29 PassMain ps_ = {
"attribute_viewer_ps_"};
41 enabled_ =
state.is_space_v3d() && !res.is_selection() &&
state.show_attribute_viewer();
48 state.clipping_plane_count);
50 auto create_sub = [&](
const char *name, GPUShader *shader) {
51 auto &sub = ps_.sub(name);
52 sub.shader_set(shader);
56 mesh_sub_ = create_sub(
"mesh", res.shaders->attribute_viewer_mesh.get());
57 pointcloud_sub_ = create_sub(
"pointcloud", res.shaders->attribute_viewer_pointcloud.get());
58 curve_sub_ = create_sub(
"curve", res.shaders->attribute_viewer_curve.get());
59 curves_sub_ = create_sub(
"curves", res.shaders->attribute_viewer_curves.get());
60 instance_sub_ = create_sub(
"instance", res.shaders->uniform_color.get());
68 const DupliObject *dupli_object = ob_ref.dupli_object;
69 const bool is_preview = dupli_object !=
nullptr &&
76 const auto &instances =
78 if (
const std::optional<blender::bke::AttributeMetaData> meta_data =
79 instances.attributes()->lookup_meta_data(
".viewer"))
81 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
82 populate_for_instance(ob_ref, *dupli_object,
state, manager);
87 populate_for_geometry(ob_ref,
state, manager);
96 manager.generate_commands(ps_,
view);
106 manager.submit_only(ps_,
view);
110 void populate_for_instance(
const ObjectRef &ob_ref,
125 color.a *=
state.overlay.viewer_attribute_opacity;
126 switch (
object.type) {
132 auto &sub = *instance_sub_;
134 sub.draw(
batch, res_handle);
137 auto &sub = *instance_sub_;
139 sub.draw(
batch, res_handle);
145 auto &sub = *pointcloud_sub_;
147 sub.push_constant(
"ucolor",
float4(color));
153 auto &sub = *instance_sub_;
154 sub.push_constant(
"ucolor",
float4(color));
156 sub.draw(
batch, res_handle);
167 static bool attribute_type_supports_viewer_overlay(
const eCustomDataType data_type)
173 void populate_for_geometry(
const ObjectRef &ob_ref,
const State &
state, Manager &manager)
175 const float opacity =
state.overlay.viewer_attribute_opacity;
176 Object &
object = *ob_ref.object;
177 switch (
object.type) {
180 if (
const std::optional<bke::AttributeMetaData> meta_data =
181 mesh.
attributes().lookup_meta_data(
".viewer"))
183 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
185 auto &sub = *mesh_sub_;
186 sub.push_constant(
"opacity", opacity);
187 sub.draw(
batch, manager.unique_handle(ob_ref));
194 if (
const std::optional<bke::AttributeMetaData> meta_data =
195 pointcloud.
attributes().lookup_meta_data(
".viewer"))
197 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
200 if (pointcloud.
totpoint > 0 && vertbuf !=
nullptr) {
201 auto &sub = *pointcloud_sub_;
203 sub.push_constant(
"opacity", opacity);
204 sub.bind_texture(
"attribute_tx", vertbuf);
205 sub.draw(
batch, manager.unique_handle(ob_ref));
215 if (
const std::optional<bke::AttributeMetaData> meta_data =
216 curves.attributes().lookup_meta_data(
".viewer"))
218 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
220 auto &sub = *curve_sub_;
221 sub.push_constant(
"opacity", opacity);
222 ResourceHandle res_handle = manager.resource_handle(
object.object_to_world());
223 sub.draw(
batch, res_handle);
231 const bke::CurvesGeometry &curves = curves_id.
geometry.wrap();
232 if (
const std::optional<bke::AttributeMetaData> meta_data =
233 curves.attributes().lookup_meta_data(
".viewer"))
235 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
236 bool is_point_domain;
238 &curves_id,
".viewer", &is_point_domain);
239 auto &sub = *curves_sub_;
241 sub.push_constant(
"opacity", opacity);
242 sub.push_constant(
"is_point_domain", is_point_domain);
243 sub.bind_texture(
"color_tx", *
texture);
244 sub.draw(
batch, manager.unique_handle(ob_ref));
Low-level operations for curves.
CustomData interface, see also DNA_customdata_types.h.
#define CD_TYPE_AS_MASK(_type)
struct PointCloud PointCloud
void GPU_framebuffer_bind(GPUFrameBuffer *fb)
T get(const int64_t index) const
std::optional< AttributeAccessor > attributes() const final
ResourceHandleRange unique_handle(const ObjectRef &ref)
ResourceHandleRange resource_handle(const ObjectRef &ref, float inflate_bounds=0.0f)
void push_constant(const char *name, const float &data)
detail::PassBase< command::DrawMultiBuf > Sub
void draw_line(Framebuffer &framebuffer, Manager &manager, View &view) final
void begin_sync(Resources &res, const State &state) final
void object_sync(Manager &manager, const ObjectRef &ob_ref, Resources &, const State &state) final
void pre_draw(Manager &manager, View &view) final
Mesh & DRW_object_get_data_for_drawing(const Object &object)
#define DRW_CLIPPING_UBO_SLOT
#define OVERLAY_GLOBALS_SLOT
@ DRW_STATE_DEPTH_LESS_EQUAL
struct @064345207361167251075330302113175271221317160336::@113254110077376341056327177062323111323010325277 batch
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
#define CD_MASK_PROP_QUATERNION
#define CD_MASK_PROP_FLOAT4X4
gpu::Batch * curves_sub_pass_setup(PassMain::Sub &ps, const Scene *scene, Object *ob, GPUMaterial *gpu_material=nullptr)
gpu::Batch * DRW_cache_curve_edge_wire_viewer_attribute_get(Object *ob)
detail::Pass< command::DrawMultiBuf > PassMain
gpu::Batch * DRW_cache_mesh_loose_edges_get(Object *ob)
gpu::Batch * pointcloud_sub_pass_setup(PassMain::Sub &sub_ps, Object *object, GPUMaterial *gpu_material=nullptr)
gpu::Batch * DRW_cache_mesh_surface_viewer_attribute_get(Object *ob)
gpu::VertBuf ** DRW_pointcloud_evaluated_attribute(PointCloud *pointcloud, StringRef name)
gpu::VertBuf ** DRW_curves_texture_for_evaluated_attribute(Curves *curves, StringRef name, bool *r_is_point_domain)
gpu::Batch * DRW_cache_curve_edge_wire_get(Object *ob)
gpu::Batch * DRW_cache_mesh_surface_get(Object *ob)
VecBase< float, 4 > float4
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
const struct Curves * curve_eval
const blender::bke::GeometrySet * preview_base_geometry
int preview_instance_index
const GeometryComponent * get_component(GeometryComponent::Type component_type) const