Blender V5.0
space_view3d.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2008 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9/* Allow using deprecated functionality for .blend file I/O. */
10#define DNA_DEPRECATED_ALLOW
11
12#include <cstring>
13
15#include "DNA_defaults.h"
18#include "DNA_object_types.h"
19#include "DNA_scene_types.h"
20#include "DNA_view3d_types.h"
21
22#include "MEM_guardedalloc.h"
23
24#include "BLI_listbase.h"
25#include "BLI_math_matrix.h"
26#include "BLI_math_vector.h"
27#include "BLI_string_utf8.h"
28#include "BLI_utildefines.h"
29
30#include "BKE_asset.hh"
31#include "BKE_context.hh"
32#include "BKE_global.hh"
33#include "BKE_gpencil_legacy.h"
34#include "BKE_idprop.hh"
35#include "BKE_layer.hh"
36#include "BKE_lib_id.hh"
37#include "BKE_lib_query.hh"
38#include "BKE_lib_remap.hh"
39#include "BKE_library.hh"
40#include "BKE_main.hh"
41#include "BKE_object.hh"
42#include "BKE_scene.hh"
43#include "BKE_screen.hh"
44#include "BKE_viewer_path.hh"
45
46#include "ED_asset_shelf.hh"
47#include "ED_geometry.hh"
48#include "ED_info.hh"
49#include "ED_object.hh"
50#include "ED_outliner.hh"
51#include "ED_render.hh"
52#include "ED_screen.hh"
53#include "ED_space_api.hh"
54#include "ED_transform.hh"
55#include "ED_undo.hh"
56
57#include "GPU_matrix.hh"
58
59#include "DRW_engine.hh"
60
61#include "WM_api.hh"
62#include "WM_message.hh"
63#include "WM_toolsystem.hh"
64#include "WM_types.hh"
65
66#include "RNA_access.hh"
67
68#include "UI_interface.hh"
69
70#include "BLO_read_write.hh"
71
72#ifdef WITH_PYTHON
73# include "BPY_extern.hh"
74#endif
75
76#include "DEG_depsgraph.hh"
78
79#include "view3d_intern.hh" /* own include */
80#include "view3d_navigate.hh"
81
82/* ******************** manage regions ********************* */
83
84bool ED_view3d_area_user_region(const ScrArea *area, const View3D *v3d, ARegion **r_region)
85{
86 RegionView3D *rv3d = nullptr;
87 ARegion *region_unlock_user = nullptr;
88 ARegion *region_unlock = nullptr;
89 const ListBase *region_list = (v3d == area->spacedata.first) ? &area->regionbase :
90 &v3d->regionbase;
91
93
94 LISTBASE_FOREACH (ARegion *, region, region_list) {
95 /* find the first unlocked rv3d */
96 if (region->regiondata && region->regiontype == RGN_TYPE_WINDOW) {
97 rv3d = static_cast<RegionView3D *>(region->regiondata);
98 if ((rv3d->viewlock & RV3D_LOCK_ROTATION) == 0) {
99 region_unlock = region;
100 if (ELEM(rv3d->persp, RV3D_PERSP, RV3D_CAMOB)) {
101 region_unlock_user = region;
102 break;
103 }
104 }
105 }
106 }
107
108 /* camera/perspective view get priority when the active region is locked */
109 if (region_unlock_user) {
110 *r_region = region_unlock_user;
111 return true;
112 }
113
114 if (region_unlock) {
115 *r_region = region_unlock;
116 return true;
117 }
118
119 return false;
120}
121
123{
124 /* local viewmat and persmat, to calculate projections */
125 mul_m4_m4m4(rv3d->viewmatob, rv3d->viewmat, ob->object_to_world().ptr());
126 mul_m4_m4m4(rv3d->persmatob, rv3d->persmat, ob->object_to_world().ptr());
127
128 /* initializes object space clipping, speeds up clip tests */
129 ED_view3d_clipping_local(rv3d, ob->object_to_world().ptr());
130}
131
133{
134 ED_view3d_init_mats_rv3d(ob, rv3d);
135
136 /* We have to multiply instead of loading `viewmatob` to make
137 * it work with duplis using display-lists, otherwise it will
138 * override the dupli-matrix. */
139 GPU_matrix_mul(ob->object_to_world().ptr());
140}
141
142#ifndef NDEBUG
144{
145 zero_m4(rv3d->viewmatob);
146 zero_m4(rv3d->persmatob);
147}
148
154#endif
155
157{
158 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
159
160 if (rv3d->view_render) {
161#ifdef WITH_PYTHON
163#endif
164
166
167#ifdef WITH_PYTHON
169#endif
170
172 }
173
174 /* A bit overkill but this make sure the viewport is reset completely. (fclem) */
175 WM_draw_region_free(region);
176}
177
178void ED_view3d_shade_update(Main *bmain, View3D *v3d, ScrArea *area)
179{
180 wmWindowManager *wm = static_cast<wmWindowManager *>(bmain->wm.first);
181
182 if (v3d->shading.type != OB_RENDER) {
183 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
184 if ((region->regiontype == RGN_TYPE_WINDOW) && region->regiondata) {
186 }
187 }
188 }
189}
190
191/* ******************** default callbacks for view3d space ***************** */
192
193static SpaceLink *view3d_create(const ScrArea * /*area*/, const Scene *scene)
194{
195 ARegion *region;
196 View3D *v3d;
197 RegionView3D *rv3d;
198
200
201 if (scene) {
202 v3d->camera = scene->camera;
203 }
204
205 /* header */
206 region = BKE_area_region_new();
207
208 BLI_addtail(&v3d->regionbase, region);
209 region->regiontype = RGN_TYPE_HEADER;
211
212 /* tool header */
213 region = BKE_area_region_new();
214
215 BLI_addtail(&v3d->regionbase, region);
219
220 /* asset shelf */
221 region = BKE_area_region_new();
222
223 BLI_addtail(&v3d->regionbase, region);
225 region->alignment = RGN_ALIGN_BOTTOM;
226 region->flag |= RGN_FLAG_HIDDEN;
227
228 /* asset shelf header */
229 region = BKE_area_region_new();
230 BLI_addtail(&v3d->regionbase, region);
233
234 /* tool shelf */
235 region = BKE_area_region_new();
236
237 BLI_addtail(&v3d->regionbase, region);
238 region->regiontype = RGN_TYPE_TOOLS;
239 region->alignment = RGN_ALIGN_LEFT;
240 region->flag = RGN_FLAG_HIDDEN;
241
242 /* buttons/list view */
243 region = BKE_area_region_new();
244
245 BLI_addtail(&v3d->regionbase, region);
246 region->regiontype = RGN_TYPE_UI;
247 region->alignment = RGN_ALIGN_RIGHT;
248 region->flag = RGN_FLAG_HIDDEN;
249
250 /* main region */
251 region = BKE_area_region_new();
252
253 BLI_addtail(&v3d->regionbase, region);
254 region->regiontype = RGN_TYPE_WINDOW;
255
256 region->regiondata = MEM_callocN<RegionView3D>("region view3d");
257 rv3d = static_cast<RegionView3D *>(region->regiondata);
258 rv3d->viewquat[0] = 1.0f;
259 rv3d->persp = RV3D_PERSP;
260 rv3d->view = RV3D_VIEW_USER;
261 rv3d->dist = 10.0;
262
263 return (SpaceLink *)v3d;
264}
265
266/* Doesn't free the space-link itself. */
267static void view3d_free(SpaceLink *sl)
268{
269 View3D *vd = (View3D *)sl;
270
271 if (vd->localvd) {
272 MEM_freeN(vd->localvd);
273 }
274
276
279 vd->runtime.properties_storage_free = nullptr;
280 }
281
282 if (vd->shading.prop) {
284 vd->shading.prop = nullptr;
285 }
286
288}
289
290/* spacetype; init callback */
291static void view3d_init(wmWindowManager * /*wm*/, ScrArea * /*area*/) {}
292
293static void view3d_exit(wmWindowManager * /*wm*/, ScrArea *area)
294{
296 View3D *v3d = static_cast<View3D *>(area->spacedata.first);
298}
299
301{
302 View3D *v3do = (View3D *)sl;
303 View3D *v3dn = static_cast<View3D *>(MEM_dupallocN(sl));
304
305 v3dn->runtime = View3D_Runtime{};
306
307 /* clear or remove stuff from old */
308
309 if (v3dn->localvd) {
310 v3dn->localvd = nullptr;
311 }
312
313 v3dn->local_collections_uid = 0;
315
316 if (v3dn->shading.type == OB_RENDER) {
317 v3dn->shading.type = OB_SOLID;
318 }
319
320 if (v3dn->shading.prop) {
322 }
323
325
326 /* copy or clear inside new stuff */
327
328 return (SpaceLink *)v3dn;
329}
330
331/* add handlers, stuff you only do once or on area/region changes */
333{
334 ListBase *lb;
335 wmKeyMap *keymap;
336
337 /* object ops. */
338
339 /* important to be before Pose keymap since they can both be enabled at once */
340 keymap = WM_keymap_ensure(wm->runtime->defaultconf,
341 "Paint Face Mask (Weight, Vertex, Texture)",
344 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
345
346 keymap = WM_keymap_ensure(wm->runtime->defaultconf,
347 "Paint Vertex Selection (Weight, Vertex)",
350 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
351
352 /* Before 'Weight/Vertex Paint' so adding curve points is not overridden. */
353 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Paint Curve", SPACE_EMPTY, RGN_TYPE_WINDOW);
354 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
355
356 /* Before 'Pose' so weight paint menus aren't overridden by pose menus. */
357 keymap = WM_keymap_ensure(
358 wm->runtime->defaultconf, "Weight Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
359 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
360
361 keymap = WM_keymap_ensure(
362 wm->runtime->defaultconf, "Vertex Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
363 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
364
365 /* pose is not modal, operator poll checks for this */
366 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Pose", SPACE_EMPTY, RGN_TYPE_WINDOW);
367 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
368
369 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
370 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
371
372 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Curve", SPACE_EMPTY, RGN_TYPE_WINDOW);
373 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
374
375 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Curves", SPACE_EMPTY, RGN_TYPE_WINDOW);
376 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
377
378 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Image Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
379 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
380
381 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Sculpt", SPACE_EMPTY, RGN_TYPE_WINDOW);
382 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
383
384 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Mesh", SPACE_EMPTY, RGN_TYPE_WINDOW);
385 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
386
387 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Armature", SPACE_EMPTY, RGN_TYPE_WINDOW);
388 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
389
390 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Metaball", SPACE_EMPTY, RGN_TYPE_WINDOW);
391 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
392
393 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Lattice", SPACE_EMPTY, RGN_TYPE_WINDOW);
394 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
395
396 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Particle", SPACE_EMPTY, RGN_TYPE_WINDOW);
397 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
398
399 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Point Cloud", SPACE_EMPTY, RGN_TYPE_WINDOW);
400 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
401
402 keymap = WM_keymap_ensure(
403 wm->runtime->defaultconf, "Sculpt Curves", SPACE_EMPTY, RGN_TYPE_WINDOW);
404 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
405
406 /* NOTE: Grease Pencil handlers used to be added using #ED_KEYMAP_GPENCIL in
407 * `ed_default_handlers` because it needed to be added to multiple editors (as other editors use
408 * annotations.). But for OB_GREASE_PENCIL, we only need it to register the keymaps for the
409 * 3D View. */
410 keymap = WM_keymap_ensure(
411 wm->runtime->defaultconf, "Grease Pencil Selection", SPACE_EMPTY, RGN_TYPE_WINDOW);
412 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
413
414 keymap = WM_keymap_ensure(
415 wm->runtime->defaultconf, "Grease Pencil Edit Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
416 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
417
418 keymap = WM_keymap_ensure(
419 wm->runtime->defaultconf, "Grease Pencil Paint Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
420 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
421
422 keymap = WM_keymap_ensure(
423 wm->runtime->defaultconf, "Grease Pencil Sculpt Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
424 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
425
426 keymap = WM_keymap_ensure(
427 wm->runtime->defaultconf, "Grease Pencil Weight Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
428 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
429
430 keymap = WM_keymap_ensure(
431 wm->runtime->defaultconf, "Grease Pencil Vertex Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
432 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
433
434 keymap = WM_keymap_ensure(
435 wm->runtime->defaultconf, "Grease Pencil Brush Stroke", SPACE_EMPTY, RGN_TYPE_WINDOW);
436 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
437
438 keymap = WM_keymap_ensure(
439 wm->runtime->defaultconf, "Grease Pencil Fill Tool", SPACE_EMPTY, RGN_TYPE_WINDOW);
440 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
441
442 /* Edit-font key-map swallows almost all (because of text input). */
443 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Font", SPACE_EMPTY, RGN_TYPE_WINDOW);
444 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
445
446 keymap = WM_keymap_ensure(
447 wm->runtime->defaultconf, "Object Non-modal", SPACE_EMPTY, RGN_TYPE_WINDOW);
448 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
449
450 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "Frames", SPACE_EMPTY, RGN_TYPE_WINDOW);
451 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
452
453 /* own keymap, last so modes can override it */
454 keymap = WM_keymap_ensure(
455 wm->runtime->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
456 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
457
458 keymap = WM_keymap_ensure(wm->runtime->defaultconf, "3D View", SPACE_VIEW3D, RGN_TYPE_WINDOW);
459 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
460
461 /* add drop boxes */
463
464 WM_event_add_dropbox_handler(&region->runtime->handlers, lb);
465}
466
468{
470}
471
472static void view3d_widgets()
473{
476
488 /* TODO(@ideasman42): Not working well enough, disable for now. */
489#if 0
491#endif
492
501
504
506
509}
510
511/* type callback, not region itself */
513{
514 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
515
516 if (rv3d) {
517 if (rv3d->localvd) {
518 MEM_freeN(rv3d->localvd);
519 }
520 if (rv3d->clipbb) {
521 MEM_freeN(rv3d->clipbb);
522 }
523
524 if (rv3d->view_render) {
526 }
527
528 if (rv3d->sms) {
529 view3d_smooth_free(rv3d);
530 }
531
532 MEM_freeN(rv3d);
533 region->regiondata = nullptr;
534 }
535}
536
537/* copy regiondata */
538static void *view3d_main_region_duplicate(void *poin)
539{
540 if (poin) {
541 RegionView3D *rv3d = static_cast<RegionView3D *>(poin);
542 RegionView3D *new_rv3d;
543
544 new_rv3d = static_cast<RegionView3D *>(MEM_dupallocN(rv3d));
545 if (rv3d->localvd) {
546 new_rv3d->localvd = static_cast<RegionView3D *>(MEM_dupallocN(rv3d->localvd));
547 }
548 if (rv3d->clipbb) {
549 new_rv3d->clipbb = static_cast<BoundBox *>(MEM_dupallocN(rv3d->clipbb));
550 }
551
552 new_rv3d->view_render = nullptr;
553 new_rv3d->sms = nullptr;
554 new_rv3d->smooth_timer = nullptr;
555
556 return new_rv3d;
557 }
558 return nullptr;
559}
560
562{
563 wmWindow *window = params->window;
564 ScrArea *area = params->area;
565 ARegion *region = params->region;
566 const wmNotifier *wmn = params->notifier;
567 const Scene *scene = params->scene;
568 View3D *v3d = static_cast<View3D *>(area->spacedata.first);
569 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
570 wmGizmoMap *gzmap = region->runtime->gizmo_map;
571
572 /* context changes */
573 switch (wmn->category) {
574 case NC_WM:
575 if (ELEM(wmn->data, ND_UNDO)) {
577 }
578 else if (ELEM(wmn->data, ND_XR_DATA_CHANGED)) {
579 /* Only cause a redraw if this a VR session mirror. Should more features be added that
580 * require redraws, we could pass something to wmn->reference, e.g. the flag value. */
581 if (v3d->flag & V3D_XR_SESSION_MIRROR) {
582 ED_region_tag_redraw(region);
583 }
584 }
585 break;
586 case NC_ANIMATION:
587 switch (wmn->data) {
588 case ND_KEYFRAME_PROP:
589 case ND_NLA_ACTCHANGE:
590 ED_region_tag_redraw(region);
591 break;
592 case ND_NLA:
593 case ND_KEYFRAME:
594 if (ELEM(wmn->action, NA_EDITED, NA_ADDED, NA_REMOVED)) {
595 ED_region_tag_redraw(region);
596 }
597 break;
598 case ND_ANIMCHAN:
600 ED_region_tag_redraw(region);
601 }
602 break;
603 }
604 break;
605 case NC_SCENE:
606 switch (wmn->data) {
607 case ND_SCENEBROWSE:
608 case ND_LAYER_CONTENT:
609 ED_region_tag_redraw(region);
613 }
614 break;
615 case ND_LAYER:
616 if (wmn->reference) {
617 BKE_screen_view3d_sync(v3d, static_cast<Scene *>(wmn->reference));
618 }
619 ED_region_tag_redraw(region);
621 break;
622 case ND_OB_ACTIVE:
623 case ND_OB_SELECT:
624 [[fallthrough]];
625 case ND_FRAME:
626 case ND_TRANSFORM:
627 case ND_OB_VISIBLE:
629 case ND_MARKERS:
630 case ND_MODE:
631 ED_region_tag_redraw(region);
633 break;
634 case ND_WORLD:
635 /* handled by space_view3d_listener() for v3d access */
636 break;
638 if (v3d->camera && (scene == wmn->reference)) {
639 if (rv3d->persp == RV3D_CAMOB) {
640 ED_region_tag_redraw(region);
641 }
642 }
643 break;
644 }
645 }
646 if (wmn->action == NA_EDITED) {
647 ED_region_tag_redraw(region);
648 }
649 break;
650 case NC_OBJECT:
651 switch (wmn->data) {
652 case ND_BONE_ACTIVE:
653 case ND_BONE_SELECT:
655 case ND_TRANSFORM:
656 case ND_POSE:
657 case ND_DRAW:
658 case ND_MODIFIER:
659 case ND_SHADERFX:
660 case ND_CONSTRAINT:
661 case ND_KEYS:
662 case ND_PARTICLE:
663 case ND_POINTCACHE:
664 case ND_LOD:
665 ED_region_tag_redraw(region);
667 break;
668 case ND_DRAW_ANIMVIZ:
669 ED_region_tag_redraw(region);
670 break;
671 }
672 switch (wmn->action) {
673 case NA_ADDED:
674 ED_region_tag_redraw(region);
675 break;
676 }
677 break;
678 case NC_GEOM:
679 switch (wmn->data) {
680 case ND_SELECT: {
683 }
684 case ND_DATA:
685 ED_region_tag_redraw(region);
687 break;
688 case ND_VERTEX_GROUP:
689 ED_region_tag_redraw(region);
690 break;
691 }
692 switch (wmn->action) {
693 case NA_EDITED:
694 ED_region_tag_redraw(region);
695 break;
696 }
697 break;
698 case NC_CAMERA:
699 switch (wmn->data) {
701 if (v3d->camera && (v3d->camera->data == wmn->reference)) {
702 if (rv3d->persp == RV3D_CAMOB) {
703 ED_region_tag_redraw(region);
704 }
705 }
706 break;
707 }
708 }
709 break;
710 case NC_GROUP:
711 /* all group ops for now */
712 ED_region_tag_redraw(region);
713 break;
714 case NC_BRUSH:
715 switch (wmn->action) {
716 case NA_EDITED:
718 break;
719 case NA_SELECTED:
720 /* used on brush changes - needed because 3d cursor
721 * has to be drawn if clone brush is selected */
722 ED_region_tag_redraw(region);
723 break;
724 }
725 break;
726 case NC_MATERIAL:
727 switch (wmn->data) {
728 case ND_SHADING:
729 case ND_NODES:
730 /* TODO(sergey): This is a bit too much updates, but needed to
731 * have proper material drivers update in the viewport.
732 *
733 * How to solve?
734 */
735 ED_region_tag_redraw(region);
736 break;
737 case ND_SHADING_DRAW:
738 case ND_SHADING_LINKS:
739 ED_region_tag_redraw(region);
740 break;
741 }
742 break;
743 case NC_NODE:
744 switch (wmn->data) {
745 case ND_NODE_GIZMO: {
747 break;
748 }
749 }
750 ED_region_tag_redraw(region);
751 break;
752 case NC_WORLD:
753 switch (wmn->data) {
754 case ND_WORLD_DRAW:
755 /* handled by space_view3d_listener() for v3d access */
756 break;
757 case ND_WORLD:
758 /* Needed for updating world materials */
759 ED_region_tag_redraw(region);
760 break;
761 }
762 break;
763 case NC_LAMP:
764 switch (wmn->data) {
765 case ND_LIGHTING:
766 /* TODO(sergey): This is a bit too much, but needed to
767 * handle updates from new depsgraph.
768 */
769 ED_region_tag_redraw(region);
770 break;
771 case ND_LIGHTING_DRAW:
772 ED_region_tag_redraw(region);
774 break;
775 }
776 break;
777 case NC_LIGHTPROBE:
779 break;
780 case NC_IMAGE:
781 /* this could be more fine grained checks if we had
782 * more context than just the region */
783 ED_region_tag_redraw(region);
784 break;
785 case NC_TEXTURE:
786 /* Same as #NC_IMAGE. */
787 ED_region_tag_redraw(region);
788 break;
789 case NC_MOVIECLIP:
790 if (wmn->data == ND_DISPLAY || wmn->action == NA_EDITED) {
791 ED_region_tag_redraw(region);
792 }
793 break;
794 case NC_SPACE:
795 if (wmn->data == ND_SPACE_VIEW3D) {
796 if (wmn->subtype == NS_VIEW3D_GPU) {
798 }
799 else if (wmn->subtype == NS_VIEW3D_SHADING) {
800#ifdef WITH_XR_OPENXR
801 ED_view3d_xr_shading_update(
802 static_cast<wmWindowManager *>(G_MAIN->wm.first), v3d, scene);
803#endif
804
805 ViewLayer *view_layer = WM_window_get_active_view_layer(window);
806 Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer);
807 if (depsgraph) {
808 ED_render_view3d_update(depsgraph, window, area, true);
809 }
810 }
811 ED_region_tag_redraw(region);
813 }
814 break;
815 case NC_ID:
817 if (ELEM(wmn->action, NA_EDITED, NA_REMOVED) && v3d->localvd &&
819 {
821 }
822 ED_region_tag_redraw(region);
824 }
825 break;
826 case NC_SCREEN:
827 switch (wmn->data) {
828 case ND_ANIMPLAY:
829 case ND_SKETCH:
830 ED_region_tag_redraw(region);
831 break;
832 case ND_LAYOUTBROWSE:
833 case ND_LAYOUTDELETE:
834 case ND_LAYOUTSET:
836 ED_region_tag_redraw(region);
837 break;
838 case ND_LAYER:
839 ED_region_tag_redraw(region);
840 break;
841 }
842 switch (wmn->action) {
843 case NA_EDITED:
845 ED_region_tag_redraw(region);
846 break;
847 }
848
849 break;
850 case NC_GPENCIL:
851 if (wmn->data == ND_DATA || ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
852 ED_region_tag_redraw(region);
853 }
854 break;
855 case NC_WORKSPACE:
856 /* In case the region displays workspace settings. */
857 ED_region_tag_redraw(region);
858 break;
859 case NC_VIEWER_PATH: {
860 if (v3d->flag2 & V3D_SHOW_VIEWER) {
861 ViewLayer *view_layer = WM_window_get_active_view_layer(window);
862 if (Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer)) {
863 ED_render_view3d_update(depsgraph, window, area, true);
864 }
865 ED_region_tag_redraw(region);
866 }
867 break;
868 }
869 }
870}
871
873{
874 wmMsgBus *mbus = params->message_bus;
875 const bContext *C = params->context;
876 ScrArea *area = params->area;
877 ARegion *region = params->region;
878
879 /* Developer NOTE: there are many properties that impact 3D view drawing,
880 * so instead of subscribing to individual properties, just subscribe to types
881 * accepting some redundant redraws.
882 *
883 * For other space types we might try avoid this, keep the 3D view as an exceptional case! */
884 wmMsgParams_RNA msg_key_params{};
885
886 /* Only subscribe to types. */
887 StructRNA *type_array[] = {
888 &RNA_Window,
889
890 /* These object have properties that impact drawing. */
891 &RNA_AreaLight,
892 &RNA_Camera,
893 &RNA_Light,
894 &RNA_Speaker,
895 &RNA_SunLight,
896
897 /* General types the 3D view depends on. */
898 &RNA_Object,
899 &RNA_UnitSettings, /* grid-floor */
900
901 &RNA_View3DCursor,
902 &RNA_View3DOverlay,
903 &RNA_View3DShading,
904 &RNA_World,
905 };
906
907 wmMsgSubscribeValue msg_sub_value_region_tag_redraw{};
908 msg_sub_value_region_tag_redraw.owner = region;
909 msg_sub_value_region_tag_redraw.user_data = region;
910 msg_sub_value_region_tag_redraw.notify = ED_region_do_msg_notify_tag_redraw;
911
912 for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
913 msg_key_params.ptr.type = type_array[i];
914 WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
915 }
916
917 /* Subscribe to a handful of other properties. */
918 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
919
920 WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, engine, &msg_sub_value_region_tag_redraw);
922 mbus, RenderSettings, resolution_x, &msg_sub_value_region_tag_redraw);
924 mbus, RenderSettings, resolution_y, &msg_sub_value_region_tag_redraw);
926 mbus, RenderSettings, pixel_aspect_x, &msg_sub_value_region_tag_redraw);
928 mbus, RenderSettings, pixel_aspect_y, &msg_sub_value_region_tag_redraw);
929 if (rv3d->persp == RV3D_CAMOB) {
931 mbus, RenderSettings, use_border, &msg_sub_value_region_tag_redraw);
932 }
933
934 WM_msg_subscribe_rna_anon_type(mbus, SceneEEVEE, &msg_sub_value_region_tag_redraw);
935 WM_msg_subscribe_rna_anon_type(mbus, SceneDisplay, &msg_sub_value_region_tag_redraw);
936 WM_msg_subscribe_rna_anon_type(mbus, ObjectDisplay, &msg_sub_value_region_tag_redraw);
937
938 const Scene *scene = CTX_data_scene(C);
939 ViewLayer *view_layer = CTX_data_view_layer(C);
940 BKE_view_layer_synced_ensure(scene, view_layer);
941 Object *obact = BKE_view_layer_active_object_get(view_layer);
942 if (obact != nullptr) {
943 switch (obact->mode) {
945 WM_msg_subscribe_rna_anon_type(mbus, ParticleEdit, &msg_sub_value_region_tag_redraw);
946 break;
947 default:
948 break;
949 }
950 }
951
952 {
953 wmMsgSubscribeValue msg_sub_value_region_tag_refresh{};
954 msg_sub_value_region_tag_refresh.owner = region;
955 msg_sub_value_region_tag_refresh.user_data = area;
956 msg_sub_value_region_tag_refresh.notify = WM_toolsystem_do_msg_notify_tag_refresh;
957 WM_msg_subscribe_rna_anon_prop(mbus, Object, mode, &msg_sub_value_region_tag_refresh);
958 WM_msg_subscribe_rna_anon_prop(mbus, LayerObjects, active, &msg_sub_value_region_tag_refresh);
959 }
960}
961
962/* concept is to retrieve cursor type context-less */
963static void view3d_main_region_cursor(wmWindow *win, ScrArea *area, ARegion *region)
964{
965 if (WM_cursor_set_from_tool(win, area, region)) {
966 return;
967 }
968
969 Scene *scene = WM_window_get_active_scene(win);
971 BKE_view_layer_synced_ensure(scene, view_layer);
972 Object *obedit = BKE_view_layer_edit_object_get(view_layer);
973 if (obedit) {
975 }
976 else {
978 }
979}
980
981/* add handlers, stuff you only do once or on area/region changes */
983{
984 wmKeyMap *keymap = WM_keymap_ensure(
985 wm->runtime->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
986
987 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
988
989 ED_region_header_init(region);
990}
991
992static void view3d_header_region_draw(const bContext *C, ARegion *region)
993{
994 ED_region_header(C, region);
995}
996
998{
999 ARegion *region = params->region;
1000 const wmNotifier *wmn = params->notifier;
1001
1002 /* context changes */
1003 switch (wmn->category) {
1004 case NC_SCENE:
1005 switch (wmn->data) {
1006 case ND_FRAME:
1007 case ND_OB_ACTIVE:
1008 case ND_OB_SELECT:
1009 case ND_OB_VISIBLE:
1010 case ND_MODE:
1011 case ND_LAYER:
1012 case ND_TOOLSETTINGS:
1013 case ND_LAYER_CONTENT:
1014 case ND_RENDER_OPTIONS:
1015 ED_region_tag_redraw(region);
1016 break;
1017 }
1018 break;
1019 case NC_SPACE:
1020 switch (wmn->data) {
1021 case ND_SPACE_VIEW3D:
1022 ED_region_tag_redraw(region);
1023 break;
1026 ED_region_tag_redraw(region);
1027 break;
1028 }
1029 break;
1030 case NC_ASSET:
1031 switch (wmn->data) {
1032 case ND_ASSET_CATALOGS:
1033 case ND_ASSET_LIST:
1036 ED_region_tag_redraw(region);
1037 break;
1038 default:
1039 if (ELEM(wmn->action, NA_ADDED, NA_REMOVED)) {
1041 ED_region_tag_redraw(region);
1042 }
1043 }
1044 break;
1045 case NC_NODE:
1046 switch (wmn->data) {
1047 case ND_NODE_ASSET_DATA:
1049 ED_region_tag_redraw(region);
1050 break;
1051 }
1052 break;
1053 case NC_GPENCIL:
1054 if (wmn->data & ND_GPENCIL_EDITMODE) {
1055 ED_region_tag_redraw(region);
1056 }
1057 else if (wmn->action == NA_EDITED) {
1058 ED_region_tag_redraw(region);
1059 }
1060 break;
1061 case NC_BRUSH:
1062 ED_region_tag_redraw(region);
1063 break;
1064 case NC_GEOM:
1065 if (ELEM(wmn->data, ND_VERTEX_GROUP, ND_DATA)) {
1066 ED_region_tag_redraw(region);
1067 }
1068 break;
1069 case NC_MATERIAL:
1070 /* For the canvas picker. */
1071 if (wmn->data == ND_SHADING_LINKS) {
1072 ED_region_tag_redraw(region);
1073 }
1074 break;
1075 }
1076
1077 /* From top-bar, which ones are needed? split per header? */
1078 /* Disable for now, re-enable if needed, or remove - campbell. */
1079#if 0
1080 /* context changes */
1081 switch (wmn->category) {
1082 case NC_WM:
1083 if (wmn->data == ND_HISTORY) {
1084 ED_region_tag_redraw(region);
1085 }
1086 break;
1087 case NC_SCENE:
1088 if (wmn->data == ND_MODE) {
1089 ED_region_tag_redraw(region);
1090 }
1091 break;
1092 case NC_SPACE:
1093 if (wmn->data == ND_SPACE_VIEW3D) {
1094 ED_region_tag_redraw(region);
1095 }
1096 break;
1097 case NC_GPENCIL:
1098 if (wmn->data == ND_DATA) {
1099 ED_region_tag_redraw(region);
1100 }
1101 break;
1102 }
1103#endif
1104}
1105
1107{
1108 wmMsgBus *mbus = params->message_bus;
1109 ARegion *region = params->region;
1110
1111 wmMsgParams_RNA msg_key_params{};
1112
1113 /* Only subscribe to types. */
1114 StructRNA *type_array[] = {
1115 &RNA_View3DShading,
1116 };
1117
1118 wmMsgSubscribeValue msg_sub_value_region_tag_redraw{};
1119 msg_sub_value_region_tag_redraw.owner = region;
1120 msg_sub_value_region_tag_redraw.user_data = region;
1121 msg_sub_value_region_tag_redraw.notify = ED_region_do_msg_notify_tag_redraw;
1122
1123 for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
1124 msg_key_params.ptr.type = type_array[i];
1125 WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
1126 }
1127}
1128
1129/* add handlers, stuff you only do once or on area/region changes */
1131{
1132 wmKeyMap *keymap;
1133
1134 ED_region_panels_init(wm, region);
1135
1137
1138 keymap = WM_keymap_ensure(
1139 wm->runtime->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1140 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
1141}
1142
1144 ARegion *region,
1145 const char *category_override)
1146{
1147 const enum eContextObjectMode mode = CTX_data_mode_enum(C);
1148
1149 const char *contexts_base[4] = {nullptr};
1150 contexts_base[0] = CTX_data_mode_string(C);
1151
1152 const char **contexts = &contexts_base[1];
1153
1154 switch (mode) {
1155 case CTX_MODE_EDIT_MESH:
1156 ARRAY_SET_ITEMS(contexts, ".mesh_edit");
1157 break;
1159 ARRAY_SET_ITEMS(contexts, ".curve_edit");
1160 break;
1162 ARRAY_SET_ITEMS(contexts, ".curves_edit");
1163 break;
1165 ARRAY_SET_ITEMS(contexts, ".curve_edit");
1166 break;
1167 case CTX_MODE_EDIT_TEXT:
1168 ARRAY_SET_ITEMS(contexts, ".text_edit");
1169 break;
1171 ARRAY_SET_ITEMS(contexts, ".armature_edit");
1172 break;
1174 ARRAY_SET_ITEMS(contexts, ".mball_edit");
1175 break;
1177 ARRAY_SET_ITEMS(contexts, ".lattice_edit");
1178 break;
1180 ARRAY_SET_ITEMS(contexts, ".grease_pencil_edit");
1181 break;
1183 ARRAY_SET_ITEMS(contexts, ".grease_pencil_paint");
1184 break;
1186 ARRAY_SET_ITEMS(contexts, ".paint_common", ".grease_pencil_sculpt");
1187 break;
1189 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1190 break;
1192 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1193 break;
1195 ARRAY_SET_ITEMS(contexts, ".pointcloud_edit");
1196 break;
1197 case CTX_MODE_POSE:
1198 ARRAY_SET_ITEMS(contexts, ".posemode");
1199 break;
1200 case CTX_MODE_SCULPT:
1201 ARRAY_SET_ITEMS(contexts, ".paint_common", ".sculpt_mode");
1202 break;
1204 ARRAY_SET_ITEMS(contexts, ".paint_common", ".weightpaint");
1205 break;
1207 ARRAY_SET_ITEMS(contexts, ".paint_common", ".vertexpaint");
1208 break;
1210 ARRAY_SET_ITEMS(contexts, ".paint_common", ".imagepaint");
1211 break;
1212 case CTX_MODE_PARTICLE:
1213 ARRAY_SET_ITEMS(contexts, ".paint_common", ".particlemode");
1214 break;
1215 case CTX_MODE_OBJECT:
1216 ARRAY_SET_ITEMS(contexts, ".objectmode");
1217 break;
1219 ARRAY_SET_ITEMS(contexts, ".greasepencil_paint");
1220 break;
1222 ARRAY_SET_ITEMS(contexts, ".greasepencil_sculpt");
1223 break;
1225 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1226 break;
1228 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1229 break;
1231 ARRAY_SET_ITEMS(contexts, ".paint_common", ".curves_sculpt");
1232 break;
1233 default:
1234 break;
1235 }
1236
1237 switch (mode) {
1239 ARRAY_SET_ITEMS(contexts, ".greasepencil_paint");
1240 break;
1242 ARRAY_SET_ITEMS(contexts, ".greasepencil_sculpt");
1243 break;
1245 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1246 break;
1248 ARRAY_SET_ITEMS(contexts, ".greasepencil_edit");
1249 break;
1251 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1252 break;
1253 default:
1254 break;
1255 }
1256
1257 ListBase *paneltypes = &region->runtime->type->paneltypes;
1258
1259 /* Allow drawing 3D view toolbar from non 3D view space type. */
1260 if (category_override != nullptr) {
1263 paneltypes = &art->paneltypes;
1264 }
1265
1267 region,
1268 paneltypes,
1270 contexts_base,
1271 category_override);
1272}
1273
1275{
1276 ED_view3d_buttons_region_layout_ex(C, region, nullptr);
1277}
1278
1280{
1281 ARegion *region = params->region;
1282 const wmNotifier *wmn = params->notifier;
1283
1284 /* context changes */
1285 switch (wmn->category) {
1286 case NC_ANIMATION:
1287 switch (wmn->data) {
1288 case ND_KEYFRAME_PROP:
1289 case ND_NLA_ACTCHANGE:
1290 ED_region_tag_redraw(region);
1291 break;
1292 case ND_NLA:
1293 case ND_KEYFRAME:
1294 if (ELEM(wmn->action, NA_EDITED, NA_ADDED, NA_REMOVED)) {
1295 ED_region_tag_redraw(region);
1296 }
1297 break;
1298 }
1299 break;
1300 case NC_SCENE:
1301 switch (wmn->data) {
1302 case ND_FRAME:
1303 case ND_OB_ACTIVE:
1304 case ND_OB_SELECT:
1305 case ND_OB_VISIBLE:
1306 case ND_MODE:
1307 case ND_LAYER:
1308 case ND_LAYER_CONTENT:
1309 case ND_TOOLSETTINGS:
1310 case ND_TRANSFORM:
1311 ED_region_tag_redraw(region);
1312 break;
1313 }
1314 switch (wmn->action) {
1315 case NA_EDITED:
1316 ED_region_tag_redraw(region);
1317 break;
1318 }
1319 break;
1320 case NC_OBJECT:
1321 switch (wmn->data) {
1322 case ND_BONE_ACTIVE:
1323 case ND_BONE_SELECT:
1324 case ND_BONE_COLLECTION:
1325 case ND_TRANSFORM:
1326 case ND_POSE:
1327 case ND_DRAW:
1328 case ND_KEYS:
1329 case ND_MODIFIER:
1330 case ND_SHADERFX:
1331 ED_region_tag_redraw(region);
1332 break;
1333 }
1334 break;
1335 case NC_GEOM:
1336 switch (wmn->data) {
1337 case ND_DATA:
1338 case ND_VERTEX_GROUP:
1339 case ND_SELECT:
1340 ED_region_tag_redraw(region);
1341 break;
1342 }
1343 if (wmn->action == NA_EDITED) {
1344 ED_region_tag_redraw(region);
1345 }
1346 break;
1347 case NC_TEXTURE:
1348 case NC_MATERIAL:
1349 /* for brush textures */
1350 ED_region_tag_redraw(region);
1351 break;
1352 case NC_BRUSH:
1353 /* NA_SELECTED is used on brush changes */
1354 if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
1355 ED_region_tag_redraw(region);
1356 }
1357 break;
1358 case NC_SPACE:
1359 if (wmn->data == ND_SPACE_VIEW3D) {
1360 ED_region_tag_redraw(region);
1361 }
1362 break;
1363 case NC_ID:
1364 if (wmn->action == NA_RENAME) {
1365 ED_region_tag_redraw(region);
1366 }
1367 break;
1368 case NC_GPENCIL:
1369 if ((wmn->data & (ND_DATA | ND_GPENCIL_EDITMODE)) || (wmn->action == NA_EDITED)) {
1370 ED_region_tag_redraw(region);
1371 }
1372 break;
1373 case NC_IMAGE:
1374 /* Update for the image layers in texture paint. */
1375 if (wmn->action == NA_EDITED) {
1376 ED_region_tag_redraw(region);
1377 }
1378 break;
1379 case NC_WM:
1380 if (wmn->data == ND_XR_DATA_CHANGED) {
1381 ED_region_tag_redraw(region);
1382 }
1383 break;
1384 }
1385}
1386
1387/* add handlers, stuff you only do once or on area/region changes */
1389{
1390 wmKeyMap *keymap;
1391
1392 ED_region_panels_init(wm, region);
1393
1395
1396 keymap = WM_keymap_ensure(
1397 wm->runtime->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1398 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
1399}
1400
1401static void view3d_tools_region_draw(const bContext *C, ARegion *region)
1402{
1403 const char *contexts[] = {CTX_data_mode_string(C), nullptr};
1405}
1406
1416
1417/* add handlers, stuff you only do once or on area/region changes */
1419{
1420 using namespace blender::ed;
1421 wmKeyMap *keymap = WM_keymap_ensure(
1422 wm->runtime->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1423 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
1424
1426}
1427
1428/* area (not region) level listener */
1430{
1431 ScrArea *area = params->area;
1432 const wmNotifier *wmn = params->notifier;
1433 View3D *v3d = static_cast<View3D *>(area->spacedata.first);
1434
1435 /* context changes */
1436 switch (wmn->category) {
1437 case NC_SCENE:
1438 switch (wmn->data) {
1439 case ND_WORLD: {
1440 const bool use_scene_world = V3D_USES_SCENE_WORLD(v3d);
1441 if (v3d->flag2 & V3D_HIDE_OVERLAYS || use_scene_world) {
1443 }
1444 break;
1445 }
1446 }
1447 break;
1448 case NC_WORLD:
1449 switch (wmn->data) {
1450 case ND_WORLD_DRAW:
1451 case ND_WORLD:
1454 }
1455 break;
1456 }
1457 break;
1458 case NC_MATERIAL:
1459 switch (wmn->data) {
1460 case ND_NODES:
1461 if (v3d->shading.type == OB_TEXTURE) {
1463 }
1464 break;
1465 }
1466 break;
1467 }
1468}
1469
1470static void space_view3d_refresh(const bContext *C, ScrArea *area)
1471{
1472 View3D *v3d = (View3D *)area->spacedata.first;
1474
1481 v3d,
1482 CTX_wm_area(C),
1483 true,
1484 U.smooth_viewtx);
1485 }
1486}
1487
1489 const blender::bke::id::IDRemapper &mappings)
1490{
1491 if (mappings.apply(reinterpret_cast<ID **>(&v3d->ob_center), ID_REMAP_APPLY_DEFAULT) ==
1493 {
1494 /* Otherwise, bone-name may remain valid...
1495 * We could be smart and check this, too? */
1496 v3d->ob_center_bone[0] = '\0';
1497 }
1498}
1499
1501 SpaceLink *slink,
1502 View3D *v3d,
1503 const blender::bke::id::IDRemapper &mappings,
1504 const bool is_local)
1505{
1506 if (mappings.apply(reinterpret_cast<ID **>(&v3d->camera), ID_REMAP_APPLY_DEFAULT) ==
1508 {
1509 /* 3D view might be inactive, in that case needs to use slink->regionbase */
1510 ListBase *regionbase = (slink == area->spacedata.first) ? &area->regionbase :
1511 &slink->regionbase;
1512 LISTBASE_FOREACH (ARegion *, region, regionbase) {
1513 if (region->regiontype == RGN_TYPE_WINDOW) {
1514 RegionView3D *rv3d = is_local ? ((RegionView3D *)region->regiondata)->localvd :
1515 static_cast<RegionView3D *>(region->regiondata);
1516 if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
1517 rv3d->persp = RV3D_PERSP;
1518 }
1519 }
1520 }
1521 }
1522}
1523
1524static void view3d_id_remap(ScrArea *area,
1525 SpaceLink *slink,
1526 const blender::bke::id::IDRemapper &mappings)
1527{
1529 FILTER_ID_MC))
1530 {
1531 return;
1532 }
1533
1534 View3D *view3d = (View3D *)slink;
1535 view3d_id_remap_v3d(area, slink, view3d, mappings, false);
1537 if (view3d->localvd != nullptr) {
1538 /* Object centers in local-view aren't used, see: #52663 */
1539 view3d_id_remap_v3d(area, slink, view3d->localvd, mappings, true);
1540 /* Remapping is potentially modifying ID pointers, and there is a local View3D, mark it for a
1541 * check for emptiness. */
1542 view3d->localvd->runtime.flag |= V3D_RUNTIME_LOCAL_MAYBE_EMPTY;
1543 }
1544 BKE_viewer_path_id_remap(&view3d->viewer_path, mappings);
1545}
1546
1548{
1549 View3D *v3d = reinterpret_cast<View3D *>(space_link);
1550
1553 if (v3d->localvd) {
1555
1556 /* If potentially modifying ID pointers, and there is a local View3D, mark it for a check for
1557 * emptiness. */
1559 if ((flags & IDWALK_READONLY) == 0) {
1561 }
1562 }
1564}
1565
1567{
1568 View3D *v3d = (View3D *)sl;
1569
1570 v3d->runtime = View3D_Runtime{};
1571
1572 if (v3d->gpd) {
1573 BLO_read_struct(reader, bGPdata, &v3d->gpd);
1574 BKE_gpencil_blend_read_data(reader, v3d->gpd);
1575 }
1576 BLO_read_struct(reader, RegionView3D, &v3d->localvd);
1577
1578 /* render can be quite heavy, set to solid on load */
1579 if (v3d->shading.type == OB_RENDER) {
1580 v3d->shading.type = OB_SOLID;
1581 }
1582 v3d->shading.prev_type = OB_SOLID;
1583
1585
1587
1589}
1590
1592{
1593 View3D *v3d = (View3D *)sl;
1594 BLO_write_struct(writer, View3D, v3d);
1595
1596 if (v3d->localvd) {
1597 BLO_write_struct(writer, View3D, v3d->localvd);
1598 }
1599
1601
1603}
1604
1606{
1607 using namespace blender::ed;
1608 std::unique_ptr<SpaceType> st = std::make_unique<SpaceType>();
1609 ARegionType *art;
1610
1611 st->spaceid = SPACE_VIEW3D;
1612 STRNCPY_UTF8(st->name, "View3D");
1613
1614 st->create = view3d_create;
1615 st->free = view3d_free;
1616 st->init = view3d_init;
1617 st->exit = view3d_exit;
1618 st->listener = space_view3d_listener;
1619 st->refresh = space_view3d_refresh;
1620 st->duplicate = view3d_duplicate;
1621 st->operatortypes = view3d_operatortypes;
1622 st->keymap = view3d_keymap;
1623 st->dropboxes = view3d_dropboxes;
1624 st->gizmos = view3d_widgets;
1625 st->context = view3d_context;
1626 st->id_remap = view3d_id_remap;
1627 st->foreach_id = view3d_foreach_id;
1628 st->blend_read_data = view3d_space_blend_read_data;
1629 st->blend_read_after_liblink = nullptr;
1630 st->blend_write = view3d_space_blend_write;
1631
1632 /* regions: main window */
1633 art = MEM_callocN<ARegionType>("spacetype view3d main region");
1645 BLI_addhead(&st->regiontypes, art);
1646
1647 /* regions: list-view/buttons */
1648 art = MEM_callocN<ARegionType>("spacetype view3d buttons region");
1649 art->regionid = RGN_TYPE_UI;
1658 BLI_addhead(&st->regiontypes, art);
1659
1661
1662 /* regions: tool(bar) */
1663 art = MEM_callocN<ARegionType>("spacetype view3d tools region");
1664 art->regionid = RGN_TYPE_TOOLS;
1665 art->prefsizex = int(UI_TOOLBAR_WIDTH);
1666 art->prefsizey = 50; /* XXX */
1673 BLI_addhead(&st->regiontypes, art);
1674
1675 /* regions: tool header */
1676 art = MEM_callocN<ARegionType>("spacetype view3d tool header region");
1678 art->prefsizey = HEADERY;
1684 BLI_addhead(&st->regiontypes, art);
1685
1686 /* regions: header */
1687 art = MEM_callocN<ARegionType>("spacetype view3d header region");
1689 art->prefsizey = HEADERY;
1695 BLI_addhead(&st->regiontypes, art);
1696
1697 /* regions: asset shelf */
1698 art = MEM_callocN<ARegionType>("spacetype view3d asset shelf region");
1713 BLI_addhead(&st->regiontypes, art);
1714
1715 /* regions: asset shelf header */
1716 art = MEM_callocN<ARegionType>("spacetype view3d asset shelf header region");
1724 BLI_addhead(&st->regiontypes, art);
1726
1727 /* regions: hud */
1728 art = ED_area_type_hud(st->spaceid);
1729 BLI_addhead(&st->regiontypes, art);
1730
1731 /* regions: xr */
1732 art = MEM_callocN<ARegionType>("spacetype view3d xr region");
1733 art->regionid = RGN_TYPE_XR;
1734 BLI_addhead(&st->regiontypes, art);
1735
1740
1741 BKE_spacetype_register(std::move(st));
1742}
const char * CTX_data_mode_string(const bContext *C)
eContextObjectMode
@ CTX_MODE_VERTEX_GPENCIL_LEGACY
@ CTX_MODE_WEIGHT_GPENCIL_LEGACY
@ 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_POINTCLOUD
@ 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
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
enum eContextObjectMode CTX_data_mode_enum(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
#define G_MAIN
void BKE_gpencil_blend_read_data(struct BlendDataReader *reader, struct bGPdata *gpd)
void IDP_FreeProperty(IDProperty *prop)
Definition idprop.cc:1251
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:863
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
Object * BKE_view_layer_edit_object_get(const ViewLayer *view_layer)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
@ IDWALK_CB_DIRECT_WEAK_LINK
LibraryForeachIDFlag BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
Definition lib_query.cc:129
@ IDWALK_READONLY
@ ID_REMAP_RESULT_SOURCE_UNASSIGNED
@ ID_REMAP_APPLY_DEFAULT
General operations, lookup, etc. for blender objects.
Depsgraph * BKE_scene_get_depsgraph(const Scene *scene, const ViewLayer *view_layer)
Definition scene.cc:3403
void BKE_screen_view3d_shading_blend_read_data(BlendDataReader *reader, View3DShading *shading)
Definition screen.cc:1096
void BKE_spacetype_register(std::unique_ptr< SpaceType > st)
Definition screen.cc:282
ARegion * BKE_area_region_new()
Definition screen.cc:387
void BKE_screen_view3d_shading_blend_write(BlendWriter *writer, View3DShading *shading)
Definition screen.cc:1089
SpaceType * BKE_spacetype_from_id(int spaceid)
Definition screen.cc:257
ARegionType * BKE_regiontype_from_id(const SpaceType *st, int regionid)
Definition screen.cc:267
void BKE_screen_view3d_sync(View3D *v3d, Scene *scene)
Definition screen.cc:986
@ REGION_DRAW_LOCK_ALL
void BKE_screen_view3d_do_versions_250(View3D *v3d, ListBase *regions)
Definition screen.cc:1329
void BKE_viewer_path_copy(ViewerPath *dst, const ViewerPath *src)
void BKE_viewer_path_id_remap(ViewerPath *viewer_path, const blender::bke::id::IDRemapper &mappings)
void BKE_viewer_path_foreach_id(LibraryForeachIDData *data, ViewerPath *viewer_path)
void BKE_viewer_path_clear(ViewerPath *viewer_path)
void BKE_viewer_path_blend_read_data(BlendDataReader *reader, ViewerPath *viewer_path)
void BKE_viewer_path_blend_write(BlendWriter *writer, const ViewerPath *viewer_path)
#define BLI_assert(a)
Definition BLI_assert.h:46
#define ATTR_FALLTHROUGH
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:91
#define BLI_ASSERT_ZERO_M4(m)
void zero_m4(float m[4][4])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
#define STRNCPY_UTF8(dst, src)
#define ARRAY_SIZE(arr)
#define ARRAY_SET_ITEMS(...)
#define ELEM(...)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct(reader, struct_name, ptr_p)
#define BPy_BEGIN_ALLOW_THREADS
Definition BPY_extern.hh:52
#define BPy_END_ALLOW_THREADS
Definition BPY_extern.hh:56
#define FILTER_ID_OB
Definition DNA_ID.h:1214
#define FILTER_ID_MC
Definition DNA_ID.h:1210
#define FILTER_ID_MA
Definition DNA_ID.h:1208
#define FILTER_ID_IM
Definition DNA_ID.h:1204
Object groups, one object can be in many groups at once.
#define DNA_struct_default_alloc(struct_name)
@ OB_TEXTURE
@ OB_SOLID
@ OB_RENDER
@ OB_MODE_PARTICLE_EDIT
Object is a sort of wrapper for general info.
#define HEADERY
#define RGN_ALIGN_ENUM_FROM_MASK(align)
@ RGN_ALIGN_HIDE_WITH_PREV
@ RGN_ALIGN_BOTTOM
@ RGN_ALIGN_LEFT
@ RGN_ALIGN_TOP
@ RGN_ALIGN_RIGHT
@ RGN_TYPE_TOOL_HEADER
@ RGN_TYPE_UI
@ RGN_TYPE_ASSET_SHELF_HEADER
@ RGN_TYPE_WINDOW
@ RGN_TYPE_ASSET_SHELF
@ RGN_TYPE_HEADER
@ RGN_TYPE_XR
@ RGN_TYPE_TOOLS
@ RGN_FLAG_HIDDEN
@ RGN_FLAG_INDICATE_OVERFLOW
@ RGN_FLAG_HIDDEN_BY_USER
@ SPACE_EMPTY
@ SPACE_VIEW3D
@ USER_HEADER_BOTTOM
@ V3D_SHADING_BACKGROUND_WORLD
@ V3D_SHOW_VIEWER
@ V3D_HIDE_OVERLAYS
@ RV3D_VIEW_USER
#define V3D_USES_SCENE_WORLD(v3d)
@ RV3D_GPULIGHT_UPDATE
@ V3D_RUNTIME_LOCAL_MAYBE_EMPTY
@ V3D_LOCAL_COLLECTIONS
@ V3D_XR_SESSION_MIRROR
@ RV3D_CAMOB
@ RV3D_PERSP
@ RV3D_LOCK_ROTATION
void DRW_engine_external_free(RegionView3D *rv3d)
void ED_view3d_local_stats_free(View3D *v3d)
void ED_render_view3d_update(Depsgraph *depsgraph, wmWindow *window, ScrArea *area, bool updated)
void ED_area_do_mgs_subscribe_for_tool_header(const wmRegionMessageSubscribeParams *params)
Definition area.cc:394
ARegionType * ED_area_type_hud(int space_type)
void ED_area_do_mgs_subscribe_for_tool_ui(const wmRegionMessageSubscribeParams *params)
Definition area.cc:409
void ED_region_header(const bContext *C, ARegion *region)
Definition area.cc:3935
void ED_region_header_init(ARegion *region)
Definition area.cc:3950
void ED_area_tag_redraw_regiontype(ScrArea *area, int regiontype)
Definition area.cc:711
void ED_region_header_with_button_sections(const bContext *C, ARegion *region, uiButtonSectionsAlign align)
Definition area.cc:3942
void ED_region_panels_ex(const bContext *C, ARegion *region, blender::wm::OpCallContext op_context, const char *contexts[])
Definition area.cc:3598
int ED_region_generic_tools_region_snap_size(const ARegion *region, int size, int axis)
Definition area_utils.cc:40
void ED_region_tag_redraw_cursor(ARegion *region)
Definition area.cc:631
void ED_area_tag_refresh(ScrArea *area)
Definition area.cc:722
void ED_region_generic_tools_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
Definition area_utils.cc:28
int ED_region_generic_panel_region_snap_size(const ARegion *region, int size, int axis)
Definition area_utils.cc:71
void ED_region_panels_init(wmWindowManager *wm, ARegion *region)
Definition area.cc:3616
void ED_region_panels_layout_ex(const bContext *C, ARegion *region, ListBase *paneltypes, blender::wm::OpCallContext op_context, const char *contexts[], const char *category_override)
Definition area.cc:3233
void ED_region_tag_redraw(ARegion *region)
Definition area.cc:618
@ ED_KEYMAP_ASSET_SHELF
Definition ED_screen.hh:768
@ ED_KEYMAP_UI
Definition ED_screen.hh:758
@ ED_KEYMAP_HEADER
Definition ED_screen.hh:764
@ ED_KEYMAP_TOOL
Definition ED_screen.hh:760
@ ED_KEYMAP_GPENCIL
Definition ED_screen.hh:766
@ ED_KEYMAP_GIZMO
Definition ED_screen.hh:759
@ ED_KEYMAP_VIEW2D
Definition ED_screen.hh:761
@ ED_KEYMAP_FRAMES
Definition ED_screen.hh:763
@ ED_KEYMAP_FOOTER
Definition ED_screen.hh:765
void ED_region_do_msg_notify_tag_redraw(bContext *C, wmMsgSubscribeKey *msg_key, wmMsgSubscribeValue *msg_val)
Definition area.cc:361
void ED_region_panels_draw(const bContext *C, ARegion *region)
Definition area.cc:3529
bool ED_localview_exit_if_empty(const Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, wmWindowManager *wm, wmWindow *win, View3D *v3d, ScrArea *area, bool frame_selected=true, int smooth_viewtx=0)
void ED_view3d_clipping_local(RegionView3D *rv3d, const float mat[4][4])
#define GPU_matrix_mul(x)
Read Guarded memory(de)allocation.
#define C
Definition RandGen.cpp:29
#define UI_SIDEBAR_PANEL_WIDTH
#define UI_TOOLBAR_WIDTH
@ WM_JOB_TYPE_RENDER_PREVIEW
Definition WM_api.hh:1779
#define NC_WORLD
Definition WM_types.hh:387
#define ND_SHADING
Definition WM_types.hh:477
#define ND_WORLD
Definition WM_types.hh:452
#define ND_ASSET_LIST_READING
Definition WM_types.hh:550
#define NC_ID
Definition WM_types.hh:395
#define NC_NODE
Definition WM_types.hh:394
#define NC_GEOM
Definition WM_types.hh:393
#define ND_NLA_ACTCHANGE
Definition WM_types.hh:498
#define ND_DRAW
Definition WM_types.hh:461
#define NC_BRUSH
Definition WM_types.hh:385
#define ND_OB_ACTIVE
Definition WM_types.hh:440
#define NC_WM
Definition WM_types.hh:374
#define ND_DATA
Definition WM_types.hh:509
#define ND_GPENCIL_EDITMODE
Definition WM_types.hh:504
#define ND_LIGHTING_DRAW
Definition WM_types.hh:484
#define ND_RENDER_OPTIONS
Definition WM_types.hh:435
#define ND_SPACE_ASSET_PARAMS
Definition WM_types.hh:525
#define NC_ANIMATION
Definition WM_types.hh:388
#define NC_VIEWER_PATH
Definition WM_types.hh:406
#define ND_VERTEX_GROUP
Definition WM_types.hh:510
#define ND_DISPLAY
Definition WM_types.hh:491
#define ND_LOD
Definition WM_types.hh:468
#define NC_SCREEN
Definition WM_types.hh:377
#define NC_MOVIECLIP
Definition WM_types.hh:397
#define ND_SKETCH
Definition WM_types.hh:427
#define ND_MODE
Definition WM_types.hh:445
#define ND_OB_SELECT
Definition WM_types.hh:442
#define ND_ANIMPLAY
Definition WM_types.hh:424
#define NC_SCENE
Definition WM_types.hh:378
#define NA_ADDED
Definition WM_types.hh:586
#define ND_OB_VISIBLE
Definition WM_types.hh:443
#define ND_LAYER_CONTENT
Definition WM_types.hh:453
#define NC_GROUP
Definition WM_types.hh:383
#define ND_NODES
Definition WM_types.hh:436
#define ND_TOOLSETTINGS
Definition WM_types.hh:449
#define ND_MODIFIER
Definition WM_types.hh:462
#define ND_POSE
Definition WM_types.hh:458
#define NA_EDITED
Definition WM_types.hh:584
#define ND_PARTICLE
Definition WM_types.hh:465
#define ND_KEYFRAME_PROP
Definition WM_types.hh:495
#define NC_MATERIAL
Definition WM_types.hh:380
#define NC_LAMP
Definition WM_types.hh:382
#define NC_IMAGE
Definition WM_types.hh:384
#define ND_CONSTRAINT
Definition WM_types.hh:464
#define NC_WORKSPACE
Definition WM_types.hh:376
#define ND_UNDO
Definition WM_types.hh:417
#define ND_MARKERS
Definition WM_types.hh:433
#define NC_CAMERA
Definition WM_types.hh:401
#define ND_FRAME
Definition WM_types.hh:434
#define NC_ASSET
Definition WM_types.hh:404
#define NA_REMOVED
Definition WM_types.hh:587
#define ND_SELECT
Definition WM_types.hh:508
#define NC_GPENCIL
Definition WM_types.hh:399
#define ND_NLA
Definition WM_types.hh:497
#define NC_TEXTURE
Definition WM_types.hh:381
#define NS_VIEW3D_GPU
Definition WM_types.hh:576
#define ND_LIGHTING
Definition WM_types.hh:483
#define ND_BONE_ACTIVE
Definition WM_types.hh:459
#define ND_TRANSFORM
Definition WM_types.hh:456
#define ND_LAYER
Definition WM_types.hh:450
#define ND_BONE_COLLECTION
Definition WM_types.hh:474
#define ND_ASSET_LIST
Definition WM_types.hh:548
#define ND_KEYS
Definition WM_types.hh:463
#define NA_RENAME
Definition WM_types.hh:588
#define ND_ASSET_CATALOGS
Definition WM_types.hh:554
#define ND_NODE_GIZMO
Definition WM_types.hh:516
#define ND_HISTORY
Definition WM_types.hh:415
#define NC_LIGHTPROBE
Definition WM_types.hh:402
#define ND_POINTCACHE
Definition WM_types.hh:466
#define ND_XR_DATA_CHANGED
Definition WM_types.hh:418
#define ND_SHADERFX
Definition WM_types.hh:471
#define ND_WORLD_DRAW
Definition WM_types.hh:487
#define ND_LAYOUTBROWSE
Definition WM_types.hh:422
#define ND_DRAW_ANIMVIZ
Definition WM_types.hh:473
#define ND_BONE_SELECT
Definition WM_types.hh:460
#define ND_SPACE_VIEW3D
Definition WM_types.hh:528
#define ND_KEYFRAME
Definition WM_types.hh:494
#define ND_LAYOUTSET
Definition WM_types.hh:426
#define NC_OBJECT
Definition WM_types.hh:379
#define ND_SCENEBROWSE
Definition WM_types.hh:432
#define NS_VIEW3D_SHADING
Definition WM_types.hh:577
#define ND_LAYOUTDELETE
Definition WM_types.hh:423
#define ND_NODE_ASSET_DATA
Definition WM_types.hh:515
#define ND_ANIMCHAN
Definition WM_types.hh:496
#define ND_SHADING_LINKS
Definition WM_types.hh:479
#define ND_SHADING_DRAW
Definition WM_types.hh:478
#define NC_SPACE
Definition WM_types.hh:392
#define NA_SELECTED
Definition WM_types.hh:589
#define ND_DRAW_RENDER_VIEWPORT
Definition WM_types.hh:470
#define U
BMesh const char void * data
BPy_StructRNA * depsgraph
IDRemapperApplyResult apply(ID **r_id_ptr, IDRemapperApplyOptions options, ID *id_self=nullptr) const
bool contains_mappings_for_any(IDTypeFilter filter) const
#define active
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void * MEM_dupallocN(const void *vmemh)
Definition mallocn.cc:143
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
void header_region(const bContext *C, ARegion *region)
void region_init(wmWindowManager *wm, ARegion *region)
void types_register(ARegionType *region_type, const int space_type)
void region_listen(const wmRegionListenerParams *params)
void region_on_poll_success(const bContext *C, ARegion *region)
void header_region_listen(const wmRegionListenerParams *params)
void region_on_user_resize(const ARegion *region)
int context(const bContext *C, const char *member, bContextDataResult *result)
int region_snap(const ARegion *region, int size, int axis)
void * region_duplicate(void *regiondata)
bool regions_poll(const RegionPollParams *params)
void header_region_init(wmWindowManager *wm, ARegion *region)
void region_draw(const bContext *C, ARegion *region)
void region_message_subscribe(const wmRegionMessageSubscribeParams *params)
void region_layout(const bContext *C, ARegion *region)
void region_free(ARegion *region)
MenuType node_group_operator_assets_menu_unassigned()
void VIEW3D_GGT_xform_gizmo_context(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_gizmo(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_cage(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_shear(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_extrude(wmGizmoGroupType *gzgt)
static void view3d_main_region_init(wmWindowManager *wm, ARegion *region)
void ED_view3d_check_mats_rv3d(RegionView3D *rv3d)
static void view3d_exit(wmWindowManager *, ScrArea *area)
static void view3d_id_remap(ScrArea *area, SpaceLink *slink, const blender::bke::id::IDRemapper &mappings)
static void view3d_tools_header_region_draw(const bContext *C, ARegion *region)
static void view3d_free(SpaceLink *sl)
static void space_view3d_listener(const wmSpaceTypeListenerParams *params)
void ED_view3d_clear_mats_rv3d(RegionView3D *rv3d)
void ED_view3d_init_mats_rv3d(const Object *ob, RegionView3D *rv3d)
static SpaceLink * view3d_duplicate(SpaceLink *sl)
static void view3d_widgets()
static void view3d_main_region_listener(const wmRegionListenerParams *params)
void ED_view3d_stop_render_preview(wmWindowManager *wm, ARegion *region)
static void view3d_header_region_draw(const bContext *C, ARegion *region)
static void view3d_id_remap_v3d(ScrArea *area, SpaceLink *slink, View3D *v3d, const blender::bke::id::IDRemapper &mappings, const bool is_local)
static void view3d_init(wmWindowManager *, ScrArea *)
static void view3d_tools_region_draw(const bContext *C, ARegion *region)
static SpaceLink * view3d_create(const ScrArea *, const Scene *scene)
static void view3d_header_region_init(wmWindowManager *wm, ARegion *region)
static void view3d_main_region_exit(wmWindowManager *wm, ARegion *region)
static void view3d_id_remap_v3d_ob_centers(View3D *v3d, const blender::bke::id::IDRemapper &mappings)
static void view3d_space_blend_read_data(BlendDataReader *reader, SpaceLink *sl)
static void view3d_header_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
static void view3d_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
static void view3d_buttons_region_layout(const bContext *C, ARegion *region)
static void view3d_asset_shelf_region_init(wmWindowManager *wm, ARegion *region)
static void view3d_space_blend_write(BlendWriter *writer, SpaceLink *sl)
void ED_view3d_init_mats_rv3d_gl(const Object *ob, RegionView3D *rv3d)
static void view3d_tools_region_init(wmWindowManager *wm, ARegion *region)
static void view3d_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
static void view3d_main_region_cursor(wmWindow *win, ScrArea *area, ARegion *region)
static void view3d_buttons_region_listener(const wmRegionListenerParams *params)
void ED_spacetype_view3d()
static void view3d_main_region_free(ARegion *region)
static void * view3d_main_region_duplicate(void *poin)
void ED_view3d_buttons_region_layout_ex(const bContext *C, ARegion *region, const char *category_override)
static void view3d_header_region_listener(const wmRegionListenerParams *params)
static void view3d_buttons_region_init(wmWindowManager *wm, ARegion *region)
void ED_view3d_shade_update(Main *bmain, View3D *v3d, ScrArea *area)
bool ED_view3d_area_user_region(const ScrArea *area, const View3D *v3d, ARegion **r_region)
static void space_view3d_refresh(const bContext *C, ScrArea *area)
bool(* poll)(const RegionPollParams *params)
void(* exit)(wmWindowManager *wm, ARegion *region)
void(* free)(ARegion *)
void(* on_poll_success)(const bContext *C, ARegion *region)
void(* message_subscribe)(const wmRegionMessageSubscribeParams *params)
void(* cursor)(wmWindow *win, ScrArea *area, ARegion *region)
void(* listener)(const wmRegionListenerParams *params)
void *(* duplicate)(void *poin)
bContextDataCallback context
void(* draw)(const bContext *C, ARegion *region)
void(* layout)(const bContext *C, ARegion *region)
void(* on_user_resize)(const ARegion *region)
ListBase paneltypes
int(* snap_size)(const ARegion *region, int size, int axis)
void(* init)(wmWindowManager *wm, ARegion *region)
void * regiondata
ARegionRuntimeHandle * runtime
Definition DNA_ID.h:414
void * first
ListBase wm
Definition BKE_main.hh:307
StructRNA * type
Definition RNA_types.hh:52
float viewmatob[4][4]
struct SmoothView3DStore * sms
float persmat[4][4]
struct ViewRender * view_render
struct RegionView3D * localvd
float viewmat[4][4]
float persmatob[4][4]
struct wmTimer * smooth_timer
struct BoundBox * clipbb
struct Object * camera
ListBase spacedata
ListBase regionbase
struct IDProperty * prop
void(* properties_storage_free)(void *properties_storage)
unsigned short local_collections_uid
View3D_Runtime runtime
struct Object * camera
struct View3D * localvd
char ob_center_bone[64]
ViewerPath viewer_path
struct Object * ob_center
ListBase regionbase
View3DShading shading
unsigned int data
Definition WM_types.hh:358
unsigned int action
Definition WM_types.hh:358
unsigned int category
Definition WM_types.hh:358
unsigned int subtype
Definition WM_types.hh:358
void * reference
Definition WM_types.hh:360
WindowManagerRuntimeHandle * runtime
i
Definition text_draw.cc:230
void view3d_buttons_register(ARegionType *art)
int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
void view3d_main_region_draw(const bContext *C, ARegion *region)
void view3d_dropboxes()
void VIEW3D_GGT_armature_spline(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_camera(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_camera_view(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_empty_image(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_force_field(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_geometry_nodes(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_light_spot(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_light_area(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_light_point(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_light_target(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_navigate(wmGizmoGroupType *gzgt)
void VIEW3D_GT_navigate_rotate(wmGizmoType *gzt)
void VIEW3D_GGT_mesh_preselect_edgering(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_mesh_preselect_elem(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_ruler(wmGizmoGroupType *gzgt)
void VIEW3D_GT_ruler_item(wmGizmoType *gzt)
void VIEW3D_GGT_tool_generic_handle_free(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_tool_generic_handle_normal(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_placement(wmGizmoGroupType *gzgt)
void view3d_operatortypes()
void view3d_smooth_free(RegionView3D *rv3d)
void view3d_keymap(wmKeyConfig *keyconf)
void WM_cursor_set(wmWindow *win, int curs)
bool WM_cursor_set_from_tool(wmWindow *win, const ScrArea *area, const ARegion *region)
@ WM_CURSOR_DEFAULT
Definition wm_cursors.hh:15
@ WM_CURSOR_EDIT
Definition wm_cursors.hh:19
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
void WM_draw_region_free(ARegion *region)
Definition wm_draw.cc:1677
wmEventHandler_Dropbox * WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes)
wmEventHandler_Keymap * WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
wmGizmoGroupType * WM_gizmogrouptype_append(void(*wtfunc)(wmGizmoGroupType *))
wmGizmoGroupTypeRef * WM_gizmogrouptype_append_and_link(wmGizmoMapType *gzmap_type, void(*wtfunc)(wmGizmoGroupType *))
void WM_gizmomap_tag_refresh(wmGizmoMap *gzmap)
wmGizmoMapType * WM_gizmomaptype_ensure(const wmGizmoMapType_Params *gzmap_params)
void WM_gizmotype_append(void(*gtfunc)(wmGizmoType *))
void WM_jobs_kill_type(wmWindowManager *wm, const void *owner, int job_type)
Definition wm_jobs.cc:623
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition wm_keymap.cc:895
bool WM_menutype_add(MenuType *mt)
#define WM_msg_subscribe_rna_anon_prop(mbus, type_, prop_, value)
#define WM_msg_subscribe_rna_anon_type(mbus, type_, value)
void WM_msg_subscribe_rna_params(wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
void WM_toolsystem_do_msg_notify_tag_refresh(bContext *C, wmMsgSubscribeKey *, wmMsgSubscribeValue *msg_val)
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
Scene * WM_window_get_active_scene(const wmWindow *win)