Blender V4.3
overlay_paint.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2019 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "DRW_render.hh"
10
11#include "BKE_image.hh"
12
13#include "DNA_mesh_types.h"
14
16
17#include "overlay_private.hh"
18
19/* Check if the given object is rendered (partially) transparent */
21{
22 if (v3d->shading.type == OB_WIRE) {
23 return true;
24 }
25 if (v3d->shading.type == OB_SOLID) {
26 if (v3d->shading.flag & V3D_SHADING_XRAY) {
27 return true;
28 }
29
31 return ob->color[3] < 1.0f;
32 }
33
34 /* NOTE: The active object might be hidden and hence have inconsistent evaluated state of its
35 * mesh data. So only perform checks dependent on mesh after checking the object is actually
36 * visible. */
37 if (ob && ob->type == OB_MESH && BKE_object_is_visible_in_viewport(v3d, ob) && ob->data &&
39 {
40 Mesh *mesh = static_cast<Mesh *>(ob->data);
41 for (int i = 0; i < mesh->totcol; i++) {
42 Material *mat = BKE_object_material_get_eval(ob, i + 1);
43 if (mat && mat->a < 1.0f) {
44 return true;
45 }
46 }
47 }
48 }
49
50 /* Check object display types. */
51 if (ob && ELEM(ob->dt, OB_WIRE, OB_BOUNDBOX)) {
52 return true;
53 }
54
55 return false;
56}
57
59{
60 OVERLAY_StorageList *stl = vedata->stl;
61 OVERLAY_PrivateData *pd = stl->pd;
62 const DRWContextState *draw_ctx = DRW_context_state_get();
63
64 pd->painting.in_front = pd->use_in_front && draw_ctx->obact &&
65 (draw_ctx->obact->dtx & OB_DRAW_IN_FRONT);
67 draw_ctx->obact);
68}
69
71{
72 const DRWContextState *draw_ctx = DRW_context_state_get();
73 OVERLAY_PassList *psl = vedata->psl;
74 OVERLAY_PrivateData *pd = vedata->stl->pd;
75 GPUShader *sh;
76 DRWShadingGroup *grp;
78
79 const bool is_edit_mode = (pd->ctx_mode == CTX_MODE_EDIT_MESH);
80 const bool draw_contours = !is_edit_mode &&
82 float opacity = 0.0f;
83 pd->paint_depth_grp = nullptr;
84 psl->paint_depth_ps = nullptr;
85
86 switch (pd->ctx_mode) {
87 case CTX_MODE_POSE:
90 opacity = is_edit_mode ? 1.0 : pd->overlay.weight_paint_mode_opacity;
91 if (opacity > 0.0f) {
93 const bool is_workbench = (draw_ctx->v3d->shading.type <= OB_SOLID) ||
95 /* Support masked transparency in Workbench.
96 * EEVEE can't be supported since depth won't match. */
100
101 const bool do_shading = draw_ctx->v3d->shading.type != OB_WIRE;
102
103 sh = OVERLAY_shader_paint_weight(do_shading);
105 DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
106 DRW_shgroup_uniform_bool_copy(grp, "drawContours", draw_contours);
107 DRW_shgroup_uniform_float_copy(grp, "opacity", opacity);
109
110 /* Arbitrary light to give a hint of the geometry behind the weights. */
111 if (do_shading) {
112 float light_dir[3];
113 copy_v3_fl3(light_dir, 0.0f, 0.5f, 0.86602f);
114 normalize_v3(light_dir);
115 DRW_shgroup_uniform_vec3_copy(grp, "light_dir", light_dir);
116 }
117
118 if (pd->painting.alpha_blending) {
123 }
124 }
125 break;
126 }
129 if (opacity > 0.0f) {
133
136 DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
137 DRW_shgroup_uniform_bool_copy(grp, "useAlphaBlend", pd->painting.alpha_blending);
138 DRW_shgroup_uniform_float_copy(grp, "opacity", opacity);
139 }
140 break;
141 }
143 const ImagePaintSettings *imapaint = &draw_ctx->scene->toolsettings->imapaint;
144 const bool mask_enabled = imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL &&
145 imapaint->stencil != nullptr;
146
147 opacity = mask_enabled ? pd->overlay.texture_paint_mode_opacity : 0.0f;
148 if (opacity > 0.0f) {
151
152 GPUTexture *tex = BKE_image_get_gpu_texture(imapaint->stencil, nullptr);
153
154 const bool mask_premult = (imapaint->stencil->alpha_mode == IMA_ALPHA_PREMUL);
155 const bool mask_inverted = (imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL_INV) != 0;
158 DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
159 DRW_shgroup_uniform_float_copy(grp, "opacity", opacity);
160 DRW_shgroup_uniform_bool_copy(grp, "maskPremult", mask_premult);
161 DRW_shgroup_uniform_vec3_copy(grp, "maskColor", imapaint->stencil_col);
162 DRW_shgroup_uniform_bool_copy(grp, "maskInvertStencil", mask_inverted);
163 DRW_shgroup_uniform_texture(grp, "maskImage", tex);
164 }
165 break;
166 }
167 default:
168 BLI_assert(0);
169 break;
170 }
171
172 if (opacity <= 0.0f) {
173 psl->paint_color_ps = nullptr;
174 pd->paint_surf_grp = nullptr;
175 }
176
177 {
182 const float4 color = {1.0f, 1.0f, 1.0f, 0.2f};
183 DRW_shgroup_uniform_vec4_copy(grp, "ucolor", color);
185
188 DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
189 DRW_shgroup_uniform_bool_copy(grp, "useSelect", true);
191
193 DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
194 DRW_shgroup_uniform_bool_copy(grp, "useSelect", false);
196
199 DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
200 }
201}
202
204{
205 OVERLAY_PrivateData *pd = vedata->stl->pd;
206 blender::gpu::Batch *geom = nullptr;
207
208 const Mesh *me_orig = static_cast<Mesh *>(DEG_get_original_object(ob)->data);
209 const bool use_face_sel = (me_orig->editflag & ME_EDIT_PAINT_FACE_SEL) != 0;
210
211 if (pd->paint_surf_grp) {
213 DRW_shgroup_call(pd->paint_surf_grp, geom, ob);
214 }
215
216 if (use_face_sel) {
218 DRW_shgroup_call(pd->paint_face_grp, geom, ob);
219 }
220}
221
223{
224 OVERLAY_PrivateData *pd = vedata->stl->pd;
225 blender::gpu::Batch *geom = nullptr;
226
227 const Mesh *me_orig = static_cast<Mesh *>(DEG_get_original_object(ob)->data);
228 const bool is_edit_mode = (pd->ctx_mode == CTX_MODE_EDIT_MESH);
229 const bool use_wire = !is_edit_mode && (pd->overlay.paint_flag & V3D_OVERLAY_PAINT_WIRE);
230 const bool use_face_sel = !is_edit_mode && (me_orig->editflag & ME_EDIT_PAINT_FACE_SEL);
231 const bool use_vert_sel = !is_edit_mode && (me_orig->editflag & ME_EDIT_PAINT_VERT_SEL);
232
234 if (pd->paint_surf_grp) {
236 DRW_shgroup_call(pd->paint_surf_grp, geom, ob);
237 }
238 if (pd->paint_depth_grp) {
240 DRW_shgroup_call(pd->paint_depth_grp, geom, ob);
241 }
242 }
243
244 if (use_face_sel || use_wire) {
246 DRW_shgroup_call(use_face_sel ? pd->paint_wire_selected_grp : pd->paint_wire_grp, geom, ob);
247 }
248
249 if (use_face_sel) {
251 DRW_shgroup_call(pd->paint_face_grp, geom, ob);
252 }
253
254 if (use_vert_sel) {
256 DRW_shgroup_call(pd->paint_point_grp, geom, ob);
257 }
258}
259
264
266{
267 OVERLAY_StorageList *stl = vedata->stl;
268 OVERLAY_PrivateData *pd = stl->pd;
269
270 OVERLAY_PassList *psl = vedata->psl;
271 OVERLAY_FramebufferList *fbl = vedata->fbl;
272
273 if (DRW_state_is_fbo()) {
275 fbl->overlay_default_fb);
276 }
277
278 if (psl->paint_depth_ps) {
280 }
281 if (psl->paint_color_ps) {
283 }
284 if (psl->paint_overlay_ps) {
286 }
287}
@ CTX_MODE_PAINT_TEXTURE
@ CTX_MODE_EDIT_MESH
@ CTX_MODE_PAINT_VERTEX
@ CTX_MODE_PAINT_WEIGHT
@ CTX_MODE_POSE
GPUTexture * BKE_image_get_gpu_texture(Image *image, ImageUser *iuser)
Definition image_gpu.cc:476
bool BKE_object_is_visible_in_viewport(const View3D *v3d, const Object *ob)
struct Material * BKE_object_material_get_eval(struct Object *ob, short act)
bool BKE_scene_uses_blender_workbench(const Scene *scene)
Definition scene.cc:2777
#define BLI_assert(a)
Definition BLI_assert.h:50
MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
MINLINE float normalize_v3(float n[3])
#define ELEM(...)
Object * DEG_get_original_object(Object *object)
@ IMA_ALPHA_PREMUL
@ ME_EDIT_PAINT_VERT_SEL
@ ME_EDIT_PAINT_FACE_SEL
@ OB_WIRE
@ OB_BOUNDBOX
@ OB_SOLID
@ OB_MODE_EDIT
@ OB_MODE_WEIGHT_PAINT
@ OB_MESH
@ OB_DRAW_IN_FRONT
@ IMAGEPAINT_PROJECT_LAYER_STENCIL_INV
@ IMAGEPAINT_PROJECT_LAYER_STENCIL
@ V3D_SHADING_MATERIAL_COLOR
@ V3D_SHADING_OBJECT_COLOR
@ V3D_OVERLAY_PAINT_WIRE
@ V3D_SHADING_XRAY
@ V3D_OVERLAY_WPAINT_CONTOURS
#define DRW_PASS_CREATE(pass, state)
#define DRW_shgroup_uniform_block(shgroup, name, ubo)
#define DRW_shgroup_call(shgroup, geom, ob)
void GPU_framebuffer_bind(GPUFrameBuffer *framebuffer)
struct GPUShader GPUShader
blender::gpu::Batch * DRW_cache_mesh_surface_weights_get(Object *ob)
blender::gpu::Batch * DRW_cache_mesh_surface_edges_get(Object *ob)
blender::gpu::Batch * DRW_cache_mesh_surface_get(Object *ob)
blender::gpu::Batch * DRW_cache_mesh_all_verts_get(Object *ob)
blender::gpu::Batch * DRW_cache_mesh_surface_texpaint_single_get(Object *ob)
DRW_Global G_draw
const DRWContextState * DRW_context_state_get()
bool DRW_state_is_fbo()
DRWShadingGroup * DRW_shgroup_create(GPUShader *shader, DRWPass *pass)
void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value)
void DRW_shgroup_uniform_texture(DRWShadingGroup *shgroup, const char *name, const GPUTexture *tex)
void DRW_shgroup_state_enable(DRWShadingGroup *shgroup, DRWState state)
void DRW_shgroup_uniform_vec3_copy(DRWShadingGroup *shgroup, const char *name, const float *value)
void DRW_shgroup_uniform_vec4_copy(DRWShadingGroup *shgroup, const char *name, const float *value)
void DRW_shgroup_uniform_bool_copy(DRWShadingGroup *shgroup, const char *name, const bool value)
void DRW_draw_pass(DRWPass *pass)
DRWState
Definition draw_state.hh:25
@ DRW_STATE_BLEND_ALPHA
Definition draw_state.hh:55
@ DRW_STATE_DEPTH_EQUAL
Definition draw_state.hh:39
@ DRW_STATE_WRITE_DEPTH
Definition draw_state.hh:29
@ DRW_STATE_WRITE_COLOR
Definition draw_state.hh:30
@ DRW_STATE_DEPTH_LESS_EQUAL
Definition draw_state.hh:38
@ DRW_STATE_BLEND_MUL
Definition draw_state.hh:60
static ulong state[N]
void OVERLAY_paint_texture_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_paint_init(OVERLAY_Data *vedata)
static bool paint_object_is_rendered_transparent(View3D *v3d, Object *ob)
void OVERLAY_paint_cache_init(OVERLAY_Data *vedata)
void OVERLAY_paint_draw(OVERLAY_Data *vedata)
void OVERLAY_paint_weight_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_paint_vertex_cache_populate(OVERLAY_Data *vedata, Object *ob)
GPUShader * OVERLAY_shader_paint_texture()
GPUShader * OVERLAY_shader_paint_wire()
GPUShader * OVERLAY_shader_paint_face()
GPUShader * OVERLAY_shader_paint_weight(bool shading)
GPUShader * OVERLAY_shader_paint_vertcol()
GPUShader * OVERLAY_shader_depth_only()
GPUShader * OVERLAY_shader_paint_point()
GPUTexture * weight_ramp
GPUUniformBuf * block_ubo
struct Image * stencil
char alpha_mode
char editflag
OVERLAY_PassList * psl
OVERLAY_StorageList * stl
OVERLAY_FramebufferList * fbl
GPUFrameBuffer * overlay_default_fb
GPUFrameBuffer * overlay_in_front_fb
DRWShadingGroup * paint_surf_grp
eContextObjectMode ctx_mode
DRWShadingGroup * paint_depth_grp
DRWShadingGroup * paint_wire_selected_grp
DRWShadingGroup * paint_face_grp
DRWShadingGroup * paint_point_grp
struct OVERLAY_PrivateData::@235 painting
DRWShadingGroup * paint_wire_grp
OVERLAY_PrivateData * pd
float color[4]
struct ToolSettings * toolsettings
struct ImagePaintSettings imapaint
float texture_paint_mode_opacity
float vertex_paint_mode_opacity
float weight_paint_mode_opacity
View3DShading shading