28 PassMain ps_ = {
"attribute_viewer_ps_"};
40 enabled_ =
state.is_space_v3d() && !res.is_selection() &&
state.show_attribute_viewer();
47 state.clipping_plane_count);
50 auto &sub = ps_.sub(
name);
51 sub.shader_set(shader);
55 mesh_sub_ = create_sub(
"mesh", res.shaders->attribute_viewer_mesh.get());
56 pointcloud_sub_ = create_sub(
"pointcloud", res.shaders->attribute_viewer_pointcloud.get());
57 curve_sub_ = create_sub(
"curve", res.shaders->attribute_viewer_curve.get());
58 curves_sub_ = create_sub(
"curves", res.shaders->attribute_viewer_curves.get());
59 instance_sub_ = create_sub(
"instance", res.shaders->uniform_color.get());
67 const bool is_preview = ob_ref.preview_base_geometry() !=
nullptr;
72 if (ob_ref.preview_instance_index() >= 0) {
73 const auto &instances =
75 if (
const std::optional<blender::bke::AttributeMetaData> meta_data =
76 instances.attributes()->lookup_meta_data(
".viewer"))
78 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
79 populate_for_instance(ob_ref,
state, manager);
84 populate_for_geometry(ob_ref,
state, manager);
93 manager.generate_commands(ps_,
view);
103 manager.submit_only(ps_,
view);
119 color.a *=
state.overlay.viewer_attribute_opacity;
120 switch (
object.type) {
126 auto &sub = *instance_sub_;
128 sub.draw(
batch, res_handle);
131 auto &sub = *instance_sub_;
133 sub.draw(
batch, res_handle);
139 auto &sub = *pointcloud_sub_;
141 sub.push_constant(
"ucolor",
float4(color));
147 auto &sub = *instance_sub_;
148 sub.push_constant(
"ucolor",
float4(color));
149 ResourceHandleRange res_handle = manager.
unique_handle(ob_ref);
150 sub.draw(
batch, res_handle);
161 static bool attribute_type_supports_viewer_overlay(
const bke::AttrType data_type)
166 void populate_for_geometry(
const ObjectRef &ob_ref,
const State &
state, Manager &manager)
168 const float opacity =
state.overlay.viewer_attribute_opacity;
169 Object &
object = *ob_ref.object;
170 switch (
object.type) {
173 if (
const std::optional<bke::AttributeMetaData> meta_data =
174 mesh.
attributes().lookup_meta_data(
".viewer"))
176 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
178 auto &sub = *mesh_sub_;
179 sub.push_constant(
"opacity", opacity);
180 sub.draw(
batch, manager.unique_handle(ob_ref));
187 if (
const std::optional<bke::AttributeMetaData> meta_data =
188 pointcloud.
attributes().lookup_meta_data(
".viewer"))
190 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
193 if (pointcloud.
totpoint > 0 && vertbuf !=
nullptr) {
194 auto &sub = *pointcloud_sub_;
196 sub.push_constant(
"opacity", opacity);
197 sub.bind_texture(
"attribute_tx", vertbuf);
198 sub.draw(
batch, manager.unique_handle(ob_ref));
208 if (
const std::optional<bke::AttributeMetaData> meta_data =
209 curves.attributes().lookup_meta_data(
".viewer"))
211 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
213 auto &sub = *curve_sub_;
214 sub.push_constant(
"opacity", opacity);
215 ResourceHandleRange res_handle = manager.unique_handle(ob_ref);
216 sub.draw(
batch, res_handle);
224 const bke::CurvesGeometry &curves = curves_id.
geometry.wrap();
225 if (
const std::optional<bke::AttributeMetaData> meta_data =
226 curves.attributes().lookup_meta_data(
".viewer"))
228 if (attribute_type_supports_viewer_overlay(meta_data->data_type)) {
229 bool is_point_domain;
232 &curves_id,
".viewer", is_point_domain, is_valid);
234 auto &sub = *curves_sub_;
235 const char *
error =
nullptr;
239 sub.push_constant(
"opacity", opacity);
240 sub.push_constant(
"is_point_domain", is_point_domain);
241 sub.bind_texture(
"color_tx",
texture);
242 sub.draw(
batch, manager.unique_handle(ob_ref));
Low-level operations for curves.
struct PointCloud PointCloud
T & DRW_object_get_data_for_drawing(const Object &object)
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
T get(const int64_t index) const
std::optional< AttributeAccessor > attributes() const final
ResourceHandleRange unique_handle(const ObjectRef &ref)
int preview_instance_index() const
const blender::bke::GeometrySet * preview_base_geometry() const
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
#define DRW_CLIPPING_UBO_SLOT
#define OVERLAY_GLOBALS_SLOT
@ DRW_STATE_DEPTH_LESS_EQUAL
struct @021025263243242147216143265077100330027142264337::@225245033123204053237120173316075113304004012000 batch
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
static void error(const char *str)
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 * curves_sub_pass_setup(PassMain::Sub &ps, const Scene *scene, Object *ob, const char *&r_error, GPUMaterial *gpu_material=nullptr)
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::Batch * DRW_cache_curve_edge_wire_get(Object *ob)
gpu::Batch * DRW_cache_mesh_surface_get(Object *ob)
blender::gpu::VertBufPtr & DRW_curves_texture_for_evaluated_attribute(Curves *curves, StringRef name, bool &r_is_point_domain, bool &r_valid_attribute)
std::unique_ptr< gpu::VertBuf, gpu::VertBufDeleter > VertBufPtr
VecBase< float, 4 > float4
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
const struct Curves * curve_eval
const GeometryComponent * get_component(GeometryComponent::Type component_type) const