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
8
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);
108 DRW_shgroup_uniform_texture(grp, "colorramp", G_draw.weight_ramp);
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_DRAW_IN_FRONT
@ OB_MESH
@ IMAGEPAINT_PROJECT_LAYER_STENCIL_INV
@ IMAGEPAINT_PROJECT_LAYER_STENCIL
@ V3D_SHADING_MATERIAL_COLOR
@ V3D_SHADING_OBJECT_COLOR
@ V3D_SHADING_XRAY
@ V3D_OVERLAY_WPAINT_CONTOURS
@ V3D_OVERLAY_PAINT_WIRE
#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)
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
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]
VecBase< float, 4 > float4
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()
struct Image * stencil
char alpha_mode
char editflag
short totcol
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::@260205116167031223165231021112203171237304040251 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