Blender V4.5
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.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(
341 wm->defaultconf, "Paint Face Mask (Weight, Vertex, Texture)", SPACE_EMPTY, RGN_TYPE_WINDOW);
342 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
343
344 keymap = WM_keymap_ensure(
345 wm->defaultconf, "Paint Vertex Selection (Weight, Vertex)", SPACE_EMPTY, RGN_TYPE_WINDOW);
346 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
347
348 /* Before 'Weight/Vertex Paint' so adding curve points is not overridden. */
349 keymap = WM_keymap_ensure(wm->defaultconf, "Paint Curve", SPACE_EMPTY, RGN_TYPE_WINDOW);
350 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
351
352 /* Before 'Pose' so weight paint menus aren't overridden by pose menus. */
353 keymap = WM_keymap_ensure(wm->defaultconf, "Weight Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
354 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
355
356 keymap = WM_keymap_ensure(wm->defaultconf, "Vertex Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
357 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
358
359 /* pose is not modal, operator poll checks for this */
361 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
362
363 keymap = WM_keymap_ensure(wm->defaultconf, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
364 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
365
367 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
368
370 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
371
372 keymap = WM_keymap_ensure(wm->defaultconf, "Image Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
373 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
374
376 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
377
379 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
380
381 keymap = WM_keymap_ensure(wm->defaultconf, "Armature", SPACE_EMPTY, RGN_TYPE_WINDOW);
382 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
383
384 keymap = WM_keymap_ensure(wm->defaultconf, "Metaball", SPACE_EMPTY, RGN_TYPE_WINDOW);
385 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
386
387 keymap = WM_keymap_ensure(wm->defaultconf, "Lattice", SPACE_EMPTY, RGN_TYPE_WINDOW);
388 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
389
390 keymap = WM_keymap_ensure(wm->defaultconf, "Particle", SPACE_EMPTY, RGN_TYPE_WINDOW);
391 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
392
393 keymap = WM_keymap_ensure(wm->defaultconf, "Point Cloud", SPACE_EMPTY, RGN_TYPE_WINDOW);
394 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
395
396 keymap = WM_keymap_ensure(wm->defaultconf, "Sculpt Curves", SPACE_EMPTY, RGN_TYPE_WINDOW);
397 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
398
399 /* NOTE: Grease Pencil handlers used to be added using `ED_KEYMAP_GPENCIL` in
400 * `ed_default_handlers` because it needed to be added to multiple editors (as other editors use
401 * annotations.). But for OB_GREASE_PENCIL, we only need it to register the keymaps for the
402 * 3D View. */
403 keymap = WM_keymap_ensure(
404 wm->defaultconf, "Grease Pencil Selection", SPACE_EMPTY, RGN_TYPE_WINDOW);
405 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
406
407 keymap = WM_keymap_ensure(
408 wm->defaultconf, "Grease Pencil Edit Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
409 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
410
411 keymap = WM_keymap_ensure(
412 wm->defaultconf, "Grease Pencil Paint Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
413 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
414
415 keymap = WM_keymap_ensure(
416 wm->defaultconf, "Grease Pencil Sculpt Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
417 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
418
419 keymap = WM_keymap_ensure(
420 wm->defaultconf, "Grease Pencil Weight Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
421 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
422
423 keymap = WM_keymap_ensure(
424 wm->defaultconf, "Grease Pencil Vertex Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
425 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
426
427 keymap = WM_keymap_ensure(
428 wm->defaultconf, "Grease Pencil Brush Stroke", SPACE_EMPTY, RGN_TYPE_WINDOW);
429 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
430
431 keymap = WM_keymap_ensure(
432 wm->defaultconf, "Grease Pencil Fill Tool", SPACE_EMPTY, RGN_TYPE_WINDOW);
433 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
434
435 /* Edit-font key-map swallows almost all (because of text input). */
437 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
438
439 keymap = WM_keymap_ensure(wm->defaultconf, "Object Non-modal", SPACE_EMPTY, RGN_TYPE_WINDOW);
440 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
441
443 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
444
445 /* own keymap, last so modes can override it */
446 keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
447 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
448
449 keymap = WM_keymap_ensure(wm->defaultconf, "3D View", SPACE_VIEW3D, RGN_TYPE_WINDOW);
450 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
451
452 /* add drop boxes */
454
455 WM_event_add_dropbox_handler(&region->runtime->handlers, lb);
456}
457
459{
461}
462
463static void view3d_widgets()
464{
467
479 /* TODO(@ideasman42): Not working well enough, disable for now. */
480#if 0
482#endif
483
492
495
497
500}
501
502/* type callback, not region itself */
504{
505 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
506
507 if (rv3d) {
508 if (rv3d->localvd) {
509 MEM_freeN(rv3d->localvd);
510 }
511 if (rv3d->clipbb) {
512 MEM_freeN(rv3d->clipbb);
513 }
514
515 if (rv3d->view_render) {
517 }
518
519 if (rv3d->sms) {
520 view3d_smooth_free(rv3d);
521 }
522
523 MEM_freeN(rv3d);
524 region->regiondata = nullptr;
525 }
526}
527
528/* copy regiondata */
529static void *view3d_main_region_duplicate(void *poin)
530{
531 if (poin) {
532 RegionView3D *rv3d = static_cast<RegionView3D *>(poin);
533 RegionView3D *new_rv3d;
534
535 new_rv3d = static_cast<RegionView3D *>(MEM_dupallocN(rv3d));
536 if (rv3d->localvd) {
537 new_rv3d->localvd = static_cast<RegionView3D *>(MEM_dupallocN(rv3d->localvd));
538 }
539 if (rv3d->clipbb) {
540 new_rv3d->clipbb = static_cast<BoundBox *>(MEM_dupallocN(rv3d->clipbb));
541 }
542
543 new_rv3d->view_render = nullptr;
544 new_rv3d->sms = nullptr;
545 new_rv3d->smooth_timer = nullptr;
546
547 return new_rv3d;
548 }
549 return nullptr;
550}
551
553{
554 wmWindow *window = params->window;
555 ScrArea *area = params->area;
556 ARegion *region = params->region;
557 const wmNotifier *wmn = params->notifier;
558 const Scene *scene = params->scene;
559 View3D *v3d = static_cast<View3D *>(area->spacedata.first);
560 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
561 wmGizmoMap *gzmap = region->runtime->gizmo_map;
562
563 /* context changes */
564 switch (wmn->category) {
565 case NC_WM:
566 if (ELEM(wmn->data, ND_UNDO)) {
568 }
569 else if (ELEM(wmn->data, ND_XR_DATA_CHANGED)) {
570 /* Only cause a redraw if this a VR session mirror. Should more features be added that
571 * require redraws, we could pass something to wmn->reference, e.g. the flag value. */
572 if (v3d->flag & V3D_XR_SESSION_MIRROR) {
573 ED_region_tag_redraw(region);
574 }
575 }
576 break;
577 case NC_ANIMATION:
578 switch (wmn->data) {
579 case ND_KEYFRAME_PROP:
580 case ND_NLA_ACTCHANGE:
581 ED_region_tag_redraw(region);
582 break;
583 case ND_NLA:
584 case ND_KEYFRAME:
585 if (ELEM(wmn->action, NA_EDITED, NA_ADDED, NA_REMOVED)) {
586 ED_region_tag_redraw(region);
587 }
588 break;
589 case ND_ANIMCHAN:
591 ED_region_tag_redraw(region);
592 }
593 break;
594 }
595 break;
596 case NC_SCENE:
597 switch (wmn->data) {
598 case ND_SCENEBROWSE:
599 case ND_LAYER_CONTENT:
600 ED_region_tag_redraw(region);
604 }
605 break;
606 case ND_LAYER:
607 if (wmn->reference) {
608 BKE_screen_view3d_sync(v3d, static_cast<Scene *>(wmn->reference));
609 }
610 ED_region_tag_redraw(region);
612 break;
613 case ND_OB_ACTIVE:
614 case ND_OB_SELECT:
615 [[fallthrough]];
616 case ND_FRAME:
617 case ND_TRANSFORM:
618 case ND_OB_VISIBLE:
620 case ND_MARKERS:
621 case ND_MODE:
622 ED_region_tag_redraw(region);
624 break;
625 case ND_WORLD:
626 /* handled by space_view3d_listener() for v3d access */
627 break;
629 if (v3d->camera && (scene == wmn->reference)) {
630 if (rv3d->persp == RV3D_CAMOB) {
631 ED_region_tag_redraw(region);
632 }
633 }
634 break;
635 }
636 }
637 if (wmn->action == NA_EDITED) {
638 ED_region_tag_redraw(region);
639 }
640 break;
641 case NC_OBJECT:
642 switch (wmn->data) {
643 case ND_BONE_ACTIVE:
644 case ND_BONE_SELECT:
646 case ND_TRANSFORM:
647 case ND_POSE:
648 case ND_DRAW:
649 case ND_MODIFIER:
650 case ND_SHADERFX:
651 case ND_CONSTRAINT:
652 case ND_KEYS:
653 case ND_PARTICLE:
654 case ND_POINTCACHE:
655 case ND_LOD:
656 ED_region_tag_redraw(region);
658 break;
659 case ND_DRAW_ANIMVIZ:
660 ED_region_tag_redraw(region);
661 break;
662 }
663 switch (wmn->action) {
664 case NA_ADDED:
665 ED_region_tag_redraw(region);
666 break;
667 }
668 break;
669 case NC_GEOM:
670 switch (wmn->data) {
671 case ND_SELECT: {
674 }
675 case ND_DATA:
676 ED_region_tag_redraw(region);
678 break;
679 case ND_VERTEX_GROUP:
680 ED_region_tag_redraw(region);
681 break;
682 }
683 switch (wmn->action) {
684 case NA_EDITED:
685 ED_region_tag_redraw(region);
686 break;
687 }
688 break;
689 case NC_CAMERA:
690 switch (wmn->data) {
692 if (v3d->camera && (v3d->camera->data == wmn->reference)) {
693 if (rv3d->persp == RV3D_CAMOB) {
694 ED_region_tag_redraw(region);
695 }
696 }
697 break;
698 }
699 }
700 break;
701 case NC_GROUP:
702 /* all group ops for now */
703 ED_region_tag_redraw(region);
704 break;
705 case NC_BRUSH:
706 switch (wmn->action) {
707 case NA_EDITED:
709 break;
710 case NA_SELECTED:
711 /* used on brush changes - needed because 3d cursor
712 * has to be drawn if clone brush is selected */
713 ED_region_tag_redraw(region);
714 break;
715 }
716 break;
717 case NC_MATERIAL:
718 switch (wmn->data) {
719 case ND_SHADING:
720 case ND_NODES:
721 /* TODO(sergey): This is a bit too much updates, but needed to
722 * have proper material drivers update in the viewport.
723 *
724 * How to solve?
725 */
726 ED_region_tag_redraw(region);
727 break;
728 case ND_SHADING_DRAW:
729 case ND_SHADING_LINKS:
730 ED_region_tag_redraw(region);
731 break;
732 }
733 break;
734 case NC_NODE:
735 switch (wmn->data) {
736 case ND_NODE_GIZMO: {
738 break;
739 }
740 }
741 ED_region_tag_redraw(region);
742 break;
743 case NC_WORLD:
744 switch (wmn->data) {
745 case ND_WORLD_DRAW:
746 /* handled by space_view3d_listener() for v3d access */
747 break;
748 case ND_WORLD:
749 /* Needed for updating world materials */
750 ED_region_tag_redraw(region);
751 break;
752 }
753 break;
754 case NC_LAMP:
755 switch (wmn->data) {
756 case ND_LIGHTING:
757 /* TODO(sergey): This is a bit too much, but needed to
758 * handle updates from new depsgraph.
759 */
760 ED_region_tag_redraw(region);
761 break;
762 case ND_LIGHTING_DRAW:
763 ED_region_tag_redraw(region);
765 break;
766 }
767 break;
768 case NC_LIGHTPROBE:
770 break;
771 case NC_IMAGE:
772 /* this could be more fine grained checks if we had
773 * more context than just the region */
774 ED_region_tag_redraw(region);
775 break;
776 case NC_TEXTURE:
777 /* Same as #NC_IMAGE. */
778 ED_region_tag_redraw(region);
779 break;
780 case NC_MOVIECLIP:
781 if (wmn->data == ND_DISPLAY || wmn->action == NA_EDITED) {
782 ED_region_tag_redraw(region);
783 }
784 break;
785 case NC_SPACE:
786 if (wmn->data == ND_SPACE_VIEW3D) {
787 if (wmn->subtype == NS_VIEW3D_GPU) {
789 }
790 else if (wmn->subtype == NS_VIEW3D_SHADING) {
791#ifdef WITH_XR_OPENXR
792 ED_view3d_xr_shading_update(
793 static_cast<wmWindowManager *>(G_MAIN->wm.first), v3d, scene);
794#endif
795
796 ViewLayer *view_layer = WM_window_get_active_view_layer(window);
797 Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer);
798 if (depsgraph) {
799 ED_render_view3d_update(depsgraph, window, area, true);
800 }
801 }
802 ED_region_tag_redraw(region);
804 }
805 break;
806 case NC_ID:
808 if (ELEM(wmn->action, NA_EDITED, NA_REMOVED) && v3d->localvd &&
810 {
812 }
813 ED_region_tag_redraw(region);
815 }
816 break;
817 case NC_SCREEN:
818 switch (wmn->data) {
819 case ND_ANIMPLAY:
820 case ND_SKETCH:
821 ED_region_tag_redraw(region);
822 break;
823 case ND_LAYOUTBROWSE:
824 case ND_LAYOUTDELETE:
825 case ND_LAYOUTSET:
827 ED_region_tag_redraw(region);
828 break;
829 case ND_LAYER:
830 ED_region_tag_redraw(region);
831 break;
832 }
833 switch (wmn->action) {
834 case NA_EDITED:
836 ED_region_tag_redraw(region);
837 break;
838 }
839
840 break;
841 case NC_GPENCIL:
842 if (wmn->data == ND_DATA || ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
843 ED_region_tag_redraw(region);
844 }
845 break;
846 case NC_WORKSPACE:
847 /* In case the region displays workspace settings. */
848 ED_region_tag_redraw(region);
849 break;
850 case NC_VIEWER_PATH: {
851 if (v3d->flag2 & V3D_SHOW_VIEWER) {
852 ViewLayer *view_layer = WM_window_get_active_view_layer(window);
853 if (Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer)) {
854 ED_render_view3d_update(depsgraph, window, area, true);
855 }
856 ED_region_tag_redraw(region);
857 }
858 break;
859 }
860 }
861}
862
864{
865 wmMsgBus *mbus = params->message_bus;
866 const bContext *C = params->context;
867 ScrArea *area = params->area;
868 ARegion *region = params->region;
869
870 /* Developer NOTE: there are many properties that impact 3D view drawing,
871 * so instead of subscribing to individual properties, just subscribe to types
872 * accepting some redundant redraws.
873 *
874 * For other space types we might try avoid this, keep the 3D view as an exceptional case! */
875 wmMsgParams_RNA msg_key_params{};
876
877 /* Only subscribe to types. */
878 StructRNA *type_array[] = {
879 &RNA_Window,
880
881 /* These object have properties that impact drawing. */
882 &RNA_AreaLight,
883 &RNA_Camera,
884 &RNA_Light,
885 &RNA_Speaker,
886 &RNA_SunLight,
887
888 /* General types the 3D view depends on. */
889 &RNA_Object,
890 &RNA_UnitSettings, /* grid-floor */
891
892 &RNA_View3DCursor,
893 &RNA_View3DOverlay,
894 &RNA_View3DShading,
895 &RNA_World,
896 };
897
898 wmMsgSubscribeValue msg_sub_value_region_tag_redraw{};
899 msg_sub_value_region_tag_redraw.owner = region;
900 msg_sub_value_region_tag_redraw.user_data = region;
901 msg_sub_value_region_tag_redraw.notify = ED_region_do_msg_notify_tag_redraw;
902
903 for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
904 msg_key_params.ptr.type = type_array[i];
905 WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
906 }
907
908 /* Subscribe to a handful of other properties. */
909 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
910
911 WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, engine, &msg_sub_value_region_tag_redraw);
913 mbus, RenderSettings, resolution_x, &msg_sub_value_region_tag_redraw);
915 mbus, RenderSettings, resolution_y, &msg_sub_value_region_tag_redraw);
917 mbus, RenderSettings, pixel_aspect_x, &msg_sub_value_region_tag_redraw);
919 mbus, RenderSettings, pixel_aspect_y, &msg_sub_value_region_tag_redraw);
920 if (rv3d->persp == RV3D_CAMOB) {
922 mbus, RenderSettings, use_border, &msg_sub_value_region_tag_redraw);
923 }
924
925 WM_msg_subscribe_rna_anon_type(mbus, SceneEEVEE, &msg_sub_value_region_tag_redraw);
926 WM_msg_subscribe_rna_anon_type(mbus, SceneDisplay, &msg_sub_value_region_tag_redraw);
927 WM_msg_subscribe_rna_anon_type(mbus, ObjectDisplay, &msg_sub_value_region_tag_redraw);
928
929 const Scene *scene = CTX_data_scene(C);
930 ViewLayer *view_layer = CTX_data_view_layer(C);
931 BKE_view_layer_synced_ensure(scene, view_layer);
932 Object *obact = BKE_view_layer_active_object_get(view_layer);
933 if (obact != nullptr) {
934 switch (obact->mode) {
936 WM_msg_subscribe_rna_anon_type(mbus, ParticleEdit, &msg_sub_value_region_tag_redraw);
937 break;
938 default:
939 break;
940 }
941 }
942
943 {
944 wmMsgSubscribeValue msg_sub_value_region_tag_refresh{};
945 msg_sub_value_region_tag_refresh.owner = region;
946 msg_sub_value_region_tag_refresh.user_data = area;
947 msg_sub_value_region_tag_refresh.notify = WM_toolsystem_do_msg_notify_tag_refresh;
948 WM_msg_subscribe_rna_anon_prop(mbus, Object, mode, &msg_sub_value_region_tag_refresh);
949 WM_msg_subscribe_rna_anon_prop(mbus, LayerObjects, active, &msg_sub_value_region_tag_refresh);
950 }
951}
952
953/* concept is to retrieve cursor type context-less */
954static void view3d_main_region_cursor(wmWindow *win, ScrArea *area, ARegion *region)
955{
956 if (WM_cursor_set_from_tool(win, area, region)) {
957 return;
958 }
959
960 Scene *scene = WM_window_get_active_scene(win);
962 BKE_view_layer_synced_ensure(scene, view_layer);
963 Object *obedit = BKE_view_layer_edit_object_get(view_layer);
964 if (obedit) {
966 }
967 else {
969 }
970}
971
972/* add handlers, stuff you only do once or on area/region changes */
974{
975 wmKeyMap *keymap = WM_keymap_ensure(
976 wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
977
978 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
979
980 ED_region_header_init(region);
981}
982
983static void view3d_header_region_draw(const bContext *C, ARegion *region)
984{
985 ED_region_header(C, region);
986}
987
989{
990 ARegion *region = params->region;
991 const wmNotifier *wmn = params->notifier;
992
993 /* context changes */
994 switch (wmn->category) {
995 case NC_SCENE:
996 switch (wmn->data) {
997 case ND_FRAME:
998 case ND_OB_ACTIVE:
999 case ND_OB_SELECT:
1000 case ND_OB_VISIBLE:
1001 case ND_MODE:
1002 case ND_LAYER:
1003 case ND_TOOLSETTINGS:
1004 case ND_LAYER_CONTENT:
1005 case ND_RENDER_OPTIONS:
1006 ED_region_tag_redraw(region);
1007 break;
1008 }
1009 break;
1010 case NC_SPACE:
1011 switch (wmn->data) {
1012 case ND_SPACE_VIEW3D:
1013 ED_region_tag_redraw(region);
1014 break;
1017 ED_region_tag_redraw(region);
1018 break;
1019 }
1020 break;
1021 case NC_ASSET:
1022 switch (wmn->data) {
1023 case ND_ASSET_CATALOGS:
1026 ED_region_tag_redraw(region);
1027 break;
1028 default:
1029 if (ELEM(wmn->action, NA_ADDED, NA_REMOVED)) {
1031 ED_region_tag_redraw(region);
1032 }
1033 }
1034 break;
1035 case NC_NODE:
1036 switch (wmn->data) {
1037 case ND_NODE_ASSET_DATA:
1039 ED_region_tag_redraw(region);
1040 break;
1041 }
1042 break;
1043 case NC_GPENCIL:
1044 if (wmn->data & ND_GPENCIL_EDITMODE) {
1045 ED_region_tag_redraw(region);
1046 }
1047 else if (wmn->action == NA_EDITED) {
1048 ED_region_tag_redraw(region);
1049 }
1050 break;
1051 case NC_BRUSH:
1052 ED_region_tag_redraw(region);
1053 break;
1054 case NC_GEOM:
1055 if (ELEM(wmn->data, ND_VERTEX_GROUP, ND_DATA)) {
1056 ED_region_tag_redraw(region);
1057 }
1058 break;
1059 case NC_MATERIAL:
1060 /* For the canvas picker. */
1061 if (wmn->data == ND_SHADING_LINKS) {
1062 ED_region_tag_redraw(region);
1063 }
1064 break;
1065 }
1066
1067 /* From top-bar, which ones are needed? split per header? */
1068 /* Disable for now, re-enable if needed, or remove - campbell. */
1069#if 0
1070 /* context changes */
1071 switch (wmn->category) {
1072 case NC_WM:
1073 if (wmn->data == ND_HISTORY) {
1074 ED_region_tag_redraw(region);
1075 }
1076 break;
1077 case NC_SCENE:
1078 if (wmn->data == ND_MODE) {
1079 ED_region_tag_redraw(region);
1080 }
1081 break;
1082 case NC_SPACE:
1083 if (wmn->data == ND_SPACE_VIEW3D) {
1084 ED_region_tag_redraw(region);
1085 }
1086 break;
1087 case NC_GPENCIL:
1088 if (wmn->data == ND_DATA) {
1089 ED_region_tag_redraw(region);
1090 }
1091 break;
1092 }
1093#endif
1094}
1095
1097{
1098 wmMsgBus *mbus = params->message_bus;
1099 ARegion *region = params->region;
1100
1101 wmMsgParams_RNA msg_key_params{};
1102
1103 /* Only subscribe to types. */
1104 StructRNA *type_array[] = {
1105 &RNA_View3DShading,
1106 };
1107
1108 wmMsgSubscribeValue msg_sub_value_region_tag_redraw{};
1109 msg_sub_value_region_tag_redraw.owner = region;
1110 msg_sub_value_region_tag_redraw.user_data = region;
1111 msg_sub_value_region_tag_redraw.notify = ED_region_do_msg_notify_tag_redraw;
1112
1113 for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
1114 msg_key_params.ptr.type = type_array[i];
1115 WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
1116 }
1117}
1118
1119/* add handlers, stuff you only do once or on area/region changes */
1121{
1122 wmKeyMap *keymap;
1123
1124 ED_region_panels_init(wm, region);
1125
1126 keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1127 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
1128}
1129
1131 ARegion *region,
1132 const char *category_override)
1133{
1134 const enum eContextObjectMode mode = CTX_data_mode_enum(C);
1135
1136 const char *contexts_base[4] = {nullptr};
1137 contexts_base[0] = CTX_data_mode_string(C);
1138
1139 const char **contexts = &contexts_base[1];
1140
1141 switch (mode) {
1142 case CTX_MODE_EDIT_MESH:
1143 ARRAY_SET_ITEMS(contexts, ".mesh_edit");
1144 break;
1146 ARRAY_SET_ITEMS(contexts, ".curve_edit");
1147 break;
1149 ARRAY_SET_ITEMS(contexts, ".curves_edit");
1150 break;
1152 ARRAY_SET_ITEMS(contexts, ".curve_edit");
1153 break;
1154 case CTX_MODE_EDIT_TEXT:
1155 ARRAY_SET_ITEMS(contexts, ".text_edit");
1156 break;
1158 ARRAY_SET_ITEMS(contexts, ".armature_edit");
1159 break;
1161 ARRAY_SET_ITEMS(contexts, ".mball_edit");
1162 break;
1164 ARRAY_SET_ITEMS(contexts, ".lattice_edit");
1165 break;
1167 ARRAY_SET_ITEMS(contexts, ".grease_pencil_edit");
1168 break;
1170 ARRAY_SET_ITEMS(contexts, ".grease_pencil_paint");
1171 break;
1173 ARRAY_SET_ITEMS(contexts, ".paint_common", ".grease_pencil_sculpt");
1174 break;
1176 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1177 break;
1179 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1180 break;
1182 ARRAY_SET_ITEMS(contexts, ".pointcloud_edit");
1183 break;
1184 case CTX_MODE_POSE:
1185 ARRAY_SET_ITEMS(contexts, ".posemode");
1186 break;
1187 case CTX_MODE_SCULPT:
1188 ARRAY_SET_ITEMS(contexts, ".paint_common", ".sculpt_mode");
1189 break;
1191 ARRAY_SET_ITEMS(contexts, ".paint_common", ".weightpaint");
1192 break;
1194 ARRAY_SET_ITEMS(contexts, ".paint_common", ".vertexpaint");
1195 break;
1197 ARRAY_SET_ITEMS(contexts, ".paint_common", ".imagepaint");
1198 break;
1199 case CTX_MODE_PARTICLE:
1200 ARRAY_SET_ITEMS(contexts, ".paint_common", ".particlemode");
1201 break;
1202 case CTX_MODE_OBJECT:
1203 ARRAY_SET_ITEMS(contexts, ".objectmode");
1204 break;
1206 ARRAY_SET_ITEMS(contexts, ".greasepencil_paint");
1207 break;
1209 ARRAY_SET_ITEMS(contexts, ".greasepencil_sculpt");
1210 break;
1212 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1213 break;
1215 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1216 break;
1218 ARRAY_SET_ITEMS(contexts, ".paint_common", ".curves_sculpt");
1219 break;
1220 default:
1221 break;
1222 }
1223
1224 switch (mode) {
1226 ARRAY_SET_ITEMS(contexts, ".greasepencil_paint");
1227 break;
1229 ARRAY_SET_ITEMS(contexts, ".greasepencil_sculpt");
1230 break;
1232 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1233 break;
1235 ARRAY_SET_ITEMS(contexts, ".greasepencil_edit");
1236 break;
1238 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1239 break;
1240 default:
1241 break;
1242 }
1243
1244 ListBase *paneltypes = &region->runtime->type->paneltypes;
1245
1246 /* Allow drawing 3D view toolbar from non 3D view space type. */
1247 if (category_override != nullptr) {
1250 paneltypes = &art->paneltypes;
1251 }
1252
1254 C, region, paneltypes, WM_OP_INVOKE_REGION_WIN, contexts_base, category_override);
1255}
1256
1258{
1259 ED_view3d_buttons_region_layout_ex(C, region, nullptr);
1260}
1261
1263{
1264 ARegion *region = params->region;
1265 const wmNotifier *wmn = params->notifier;
1266
1267 /* context changes */
1268 switch (wmn->category) {
1269 case NC_ANIMATION:
1270 switch (wmn->data) {
1271 case ND_KEYFRAME_PROP:
1272 case ND_NLA_ACTCHANGE:
1273 ED_region_tag_redraw(region);
1274 break;
1275 case ND_NLA:
1276 case ND_KEYFRAME:
1277 if (ELEM(wmn->action, NA_EDITED, NA_ADDED, NA_REMOVED)) {
1278 ED_region_tag_redraw(region);
1279 }
1280 break;
1281 }
1282 break;
1283 case NC_SCENE:
1284 switch (wmn->data) {
1285 case ND_FRAME:
1286 case ND_OB_ACTIVE:
1287 case ND_OB_SELECT:
1288 case ND_OB_VISIBLE:
1289 case ND_MODE:
1290 case ND_LAYER:
1291 case ND_LAYER_CONTENT:
1292 case ND_TOOLSETTINGS:
1293 case ND_TRANSFORM:
1294 ED_region_tag_redraw(region);
1295 break;
1296 }
1297 switch (wmn->action) {
1298 case NA_EDITED:
1299 ED_region_tag_redraw(region);
1300 break;
1301 }
1302 break;
1303 case NC_OBJECT:
1304 switch (wmn->data) {
1305 case ND_BONE_ACTIVE:
1306 case ND_BONE_SELECT:
1307 case ND_BONE_COLLECTION:
1308 case ND_TRANSFORM:
1309 case ND_POSE:
1310 case ND_DRAW:
1311 case ND_KEYS:
1312 case ND_MODIFIER:
1313 case ND_SHADERFX:
1314 ED_region_tag_redraw(region);
1315 break;
1316 }
1317 break;
1318 case NC_GEOM:
1319 switch (wmn->data) {
1320 case ND_DATA:
1321 case ND_VERTEX_GROUP:
1322 case ND_SELECT:
1323 ED_region_tag_redraw(region);
1324 break;
1325 }
1326 if (wmn->action == NA_EDITED) {
1327 ED_region_tag_redraw(region);
1328 }
1329 break;
1330 case NC_TEXTURE:
1331 case NC_MATERIAL:
1332 /* for brush textures */
1333 ED_region_tag_redraw(region);
1334 break;
1335 case NC_BRUSH:
1336 /* NA_SELECTED is used on brush changes */
1337 if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
1338 ED_region_tag_redraw(region);
1339 }
1340 break;
1341 case NC_SPACE:
1342 if (wmn->data == ND_SPACE_VIEW3D) {
1343 ED_region_tag_redraw(region);
1344 }
1345 break;
1346 case NC_ID:
1347 if (wmn->action == NA_RENAME) {
1348 ED_region_tag_redraw(region);
1349 }
1350 break;
1351 case NC_GPENCIL:
1352 if ((wmn->data & (ND_DATA | ND_GPENCIL_EDITMODE)) || (wmn->action == NA_EDITED)) {
1353 ED_region_tag_redraw(region);
1354 }
1355 break;
1356 case NC_IMAGE:
1357 /* Update for the image layers in texture paint. */
1358 if (wmn->action == NA_EDITED) {
1359 ED_region_tag_redraw(region);
1360 }
1361 break;
1362 case NC_WM:
1363 if (wmn->data == ND_XR_DATA_CHANGED) {
1364 ED_region_tag_redraw(region);
1365 }
1366 break;
1367 }
1368}
1369
1370/* add handlers, stuff you only do once or on area/region changes */
1372{
1373 wmKeyMap *keymap;
1374
1375 ED_region_panels_init(wm, region);
1376
1377 keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1378 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
1379}
1380
1381static void view3d_tools_region_draw(const bContext *C, ARegion *region)
1382{
1383 const char *contexts[] = {CTX_data_mode_string(C), nullptr};
1384 ED_region_panels_ex(C, region, WM_OP_INVOKE_REGION_WIN, contexts);
1385}
1386
1396
1397/* add handlers, stuff you only do once or on area/region changes */
1399{
1400 using namespace blender::ed;
1401 wmKeyMap *keymap = WM_keymap_ensure(
1402 wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1403 WM_event_add_keymap_handler(&region->runtime->handlers, keymap);
1404
1406}
1407
1408/* area (not region) level listener */
1410{
1411 ScrArea *area = params->area;
1412 const wmNotifier *wmn = params->notifier;
1413 View3D *v3d = static_cast<View3D *>(area->spacedata.first);
1414
1415 /* context changes */
1416 switch (wmn->category) {
1417 case NC_SCENE:
1418 switch (wmn->data) {
1419 case ND_WORLD: {
1420 const bool use_scene_world = V3D_USES_SCENE_WORLD(v3d);
1421 if (v3d->flag2 & V3D_HIDE_OVERLAYS || use_scene_world) {
1423 }
1424 break;
1425 }
1426 }
1427 break;
1428 case NC_WORLD:
1429 switch (wmn->data) {
1430 case ND_WORLD_DRAW:
1431 case ND_WORLD:
1434 }
1435 break;
1436 }
1437 break;
1438 case NC_MATERIAL:
1439 switch (wmn->data) {
1440 case ND_NODES:
1441 if (v3d->shading.type == OB_TEXTURE) {
1443 }
1444 break;
1445 }
1446 break;
1447 }
1448}
1449
1450static void space_view3d_refresh(const bContext *C, ScrArea *area)
1451{
1452 View3D *v3d = (View3D *)area->spacedata.first;
1454
1461 v3d,
1462 CTX_wm_area(C),
1463 true,
1464 U.smooth_viewtx);
1465 }
1466}
1467
1469 const blender::bke::id::IDRemapper &mappings)
1470{
1471 if (mappings.apply(reinterpret_cast<ID **>(&v3d->ob_center), ID_REMAP_APPLY_DEFAULT) ==
1473 {
1474 /* Otherwise, bone-name may remain valid...
1475 * We could be smart and check this, too? */
1476 v3d->ob_center_bone[0] = '\0';
1477 }
1478}
1479
1481 SpaceLink *slink,
1482 View3D *v3d,
1483 const blender::bke::id::IDRemapper &mappings,
1484 const bool is_local)
1485{
1486 if (mappings.apply(reinterpret_cast<ID **>(&v3d->camera), ID_REMAP_APPLY_DEFAULT) ==
1488 {
1489 /* 3D view might be inactive, in that case needs to use slink->regionbase */
1490 ListBase *regionbase = (slink == area->spacedata.first) ? &area->regionbase :
1491 &slink->regionbase;
1492 LISTBASE_FOREACH (ARegion *, region, regionbase) {
1493 if (region->regiontype == RGN_TYPE_WINDOW) {
1494 RegionView3D *rv3d = is_local ? ((RegionView3D *)region->regiondata)->localvd :
1495 static_cast<RegionView3D *>(region->regiondata);
1496 if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
1497 rv3d->persp = RV3D_PERSP;
1498 }
1499 }
1500 }
1501 }
1502}
1503
1504static void view3d_id_remap(ScrArea *area,
1505 SpaceLink *slink,
1506 const blender::bke::id::IDRemapper &mappings)
1507{
1509 FILTER_ID_MC))
1510 {
1511 return;
1512 }
1513
1514 View3D *view3d = (View3D *)slink;
1515 view3d_id_remap_v3d(area, slink, view3d, mappings, false);
1517 if (view3d->localvd != nullptr) {
1518 /* Object centers in local-view aren't used, see: #52663 */
1519 view3d_id_remap_v3d(area, slink, view3d->localvd, mappings, true);
1520 /* Remapping is potentially modifying ID pointers, and there is a local View3D, mark it for a
1521 * check for emptiness. */
1522 view3d->localvd->runtime.flag |= V3D_RUNTIME_LOCAL_MAYBE_EMPTY;
1523 }
1524 BKE_viewer_path_id_remap(&view3d->viewer_path, mappings);
1525}
1526
1528{
1529 View3D *v3d = reinterpret_cast<View3D *>(space_link);
1530
1533 if (v3d->localvd) {
1535
1536 /* If potentially modifying ID pointers, and there is a local View3D, mark it for a check for
1537 * emptiness. */
1539 if ((flags & IDWALK_READONLY) == 0) {
1541 }
1542 }
1544}
1545
1547{
1548 View3D *v3d = (View3D *)sl;
1549
1550 v3d->runtime = View3D_Runtime{};
1551
1552 if (v3d->gpd) {
1553 BLO_read_struct(reader, bGPdata, &v3d->gpd);
1554 BKE_gpencil_blend_read_data(reader, v3d->gpd);
1555 }
1556 BLO_read_struct(reader, RegionView3D, &v3d->localvd);
1557
1558 /* render can be quite heavy, set to solid on load */
1559 if (v3d->shading.type == OB_RENDER) {
1560 v3d->shading.type = OB_SOLID;
1561 }
1562 v3d->shading.prev_type = OB_SOLID;
1563
1565
1567
1569}
1570
1572{
1573 View3D *v3d = (View3D *)sl;
1574 BLO_write_struct(writer, View3D, v3d);
1575
1576 if (v3d->localvd) {
1577 BLO_write_struct(writer, View3D, v3d->localvd);
1578 }
1579
1581
1583}
1584
1586{
1587 using namespace blender::ed;
1588 std::unique_ptr<SpaceType> st = std::make_unique<SpaceType>();
1589 ARegionType *art;
1590
1591 st->spaceid = SPACE_VIEW3D;
1592 STRNCPY(st->name, "View3D");
1593
1594 st->create = view3d_create;
1595 st->free = view3d_free;
1596 st->init = view3d_init;
1597 st->exit = view3d_exit;
1598 st->listener = space_view3d_listener;
1599 st->refresh = space_view3d_refresh;
1600 st->duplicate = view3d_duplicate;
1601 st->operatortypes = view3d_operatortypes;
1602 st->keymap = view3d_keymap;
1603 st->dropboxes = view3d_dropboxes;
1604 st->gizmos = view3d_widgets;
1605 st->context = view3d_context;
1606 st->id_remap = view3d_id_remap;
1607 st->foreach_id = view3d_foreach_id;
1608 st->blend_read_data = view3d_space_blend_read_data;
1609 st->blend_read_after_liblink = nullptr;
1610 st->blend_write = view3d_space_blend_write;
1611
1612 /* regions: main window */
1613 art = MEM_callocN<ARegionType>("spacetype view3d main region");
1625 BLI_addhead(&st->regiontypes, art);
1626
1627 /* regions: list-view/buttons */
1628 art = MEM_callocN<ARegionType>("spacetype view3d buttons region");
1629 art->regionid = RGN_TYPE_UI;
1637 BLI_addhead(&st->regiontypes, art);
1638
1640
1641 /* regions: tool(bar) */
1642 art = MEM_callocN<ARegionType>("spacetype view3d tools region");
1643 art->regionid = RGN_TYPE_TOOLS;
1644 art->prefsizex = int(UI_TOOLBAR_WIDTH);
1645 art->prefsizey = 50; /* XXX */
1652 BLI_addhead(&st->regiontypes, art);
1653
1654 /* regions: tool header */
1655 art = MEM_callocN<ARegionType>("spacetype view3d tool header region");
1657 art->prefsizey = HEADERY;
1663 BLI_addhead(&st->regiontypes, art);
1664
1665 /* regions: header */
1666 art = MEM_callocN<ARegionType>("spacetype view3d header region");
1668 art->prefsizey = HEADERY;
1674 BLI_addhead(&st->regiontypes, art);
1675
1676 /* regions: asset shelf */
1677 art = MEM_callocN<ARegionType>("spacetype view3d asset shelf region");
1692 BLI_addhead(&st->regiontypes, art);
1693
1694 /* regions: asset shelf header */
1695 art = MEM_callocN<ARegionType>("spacetype view3d asset shelf header region");
1703 BLI_addhead(&st->regiontypes, art);
1705
1706 /* regions: hud */
1707 art = ED_area_type_hud(st->spaceid);
1708 BLI_addhead(&st->regiontypes, art);
1709
1710 /* regions: xr */
1711 art = MEM_callocN<ARegionType>("spacetype view3d xr region");
1712 art->regionid = RGN_TYPE_XR;
1713 BLI_addhead(&st->regiontypes, art);
1714
1719
1720 BKE_spacetype_register(std::move(st));
1721}
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:1243
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:873
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:3414
void BKE_screen_view3d_shading_blend_read_data(BlendDataReader *reader, View3DShading *shading)
Definition screen.cc:1090
void BKE_spacetype_register(std::unique_ptr< SpaceType > st)
Definition screen.cc:276
ARegion * BKE_area_region_new()
Definition screen.cc:381
void BKE_screen_view3d_shading_blend_write(BlendWriter *writer, View3DShading *shading)
Definition screen.cc:1083
SpaceType * BKE_spacetype_from_id(int spaceid)
Definition screen.cc:251
ARegionType * BKE_regiontype_from_id(const SpaceType *st, int regionid)
Definition screen.cc:261
void BKE_screen_view3d_sync(View3D *v3d, Scene *scene)
Definition screen.cc:980
@ REGION_DRAW_LOCK_ALL
void BKE_screen_view3d_do_versions_250(View3D *v3d, ListBase *regions)
Definition screen.cc:1318
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])
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:688
#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:51
#define BPy_END_ALLOW_THREADS
Definition BPY_extern.hh:55
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_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_HIDDEN_BY_USER
@ RGN_ALIGN_HIDE_WITH_PREV
@ RGN_ALIGN_BOTTOM
@ RGN_ALIGN_LEFT
@ RGN_ALIGN_TOP
@ RGN_ALIGN_RIGHT
@ SPACE_EMPTY
@ SPACE_VIEW3D
@ USER_HEADER_BOTTOM
@ V3D_SHADING_BACKGROUND_WORLD
@ RV3D_LOCK_ROTATION
#define V3D_USES_SCENE_WORLD(v3d)
@ V3D_LOCAL_COLLECTIONS
@ V3D_XR_SESSION_MIRROR
@ V3D_SHOW_VIEWER
@ V3D_HIDE_OVERLAYS
@ RV3D_CAMOB
@ RV3D_PERSP
@ V3D_RUNTIME_LOCAL_MAYBE_EMPTY
@ RV3D_GPULIGHT_UPDATE
@ RV3D_VIEW_USER
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:417
ARegionType * ED_area_type_hud(int space_type)
void ED_area_do_mgs_subscribe_for_tool_ui(const wmRegionMessageSubscribeParams *params)
Definition area.cc:432
@ ED_KEYMAP_ASSET_SHELF
Definition ED_screen.hh:750
@ ED_KEYMAP_UI
Definition ED_screen.hh:740
@ ED_KEYMAP_HEADER
Definition ED_screen.hh:746
@ ED_KEYMAP_TOOL
Definition ED_screen.hh:742
@ ED_KEYMAP_GPENCIL
Definition ED_screen.hh:748
@ ED_KEYMAP_GIZMO
Definition ED_screen.hh:741
@ ED_KEYMAP_VIEW2D
Definition ED_screen.hh:743
@ ED_KEYMAP_FRAMES
Definition ED_screen.hh:745
@ ED_KEYMAP_FOOTER
Definition ED_screen.hh:747
void ED_region_header(const bContext *C, ARegion *region)
Definition area.cc:3754
void ED_region_header_init(ARegion *region)
Definition area.cc:3769
void ED_area_tag_redraw_regiontype(ScrArea *area, int regiontype)
Definition area.cc:732
void ED_region_panels_layout_ex(const bContext *C, ARegion *region, ListBase *paneltypes, wmOperatorCallContext op_context, const char *contexts[], const char *category_override)
Definition area.cc:3219
void ED_region_header_with_button_sections(const bContext *C, ARegion *region, uiButtonSectionsAlign align)
Definition area.cc:3761
int ED_region_generic_tools_region_snap_size(const ARegion *region, int size, int axis)
Definition area_utils.cc:38
void ED_region_tag_redraw_cursor(ARegion *region)
Definition area.cc:652
void ED_area_tag_refresh(ScrArea *area)
Definition area.cc:743
void ED_region_generic_tools_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
Definition area_utils.cc:26
void ED_region_panels_init(wmWindowManager *wm, ARegion *region)
Definition area.cc:3473
void ED_region_tag_redraw(ARegion *region)
Definition area.cc:639
void ED_region_do_msg_notify_tag_redraw(bContext *C, wmMsgSubscribeKey *msg_key, wmMsgSubscribeValue *msg_val)
Definition area.cc:384
void ED_region_panels_ex(const bContext *C, ARegion *region, wmOperatorCallContext op_context, const char *contexts[])
Definition area.cc:3455
void ED_region_panels_draw(const bContext *C, ARegion *region)
Definition area.cc:3409
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:1729
#define NC_WORLD
Definition WM_types.hh:384
#define ND_SHADING
Definition WM_types.hh:474
#define ND_WORLD
Definition WM_types.hh:449
#define ND_ASSET_LIST_READING
Definition WM_types.hh:547
#define NC_ID
Definition WM_types.hh:392
#define NC_NODE
Definition WM_types.hh:391
#define NC_GEOM
Definition WM_types.hh:390
#define ND_NLA_ACTCHANGE
Definition WM_types.hh:495
#define ND_DRAW
Definition WM_types.hh:458
#define NC_BRUSH
Definition WM_types.hh:382
#define ND_OB_ACTIVE
Definition WM_types.hh:437
#define NC_WM
Definition WM_types.hh:371
#define ND_DATA
Definition WM_types.hh:506
#define ND_GPENCIL_EDITMODE
Definition WM_types.hh:501
#define ND_LIGHTING_DRAW
Definition WM_types.hh:481
#define ND_RENDER_OPTIONS
Definition WM_types.hh:432
#define ND_SPACE_ASSET_PARAMS
Definition WM_types.hh:522
#define NC_ANIMATION
Definition WM_types.hh:385
#define NC_VIEWER_PATH
Definition WM_types.hh:403
#define ND_VERTEX_GROUP
Definition WM_types.hh:507
#define ND_DISPLAY
Definition WM_types.hh:488
#define ND_LOD
Definition WM_types.hh:465
#define NC_SCREEN
Definition WM_types.hh:374
#define NC_MOVIECLIP
Definition WM_types.hh:394
#define ND_SKETCH
Definition WM_types.hh:424
#define ND_MODE
Definition WM_types.hh:442
#define ND_OB_SELECT
Definition WM_types.hh:439
#define ND_ANIMPLAY
Definition WM_types.hh:421
#define NC_SCENE
Definition WM_types.hh:375
#define NA_ADDED
Definition WM_types.hh:583
#define ND_OB_VISIBLE
Definition WM_types.hh:440
#define ND_LAYER_CONTENT
Definition WM_types.hh:450
#define NC_GROUP
Definition WM_types.hh:380
#define ND_NODES
Definition WM_types.hh:433
#define ND_TOOLSETTINGS
Definition WM_types.hh:446
#define ND_MODIFIER
Definition WM_types.hh:459
#define ND_POSE
Definition WM_types.hh:455
#define NA_EDITED
Definition WM_types.hh:581
#define ND_PARTICLE
Definition WM_types.hh:462
#define ND_KEYFRAME_PROP
Definition WM_types.hh:492
#define NC_MATERIAL
Definition WM_types.hh:377
#define NC_LAMP
Definition WM_types.hh:379
#define NC_IMAGE
Definition WM_types.hh:381
#define ND_CONSTRAINT
Definition WM_types.hh:461
#define NC_WORKSPACE
Definition WM_types.hh:373
#define ND_UNDO
Definition WM_types.hh:414
#define ND_MARKERS
Definition WM_types.hh:430
#define NC_CAMERA
Definition WM_types.hh:398
#define ND_FRAME
Definition WM_types.hh:431
#define NC_ASSET
Definition WM_types.hh:401
#define NA_REMOVED
Definition WM_types.hh:584
#define ND_SELECT
Definition WM_types.hh:505
#define NC_GPENCIL
Definition WM_types.hh:396
#define ND_NLA
Definition WM_types.hh:494
#define NC_TEXTURE
Definition WM_types.hh:378
#define NS_VIEW3D_GPU
Definition WM_types.hh:573
#define ND_LIGHTING
Definition WM_types.hh:480
#define ND_BONE_ACTIVE
Definition WM_types.hh:456
#define ND_TRANSFORM
Definition WM_types.hh:453
#define ND_LAYER
Definition WM_types.hh:447
@ WM_OP_INVOKE_REGION_WIN
Definition WM_types.hh:239
#define ND_BONE_COLLECTION
Definition WM_types.hh:471
#define ND_KEYS
Definition WM_types.hh:460
#define NA_RENAME
Definition WM_types.hh:585
#define ND_ASSET_CATALOGS
Definition WM_types.hh:551
#define ND_NODE_GIZMO
Definition WM_types.hh:513
#define ND_HISTORY
Definition WM_types.hh:412
#define NC_LIGHTPROBE
Definition WM_types.hh:399
#define ND_POINTCACHE
Definition WM_types.hh:463
#define ND_XR_DATA_CHANGED
Definition WM_types.hh:415
#define ND_SHADERFX
Definition WM_types.hh:468
#define ND_WORLD_DRAW
Definition WM_types.hh:484
#define ND_LAYOUTBROWSE
Definition WM_types.hh:419
#define ND_DRAW_ANIMVIZ
Definition WM_types.hh:470
#define ND_BONE_SELECT
Definition WM_types.hh:457
#define ND_SPACE_VIEW3D
Definition WM_types.hh:525
#define ND_KEYFRAME
Definition WM_types.hh:491
#define ND_LAYOUTSET
Definition WM_types.hh:423
#define NC_OBJECT
Definition WM_types.hh:376
#define ND_SCENEBROWSE
Definition WM_types.hh:429
#define NS_VIEW3D_SHADING
Definition WM_types.hh:574
#define ND_LAYOUTDELETE
Definition WM_types.hh:420
#define ND_NODE_ASSET_DATA
Definition WM_types.hh:512
#define ND_ANIMCHAN
Definition WM_types.hh:493
#define ND_SHADING_LINKS
Definition WM_types.hh:476
#define ND_SHADING_DRAW
Definition WM_types.hh:475
#define NC_SPACE
Definition WM_types.hh:389
#define NA_SELECTED
Definition WM_types.hh:586
#define ND_DRAW_RENDER_VIEWPORT
Definition WM_types.hh:467
#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
#define FILTER_ID_OB
#define FILTER_ID_MC
#define FILTER_ID_MA
#define FILTER_ID_IM
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:404
void * first
ListBase wm
Definition BKE_main.hh:276
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:355
unsigned int action
Definition WM_types.hh:355
unsigned int category
Definition WM_types.hh:355
unsigned int subtype
Definition WM_types.hh:355
void * reference
Definition WM_types.hh:357
struct wmKeyConfig * defaultconf
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:1643
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:598
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition wm_keymap.cc:893
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)