Blender V4.3
overlay_next_instance.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include "ED_view3d.hh"
12
13#include "BKE_paint.hh"
14
15#include "draw_debug.hh"
16
18
19namespace blender::draw::overlay {
20
22{
23 /* TODO(fclem): Remove DRW global usage. */
25 /* Was needed by `object_wire_theme_id()` when doing the port. Not sure if needed nowadays. */
27
31 state.scene = ctx->scene;
32 state.v3d = ctx->v3d;
33 state.region = ctx->region;
34 state.rv3d = ctx->rv3d;
39
40 /* Note there might be less than 6 planes, but we always compute the 6 of them for simplicity. */
41 state.clipping_plane_count = clipping_enabled_ ? 6 : 0;
42
43 state.pixelsize = U.pixelsize;
47 if (state.v3d != nullptr) {
56
57 if (!state.hide_overlays) {
61 }
62 else {
63 memset(&state.overlay, 0, sizeof(state.overlay));
64 state.v3d_flag = 0;
71 }
72
75 ctx->object_pose != nullptr;
76 }
77 else if (state.space_type == SPACE_IMAGE) {
78 SpaceImage *space_image = (SpaceImage *)state.space_data;
79
80 state.clear_in_front = false;
81 state.use_in_front = false;
84 state.xray_enabled = false;
85
86 /* During engine initialization phase the `space_image` isn't locked and we are able to
87 * retrieve the needed data. During cache_init the image engine locks the `space_image` and
88 * makes it impossible to retrieve the data. */
92 }
93
94 /* TODO(fclem): Remove DRW global usage. */
98 {
101 float data = 1.0f;
103 }
104 }
105}
106
108{
109 const DRWView *view_legacy = DRW_view_default_get();
110 View view("OverlayView", view_legacy);
112 state.camera_position = view.viewinv().location();
113 state.camera_forward = view.viewinv().z_axis();
114
116
117 background.begin_sync(resources, state);
119 origins.begin_sync(state);
121
122 auto begin_sync_layer = [&](OverlayLayer &layer) {
123 layer.armatures.begin_sync(resources, state);
124 layer.attribute_viewer.begin_sync(resources, state);
125 layer.bounds.begin_sync();
126 layer.cameras.begin_sync(resources, state, view);
127 layer.curves.begin_sync(resources, state, view);
128 layer.edit_text.begin_sync(state);
129 layer.empties.begin_sync(resources, state, view);
130 layer.facing.begin_sync(resources, state);
131 layer.fade.begin_sync(resources, state);
132 layer.force_fields.begin_sync();
133 layer.fluids.begin_sync(resources, state);
134 layer.grease_pencil.begin_sync(resources, state, view);
135 layer.lattices.begin_sync(resources, state);
136 layer.lights.begin_sync();
137 layer.light_probes.begin_sync(resources, state);
138 layer.metaballs.begin_sync();
139 layer.meshes.begin_sync(resources, state, view);
140 layer.mesh_uvs.begin_sync(resources, state);
141 layer.mode_transfer.begin_sync(resources, state);
142 layer.paints.begin_sync(resources, state);
143 layer.particles.begin_sync(resources, state);
144 layer.prepass.begin_sync(resources, state);
145 layer.relations.begin_sync(resources, state);
146 layer.speakers.begin_sync();
147 layer.sculpts.begin_sync(resources, state);
148 layer.wireframe.begin_sync(resources, state);
149 };
150 begin_sync_layer(regular);
151 begin_sync_layer(infront);
152
153 grid.begin_sync(resources, shapes, state, view);
154
157}
158
160{
161 const bool in_edit_mode = object_is_edit_mode(ob_ref.object);
162 const bool in_paint_mode = object_is_paint_mode(ob_ref.object);
163 const bool in_sculpt_mode = object_is_sculpt_mode(ob_ref);
164 const bool in_particle_edit_mode = object_is_particle_edit_mode(ob_ref);
165 const bool in_edit_paint_mode = object_is_edit_paint_mode(
166 ob_ref, in_edit_mode, in_paint_mode, in_sculpt_mode);
167 const bool needs_prepass = object_needs_prepass(ob_ref, in_paint_mode);
168
169 OverlayLayer &layer = object_is_in_front(ob_ref.object, state) ? infront : regular;
170
171 layer.mode_transfer.object_sync(manager, ob_ref, state);
172
173 if (needs_prepass) {
174 layer.prepass.object_sync(manager, ob_ref, resources, state);
175 }
176
177 if (in_particle_edit_mode) {
178 layer.particles.edit_object_sync(manager, ob_ref, resources, state);
179 }
180
181 if (in_paint_mode) {
182 switch (ob_ref.object->type) {
183 case OB_MESH:
184 /* TODO(fclem): Make it part of a #Meshes. */
185 layer.paints.object_sync(manager, ob_ref, state);
186 break;
187 case OB_GREASE_PENCIL:
188 layer.grease_pencil.paint_object_sync(manager, ob_ref, state, resources);
189 break;
190 default:
191 break;
192 }
193 }
194
195 if (in_sculpt_mode) {
196 switch (ob_ref.object->type) {
197 case OB_MESH:
198 /* TODO(fclem): Make it part of a #Meshes. */
199 layer.sculpts.object_sync(manager, ob_ref, state);
200 break;
201 case OB_GREASE_PENCIL:
202 layer.grease_pencil.sculpt_object_sync(manager, ob_ref, state, resources);
203 break;
204 default:
205 break;
206 }
207 }
208
209 if (in_edit_mode && !state.hide_overlays) {
210 switch (ob_ref.object->type) {
211 case OB_MESH:
212 layer.meshes.edit_object_sync(manager, ob_ref, state, resources);
213 /* TODO(fclem): Find a better place / condition. */
214 layer.mesh_uvs.edit_object_sync(manager, ob_ref, state);
215 break;
216 case OB_ARMATURE:
217 layer.armatures.edit_object_sync(ob_ref, resources, shapes, state);
218 break;
219 case OB_SURF:
220 case OB_CURVES_LEGACY:
221 layer.curves.edit_object_sync_legacy(manager, ob_ref, resources);
222 break;
223 case OB_CURVES:
224 layer.curves.edit_object_sync(manager, ob_ref, resources);
225 break;
226 case OB_LATTICE:
227 layer.lattices.edit_object_sync(manager, ob_ref, resources);
228 break;
229 case OB_MBALL:
230 layer.metaballs.edit_object_sync(ob_ref, resources);
231 break;
232 case OB_FONT:
233 layer.edit_text.edit_object_sync(ob_ref, resources);
234 break;
235 case OB_GREASE_PENCIL:
236 layer.grease_pencil.edit_object_sync(manager, ob_ref, state, resources);
237 break;
238 }
239 }
240
242 layer.wireframe.object_sync(manager, ob_ref, state, resources, in_edit_paint_mode);
243 }
244
245 if (!state.hide_overlays) {
246 switch (ob_ref.object->type) {
247 case OB_EMPTY:
248 layer.empties.object_sync(ob_ref, shapes, manager, resources, state);
249 break;
250 case OB_CAMERA:
251 layer.cameras.object_sync(ob_ref, shapes, manager, resources, state);
252 break;
253 case OB_ARMATURE:
254 if (!in_edit_mode) {
255 layer.armatures.object_sync(ob_ref, resources, shapes, state);
256 }
257 break;
258 case OB_LATTICE:
259 if (!in_edit_mode) {
260 layer.lattices.object_sync(manager, ob_ref, resources, state);
261 }
262 break;
263 case OB_LAMP:
264 layer.lights.object_sync(ob_ref, resources, state);
265 break;
266 case OB_LIGHTPROBE:
267 layer.light_probes.object_sync(ob_ref, resources, state);
268 break;
269 case OB_MBALL:
270 if (!in_edit_mode) {
271 layer.metaballs.object_sync(ob_ref, resources, state);
272 }
273 break;
274 case OB_GREASE_PENCIL:
275 layer.grease_pencil.object_sync(ob_ref, resources, state);
276 break;
277 case OB_SPEAKER:
278 layer.speakers.object_sync(ob_ref, resources, state);
279 break;
280 }
281 layer.attribute_viewer.object_sync(ob_ref, state, manager);
282 layer.bounds.object_sync(ob_ref, resources, state);
283 layer.facing.object_sync(manager, ob_ref, state);
284 layer.fade.object_sync(manager, ob_ref, state);
285 layer.force_fields.object_sync(ob_ref, resources, state);
286 layer.fluids.object_sync(manager, ob_ref, resources, state);
287 layer.particles.object_sync(manager, ob_ref, resources, state);
288 layer.relations.object_sync(ob_ref, resources, state);
289
291 origins.object_sync(ob_ref, resources, state);
292
293 if (object_is_selected(ob_ref) && !in_edit_paint_mode) {
294 outline.object_sync(manager, ob_ref, state);
295 }
296 }
297}
298
300{
301 origins.end_sync(resources, state);
303
304 auto end_sync_layer = [&](OverlayLayer &layer) {
305 layer.armatures.end_sync(resources, shapes, state);
306 layer.bounds.end_sync(resources, shapes, state);
307 layer.cameras.end_sync(resources, shapes, state);
308 layer.edit_text.end_sync(resources, shapes, state);
309 layer.empties.end_sync(resources, shapes, state);
310 layer.force_fields.end_sync(resources, shapes, state);
311 layer.lights.end_sync(resources, shapes, state);
312 layer.light_probes.end_sync(resources, shapes, state);
313 layer.mesh_uvs.end_sync(resources, shapes, state);
314 layer.metaballs.end_sync(resources, shapes, state);
315 layer.relations.end_sync(resources, state);
316 layer.fluids.end_sync(resources, shapes, state);
317 layer.speakers.end_sync(resources, shapes, state);
318 };
319 end_sync_layer(regular);
320 end_sync_layer(infront);
321
322 /* WORKAROUND: This prevents bad frame-buffer config inside workbench when xray is enabled.
323 * Better find a solution to this chicken-egg problem. */
324 {
325 /* HACK we allocate the in front depth here to avoid the overhead when if is not needed. */
328
331
333 &dfbl->in_front_fb,
334 {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
335 }
336}
337
339{
344
347
348 int2 render_size = int2(resources.depth_tx.size());
349
350 const DRWView *view_legacy = DRW_view_default_get();
351 View view("OverlayView", view_legacy);
352
353 /* TODO(fclem): Remove mandatory allocation. */
357 }
358
359 if (state.xray_enabled) {
360 /* For X-ray we render the scene to a separate depth buffer. */
364 }
365 else {
368 }
369
370 /* TODO: Better semantics using a switch? */
372 /* Likely to be the selection case. Allocate dummy texture and bind only depth buffer. */
375
378
381
386 }
387 else {
390 resources.line_tx.acquire(render_size, GPU_RGBA8, usage);
391 resources.overlay_tx.acquire(render_size, GPU_SRGB8_A8, usage);
392
405 }
406
414
415 static gpu::DebugScope select_scope = {"Selection"};
416 static gpu::DebugScope draw_scope = {"Overlay"};
417
418 if (resources.selection_type != SelectionType::DISABLED) {
419 select_scope.begin_capture();
420 }
421 else {
422 draw_scope.begin_capture();
423 }
424
425 regular.sculpts.draw_on_render(resources.render_fb, manager, view);
426 regular.mesh_uvs.draw_on_render(resources.render_fb, manager, view);
427 infront.sculpts.draw_on_render(resources.render_in_front_fb, manager, view);
428 regular.mesh_uvs.draw_on_render(resources.render_in_front_fb, manager, view);
429
431 float4 clear_color(0.0f);
432 if (state.xray_enabled) {
433 /* Rendering to a new depth buffer that needs to be cleared. */
435 }
436 else {
438 }
439
440 regular.cameras.draw_scene_background_images(resources.overlay_color_only_fb, manager, view);
441 infront.cameras.draw_scene_background_images(resources.overlay_color_only_fb, manager, view);
442
443 regular.empties.draw_background_images(resources.overlay_color_only_fb, manager, view);
444 regular.cameras.draw_background_images(resources.overlay_color_only_fb, manager, view);
445 infront.cameras.draw_background_images(resources.overlay_color_only_fb, manager, view);
446
447 regular.empties.draw_images(resources.overlay_fb, manager, view);
448
449 regular.prepass.draw(resources.overlay_line_fb, manager, view);
450 infront.prepass.draw(resources.overlay_line_in_front_fb, manager, view);
451
452 outline.draw(resources, manager, view);
453
454 auto overlay_fb_draw = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
455 layer.facing.draw(framebuffer, manager, view);
456 layer.fade.draw(framebuffer, manager, view);
457 layer.mode_transfer.draw(framebuffer, manager, view);
458 layer.edit_text.draw(framebuffer, manager, view);
459 layer.paints.draw(framebuffer, manager, view);
460 layer.particles.draw_no_line(framebuffer, manager, view);
461 };
462
463 auto draw_layer = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
464 layer.bounds.draw(framebuffer, manager, view);
465 layer.wireframe.draw(framebuffer, manager, view);
466 layer.cameras.draw(framebuffer, manager, view);
467 layer.empties.draw(framebuffer, manager, view);
468 layer.force_fields.draw(framebuffer, manager, view);
469 layer.lights.draw(framebuffer, manager, view);
470 layer.light_probes.draw(framebuffer, manager, view);
471 layer.speakers.draw(framebuffer, manager, view);
472 layer.lattices.draw(framebuffer, manager, view);
473 layer.metaballs.draw(framebuffer, manager, view);
474 layer.relations.draw(framebuffer, manager, view);
475 layer.fluids.draw(framebuffer, manager, view);
476 layer.particles.draw(framebuffer, manager, view);
477 layer.attribute_viewer.draw(framebuffer, manager, view);
478 layer.armatures.draw(framebuffer, manager, view);
479 layer.sculpts.draw(framebuffer, manager, view);
480 layer.grease_pencil.draw(framebuffer, manager, view);
481 layer.meshes.draw(framebuffer, manager, view);
482 layer.mesh_uvs.draw(framebuffer, manager, view);
483 layer.curves.draw(framebuffer, manager, view);
484 };
485
486 auto draw_layer_color_only = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
487 layer.light_probes.draw_color_only(framebuffer, manager, view);
488 layer.meshes.draw_color_only(framebuffer, manager, view);
489 layer.curves.draw_color_only(framebuffer, manager, view);
490 layer.grease_pencil.draw_color_only(framebuffer, manager, view);
491 };
492
493 overlay_fb_draw(regular, resources.overlay_fb);
494 draw_layer(regular, resources.overlay_line_fb);
495
496 overlay_fb_draw(infront, resources.overlay_in_front_fb);
497 draw_layer(infront, resources.overlay_line_in_front_fb);
498
501 grid.draw(resources.overlay_color_only_fb, manager, view);
502
503 draw_layer_color_only(regular, resources.overlay_color_only_fb);
504 draw_layer_color_only(infront, resources.overlay_color_only_fb);
505
506 infront.empties.draw_in_front_images(resources.overlay_color_only_fb, manager, view);
507 regular.cameras.draw_in_front(resources.overlay_color_only_fb, manager, view);
508 infront.cameras.draw_in_front(resources.overlay_color_only_fb, manager, view);
509
510 origins.draw(resources.overlay_color_only_fb, manager, view);
511
512 background.draw(resources.overlay_output_fb, manager, view);
514
521
523
524 if (resources.selection_type != SelectionType::DISABLED) {
525 select_scope.end_capture();
526 }
527 else {
528 draw_scope.end_capture();
529 }
530}
531
532bool Instance::object_is_selected(const ObjectRef &ob_ref)
533{
534 return (ob_ref.object->base_flag & BASE_SELECTED);
535}
536
537bool Instance::object_is_paint_mode(const Object *object)
538{
539 if (object->type == OB_GREASE_PENCIL && (state.object_mode & OB_MODE_ALL_PAINT_GPENCIL)) {
540 return true;
541 }
542 return state.active_base && (object == state.active_base->object) &&
544}
545
546bool Instance::object_is_sculpt_mode(const ObjectRef &ob_ref)
547{
549 const Object *active_object = state.active_base->object;
550 const bool is_active_object = ob_ref.object == active_object;
551
552 bool is_geonode_preview = ob_ref.dupli_object && ob_ref.dupli_object->preview_base_geometry;
553 bool is_active_dupli_parent = ob_ref.dupli_parent == active_object;
554 return is_active_object || (is_active_dupli_parent && is_geonode_preview);
555 }
556
558 const Object *active_object = state.active_base->object;
559 const bool is_active_object = ob_ref.object == active_object;
560 return is_active_object;
561 }
562
563 return false;
564}
565
566bool Instance::object_is_particle_edit_mode(const ObjectRef &ob_ref)
567{
568 return (ob_ref.object->mode == OB_MODE_PARTICLE_EDIT) && (state.ctx_mode == CTX_MODE_PARTICLE);
569}
570
571bool Instance::object_is_sculpt_mode(const Object *object)
572{
573 if (object->sculpt && (object->sculpt->mode_type == OB_MODE_SCULPT)) {
574 return object == state.active_base->object;
575 }
576 return false;
577}
578
579bool Instance::object_is_edit_paint_mode(const ObjectRef &ob_ref,
580 bool in_edit_mode,
581 bool in_paint_mode,
582 bool in_sculpt_mode)
583{
584 bool in_edit_paint_mode = in_edit_mode || in_paint_mode || in_sculpt_mode;
585 if (ob_ref.object->base_flag & BASE_FROM_DUPLI) {
586 /* Disable outlines for objects instanced by an object in sculpt, paint or edit mode. */
587 in_edit_paint_mode |= ob_ref.dupli_parent && (object_is_edit_mode(ob_ref.dupli_parent) ||
588 object_is_sculpt_mode(ob_ref.dupli_parent) ||
589 object_is_paint_mode(ob_ref.dupli_parent));
590 }
591 return in_edit_paint_mode;
592}
593
594bool Instance::object_is_edit_mode(const Object *object)
595{
596 if (DRW_object_is_in_edit_mode(object)) {
597 /* Also check for context mode as the object mode is not 100% reliable. (see T72490) */
598 switch (object->type) {
599 case OB_MESH:
601 case OB_ARMATURE:
603 case OB_CURVES_LEGACY:
605 case OB_SURF:
607 case OB_LATTICE:
609 case OB_MBALL:
611 case OB_FONT:
613 case OB_CURVES:
615 case OB_POINTCLOUD:
617 case OB_GREASE_PENCIL:
619 case OB_VOLUME:
620 /* No edit mode yet. */
621 return false;
622 }
623 }
624 return false;
625}
626
627bool Instance::object_is_in_front(const Object *object, const State &state)
628{
629 switch (object->type) {
630 case OB_ARMATURE:
631 return (object->dtx & OB_DRAW_IN_FRONT) ||
633 case OB_MESH:
634 case OB_CURVES_LEGACY:
635 case OB_GREASE_PENCIL:
636 case OB_SURF:
637 case OB_LATTICE:
638 case OB_MBALL:
639 case OB_FONT:
640 case OB_CURVES:
641 case OB_POINTCLOUD:
642 case OB_VOLUME:
643 return state.use_in_front && (object->dtx & OB_DRAW_IN_FRONT);
644 }
645 return false;
646}
647
648bool Instance::object_needs_prepass(const ObjectRef &ob_ref, bool in_paint_mode)
649{
650 if (in_paint_mode) {
651 /* Allow paint overlays to draw with depth equal test. */
652 return object_is_rendered_transparent(ob_ref.object, state);
653 }
654
655 if (!state.xray_enabled || (selection_type_ != SelectionType::DISABLED)) {
656 return ob_ref.object->dt >= OB_SOLID;
657 }
658
659 return false;
660}
661
662bool Instance::object_is_rendered_transparent(const Object *object, const State &state)
663{
664 if (state.v3d == nullptr) {
665 return false;
666 }
667
668 if (state.xray_enabled) {
669 return true;
670 }
671
672 if (ELEM(object->dt, OB_WIRE, OB_BOUNDBOX)) {
673 return true;
674 }
675
676 const View3DShading &shading = state.v3d->shading;
677
678 if (shading.type == OB_WIRE) {
679 return true;
680 }
681
682 if (shading.type > OB_SOLID) {
683 return false;
684 }
685
686 if (shading.color_type == V3D_SHADING_OBJECT_COLOR) {
687 return object->color[3] < 1.0f;
688 }
689
690 if (shading.color_type == V3D_SHADING_MATERIAL_COLOR) {
691 if (object->type == OB_MESH) {
692 Mesh *mesh = static_cast<Mesh *>(object->data);
693 for (int i = 0; i < mesh->totcol; i++) {
694 Material *mat = BKE_object_material_get_eval(const_cast<Object *>(object), i + 1);
695 if (mat && mat->a < 1.0f) {
696 return true;
697 }
698 }
699 }
700 }
701
702 return false;
703}
704
705} // namespace blender::draw::overlay
@ CTX_MODE_EDIT_POINT_CLOUD
@ CTX_MODE_EDIT_CURVE
@ CTX_MODE_EDIT_SURFACE
@ CTX_MODE_PARTICLE
@ CTX_MODE_EDIT_MESH
@ CTX_MODE_EDIT_GREASE_PENCIL
@ CTX_MODE_EDIT_TEXT
@ CTX_MODE_EDIT_CURVES
@ CTX_MODE_EDIT_ARMATURE
@ CTX_MODE_EDIT_LATTICE
@ CTX_MODE_EDIT_METABALL
enum eContextObjectMode CTX_data_mode_enum_ex(const Object *obedit, const Object *ob, eObjectMode object_mode)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Base * BKE_view_layer_active_base_get(ViewLayer *view_layer)
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 ELEM(...)
float DEG_get_ctime(const Depsgraph *graph)
@ BASE_FROM_DUPLI
#define OB_MODE_ALL_PAINT
@ OB_WIRE
@ OB_BOUNDBOX
@ OB_SOLID
#define OB_MODE_ALL_PAINT_GPENCIL
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_WEIGHT_PAINT
@ OB_MODE_SCULPT
@ OB_MODE_SCULPT_CURVES
@ 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_CURVES
@ OB_LIGHTPROBE
@ OB_DRAW_IN_FRONT
#define BASE_SELECTED(v3d, base)
@ SI_OVERLAY_SHOW_OVERLAYS
eSpace_Type
@ SPACE_IMAGE
@ SPACE_VIEW3D
@ V3D_SHADING_MATERIAL_COLOR
@ V3D_SHADING_OBJECT_COLOR
@ V3D_OVERLAY_HIDE_OBJECT_ORIGINS
@ V3D_OVERLAY_HIDE_BONES
@ V3D_OVERLAY_HIDE_MOTION_PATHS
@ V3D_OVERLAY_HIDE_OBJECT_XTRAS
@ V3D_OVERLAY_HIDE_TEXT
@ V3D_OVERLAY_BONE_SELECT
@ V3D_HIDE_OVERLAYS
DRWTextureFlag
void ED_space_image_get_size(SpaceImage *sima, int *r_width, int *r_height)
void ED_space_image_get_uv_aspect(SpaceImage *sima, float *r_aspx, float *r_aspy)
void ED_space_image_get_aspect(SpaceImage *sima, float *r_aspx, float *r_aspy)
#define XRAY_ACTIVE(v3d)
#define XRAY_ALPHA(v3d)
static AppView * view
#define GPU_ATTACHMENT_TEXTURE(_texture)
#define GPU_ATTACHMENT_NONE
void GPU_framebuffer_clear_color_depth(GPUFrameBuffer *fb, const float clear_col[4], float clear_depth)
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_DATA_FLOAT
eGPUTextureUsage
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
@ GPU_TEXTURE_USAGE_ATTACHMENT
void GPU_texture_update_sub(GPUTexture *texture, eGPUDataFormat data_format, const void *pixels, int offset_x, int offset_y, int offset_z, int width, int height, int depth)
@ GPU_SRGB8_A8
@ GPU_DEPTH24_STENCIL8
@ GPU_DEPTH_COMPONENT32F
unsigned int U
Definition btGjkEpa3.h:78
void ensure(GPUAttachment depth=GPU_ATTACHMENT_NONE, GPUAttachment color1=GPU_ATTACHMENT_NONE, GPUAttachment color2=GPU_ATTACHMENT_NONE, GPUAttachment color3=GPU_ATTACHMENT_NONE, GPUAttachment color4=GPU_ATTACHMENT_NONE, GPUAttachment color5=GPU_ATTACHMENT_NONE, GPUAttachment color6=GPU_ATTACHMENT_NONE, GPUAttachment color7=GPU_ATTACHMENT_NONE, GPUAttachment color8=GPU_ATTACHMENT_NONE)
void acquire(int2 extent, eGPUTextureFormat format, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL)
void wrap(GPUTexture *tex)
bool ensure_2d(eGPUTextureFormat format, int2 extent, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL, const float *data=nullptr, int mip_len=1)
int3 size(int miplvl=0) const
void draw(Framebuffer &framebuffer, Manager &manager, View &)
static bool is_pose_mode(const Object *armature_ob, const State &state)
void object_sync(ObjectRef &ob_ref, Manager &manager)
void begin_sync(Resources &res, const State &state)
void draw_color_only(Framebuffer &framebuffer, Manager &manager, View &view)
void object_sync(const ObjectRef &ob_ref, Resources &, const State &state)
void begin_sync(Resources &res, const State &state)
void draw(Resources &res, Manager &manager, View &view)
void object_sync(Manager &manager, const ObjectRef &ob_ref, const State &state)
void begin_sync(Resources &res, State &state)
void draw(Framebuffer &framebuffer, Manager &manager, View &)
DRW_Global G_draw
Simple API to draw debug shapes and log in the viewport.
DefaultFramebufferList * DRW_viewport_framebuffer_list_get()
bool DRW_object_is_in_edit_mode(const Object *ob)
DRWTextStore * DRW_text_cache_ensure()
DefaultTextureList * DRW_viewport_texture_list_get()
const DRWContextState * DRW_context_state_get()
const DRWView * DRW_view_default_get()
void DRW_texture_ensure_fullscreen_2d(GPUTexture **tex, eGPUTextureFormat format, DRWTextureFlag flags)
RAYTRACE_GROUP_SIZE additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_global_ubo", "eevee_sampling_data", "eevee_utility_texture", "eevee_hiz_data", "draw_view") .specialization_constant(Type RAYTRACE_GROUP_SIZE in_sh_0_tx in_sh_2_tx screen_normal_tx GPU_RGBA8
static ulong state[N]
VecBase< int32_t, 2 > int2
struct Object * object
Object * object_pose
ViewLayer * view_layer
Depsgraph * depsgraph
eObjectMode object_mode
ARegion * region
Object * object_edit
RegionView3D * rv3d
SpaceLink * space_data
GlobalsUboStorage block
GPUTexture * weight_ramp
GPUUniformBuf * block_ubo
GPUFrameBuffer * in_front_fb
GPUFrameBuffer * default_fb
GPUTexture * depth_in_front
short base_flag
SpaceImageOverlay overlay
View3DOverlay overlay
View3DShading shading