32 PassSimple paint_region_ps_ = {
"paint_region_ps_"};
43 PassSimple paint_mask_ps_ = {
"paint_mask_ps_"};
45 bool show_weight_ =
false;
46 bool show_wires_ =
false;
47 bool show_paint_mask_ =
false;
48 bool masked_transparency_support_ =
false;
54 state.is_space_v3d() && !res.is_selection() &&
58 paint_region_ps_.init();
60 paint_mask_ps_.init();
70 auto &pass = paint_region_ps_;
74 auto &sub = pass.sub(
"Face");
77 state.clipping_plane_count);
78 sub.shader_set(res.shaders->paint_region_face.get());
79 sub.push_constant(
"ucolor",
float4(1.0, 1.0, 1.0, 0.2));
80 paint_region_face_ps_ = ⊂
83 auto &sub = pass.sub(
"Edge");
86 state.clipping_plane_count);
87 sub.shader_set(res.shaders->paint_region_edge.get());
88 paint_region_edge_ps_ = ⊂
91 auto &sub = pass.sub(
"Vert");
93 state.clipping_plane_count);
94 sub.shader_set(res.shaders->paint_region_vert.get());
95 paint_region_vert_ps_ = ⊂
103 masked_transparency_support_ = ((shading_type ==
OB_SOLID) ||
107 const bool shadeless = shading_type ==
OB_WIRE;
110 auto &pass = weight_ps_;
113 auto weight_subpass = [&](
const char *
name,
DRWState drw_state) {
114 auto &sub = pass.sub(
name);
115 sub.state_set(drw_state,
state.clipping_plane_count);
116 sub.shader_set(shadeless ? res.shaders->paint_weight.get() :
117 res.shaders->paint_weight_fake_shading.get());
118 sub.bind_texture(
"colorramp", &res.weight_ramp_tx);
119 sub.push_constant(
"draw_contours", draw_contours);
120 sub.push_constant(
"opacity",
state.overlay.weight_paint_mode_opacity);
127 weight_opaque_ps_ = weight_subpass(
129 weight_masked_transparency_ps_ = weight_subpass(
130 "Masked Transparency",
136 show_paint_mask_ = paint_settings.
stencil &&
139 if (show_paint_mask_) {
144 auto &pass = paint_mask_ps_;
146 state.clipping_plane_count);
147 pass.shader_set(res.shaders->paint_texture.get());
150 pass.bind_texture(
"mask_image", mask_texture);
151 pass.push_constant(
"maskPremult", mask_premult);
152 pass.push_constant(
"mask_invert_stencil", mask_inverted);
154 pass.push_constant(
"opacity",
state.overlay.texture_paint_mode_opacity);
168 if (ob_ref.object->type !=
OB_MESH) {
173 switch (
state.ctx_mode) {
197 switch (
state.ctx_mode) {
200 if (masked_transparency_support_ && ob_ref.object->dt >=
OB_SOLID) {
201 weight_masked_transparency_ps_->draw(geom, manager.unique_handle(ob_ref));
204 weight_opaque_ps_->draw(geom, manager.unique_handle(ob_ref));
213 if (show_paint_mask_) {
215 paint_mask_ps_.draw(geom, manager.unique_handle(ob_ref));
235 if ((use_face_selection || show_wires_) && !in_texture_paint_mode) {
237 paint_region_edge_ps_->push_constant(
"use_select", use_face_selection);
238 paint_region_edge_ps_->draw(geom, manager.unique_handle(ob_ref));
240 if (use_face_selection) {
242 paint_region_face_ps_->draw(geom, manager.unique_handle(ob_ref));
244 if (use_vert_selection && !in_texture_paint_mode) {
246 paint_region_vert_ps_->draw(geom, manager.unique_handle(ob_ref));
257 manager.submit(weight_ps_,
view);
258 manager.submit(paint_mask_ps_,
view);
261 manager.submit(paint_region_ps_,
view);
blender::gpu::Texture * BKE_image_get_gpu_texture(Image *image, ImageUser *iuser)
bool BKE_scene_uses_blender_workbench(const Scene *scene)
#define BLI_assert_unreachable()
T * DEG_get_original(T *id)
@ IMAGEPAINT_PROJECT_LAYER_STENCIL_INV
@ IMAGEPAINT_PROJECT_LAYER_STENCIL
@ V3D_OVERLAY_WPAINT_CONTOURS
T & DRW_object_get_data_for_drawing(const Object &object)
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
detail::PassBase< command::DrawCommandBuf > Sub
void draw(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
#define DRW_CLIPPING_UBO_SLOT
#define OVERLAY_GLOBALS_SLOT
@ DRW_STATE_DEPTH_LESS_EQUAL
detail::Pass< command::DrawCommandBuf > PassSimple
gpu::Batch * DRW_cache_mesh_paint_overlay_edges_get(Object *ob)
gpu::Batch * DRW_cache_mesh_paint_overlay_verts_get(Object *ob)
gpu::Batch * DRW_cache_mesh_surface_weights_get(Object *ob)
gpu::Batch * DRW_cache_mesh_paint_overlay_surface_get(Object *ob)
gpu::Batch * DRW_cache_mesh_surface_texpaint_single_get(Object *ob)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
VecBase< float, 4 > float4
VecBase< float, 3 > float3