Blender V4.3
overlay_engine.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
11#include "DRW_engine.hh"
12#include "DRW_render.hh"
13
15
16#include "ED_view3d.hh"
17
18#include "UI_interface.hh"
19
20#include "BKE_duplilist.hh"
21#include "BKE_object.hh"
22#include "BKE_paint.hh"
23
24#include "GPU_capabilities.hh"
25
26#include "DNA_space_types.h"
27
28#include "draw_manager.hh"
30
31#include "overlay_engine.h"
32#include "overlay_private.hh"
33
34using namespace blender::draw;
35
37
38/* -------------------------------------------------------------------- */
42static void OVERLAY_engine_init(void *vedata)
43{
44 OVERLAY_Data *data = static_cast<OVERLAY_Data *>(vedata);
45 OVERLAY_StorageList *stl = data->stl;
46 const DRWContextState *draw_ctx = DRW_context_state_get();
47 const RegionView3D *rv3d = draw_ctx->rv3d;
48 const View3D *v3d = draw_ctx->v3d;
49 const Scene *scene = draw_ctx->scene;
50 const ToolSettings *ts = scene->toolsettings;
51
52 if (!stl->pd) {
53 /* Allocate transient pointers. */
54 stl->pd = static_cast<OVERLAY_PrivateData *>(MEM_callocN(sizeof(*stl->pd), __func__));
55 }
56
57 /* Allocate instance. */
58 if (data->instance == nullptr) {
59 data->instance = new Instance(select::SelectionType::DISABLED, false);
60 }
61
62 OVERLAY_PrivateData *pd = stl->pd;
63 pd->space_type = v3d != nullptr ? int(SPACE_VIEW3D) : draw_ctx->space_data->spacetype;
64
65 if (pd->space_type == SPACE_IMAGE) {
66 const SpaceImage *sima = (SpaceImage *)draw_ctx->space_data;
68 pd->clipping_state = DRWState(0);
71 return;
72 }
73 if (pd->space_type == SPACE_NODE) {
74 pd->hide_overlays = true;
75 pd->clipping_state = DRWState(0);
76 return;
77 }
78
79 pd->hide_overlays = (v3d->flag2 & V3D_HIDE_OVERLAYS) != 0;
81 draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode);
82
83 if (!pd->hide_overlays) {
84 pd->overlay = v3d->overlay;
85 pd->v3d_flag = v3d->flag;
86 pd->v3d_gridflag = v3d->gridflag;
87 }
88 else {
89 memset(&pd->overlay, 0, sizeof(pd->overlay));
90 pd->v3d_flag = 0;
91 pd->v3d_gridflag = 0;
97 }
98
99 if (v3d->shading.type == OB_WIRE) {
101 }
102
103 if (ts->sculpt) {
106 }
107 if (!(v3d->overlay.flag & int(V3D_OVERLAY_SCULPT_SHOW_MASK))) {
109 }
110 }
111
112 pd->use_in_front = (v3d->shading.type <= OB_SOLID) ||
114 pd->wireframe_mode = (v3d->shading.type == OB_WIRE);
116 pd->xray_opacity = XRAY_ALPHA(v3d);
117 pd->xray_enabled = XRAY_ACTIVE(v3d);
119 pd->clear_in_front = (v3d->shading.type != OB_SOLID);
120 pd->cfra = DEG_get_ctime(draw_ctx->depsgraph);
121
123
124 switch (stl->pd->ctx_mode) {
127 break;
130 break;
131 default:
132 /* Nothing to do. */
133 break;
134 }
136 OVERLAY_grid_init(data);
137 OVERLAY_image_init(data);
140 OVERLAY_paint_init(data);
141}
142
143static void OVERLAY_cache_init(void *vedata)
144{
145 OVERLAY_Data *data = static_cast<OVERLAY_Data *>(vedata);
146 OVERLAY_StorageList *stl = data->stl;
147 OVERLAY_PrivateData *pd = stl->pd;
148
149 if (pd->space_type == SPACE_IMAGE) {
153 return;
154 }
155 if (pd->space_type == SPACE_NODE) {
157 return;
158 }
159
160 switch (pd->ctx_mode) {
161 case CTX_MODE_EDIT_MESH: {
163 /* `pd->edit_mesh.flag` is valid after calling `OVERLAY_edit_mesh_cache_init`. */
164 const bool draw_edit_weights = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_WEIGHT);
165 if (draw_edit_weights) {
167 }
168 break;
169 }
173 break;
176 break;
178 break;
180 break;
183 break;
190 break;
193 break;
194 case CTX_MODE_POSE:
199 break;
200 case CTX_MODE_SCULPT:
202 break;
205 break;
211 break;
214 break;
217 break;
219 case CTX_MODE_OBJECT:
220 break;
221 default:
222 BLI_assert_msg(0, "Draw mode invalid");
223 break;
224 }
243}
244
245BLI_INLINE OVERLAY_DupliData *OVERLAY_duplidata_get(Object *ob, void *vedata, bool *r_do_init)
246{
247 OVERLAY_DupliData **dupli_data = (OVERLAY_DupliData **)DRW_duplidata_get(vedata);
248 *r_do_init = false;
250 return nullptr;
251 }
252
253 if (dupli_data) {
254 if (*dupli_data == nullptr) {
255 *dupli_data = static_cast<OVERLAY_DupliData *>(
256 MEM_callocN(sizeof(OVERLAY_DupliData), __func__));
257 *r_do_init = true;
258 }
259 else if ((*dupli_data)->base_flag != ob->base_flag) {
260 /* Select state might have change, reinitialize. */
261 *r_do_init = true;
262 }
263 return *dupli_data;
264 }
265 return nullptr;
266}
267
269{
271 /* Also check for context mode as the object mode is not 100% reliable. (see #72490) */
272 switch (ob->type) {
273 case OB_MESH:
274 return pd->ctx_mode == CTX_MODE_EDIT_MESH;
275 case OB_ARMATURE:
276 return pd->ctx_mode == CTX_MODE_EDIT_ARMATURE;
277 case OB_CURVES_LEGACY:
278 return pd->ctx_mode == CTX_MODE_EDIT_CURVE;
279 case OB_SURF:
280 return pd->ctx_mode == CTX_MODE_EDIT_SURFACE;
281 case OB_LATTICE:
282 return pd->ctx_mode == CTX_MODE_EDIT_LATTICE;
283 case OB_MBALL:
284 return pd->ctx_mode == CTX_MODE_EDIT_METABALL;
285 case OB_FONT:
286 return pd->ctx_mode == CTX_MODE_EDIT_TEXT;
287 case OB_CURVES:
288 return pd->ctx_mode == CTX_MODE_EDIT_CURVES;
289 case OB_POINTCLOUD:
290 case OB_VOLUME:
291 /* No edit mode yet. */
292 return false;
293 case OB_GREASE_PENCIL:
295 }
296 }
297 return false;
298}
299
300static bool overlay_object_is_paint_mode(const DRWContextState *draw_ctx, const Object *ob)
301{
302 if (ob->type == OB_GREASE_PENCIL &&
304 {
305 return true;
306 }
307 return (ob == draw_ctx->obact) && (draw_ctx->object_mode & OB_MODE_ALL_PAINT);
308}
309
310static bool overlay_should_fade_object(Object *ob, Object *active_object)
311{
312 if (!active_object || !ob) {
313 return false;
314 }
315
316 if (ELEM(active_object->mode, OB_MODE_OBJECT, OB_MODE_POSE)) {
317 return false;
318 }
319
320 if ((active_object->mode & ob->mode) != 0) {
321 return false;
322 }
323
324 return true;
325}
326
327static void OVERLAY_cache_populate(void *vedata, Object *ob)
328{
329 OVERLAY_Data *data = static_cast<OVERLAY_Data *>(vedata);
330 OVERLAY_PrivateData *pd = data->stl->pd;
331
332 if (pd->space_type == SPACE_IMAGE) {
333 return;
334 }
335
336 const DRWContextState *draw_ctx = DRW_context_state_get();
337 DupliObject *dupli_object = DRW_object_get_dupli(ob);
338 Object *dupli_parent = DRW_object_get_dupli_parent(ob);
339 const bool is_select = DRW_state_is_select();
340 const bool renderable = DRW_object_is_renderable(ob);
341 const bool is_preview = dupli_object != nullptr &&
342 dupli_object->preview_base_geometry != nullptr;
343 const bool in_pose_mode = ob->type == OB_ARMATURE && OVERLAY_armature_is_pose_mode(ob, draw_ctx);
344 const bool in_edit_mode = overlay_object_is_edit_mode(pd, ob);
345 const bool is_instance = (ob->base_flag & BASE_FROM_DUPLI);
346 const bool instance_parent_in_edit_mode = is_instance ?
349 false;
350 const bool in_particle_edit_mode = (ob->mode == OB_MODE_PARTICLE_EDIT) &&
352 const bool in_paint_mode = overlay_object_is_paint_mode(draw_ctx, ob);
353 const bool in_sculpt_curve_mode = (ob == draw_ctx->obact ||
354 (is_preview && dupli_parent == draw_ctx->obact &&
355 ob->type == OB_CURVES)) &&
357 const bool in_sculpt_mode = (ob == draw_ctx->obact) && (ob->sculpt != nullptr) &&
359 const bool in_grease_pencil_sculpt_mode = (ob->type == OB_GREASE_PENCIL) &&
361 const bool has_surface = ELEM(ob->type,
362 OB_MESH,
364 OB_SURF,
365 OB_FONT,
367 OB_CURVES,
369 OB_VOLUME,
371 const bool draw_surface = (ob->dt >= OB_WIRE) && (renderable || (ob->dt == OB_WIRE));
372 const bool draw_facing = draw_surface && (pd->overlay.flag & V3D_OVERLAY_FACE_ORIENTATION) &&
373 (ob->dt >= OB_SOLID) && !is_select;
374 const bool draw_fade = draw_surface && (pd->overlay.flag & V3D_OVERLAY_FADE_INACTIVE) &&
375 overlay_should_fade_object(ob, draw_ctx->obact);
376 const bool draw_mode_transfer = draw_surface;
377 const bool draw_bones = (pd->overlay.flag & V3D_OVERLAY_HIDE_BONES) == 0;
378 const bool draw_wires = draw_surface && has_surface &&
379 (pd->wireframe_mode || !pd->hide_overlays);
380 const bool draw_outlines = !in_edit_mode && !in_paint_mode && !in_sculpt_curve_mode &&
381 renderable && has_surface && !instance_parent_in_edit_mode &&
383 (ob->base_flag & BASE_SELECTED);
384 const bool draw_bone_selection = (ob->type == OB_MESH) && pd->armature.do_pose_fade_geom &&
385 !is_select;
386 const bool draw_edit_weights = in_edit_mode && (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_WEIGHT);
387 const bool draw_extras =
388 (!pd->hide_overlays) &&
390 /* Show if this is the camera we're looking through since it's useful for selecting. */
391 ((draw_ctx->rv3d->persp == RV3D_CAMOB) && ((ID *)draw_ctx->v3d->camera == ob->id.orig_id)));
392
393 const bool draw_motion_paths = (pd->overlay.flag & V3D_OVERLAY_HIDE_MOTION_PATHS) == 0;
394
395 bool do_init;
396 OVERLAY_DupliData *dupli = OVERLAY_duplidata_get(ob, vedata, &do_init);
397
398 if (draw_fade) {
400 }
401 if (draw_facing) {
403 }
404 if (draw_mode_transfer) {
406 }
407 if (draw_wires) {
408 OVERLAY_wireframe_cache_populate(data, ob, dupli, do_init);
409 }
410 if (draw_outlines) {
411 OVERLAY_outline_cache_populate(data, ob, dupli, do_init);
412 }
413 if (draw_bone_selection) {
415 }
416
418 if (is_preview) {
420 }
421 }
422
423 if (is_preview && (pd->overlay.flag & V3D_OVERLAY_VIEWER_ATTRIBUTE_TEXT) != 0) {
425 }
426
427 if (ob->type == OB_VOLUME) {
429 }
430
431 if (in_edit_mode && !pd->hide_overlays) {
432 switch (ob->type) {
433 case OB_MESH:
435 if (draw_edit_weights) {
437 }
438 break;
439 case OB_ARMATURE:
440 if (draw_bones) {
442 }
443 break;
444 case OB_CURVES_LEGACY:
446 break;
447 case OB_SURF:
449 break;
450 case OB_LATTICE:
452 break;
453 case OB_MBALL:
455 break;
456 case OB_FONT:
458 break;
459 case OB_CURVES:
461 break;
462 case OB_GREASE_PENCIL:
464 break;
465 }
466 }
467 else if (in_pose_mode && draw_bones) {
469 }
470 else if (in_paint_mode && !pd->hide_overlays) {
471 switch (draw_ctx->object_mode) {
474 break;
477 break;
480 break;
483 break;
486 break;
487 default:
488 break;
489 }
490 }
491 else if (in_particle_edit_mode) {
493 }
494
495 if (in_sculpt_mode) {
497 }
498 else if (in_sculpt_curve_mode) {
500 }
501 else if (in_grease_pencil_sculpt_mode && !pd->hide_overlays) {
503 }
504
505 if (draw_motion_paths) {
507 }
508
509 if (!pd->hide_overlays) {
510 switch (ob->type) {
511 case OB_ARMATURE:
512 if (draw_bones && (is_select || (!in_edit_mode && !in_pose_mode))) {
514 }
515 break;
516 case OB_MBALL:
517 if (!in_edit_mode) {
519 }
520 break;
521 }
522 }
523 /* Non-Meshes */
524 if (draw_extras) {
525 switch (ob->type) {
526 case OB_EMPTY:
528 break;
529 case OB_LAMP:
531 break;
532 case OB_CAMERA:
534 break;
535 case OB_SPEAKER:
537 break;
538 case OB_LIGHTPROBE:
540 break;
541 case OB_LATTICE: {
542 /* Unlike the other types above, lattices actually have a bounding box defined, so hide the
543 * lattice wires if only the bounding-box is requested. */
544 if (ob->dt > OB_BOUNDBOX) {
546 }
547 break;
548 }
549 }
550 }
551
554 }
555
556 /* Relationship, object center, bounding-box... etc. */
557 if (!pd->hide_overlays) {
559 }
560
561 if (dupli) {
562 dupli->base_flag = ob->base_flag;
563 }
564}
565
566static void OVERLAY_cache_finish(void *vedata)
567{
568 OVERLAY_Data *data = static_cast<OVERLAY_Data *>(vedata);
569 OVERLAY_PrivateData *pd = data->stl->pd;
570
571 if (ELEM(pd->space_type, SPACE_IMAGE)) {
573 return;
574 }
575 if (ELEM(pd->space_type, SPACE_NODE)) {
576 return;
577 }
578
579 /* TODO(fclem): Only do this when really needed. */
580 {
581 /* HACK we allocate the in front depth here to avoid the overhead when if is not needed. */
584
587
589 &dfbl->in_front_fb,
590 {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
591 }
592
597}
598
599static void OVERLAY_draw_scene(void *vedata)
600{
601 OVERLAY_Data *data = static_cast<OVERLAY_Data *>(vedata);
602 OVERLAY_PrivateData *pd = data->stl->pd;
603 OVERLAY_FramebufferList *fbl = data->fbl;
605 const DRWContextState *draw_ctx = DRW_context_state_get();
606 const View3D *v3d = draw_ctx->v3d;
607
608 /* Needs to be done first as it modifies the scene color and depth buffer. */
609 if (pd->space_type == SPACE_VIEW3D) {
611 }
612
613 if (DRW_state_is_fbo()) {
615 /* Don't clear background for the node editor. The node editor draws the background and we
616 * need to mask out the image from the already drawn overlay color buffer. */
617 if (pd->space_type != SPACE_NODE) {
618 const float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
620 }
621 }
622
623 if (pd->space_type == SPACE_IMAGE) {
625 OVERLAY_grid_draw(data);
626 if (DRW_state_is_fbo()) {
628 }
630 return;
631 }
632 if (pd->space_type == SPACE_NODE) {
634 return;
635 }
636
638 /* Do not render background if XR passthrough is enabled. */
639 if ((pd->v3d_flag & V3D_XR_SESSION_SURFACE) == 0 || (v3d->flag2 & V3D_XR_SHOW_PASSTHROUGH) == 0)
640 {
642 }
643
645
646 DRW_view_set_active(nullptr);
647
648 if (DRW_state_is_fbo()) {
650 }
651
653
654 if (DRW_state_is_fbo()) {
656 }
657
660
661 if (DRW_state_is_fbo()) {
663 }
664
665 OVERLAY_image_draw(data);
666 OVERLAY_fade_draw(data);
670
671 /* These overlays are drawn here to avoid artifacts with wire-frame opacity. */
672 switch (pd->ctx_mode) {
673 case CTX_MODE_SCULPT:
675 break;
678 break;
680 case CTX_MODE_POSE:
684 OVERLAY_paint_draw(data);
685 break;
686 default:
687 break;
688 }
689
690 if (DRW_state_is_fbo()) {
692 }
693
694 if (pd->ctx_mode == CTX_MODE_SCULPT_CURVES) {
696 }
697
704 OVERLAY_extra_draw(data);
707 }
708
709 if (DRW_state_is_fbo()) {
711 }
712
714 OVERLAY_grid_draw(data);
715
717
718 if (DRW_state_is_fbo()) {
720 }
721
725
726 if (DRW_state_is_fbo()) {
728 }
729
734
735 if (DRW_state_is_fbo()) {
737 }
738
742
744 /* Edit modes have their own selection code. */
745 return;
746 }
747
748 /* Functions after this point can change FBO freely. */
749
750 switch (pd->ctx_mode) {
753 break;
757 break;
760 break;
763 break;
764 case CTX_MODE_POSE:
765 OVERLAY_pose_draw(data);
766 break;
769 break;
772 break;
778 break;
780 break;
783 break;
789 break;
790 default:
791 break;
792 }
793
795}
796
802
803static void OVERLAY_instance_free(void *instance_)
804{
805 Instance *instance = (Instance *)instance_;
806 if (instance != nullptr) {
807 delete instance;
808 }
809}
811/* -------------------------------------------------------------------- */
816
818 /*next*/ nullptr,
819 /*prev*/ nullptr,
820 /*idname*/ N_("Overlay"),
821 /*vedata_size*/ &overlay_data_size,
822 /*engine_init*/ &OVERLAY_engine_init,
823 /*engine_free*/ &OVERLAY_engine_free,
824 /*instance_free*/ &OVERLAY_instance_free,
825 /*cache_init*/ &OVERLAY_cache_init,
826 /*cache_populate*/ &OVERLAY_cache_populate,
827 /*cache_finish*/ &OVERLAY_cache_finish,
828 /*draw_scene*/ &OVERLAY_draw_scene,
829 /*view_update*/ nullptr,
830 /*id_update*/ nullptr,
831 /*render_to_image*/ nullptr,
832 /*store_metadata*/ nullptr,
833};
834
837#undef SELECT_ENGINE
@ CTX_MODE_VERTEX_GPENCIL_LEGACY
@ CTX_MODE_WEIGHT_GPENCIL_LEGACY
@ CTX_MODE_EDIT_POINT_CLOUD
@ CTX_MODE_SCULPT_GPENCIL_LEGACY
@ CTX_MODE_PAINT_GREASE_PENCIL
@ CTX_MODE_PAINT_GPENCIL_LEGACY
@ CTX_MODE_EDIT_CURVE
@ CTX_MODE_PAINT_TEXTURE
@ CTX_MODE_EDIT_SURFACE
@ CTX_MODE_SCULPT_GREASE_PENCIL
@ CTX_MODE_PARTICLE
@ CTX_MODE_SCULPT
@ CTX_MODE_OBJECT
@ CTX_MODE_EDIT_MESH
@ CTX_MODE_EDIT_GREASE_PENCIL
@ CTX_MODE_SCULPT_CURVES
@ CTX_MODE_EDIT_TEXT
@ CTX_MODE_EDIT_CURVES
@ CTX_MODE_EDIT_ARMATURE
@ CTX_MODE_EDIT_LATTICE
@ CTX_MODE_WEIGHT_GREASE_PENCIL
@ CTX_MODE_VERTEX_GREASE_PENCIL
@ CTX_MODE_PAINT_VERTEX
@ CTX_MODE_EDIT_METABALL
@ CTX_MODE_PAINT_WEIGHT
@ CTX_MODE_EDIT_GPENCIL_LEGACY
@ CTX_MODE_POSE
enum eContextObjectMode CTX_data_mode_enum_ex(const Object *obedit, const Object *ob, eObjectMode object_mode)
General operations, lookup, etc. for blender objects.
bool BKE_scene_uses_blender_workbench(const Scene *scene)
Definition scene.cc:2777
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
#define BLI_INLINE
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define ELEM(...)
float DEG_get_ctime(const Depsgraph *graph)
@ BASE_FROM_DUPLI
#define OB_MODE_ALL_PAINT
@ OB_WIRE
@ OB_BOUNDBOX
@ OB_SOLID
@ OB_MODE_VERTEX_GREASE_PENCIL
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_WEIGHT_PAINT
@ OB_MODE_SCULPT
@ OB_MODE_SCULPT_CURVES
@ OB_MODE_SCULPT_GREASE_PENCIL
@ OB_MODE_POSE
@ OB_MODE_TEXTURE_PAINT
@ OB_MODE_OBJECT
@ OB_MODE_WEIGHT_GREASE_PENCIL
@ OB_MODE_VERTEX_PAINT
@ OB_SPEAKER
@ OB_LATTICE
@ OB_MBALL
@ OB_EMPTY
@ OB_SURF
@ OB_CAMERA
@ OB_FONT
@ OB_GREASE_PENCIL
@ OB_ARMATURE
@ OB_LAMP
@ OB_MESH
@ OB_POINTCLOUD
@ OB_VOLUME
@ OB_CURVES_LEGACY
@ OB_GPENCIL_LEGACY
@ OB_CURVES
@ OB_LIGHTPROBE
#define BASE_SELECTED(v3d, base)
@ SI_OVERLAY_SHOW_OVERLAYS
@ SPACE_NODE
@ SPACE_IMAGE
@ SPACE_VIEW3D
@ V3D_OVERLAY_EDIT_WEIGHT
#define RV3D_CLIPPING_ENABLED(v3d, rv3d)
@ V3D_OVERLAY_SCULPT_SHOW_FACE_SETS
@ V3D_OVERLAY_FACE_ORIENTATION
@ V3D_OVERLAY_VIEWER_ATTRIBUTE
@ V3D_OVERLAY_HIDE_OBJECT_ORIGINS
@ V3D_OVERLAY_HIDE_BONES
@ V3D_OVERLAY_HIDE_MOTION_PATHS
@ V3D_OVERLAY_WIREFRAMES
@ V3D_OVERLAY_SCULPT_SHOW_MASK
@ V3D_OVERLAY_HIDE_OBJECT_XTRAS
@ V3D_OVERLAY_FADE_INACTIVE
@ V3D_OVERLAY_VIEWER_ATTRIBUTE_TEXT
@ V3D_OVERLAY_HIDE_TEXT
@ RV3D_CAMOB
@ V3D_HIDE_OVERLAYS
@ V3D_XR_SHOW_PASSTHROUGH
@ V3D_XR_SESSION_SURFACE
@ V3D_SELECT_OUTLINE
DRWTextureFlag
#define DRW_VIEWPORT_DATA_SIZE(ty)
#define XRAY_ACTIVE(v3d)
#define XRAY_ALPHA(v3d)
void GPU_framebuffer_bind(GPUFrameBuffer *framebuffer)
void GPU_framebuffer_clear_color(GPUFrameBuffer *fb, const float clear_col[4])
#define GPU_framebuffer_ensure_config(_fb,...)
@ GPU_DEPTH24_STENCIL8
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object instance
A running instance of the engine.
Object * DRW_object_get_dupli_parent(const Object *)
DefaultFramebufferList * DRW_viewport_framebuffer_list_get()
bool DRW_object_is_in_edit_mode(const Object *ob)
bool DRW_object_is_renderable(const Object *ob)
DefaultTextureList * DRW_viewport_texture_list_get()
void ** DRW_duplidata_get(void *vedata)
const DRWContextState * DRW_context_state_get()
DupliObject * DRW_object_get_dupli(const Object *)
bool DRW_state_is_fbo()
bool DRW_state_is_select()
bool DRW_state_is_depth()
void DRW_view_set_active(const DRWView *view)
void DRW_texture_ensure_fullscreen_2d(GPUTexture **tex, eGPUTextureFormat format, DRWTextureFlag flags)
DRWState
Definition draw_state.hh:25
@ DRW_STATE_CLIP_PLANES
Definition draw_state.hh:69
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
void OVERLAY_antialiasing_cache_init(OVERLAY_Data *vedata)
void OVERLAY_antialiasing_cache_finish(OVERLAY_Data *vedata)
void OVERLAY_antialiasing_init(OVERLAY_Data *vedata)
void OVERLAY_xray_depth_copy(OVERLAY_Data *vedata)
void OVERLAY_antialiasing_start(OVERLAY_Data *vedata)
void OVERLAY_xray_depth_infront_copy(OVERLAY_Data *vedata)
void OVERLAY_xray_fade_draw(OVERLAY_Data *vedata)
void OVERLAY_antialiasing_end(OVERLAY_Data *vedata)
void OVERLAY_armature_in_front_draw(OVERLAY_Data *vedata)
bool OVERLAY_armature_is_pose_mode(Object *ob, const DRWContextState *draw_ctx)
void OVERLAY_edit_armature_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_armature_cache_finish(OVERLAY_Data *vedata)
void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
void OVERLAY_pose_armature_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_pose_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_armature_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_pose_draw(OVERLAY_Data *vedata)
void OVERLAY_armature_draw(OVERLAY_Data *vedata)
void OVERLAY_background_cache_init(OVERLAY_Data *vedata)
void OVERLAY_background_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_curve_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_curve_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_edit_curve_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_surf_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_edit_curves_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_curves_init(OVERLAY_Data *vedata)
void OVERLAY_edit_curves_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_edit_curves_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_mesh_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_edit_mesh_init(OVERLAY_Data *vedata)
void OVERLAY_edit_mesh_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_text_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_text_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_edit_text_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_uv_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_uv_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_uv_cache_finish(OVERLAY_Data *vedata)
void OVERLAY_edit_uv_init(OVERLAY_Data *vedata)
static void OVERLAY_draw_scene(void *vedata)
static const DrawEngineDataSize overlay_data_size
blender::draw::overlay::Instance Instance
static void OVERLAY_cache_init(void *vedata)
static bool overlay_object_is_paint_mode(const DRWContextState *draw_ctx, const Object *ob)
static void OVERLAY_cache_populate(void *vedata, Object *ob)
static bool overlay_object_is_edit_mode(const OVERLAY_PrivateData *pd, const Object *ob)
DrawEngineType draw_engine_overlay_type
static void OVERLAY_engine_init(void *vedata)
static void OVERLAY_engine_free()
static bool overlay_should_fade_object(Object *ob, Object *active_object)
BLI_INLINE OVERLAY_DupliData * OVERLAY_duplidata_get(Object *ob, void *vedata, bool *r_do_init)
static void OVERLAY_cache_finish(void *vedata)
static void OVERLAY_instance_free(void *instance_)
void OVERLAY_extra_centers_draw(OVERLAY_Data *vedata)
void OVERLAY_extra_in_front_draw(OVERLAY_Data *vedata)
void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
void OVERLAY_camera_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_light_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_lightprobe_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_extra_blend_draw(OVERLAY_Data *vedata)
void OVERLAY_extra_draw(OVERLAY_Data *vedata)
void OVERLAY_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_speaker_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_facing_init(OVERLAY_Data *)
void OVERLAY_facing_infront_draw(OVERLAY_Data *vedata)
void OVERLAY_facing_draw(OVERLAY_Data *vedata)
void OVERLAY_facing_cache_init(OVERLAY_Data *vedata)
void OVERLAY_facing_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_fade_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_fade_draw(OVERLAY_Data *vedata)
void OVERLAY_fade_infront_draw(OVERLAY_Data *vedata)
void OVERLAY_fade_cache_init(OVERLAY_Data *vedata)
void OVERLAY_gpencil_legacy_cache_init(OVERLAY_Data *vedata)
void OVERLAY_gpencil_legacy_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_gpencil_legacy_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_gpencil_legacy_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_grease_pencil_draw(OVERLAY_Data *vedata)
void OVERLAY_weight_grease_pencil_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_vertex_grease_pencil_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_edit_grease_pencil_cache_init(OVERLAY_Data *vedata)
void OVERLAY_grease_pencil_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_grease_pencil_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_grease_pencil_draw(OVERLAY_Data *vedata)
void OVERLAY_sculpt_grease_pencil_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_grid_draw(OVERLAY_Data *vedata)
void OVERLAY_grid_cache_init(OVERLAY_Data *vedata)
void OVERLAY_grid_init(OVERLAY_Data *vedata)
void OVERLAY_image_cache_init(OVERLAY_Data *vedata)
void OVERLAY_image_background_draw(OVERLAY_Data *vedata)
void OVERLAY_image_in_front_draw(OVERLAY_Data *vedata)
void OVERLAY_image_scene_background_draw(OVERLAY_Data *vedata)
void OVERLAY_image_cache_finish(OVERLAY_Data *vedata)
void OVERLAY_image_draw(OVERLAY_Data *vedata)
void OVERLAY_image_init(OVERLAY_Data *vedata)
void OVERLAY_lattice_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_edit_lattice_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_lattice_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_lattice_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_metaball_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_metaball_in_front_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_metaball_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_metaball_draw(OVERLAY_Data *vedata)
void OVERLAY_metaball_cache_init(OVERLAY_Data *vedata)
void OVERLAY_mode_transfer_cache_init(OVERLAY_Data *vedata)
void OVERLAY_mode_transfer_cache_finish(OVERLAY_Data *vedata)
void OVERLAY_mode_transfer_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_mode_transfer_infront_draw(OVERLAY_Data *vedata)
void OVERLAY_mode_transfer_draw(OVERLAY_Data *vedata)
void OVERLAY_motion_path_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_motion_path_draw(OVERLAY_Data *vedata)
void OVERLAY_motion_path_cache_init(OVERLAY_Data *vedata)
void OVERLAY_outline_cache_populate(OVERLAY_Data *vedata, Object *ob, OVERLAY_DupliData *dupli, bool init_dupli)
void OVERLAY_outline_draw(OVERLAY_Data *vedata)
void OVERLAY_outline_init(OVERLAY_Data *vedata)
void OVERLAY_outline_cache_init(OVERLAY_Data *vedata)
void OVERLAY_paint_texture_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_paint_init(OVERLAY_Data *vedata)
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)
void OVERLAY_particle_draw(OVERLAY_Data *vedata)
void OVERLAY_edit_particle_cache_init(OVERLAY_Data *vedata)
void OVERLAY_particle_cache_init(OVERLAY_Data *vedata)
void OVERLAY_edit_particle_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_particle_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_edit_particle_draw(OVERLAY_Data *vedata)
void OVERLAY_sculpt_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_sculpt_draw(OVERLAY_Data *vedata)
void OVERLAY_wireframe_draw(OVERLAY_Data *vedata)
void OVERLAY_volume_draw(OVERLAY_Data *vedata)
void OVERLAY_viewer_attribute_draw(OVERLAY_Data *vedata)
void OVERLAY_sculpt_curves_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_shader_free()
void OVERLAY_wireframe_in_front_draw(OVERLAY_Data *vedata)
void OVERLAY_sculpt_curves_cache_init(OVERLAY_Data *vedata)
void OVERLAY_volume_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_volume_cache_init(OVERLAY_Data *vedata)
void OVERLAY_viewer_attribute_cache_populate(OVERLAY_Data *vedata, Object *object)
void OVERLAY_viewer_attribute_text(const Object &object)
void OVERLAY_sculpt_cache_init(OVERLAY_Data *vedata)
void OVERLAY_wireframe_cache_populate(OVERLAY_Data *vedata, Object *ob, OVERLAY_DupliData *dupli, bool init_dupli)
void OVERLAY_sculpt_curves_draw_wires(OVERLAY_Data *vedata)
void OVERLAY_sculpt_curves_draw(OVERLAY_Data *vedata)
void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
void OVERLAY_viewer_attribute_cache_init(OVERLAY_Data *vedata)
void OVERLAY_wireframe_init(OVERLAY_Data *vedata)
Depsgraph * depsgraph
eObjectMode object_mode
Object * object_edit
RegionView3D * rv3d
SpaceLink * space_data
GPUFrameBuffer * overlay_fb
GPUFrameBuffer * in_front_fb
GPUFrameBuffer * overlay_only_fb
GPUTexture * depth_in_front
const blender::bke::GeometrySet * preview_base_geometry
Definition DNA_ID.h:413
struct ID * orig_id
Definition DNA_ID.h:466
GPUFrameBuffer * overlay_line_fb
GPUFrameBuffer * overlay_default_fb
GPUFrameBuffer * overlay_color_only_fb
GPUFrameBuffer * overlay_line_in_front_fb
GPUFrameBuffer * overlay_in_front_fb
eContextObjectMode ctx_mode
struct OVERLAY_PrivateData::@234 armature
struct OVERLAY_PrivateData::@230 edit_mesh
OVERLAY_PrivateData * pd
ListBase particlesystem
short base_flag
struct SculptSession * sculpt
eObjectMode mode_type
Definition BKE_paint.hh:487
SpaceImageOverlay overlay
float sculpt_mode_mask_opacity
float sculpt_mode_face_sets_opacity
View3DOverlay overlay
struct Object * camera
View3DShading shading
#define N_(msgid)