Blender V4.3
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
9/* Allow using deprecated functionality for .blend file I/O. */
10#define DNA_DEPRECATED_ALLOW
11
12#include <cstdio>
13#include <cstring>
14
16
18#include "DNA_defaults.h"
21#include "DNA_material_types.h"
22#include "DNA_object_types.h"
23#include "DNA_scene_types.h"
24#include "DNA_view3d_types.h"
25
26#include "MEM_guardedalloc.h"
27
28#include "BLI_blenlib.h"
29#include "BLI_math_matrix.h"
30#include "BLI_math_vector.h"
31#include "BLI_math_vector.hh"
32#include "BLI_utildefines.h"
33
34#include "BLT_translation.hh"
35
36#include "BKE_asset.hh"
37#include "BKE_context.hh"
38#include "BKE_global.hh"
39#include "BKE_gpencil_legacy.h"
40#include "BKE_idprop.hh"
41#include "BKE_layer.hh"
42#include "BKE_lib_id.hh"
43#include "BKE_lib_query.hh"
44#include "BKE_lib_remap.hh"
45#include "BKE_main.hh"
46#include "BKE_object.hh"
47#include "BKE_scene.hh"
48#include "BKE_screen.hh"
49#include "BKE_viewer_path.hh"
50
51#include "ED_asset_shelf.hh"
52#include "ED_geometry.hh"
53#include "ED_object.hh"
54#include "ED_outliner.hh"
55#include "ED_render.hh"
56#include "ED_screen.hh"
57#include "ED_space_api.hh"
58#include "ED_transform.hh"
59#include "ED_undo.hh"
60
61#include "GPU_matrix.hh"
62
63#include "DRW_engine.hh"
64
65#include "WM_api.hh"
66#include "WM_message.hh"
67#include "WM_toolsystem.hh"
68#include "WM_types.hh"
69
70#include "RNA_access.hh"
71
72#include "UI_interface.hh"
73#include "UI_resources.hh"
74
75#include "BLO_read_write.hh"
76
77#ifdef WITH_PYTHON
78# include "BPY_extern.hh"
79#endif
80
81#include "DEG_depsgraph.hh"
83
84#include "view3d_intern.hh" /* own include */
85#include "view3d_navigate.hh"
86
87/* ******************** manage regions ********************* */
88
89bool ED_view3d_area_user_region(const ScrArea *area, const View3D *v3d, ARegion **r_region)
90{
91 RegionView3D *rv3d = nullptr;
92 ARegion *region_unlock_user = nullptr;
93 ARegion *region_unlock = nullptr;
94 const ListBase *region_list = (v3d == area->spacedata.first) ? &area->regionbase :
95 &v3d->regionbase;
96
98
99 LISTBASE_FOREACH (ARegion *, region, region_list) {
100 /* find the first unlocked rv3d */
101 if (region->regiondata && region->regiontype == RGN_TYPE_WINDOW) {
102 rv3d = static_cast<RegionView3D *>(region->regiondata);
103 if ((rv3d->viewlock & RV3D_LOCK_ROTATION) == 0) {
104 region_unlock = region;
105 if (ELEM(rv3d->persp, RV3D_PERSP, RV3D_CAMOB)) {
106 region_unlock_user = region;
107 break;
108 }
109 }
110 }
111 }
112
113 /* camera/perspective view get priority when the active region is locked */
114 if (region_unlock_user) {
115 *r_region = region_unlock_user;
116 return true;
117 }
118
119 if (region_unlock) {
120 *r_region = region_unlock;
121 return true;
122 }
123
124 return false;
125}
126
128{
129 /* local viewmat and persmat, to calculate projections */
130 mul_m4_m4m4(rv3d->viewmatob, rv3d->viewmat, ob->object_to_world().ptr());
131 mul_m4_m4m4(rv3d->persmatob, rv3d->persmat, ob->object_to_world().ptr());
132
133 /* initializes object space clipping, speeds up clip tests */
134 ED_view3d_clipping_local(rv3d, ob->object_to_world().ptr());
135}
136
138{
139 ED_view3d_init_mats_rv3d(ob, rv3d);
140
141 /* We have to multiply instead of loading `viewmatob` to make
142 * it work with duplis using display-lists, otherwise it will
143 * override the dupli-matrix. */
144 GPU_matrix_mul(ob->object_to_world().ptr());
145}
146
147#ifndef NDEBUG
149{
150 zero_m4(rv3d->viewmatob);
151 zero_m4(rv3d->persmatob);
152}
153
159#endif
160
162{
163 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
164
165 if (rv3d->view_render) {
166#ifdef WITH_PYTHON
168#endif
169
171
172#ifdef WITH_PYTHON
174#endif
175
177 }
178
179 /* A bit overkill but this make sure the viewport is reset completely. (fclem) */
180 WM_draw_region_free(region);
181}
182
183void ED_view3d_shade_update(Main *bmain, View3D *v3d, ScrArea *area)
184{
185 wmWindowManager *wm = static_cast<wmWindowManager *>(bmain->wm.first);
186
187 if (v3d->shading.type != OB_RENDER) {
188 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
189 if ((region->regiontype == RGN_TYPE_WINDOW) && region->regiondata) {
191 }
192 }
193 }
194}
195
196/* ******************** default callbacks for view3d space ***************** */
197
198static SpaceLink *view3d_create(const ScrArea * /*area*/, const Scene *scene)
199{
200 ARegion *region;
201 View3D *v3d;
202 RegionView3D *rv3d;
203
205
206 if (scene) {
207 v3d->camera = scene->camera;
208 }
209
210 /* header */
211 region = MEM_cnew<ARegion>("header for view3d");
212
213 BLI_addtail(&v3d->regionbase, region);
214 region->regiontype = RGN_TYPE_HEADER;
215 region->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP;
216
217 /* tool header */
218 region = MEM_cnew<ARegion>("tool header for view3d");
219
220 BLI_addtail(&v3d->regionbase, region);
221 region->regiontype = RGN_TYPE_TOOL_HEADER;
222 region->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP;
224
225 /* asset shelf */
226 region = MEM_cnew<ARegion>("asset shelf for view3d");
227
228 BLI_addtail(&v3d->regionbase, region);
229 region->regiontype = RGN_TYPE_ASSET_SHELF;
230 region->alignment = RGN_ALIGN_BOTTOM;
231 region->flag |= RGN_FLAG_HIDDEN;
232
233 /* asset shelf header */
234 region = MEM_cnew<ARegion>("asset shelf header for view3d");
235 BLI_addtail(&v3d->regionbase, region);
236 region->regiontype = RGN_TYPE_ASSET_SHELF_HEADER;
237 region->alignment = RGN_ALIGN_BOTTOM | RGN_ALIGN_HIDE_WITH_PREV;
238
239 /* tool shelf */
240 region = MEM_cnew<ARegion>("toolshelf for view3d");
241
242 BLI_addtail(&v3d->regionbase, region);
243 region->regiontype = RGN_TYPE_TOOLS;
244 region->alignment = RGN_ALIGN_LEFT;
245 region->flag = RGN_FLAG_HIDDEN;
246
247 /* buttons/list view */
248 region = MEM_cnew<ARegion>("buttons for view3d");
249
250 BLI_addtail(&v3d->regionbase, region);
251 region->regiontype = RGN_TYPE_UI;
252 region->alignment = RGN_ALIGN_RIGHT;
253 region->flag = RGN_FLAG_HIDDEN;
254
255 /* main region */
256 region = MEM_cnew<ARegion>("main region for view3d");
257
258 BLI_addtail(&v3d->regionbase, region);
259 region->regiontype = RGN_TYPE_WINDOW;
260
261 region->regiondata = MEM_cnew<RegionView3D>("region view3d");
262 rv3d = static_cast<RegionView3D *>(region->regiondata);
263 rv3d->viewquat[0] = 1.0f;
264 rv3d->persp = RV3D_PERSP;
265 rv3d->view = RV3D_VIEW_USER;
266 rv3d->dist = 10.0;
267
268 return (SpaceLink *)v3d;
269}
270
271/* Doesn't free the space-link itself. */
272static void view3d_free(SpaceLink *sl)
273{
274 View3D *vd = (View3D *)sl;
275
276 if (vd->localvd) {
277 MEM_freeN(vd->localvd);
278 }
279
281
284 vd->runtime.properties_storage_free = nullptr;
285 }
286
287 if (vd->shading.prop) {
289 vd->shading.prop = nullptr;
290 }
291
293}
294
295/* spacetype; init callback */
296static void view3d_init(wmWindowManager * /*wm*/, ScrArea * /*area*/) {}
297
298static void view3d_exit(wmWindowManager * /*wm*/, ScrArea *area)
299{
300 BLI_assert(area->spacetype == SPACE_VIEW3D);
301 View3D *v3d = static_cast<View3D *>(area->spacedata.first);
303}
304
306{
307 View3D *v3do = (View3D *)sl;
308 View3D *v3dn = static_cast<View3D *>(MEM_dupallocN(sl));
309
310 memset(&v3dn->runtime, 0x0, sizeof(v3dn->runtime));
311
312 /* clear or remove stuff from old */
313
314 if (v3dn->localvd) {
315 v3dn->localvd = nullptr;
316 }
317
318 v3dn->local_collections_uid = 0;
320
321 if (v3dn->shading.type == OB_RENDER) {
322 v3dn->shading.type = OB_SOLID;
323 }
324
325 if (v3dn->shading.prop) {
327 }
328
330
331 /* copy or clear inside new stuff */
332
333 return (SpaceLink *)v3dn;
334}
335
336/* add handlers, stuff you only do once or on area/region changes */
338{
339 ListBase *lb;
340 wmKeyMap *keymap;
341
342 /* object ops. */
343
344 /* important to be before Pose keymap since they can both be enabled at once */
345 keymap = WM_keymap_ensure(
346 wm->defaultconf, "Paint Face Mask (Weight, Vertex, Texture)", SPACE_EMPTY, RGN_TYPE_WINDOW);
347 WM_event_add_keymap_handler(&region->handlers, keymap);
348
349 keymap = WM_keymap_ensure(
350 wm->defaultconf, "Paint Vertex Selection (Weight, Vertex)", SPACE_EMPTY, RGN_TYPE_WINDOW);
351 WM_event_add_keymap_handler(&region->handlers, keymap);
352
353 /* Before 'Weight/Vertex Paint' so adding curve points is not overridden. */
354 keymap = WM_keymap_ensure(wm->defaultconf, "Paint Curve", SPACE_EMPTY, RGN_TYPE_WINDOW);
355 WM_event_add_keymap_handler(&region->handlers, keymap);
356
357 /* Before 'Pose' so weight paint menus aren't overridden by pose menus. */
358 keymap = WM_keymap_ensure(wm->defaultconf, "Weight Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
359 WM_event_add_keymap_handler(&region->handlers, keymap);
360
361 keymap = WM_keymap_ensure(wm->defaultconf, "Vertex Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
362 WM_event_add_keymap_handler(&region->handlers, keymap);
363
364 /* pose is not modal, operator poll checks for this */
366 WM_event_add_keymap_handler(&region->handlers, keymap);
367
368 keymap = WM_keymap_ensure(wm->defaultconf, "Object Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
369 WM_event_add_keymap_handler(&region->handlers, keymap);
370
372 WM_event_add_keymap_handler(&region->handlers, keymap);
373
375 WM_event_add_keymap_handler(&region->handlers, keymap);
376
377 keymap = WM_keymap_ensure(wm->defaultconf, "Image Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
378 WM_event_add_keymap_handler(&region->handlers, keymap);
379
381 WM_event_add_keymap_handler(&region->handlers, keymap);
382
384 WM_event_add_keymap_handler(&region->handlers, keymap);
385
386 keymap = WM_keymap_ensure(wm->defaultconf, "Armature", SPACE_EMPTY, RGN_TYPE_WINDOW);
387 WM_event_add_keymap_handler(&region->handlers, keymap);
388
389 keymap = WM_keymap_ensure(wm->defaultconf, "Metaball", SPACE_EMPTY, RGN_TYPE_WINDOW);
390 WM_event_add_keymap_handler(&region->handlers, keymap);
391
392 keymap = WM_keymap_ensure(wm->defaultconf, "Lattice", SPACE_EMPTY, RGN_TYPE_WINDOW);
393 WM_event_add_keymap_handler(&region->handlers, keymap);
394
395 keymap = WM_keymap_ensure(wm->defaultconf, "Particle", SPACE_EMPTY, RGN_TYPE_WINDOW);
396 WM_event_add_keymap_handler(&region->handlers, keymap);
397
398 keymap = WM_keymap_ensure(wm->defaultconf, "Sculpt Curves", SPACE_EMPTY, RGN_TYPE_WINDOW);
399 WM_event_add_keymap_handler(&region->handlers, keymap);
400
401 /* NOTE: Grease Pencil handlers used to be added using `ED_KEYMAP_GPENCIL` in
402 * `ed_default_handlers` because it needed to be added to multiple editors (as other editors use
403 * annotations.). But for OB_GREASE_PENCIL, we only need it to register the keymaps for the
404 * 3D View. */
405 keymap = WM_keymap_ensure(
406 wm->defaultconf, "Grease Pencil Selection", SPACE_EMPTY, RGN_TYPE_WINDOW);
407 WM_event_add_keymap_handler(&region->handlers, keymap);
408
409 keymap = WM_keymap_ensure(
410 wm->defaultconf, "Grease Pencil Edit Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
411 WM_event_add_keymap_handler(&region->handlers, keymap);
412
413 keymap = WM_keymap_ensure(
414 wm->defaultconf, "Grease Pencil Paint Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
415 WM_event_add_keymap_handler(&region->handlers, keymap);
416
417 keymap = WM_keymap_ensure(
418 wm->defaultconf, "Grease Pencil Sculpt Mode", SPACE_EMPTY, RGN_TYPE_WINDOW);
419 WM_event_add_keymap_handler(&region->handlers, keymap);
420
421 keymap = WM_keymap_ensure(
422 wm->defaultconf, "Grease Pencil Weight Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
423 WM_event_add_keymap_handler(&region->handlers, keymap);
424
425 keymap = WM_keymap_ensure(
426 wm->defaultconf, "Grease Pencil Vertex Paint", SPACE_EMPTY, RGN_TYPE_WINDOW);
427 WM_event_add_keymap_handler(&region->handlers, keymap);
428
429 keymap = WM_keymap_ensure(
430 wm->defaultconf, "Grease Pencil Brush Stroke", SPACE_EMPTY, RGN_TYPE_WINDOW);
431 WM_event_add_keymap_handler(&region->handlers, keymap);
432
433 keymap = WM_keymap_ensure(
434 wm->defaultconf, "Grease Pencil Fill Tool", SPACE_EMPTY, RGN_TYPE_WINDOW);
435 WM_event_add_keymap_handler(&region->handlers, keymap);
436
437 /* Edit-font key-map swallows almost all (because of text input). */
439 WM_event_add_keymap_handler(&region->handlers, keymap);
440
441 keymap = WM_keymap_ensure(wm->defaultconf, "Object Non-modal", SPACE_EMPTY, RGN_TYPE_WINDOW);
442 WM_event_add_keymap_handler(&region->handlers, keymap);
443
445 WM_event_add_keymap_handler(&region->handlers, keymap);
446
447 /* own keymap, last so modes can override it */
448 keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
449 WM_event_add_keymap_handler(&region->handlers, keymap);
450
451 keymap = WM_keymap_ensure(wm->defaultconf, "3D View", SPACE_VIEW3D, RGN_TYPE_WINDOW);
452 WM_event_add_keymap_handler(&region->handlers, keymap);
453
454 /* add drop boxes */
456
457 WM_event_add_dropbox_handler(&region->handlers, lb);
458}
459
461{
463}
464
466{
467 ScrArea *area = CTX_wm_area(C);
468 return ED_region_overlap_isect_any_xy(area, event->xy) == false;
469}
470
472 wmDrag *drag,
473 const wmEvent *event)
474{
475 const ScrArea *area = CTX_wm_area(C);
476
477 if (ED_region_overlap_isect_any_xy(area, event->xy)) {
478 return ID_Type(0);
479 }
480 if (!view3d_drop_in_main_region_poll(C, event)) {
481 return ID_Type(0);
482 }
483
484 ID *local_id = WM_drag_get_local_ID(drag, 0);
485 if (local_id) {
486 return GS(local_id->name);
487 }
488
489 wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0);
490 if (asset_drag) {
491 return asset_drag->asset->get_id_type();
492 }
493
494 return ID_Type(0);
495}
496
498 wmDrag *drag,
499 const wmEvent *event,
500 ID_Type id_type)
501{
502 if (!view3d_drop_in_main_region_poll(C, event)) {
503 return false;
504 }
505
506 return WM_drag_is_ID_type(drag, id_type);
507}
508
509static void view3d_ob_drop_on_enter(wmDropBox *drop, wmDrag *drag)
510{
511 V3DSnapCursorState *state = static_cast<V3DSnapCursorState *>(drop->draw_data);
512 if (state) {
513 return;
514 }
515
516 /* Don't use the snap cursor when linking the object. Object transform isn't editable then and
517 * would be reset on reload. */
519 return;
520 }
521
523 drop->draw_data = state;
524 state->draw_plane = true;
525
526 float dimensions[3] = {0.0f};
527 if (drag->type == WM_DRAG_ID) {
528 Object *ob = (Object *)WM_drag_get_local_ID(drag, ID_OB);
530 }
531 else {
533 IDProperty *dimensions_prop = BKE_asset_metadata_idprop_find(meta_data, "dimensions");
534 if (dimensions_prop) {
535 copy_v3_v3(dimensions, static_cast<float *>(IDP_Array(dimensions_prop)));
536 }
537 }
538
539 if (!is_zero_v3(dimensions)) {
540 mul_v3_v3fl(state->box_dimensions, dimensions, 0.5f);
542 state->draw_box = true;
543 }
544}
545
546static void view3d_ob_drop_on_exit(wmDropBox *drop, wmDrag * /*drag*/)
547{
548 V3DSnapCursorState *state = static_cast<V3DSnapCursorState *>(drop->draw_data);
549 if (state) {
551 drop->draw_data = nullptr;
552 }
553}
554
555static bool view3d_ob_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
556{
557 return view3d_drop_id_in_main_region_poll(C, drag, event, ID_OB);
558}
559static bool view3d_ob_drop_poll_external_asset(bContext *C, wmDrag *drag, const wmEvent *event)
560{
561 if (!view3d_ob_drop_poll(C, drag, event) || (drag->type != WM_DRAG_ASSET)) {
562 return false;
563 }
564 return true;
565}
566
571static bool view3d_ob_drop_poll_local_id(bContext *C, wmDrag *drag, const wmEvent *event)
572{
573 if (!view3d_ob_drop_poll(C, drag, event) || (drag->type != WM_DRAG_ID)) {
574 return false;
575 }
576 return true;
577}
578
579static bool view3d_collection_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
580{
581 return view3d_drop_id_in_main_region_poll(C, drag, event, ID_GR);
582}
583
585{
586 if (!view3d_collection_drop_poll(C, drag, event) || (drag->type != WM_DRAG_ID)) {
587 return false;
588 }
589 return true;
590}
591
593 wmDrag *drag,
594 const wmEvent *event)
595{
596 if (!view3d_collection_drop_poll(C, drag, event) || (drag->type != WM_DRAG_ASSET)) {
597 return false;
598 }
599 return true;
600}
601
602static bool view3d_mat_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
603{
604 if (!view3d_drop_id_in_main_region_poll(C, drag, event, ID_MA)) {
605 return false;
606 }
607
609
610 return (ob && ID_IS_EDITABLE(&ob->id) && !ID_IS_OVERRIDE_LIBRARY(&ob->id));
611}
612
613static std::string view3d_mat_drop_tooltip(bContext *C,
614 wmDrag *drag,
615 const int xy[2],
616 wmDropBox * /*drop*/)
617{
618 const char *name = WM_drag_get_item_name(drag);
619 ARegion *region = CTX_wm_region(C);
620 const int mval[2] = {
621 xy[0] - region->winrct.xmin,
622 xy[1] - region->winrct.ymin,
623 };
625}
626
627static bool view3d_world_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
628{
629 return view3d_drop_id_in_main_region_poll(C, drag, event, ID_WO);
630}
631
632static bool view3d_object_data_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
633{
635 if (id_type && OB_DATA_SUPPORT_ID(id_type)) {
636 return true;
637 }
638 return false;
639}
640
641static std::string view3d_object_data_drop_tooltip(bContext * /*C*/,
642 wmDrag * /*drag*/,
643 const int /*xy*/[2],
644 wmDropBox * /*drop*/)
645{
646 return TIP_("Create object instance from object-data");
647}
648
649static bool view3d_ima_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
650{
652 return false;
653 }
654 return WM_drag_is_ID_type(drag, ID_IM);
655}
656
658{
660 if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
661 View3D *v3d = CTX_wm_view3d(C);
662 if (v3d && v3d->camera && v3d->camera->type == OB_CAMERA) {
663 return true;
664 }
665 }
666 return false;
667}
668
669static bool view3d_ima_bg_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
670{
671 if (!view3d_ima_drop_poll(C, drag, event)) {
672 return false;
673 }
674
675 if (ED_view3d_is_object_under_cursor(C, event->mval)) {
676 return false;
677 }
678
680}
681
682static bool view3d_ima_empty_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
683{
684 if (!view3d_ima_drop_poll(C, drag, event)) {
685 return false;
686 }
687
689
690 if (ob == nullptr) {
691 return true;
692 }
693
694 if (ob->type == OB_EMPTY && ob->empty_drawtype == OB_EMPTY_IMAGE) {
695 return true;
696 }
697
698 return false;
699}
700
701static bool view3d_geometry_nodes_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
702{
703 if (!view3d_drop_id_in_main_region_poll(C, drag, event, ID_NT)) {
704 return false;
705 }
706
707 if (drag->type == WM_DRAG_ID) {
708 const bNodeTree *node_tree = reinterpret_cast<const bNodeTree *>(
710 if (!node_tree) {
711 return false;
712 }
713 return node_tree->type == NTREE_GEOMETRY;
714 }
715
716 if (drag->type == WM_DRAG_ASSET) {
717 const wmDragAsset *asset_data = WM_drag_get_asset_data(drag, ID_NT);
718 if (!asset_data) {
719 return false;
720 }
721 const AssetMetaData *metadata = &asset_data->asset->get_metadata();
722 const IDProperty *tree_type = BKE_asset_metadata_idprop_find(metadata, "type");
723 if (!tree_type || IDP_Int(tree_type) != NTREE_GEOMETRY) {
724 return false;
725 }
726 if (wmDropBox *drop_box = drag->drop_state.active_dropbox) {
727 const uint32_t uid = RNA_int_get(drop_box->ptr, "session_uid");
728 const bNodeTree *node_tree = reinterpret_cast<const bNodeTree *>(
730 if (node_tree) {
731 return node_tree->type == NTREE_GEOMETRY;
732 }
733 }
734 }
735 return true;
736}
737
739 wmDrag * /*drag*/,
740 const int xy[2],
741 wmDropBox *drop)
742{
743 ARegion *region = CTX_wm_region(C);
744 int mval[2] = {xy[0] - region->winrct.xmin, xy[1] - region->winrct.ymin};
746}
747
749 Object *ob,
750 float obmat_final[4][4])
751{
752 using namespace blender;
754 BLI_assert(snap_state->draw_box || snap_state->draw_plane);
755 UNUSED_VARS_NDEBUG(snap_state);
756 copy_m4_m3(obmat_final, snap_data->plane_omat);
757 copy_v3_v3(obmat_final[3], snap_data->loc);
758
759 float scale[3];
760 mat4_to_size(scale, ob->object_to_world().ptr());
761 rescale_m4(obmat_final, scale);
762
763 if (const std::optional<Bounds<float3>> bb = BKE_object_boundbox_get(ob)) {
764 float3 offset = math::midpoint(bb->min, bb->max);
765 offset[2] = bb->min[2];
766 mul_mat3_m4_v3(obmat_final, offset);
767 sub_v3_v3(obmat_final[3], offset);
768 }
769}
770
771static void view3d_ob_drop_copy_local_id(bContext * /*C*/, wmDrag *drag, wmDropBox *drop)
772{
773 ID *id = WM_drag_get_local_ID(drag, ID_OB);
774
775 RNA_int_set(drop->ptr, "session_uid", id->session_uid);
776 /* Don't duplicate ID's which were just imported. Only do that for existing, local IDs. */
777 BLI_assert(drag->type != WM_DRAG_ASSET);
778
780 float obmat_final[4][4];
781
782 view3d_ob_drop_matrix_from_snap(snap_state, (Object *)id, obmat_final);
783
784 RNA_float_set_array(drop->ptr, "matrix", &obmat_final[0][0]);
785}
786
787/* Mostly the same logic as #view3d_collection_drop_copy_external_asset(), just different enough to
788 * make sharing code a bit difficult. */
790{
791 /* NOTE(@ideasman42): Selection is handled here, de-selecting objects before append,
792 * using auto-select to ensure the new objects are selected.
793 * This is done so #OBJECT_OT_transform_to_mouse (which runs after this drop handler)
794 * can use the context setup here to place the objects. */
795 BLI_assert(drag->type == WM_DRAG_ASSET);
796
797 wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0);
798 Scene *scene = CTX_data_scene(C);
799 ViewLayer *view_layer = CTX_data_view_layer(C);
800
801 BKE_view_layer_base_deselect_all(scene, view_layer);
802
803 ID *id = WM_drag_asset_id_import(C, asset_drag, FILE_AUTOSELECT);
804
805 /* TODO(sergey): Only update relations for the current scene. */
808
809 RNA_int_set(drop->ptr, "session_uid", id->session_uid);
810
811 BKE_view_layer_synced_ensure(scene, view_layer);
812 Base *base = BKE_view_layer_base_find(view_layer, (Object *)id);
813 if (base != nullptr) {
816 }
819
820 /* Make sure the depsgraph is evaluated so the new object's transforms are up-to-date.
821 * The evaluated #Object::object_to_world() will be copied back to the original object
822 * and used below. */
824
825 V3DSnapCursorState *snap_state = static_cast<V3DSnapCursorState *>(drop->draw_data);
826 if (snap_state) {
827 float obmat_final[4][4];
828
829 view3d_ob_drop_matrix_from_snap(snap_state, (Object *)id, obmat_final);
830
831 RNA_float_set_array(drop->ptr, "matrix", &obmat_final[0][0]);
832 }
833}
834
836{
837 ID *id = WM_drag_get_local_ID(drag, ID_GR);
838 RNA_int_set(drop->ptr, "session_uid", int(id->session_uid));
839}
840
841/* Mostly the same logic as #view3d_ob_drop_copy_external_asset(), just different enough to make
842 * sharing code a bit difficult. */
844{
845 BLI_assert(drag->type == WM_DRAG_ASSET);
846
847 wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0);
848 Scene *scene = CTX_data_scene(C);
849 ViewLayer *view_layer = CTX_data_view_layer(C);
850
851 BKE_view_layer_base_deselect_all(scene, view_layer);
852
853 ID *id = WM_drag_asset_id_import(C, asset_drag, FILE_AUTOSELECT);
854 Collection *collection = (Collection *)id;
855
856 /* TODO(sergey): Only update relations for the current scene. */
859
860 RNA_int_set(drop->ptr, "session_uid", int(id->session_uid));
861
862 /* Make an object active, just use the first one in the collection. */
863 CollectionObject *cobject = static_cast<CollectionObject *>(collection->gobject.first);
864 BKE_view_layer_synced_ensure(scene, view_layer);
865 Base *base = cobject ? BKE_view_layer_base_find(view_layer, cobject->ob) : nullptr;
866 if (base) {
870 }
873
874 /* XXX Without an undo push here, there will be a crash when the user modifies operator
875 * properties. The stuff we do in these drop callbacks just isn't safe over undo/redo. */
876 ED_undo_push(C, "Collection_Drop");
877}
878
879static void view3d_id_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
880{
882
884 RNA_boolean_set(drop->ptr, "show_datablock_in_modifier", (drag->type != WM_DRAG_ASSET));
885}
886
888{
889 view3d_id_drop_copy(C, drag, drop);
890 RNA_boolean_set(drop->ptr, "show_datablock_in_modifier", (drag->type != WM_DRAG_ASSET));
891}
892
894{
896
897 RNA_enum_set(drop->ptr, "type", GS(id->name));
899}
900
902{
904
905 if (id) {
907 RNA_struct_property_unset(drop->ptr, "filepath");
908 return;
909 }
910}
911
912/* region dropbox definition */
913static void view3d_dropboxes()
914{
916
917 wmDropBox *drop;
918 drop = WM_dropbox_add(lb,
919 "OBJECT_OT_add_named",
923 nullptr);
924
928
929 drop = WM_dropbox_add(lb,
930 "OBJECT_OT_transform_to_mouse",
934 nullptr);
935
939
941 "OBJECT_OT_collection_external_asset_drop",
945 nullptr);
947 "OBJECT_OT_collection_instance_add",
951 nullptr);
952
954 "OBJECT_OT_drop_named_material",
960 "OBJECT_OT_drop_geometry_nodes",
966 "VIEW3D_OT_camera_background_image_add",
970 nullptr);
972 "OBJECT_OT_empty_image_add",
976 nullptr);
978 "OBJECT_OT_data_instance_add",
984 "VIEW3D_OT_drop_world",
988 nullptr);
989}
990
991static void view3d_widgets()
992{
995
1006 /* TODO(@ideasman42): Not working well enough, disable for now. */
1007#if 0
1009#endif
1010
1019
1022
1024
1027}
1028
1029/* type callback, not region itself */
1031{
1032 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
1033
1034 if (rv3d) {
1035 if (rv3d->localvd) {
1036 MEM_freeN(rv3d->localvd);
1037 }
1038 if (rv3d->clipbb) {
1039 MEM_freeN(rv3d->clipbb);
1040 }
1041
1042 if (rv3d->view_render) {
1044 }
1045
1046 if (rv3d->sms) {
1047 MEM_freeN(rv3d->sms);
1048 }
1049
1050 MEM_freeN(rv3d);
1051 region->regiondata = nullptr;
1052 }
1053}
1054
1055/* copy regiondata */
1056static void *view3d_main_region_duplicate(void *poin)
1057{
1058 if (poin) {
1059 RegionView3D *rv3d = static_cast<RegionView3D *>(poin);
1060 RegionView3D *new_rv3d;
1061
1062 new_rv3d = static_cast<RegionView3D *>(MEM_dupallocN(rv3d));
1063 if (rv3d->localvd) {
1064 new_rv3d->localvd = static_cast<RegionView3D *>(MEM_dupallocN(rv3d->localvd));
1065 }
1066 if (rv3d->clipbb) {
1067 new_rv3d->clipbb = static_cast<BoundBox *>(MEM_dupallocN(rv3d->clipbb));
1068 }
1069
1070 new_rv3d->view_render = nullptr;
1071 new_rv3d->sms = nullptr;
1072 new_rv3d->smooth_timer = nullptr;
1073
1074 return new_rv3d;
1075 }
1076 return nullptr;
1077}
1078
1080{
1081 wmWindow *window = params->window;
1082 ScrArea *area = params->area;
1083 ARegion *region = params->region;
1084 const wmNotifier *wmn = params->notifier;
1085 const Scene *scene = params->scene;
1086 View3D *v3d = static_cast<View3D *>(area->spacedata.first);
1087 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
1088 wmGizmoMap *gzmap = region->gizmo_map;
1089
1090 /* context changes */
1091 switch (wmn->category) {
1092 case NC_WM:
1093 if (ELEM(wmn->data, ND_UNDO)) {
1095 }
1096 else if (ELEM(wmn->data, ND_XR_DATA_CHANGED)) {
1097 /* Only cause a redraw if this a VR session mirror. Should more features be added that
1098 * require redraws, we could pass something to wmn->reference, e.g. the flag value. */
1099 if (v3d->flag & V3D_XR_SESSION_MIRROR) {
1100 ED_region_tag_redraw(region);
1101 }
1102 }
1103 break;
1104 case NC_ANIMATION:
1105 switch (wmn->data) {
1106 case ND_KEYFRAME_PROP:
1107 case ND_NLA_ACTCHANGE:
1108 ED_region_tag_redraw(region);
1109 break;
1110 case ND_NLA:
1111 case ND_KEYFRAME:
1112 if (ELEM(wmn->action, NA_EDITED, NA_ADDED, NA_REMOVED)) {
1113 ED_region_tag_redraw(region);
1114 }
1115 break;
1116 case ND_ANIMCHAN:
1118 ED_region_tag_redraw(region);
1119 }
1120 break;
1121 }
1122 break;
1123 case NC_SCENE:
1124 switch (wmn->data) {
1125 case ND_SCENEBROWSE:
1126 case ND_LAYER_CONTENT:
1127 ED_region_tag_redraw(region);
1130 ED_area_tag_refresh(area);
1131 }
1132 break;
1133 case ND_LAYER:
1134 if (wmn->reference) {
1135 BKE_screen_view3d_sync(v3d, static_cast<Scene *>(wmn->reference));
1136 }
1137 ED_region_tag_redraw(region);
1139 break;
1140 case ND_OB_ACTIVE:
1141 case ND_OB_SELECT:
1142 [[fallthrough]];
1143 case ND_FRAME:
1144 case ND_TRANSFORM:
1145 case ND_OB_VISIBLE:
1146 case ND_RENDER_OPTIONS:
1147 case ND_MARKERS:
1148 case ND_MODE:
1149 ED_region_tag_redraw(region);
1151 break;
1152 case ND_WORLD:
1153 /* handled by space_view3d_listener() for v3d access */
1154 break;
1156 if (v3d->camera && (scene == wmn->reference)) {
1157 if (rv3d->persp == RV3D_CAMOB) {
1158 ED_region_tag_redraw(region);
1159 }
1160 }
1161 break;
1162 }
1163 }
1164 if (wmn->action == NA_EDITED) {
1165 ED_region_tag_redraw(region);
1166 }
1167 break;
1168 case NC_OBJECT:
1169 switch (wmn->data) {
1170 case ND_BONE_ACTIVE:
1171 case ND_BONE_SELECT:
1172 case ND_BONE_COLLECTION:
1173 case ND_TRANSFORM:
1174 case ND_POSE:
1175 case ND_DRAW:
1176 case ND_MODIFIER:
1177 case ND_SHADERFX:
1178 case ND_CONSTRAINT:
1179 case ND_KEYS:
1180 case ND_PARTICLE:
1181 case ND_POINTCACHE:
1182 case ND_LOD:
1183 ED_region_tag_redraw(region);
1185 break;
1186 case ND_DRAW_ANIMVIZ:
1187 ED_region_tag_redraw(region);
1188 break;
1189 }
1190 switch (wmn->action) {
1191 case NA_ADDED:
1192 ED_region_tag_redraw(region);
1193 break;
1194 }
1195 break;
1196 case NC_GEOM:
1197 switch (wmn->data) {
1198 case ND_SELECT: {
1201 }
1202 case ND_DATA:
1203 ED_region_tag_redraw(region);
1205 break;
1206 case ND_VERTEX_GROUP:
1207 ED_region_tag_redraw(region);
1208 break;
1209 }
1210 switch (wmn->action) {
1211 case NA_EDITED:
1212 ED_region_tag_redraw(region);
1213 break;
1214 }
1215 break;
1216 case NC_CAMERA:
1217 switch (wmn->data) {
1219 if (v3d->camera && (v3d->camera->data == wmn->reference)) {
1220 if (rv3d->persp == RV3D_CAMOB) {
1221 ED_region_tag_redraw(region);
1222 }
1223 }
1224 break;
1225 }
1226 }
1227 break;
1228 case NC_GROUP:
1229 /* all group ops for now */
1230 ED_region_tag_redraw(region);
1231 break;
1232 case NC_BRUSH:
1233 switch (wmn->action) {
1234 case NA_EDITED:
1236 break;
1237 case NA_SELECTED:
1238 /* used on brush changes - needed because 3d cursor
1239 * has to be drawn if clone brush is selected */
1240 ED_region_tag_redraw(region);
1241 break;
1242 }
1243 break;
1244 case NC_MATERIAL:
1245 switch (wmn->data) {
1246 case ND_SHADING:
1247 case ND_NODES:
1248 /* TODO(sergey): This is a bit too much updates, but needed to
1249 * have proper material drivers update in the viewport.
1250 *
1251 * How to solve?
1252 */
1253 ED_region_tag_redraw(region);
1254 break;
1255 case ND_SHADING_DRAW:
1256 case ND_SHADING_LINKS:
1257 ED_region_tag_redraw(region);
1258 break;
1259 }
1260 break;
1261 case NC_NODE:
1262 switch (wmn->data) {
1263 case ND_NODE_GIZMO: {
1265 break;
1266 }
1267 }
1268 ED_region_tag_redraw(region);
1269 break;
1270 case NC_WORLD:
1271 switch (wmn->data) {
1272 case ND_WORLD_DRAW:
1273 /* handled by space_view3d_listener() for v3d access */
1274 break;
1275 case ND_WORLD:
1276 /* Needed for updating world materials */
1277 ED_region_tag_redraw(region);
1278 break;
1279 }
1280 break;
1281 case NC_LAMP:
1282 switch (wmn->data) {
1283 case ND_LIGHTING:
1284 /* TODO(sergey): This is a bit too much, but needed to
1285 * handle updates from new depsgraph.
1286 */
1287 ED_region_tag_redraw(region);
1288 break;
1289 case ND_LIGHTING_DRAW:
1290 ED_region_tag_redraw(region);
1292 break;
1293 }
1294 break;
1295 case NC_LIGHTPROBE:
1296 ED_area_tag_refresh(area);
1297 break;
1298 case NC_IMAGE:
1299 /* this could be more fine grained checks if we had
1300 * more context than just the region */
1301 ED_region_tag_redraw(region);
1302 break;
1303 case NC_TEXTURE:
1304 /* Same as #NC_IMAGE. */
1305 ED_region_tag_redraw(region);
1306 break;
1307 case NC_MOVIECLIP:
1308 if (wmn->data == ND_DISPLAY || wmn->action == NA_EDITED) {
1309 ED_region_tag_redraw(region);
1310 }
1311 break;
1312 case NC_SPACE:
1313 if (wmn->data == ND_SPACE_VIEW3D) {
1314 if (wmn->subtype == NS_VIEW3D_GPU) {
1315 rv3d->rflag |= RV3D_GPULIGHT_UPDATE;
1316 }
1317 else if (wmn->subtype == NS_VIEW3D_SHADING) {
1318#ifdef WITH_XR_OPENXR
1319 ED_view3d_xr_shading_update(
1320 static_cast<wmWindowManager *>(G_MAIN->wm.first), v3d, scene);
1321#endif
1322
1323 ViewLayer *view_layer = WM_window_get_active_view_layer(window);
1324 Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer);
1325 if (depsgraph) {
1326 ED_render_view3d_update(depsgraph, window, area, true);
1327 }
1328 }
1329 ED_region_tag_redraw(region);
1331 }
1332 break;
1333 case NC_ID:
1335 if (ELEM(wmn->action, NA_EDITED, NA_REMOVED) && v3d->localvd &&
1337 {
1338 ED_area_tag_refresh(area);
1339 }
1340 ED_region_tag_redraw(region);
1342 }
1343 break;
1344 case NC_SCREEN:
1345 switch (wmn->data) {
1346 case ND_ANIMPLAY:
1347 case ND_SKETCH:
1348 ED_region_tag_redraw(region);
1349 break;
1350 case ND_LAYOUTBROWSE:
1351 case ND_LAYOUTDELETE:
1352 case ND_LAYOUTSET:
1354 ED_region_tag_redraw(region);
1355 break;
1356 case ND_LAYER:
1357 ED_region_tag_redraw(region);
1358 break;
1359 }
1360
1361 break;
1362 case NC_GPENCIL:
1363 if (wmn->data == ND_DATA || ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
1364 ED_region_tag_redraw(region);
1365 }
1366 break;
1367 case NC_WORKSPACE:
1368 /* In case the region displays workspace settings. */
1369 ED_region_tag_redraw(region);
1370 break;
1371 case NC_VIEWER_PATH: {
1372 if (v3d->flag2 & V3D_SHOW_VIEWER) {
1373 ViewLayer *view_layer = WM_window_get_active_view_layer(window);
1374 if (Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer)) {
1375 ED_render_view3d_update(depsgraph, window, area, true);
1376 }
1377 ED_region_tag_redraw(region);
1378 }
1379 break;
1380 }
1381 }
1382}
1383
1385 wmMsgSubscribeKey * /*msg_key*/,
1386 wmMsgSubscribeValue *msg_val)
1387{
1388 Scene *scene = CTX_data_scene(C);
1389 ScrArea *area = (ScrArea *)msg_val->user_data;
1390 View3D *v3d = (View3D *)area->spacedata.first;
1391 if (v3d->shading.type == OB_SOLID) {
1392 RenderEngineType *engine_type = ED_view3d_engine_type(scene, v3d->shading.type);
1393 DRWUpdateContext drw_context = {nullptr};
1394 drw_context.bmain = CTX_data_main(C);
1395 drw_context.depsgraph = CTX_data_depsgraph_pointer(C);
1396 drw_context.scene = scene;
1397 drw_context.view_layer = CTX_data_view_layer(C);
1398 drw_context.region = (ARegion *)(msg_val->owner);
1399 drw_context.v3d = v3d;
1400 drw_context.engine_type = engine_type;
1401 DRW_notify_view_update(&drw_context);
1402 }
1403}
1404
1406{
1407 wmMsgBus *mbus = params->message_bus;
1408 const bContext *C = params->context;
1409 ScrArea *area = params->area;
1410 ARegion *region = params->region;
1411
1412 /* Developer NOTE: there are many properties that impact 3D view drawing,
1413 * so instead of subscribing to individual properties, just subscribe to types
1414 * accepting some redundant redraws.
1415 *
1416 * For other space types we might try avoid this, keep the 3D view as an exceptional case! */
1417 wmMsgParams_RNA msg_key_params{};
1418
1419 /* Only subscribe to types. */
1420 StructRNA *type_array[] = {
1421 &RNA_Window,
1422
1423 /* These object have properties that impact drawing. */
1424 &RNA_AreaLight,
1425 &RNA_Camera,
1426 &RNA_Light,
1427 &RNA_Speaker,
1428 &RNA_SunLight,
1429
1430 /* General types the 3D view depends on. */
1431 &RNA_Object,
1432 &RNA_UnitSettings, /* grid-floor */
1433
1434 &RNA_View3DCursor,
1435 &RNA_View3DOverlay,
1436 &RNA_View3DShading,
1437 &RNA_World,
1438 };
1439
1440 wmMsgSubscribeValue msg_sub_value_region_tag_redraw{};
1441 msg_sub_value_region_tag_redraw.owner = region;
1442 msg_sub_value_region_tag_redraw.user_data = region;
1443 msg_sub_value_region_tag_redraw.notify = ED_region_do_msg_notify_tag_redraw;
1444
1445 wmMsgSubscribeValue msg_sub_value_workbench_view_update{};
1446 msg_sub_value_workbench_view_update.owner = region;
1447 msg_sub_value_workbench_view_update.user_data = area;
1448 msg_sub_value_workbench_view_update.notify = view3d_do_msg_notify_workbench_view_update;
1449
1450 for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
1451 msg_key_params.ptr.type = type_array[i];
1452 WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
1453 }
1454
1455 /* Subscribe to a handful of other properties. */
1456 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
1457
1458 WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, engine, &msg_sub_value_region_tag_redraw);
1460 mbus, RenderSettings, resolution_x, &msg_sub_value_region_tag_redraw);
1462 mbus, RenderSettings, resolution_y, &msg_sub_value_region_tag_redraw);
1464 mbus, RenderSettings, pixel_aspect_x, &msg_sub_value_region_tag_redraw);
1466 mbus, RenderSettings, pixel_aspect_y, &msg_sub_value_region_tag_redraw);
1467 if (rv3d->persp == RV3D_CAMOB) {
1469 mbus, RenderSettings, use_border, &msg_sub_value_region_tag_redraw);
1470 }
1471
1472 WM_msg_subscribe_rna_anon_type(mbus, SceneEEVEE, &msg_sub_value_region_tag_redraw);
1473 WM_msg_subscribe_rna_anon_type(mbus, SceneDisplay, &msg_sub_value_region_tag_redraw);
1474 WM_msg_subscribe_rna_anon_type(mbus, ObjectDisplay, &msg_sub_value_region_tag_redraw);
1475
1476 const Scene *scene = CTX_data_scene(C);
1477 ViewLayer *view_layer = CTX_data_view_layer(C);
1478 BKE_view_layer_synced_ensure(scene, view_layer);
1479 Object *obact = BKE_view_layer_active_object_get(view_layer);
1480 if (obact != nullptr) {
1481 switch (obact->mode) {
1483 WM_msg_subscribe_rna_anon_type(mbus, ParticleEdit, &msg_sub_value_region_tag_redraw);
1484 break;
1485
1486 case OB_MODE_SCULPT:
1488 mbus, WorkSpace, tools, &msg_sub_value_workbench_view_update);
1489 break;
1490 default:
1491 break;
1492 }
1493 }
1494
1495 {
1496 wmMsgSubscribeValue msg_sub_value_region_tag_refresh{};
1497 msg_sub_value_region_tag_refresh.owner = region;
1498 msg_sub_value_region_tag_refresh.user_data = area;
1499 msg_sub_value_region_tag_refresh.notify = WM_toolsystem_do_msg_notify_tag_refresh;
1500 WM_msg_subscribe_rna_anon_prop(mbus, Object, mode, &msg_sub_value_region_tag_refresh);
1501 WM_msg_subscribe_rna_anon_prop(mbus, LayerObjects, active, &msg_sub_value_region_tag_refresh);
1502 }
1503}
1504
1505/* concept is to retrieve cursor type context-less */
1506static void view3d_main_region_cursor(wmWindow *win, ScrArea *area, ARegion *region)
1507{
1508 if (WM_cursor_set_from_tool(win, area, region)) {
1509 return;
1510 }
1511
1512 Scene *scene = WM_window_get_active_scene(win);
1513 ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1514 BKE_view_layer_synced_ensure(scene, view_layer);
1515 Object *obedit = BKE_view_layer_edit_object_get(view_layer);
1516 if (obedit) {
1518 }
1519 else {
1521 }
1522}
1523
1524/* add handlers, stuff you only do once or on area/region changes */
1526{
1527 wmKeyMap *keymap = WM_keymap_ensure(
1528 wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1529
1530 WM_event_add_keymap_handler(&region->handlers, keymap);
1531
1532 ED_region_header_init(region);
1533}
1534
1535static void view3d_header_region_draw(const bContext *C, ARegion *region)
1536{
1537 ED_region_header(C, region);
1538}
1539
1541{
1542 ARegion *region = params->region;
1543 const wmNotifier *wmn = params->notifier;
1544
1545 /* context changes */
1546 switch (wmn->category) {
1547 case NC_SCENE:
1548 switch (wmn->data) {
1549 case ND_FRAME:
1550 case ND_OB_ACTIVE:
1551 case ND_OB_SELECT:
1552 case ND_OB_VISIBLE:
1553 case ND_MODE:
1554 case ND_LAYER:
1555 case ND_TOOLSETTINGS:
1556 case ND_LAYER_CONTENT:
1557 case ND_RENDER_OPTIONS:
1558 ED_region_tag_redraw(region);
1559 break;
1560 }
1561 break;
1562 case NC_SPACE:
1563 switch (wmn->data) {
1564 case ND_SPACE_VIEW3D:
1565 ED_region_tag_redraw(region);
1566 break;
1569 ED_region_tag_redraw(region);
1570 break;
1571 }
1572 break;
1573 case NC_ASSET:
1574 switch (wmn->data) {
1575 case ND_ASSET_CATALOGS:
1578 ED_region_tag_redraw(region);
1579 break;
1580 default:
1581 if (ELEM(wmn->action, NA_ADDED, NA_REMOVED)) {
1583 ED_region_tag_redraw(region);
1584 }
1585 }
1586 break;
1587 case NC_NODE:
1588 switch (wmn->data) {
1589 case ND_NODE_ASSET_DATA:
1591 ED_region_tag_redraw(region);
1592 break;
1593 }
1594 break;
1595 case NC_GPENCIL:
1596 if (wmn->data & ND_GPENCIL_EDITMODE) {
1597 ED_region_tag_redraw(region);
1598 }
1599 else if (wmn->action == NA_EDITED) {
1600 ED_region_tag_redraw(region);
1601 }
1602 break;
1603 case NC_BRUSH:
1604 ED_region_tag_redraw(region);
1605 break;
1606 case NC_GEOM:
1607 if (ELEM(wmn->data, ND_VERTEX_GROUP, ND_DATA)) {
1608 ED_region_tag_redraw(region);
1609 }
1610 break;
1611 case NC_MATERIAL:
1612 /* For the canvas picker. */
1613 if (wmn->data == ND_SHADING_LINKS) {
1614 ED_region_tag_redraw(region);
1615 }
1616 break;
1617 }
1618
1619 /* From top-bar, which ones are needed? split per header? */
1620 /* Disable for now, re-enable if needed, or remove - campbell. */
1621#if 0
1622 /* context changes */
1623 switch (wmn->category) {
1624 case NC_WM:
1625 if (wmn->data == ND_HISTORY) {
1626 ED_region_tag_redraw(region);
1627 }
1628 break;
1629 case NC_SCENE:
1630 if (wmn->data == ND_MODE) {
1631 ED_region_tag_redraw(region);
1632 }
1633 break;
1634 case NC_SPACE:
1635 if (wmn->data == ND_SPACE_VIEW3D) {
1636 ED_region_tag_redraw(region);
1637 }
1638 break;
1639 case NC_GPENCIL:
1640 if (wmn->data == ND_DATA) {
1641 ED_region_tag_redraw(region);
1642 }
1643 break;
1644 }
1645#endif
1646}
1647
1649{
1650 wmMsgBus *mbus = params->message_bus;
1651 ARegion *region = params->region;
1652
1653 wmMsgParams_RNA msg_key_params{};
1654
1655 /* Only subscribe to types. */
1656 StructRNA *type_array[] = {
1657 &RNA_View3DShading,
1658 };
1659
1660 wmMsgSubscribeValue msg_sub_value_region_tag_redraw{};
1661 msg_sub_value_region_tag_redraw.owner = region;
1662 msg_sub_value_region_tag_redraw.user_data = region;
1663 msg_sub_value_region_tag_redraw.notify = ED_region_do_msg_notify_tag_redraw;
1664
1665 for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
1666 msg_key_params.ptr.type = type_array[i];
1667 WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
1668 }
1669}
1670
1671/* add handlers, stuff you only do once or on area/region changes */
1673{
1674 wmKeyMap *keymap;
1675
1676 ED_region_panels_init(wm, region);
1677
1678 keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1679 WM_event_add_keymap_handler(&region->handlers, keymap);
1680}
1681
1683 ARegion *region,
1684 const char *category_override)
1685{
1686 const enum eContextObjectMode mode = CTX_data_mode_enum(C);
1687
1688 const char *contexts_base[4] = {nullptr};
1689 contexts_base[0] = CTX_data_mode_string(C);
1690
1691 const char **contexts = &contexts_base[1];
1692
1693 switch (mode) {
1694 case CTX_MODE_EDIT_MESH:
1695 ARRAY_SET_ITEMS(contexts, ".mesh_edit");
1696 break;
1698 ARRAY_SET_ITEMS(contexts, ".curve_edit");
1699 break;
1701 ARRAY_SET_ITEMS(contexts, ".curves_edit");
1702 break;
1704 ARRAY_SET_ITEMS(contexts, ".curve_edit");
1705 break;
1706 case CTX_MODE_EDIT_TEXT:
1707 ARRAY_SET_ITEMS(contexts, ".text_edit");
1708 break;
1710 ARRAY_SET_ITEMS(contexts, ".armature_edit");
1711 break;
1713 ARRAY_SET_ITEMS(contexts, ".mball_edit");
1714 break;
1716 ARRAY_SET_ITEMS(contexts, ".lattice_edit");
1717 break;
1719 ARRAY_SET_ITEMS(contexts, ".grease_pencil_edit");
1720 break;
1722 ARRAY_SET_ITEMS(contexts, ".grease_pencil_paint");
1723 break;
1725 ARRAY_SET_ITEMS(contexts, ".paint_common", ".grease_pencil_sculpt");
1726 break;
1728 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1729 break;
1731 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1732 break;
1734 ARRAY_SET_ITEMS(contexts, ".point_cloud_edit");
1735 break;
1736 case CTX_MODE_POSE:
1737 ARRAY_SET_ITEMS(contexts, ".posemode");
1738 break;
1739 case CTX_MODE_SCULPT:
1740 ARRAY_SET_ITEMS(contexts, ".paint_common", ".sculpt_mode");
1741 break;
1743 ARRAY_SET_ITEMS(contexts, ".paint_common", ".weightpaint");
1744 break;
1746 ARRAY_SET_ITEMS(contexts, ".paint_common", ".vertexpaint");
1747 break;
1749 ARRAY_SET_ITEMS(contexts, ".paint_common", ".imagepaint");
1750 break;
1751 case CTX_MODE_PARTICLE:
1752 ARRAY_SET_ITEMS(contexts, ".paint_common", ".particlemode");
1753 break;
1754 case CTX_MODE_OBJECT:
1755 ARRAY_SET_ITEMS(contexts, ".objectmode");
1756 break;
1758 ARRAY_SET_ITEMS(contexts, ".greasepencil_paint");
1759 break;
1761 ARRAY_SET_ITEMS(contexts, ".greasepencil_sculpt");
1762 break;
1764 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1765 break;
1767 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1768 break;
1770 ARRAY_SET_ITEMS(contexts, ".paint_common", ".curves_sculpt");
1771 break;
1772 default:
1773 break;
1774 }
1775
1776 switch (mode) {
1778 ARRAY_SET_ITEMS(contexts, ".greasepencil_paint");
1779 break;
1781 ARRAY_SET_ITEMS(contexts, ".greasepencil_sculpt");
1782 break;
1784 ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1785 break;
1787 ARRAY_SET_ITEMS(contexts, ".greasepencil_edit");
1788 break;
1790 ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1791 break;
1792 default:
1793 break;
1794 }
1795
1796 ListBase *paneltypes = &region->type->paneltypes;
1797
1798 /* Allow drawing 3D view toolbar from non 3D view space type. */
1799 if (category_override != nullptr) {
1802 paneltypes = &art->paneltypes;
1803 }
1804
1806 C, region, paneltypes, WM_OP_INVOKE_REGION_WIN, contexts_base, category_override);
1807}
1808
1809static void view3d_buttons_region_layout(const bContext *C, ARegion *region)
1810{
1811 ED_view3d_buttons_region_layout_ex(C, region, nullptr);
1812}
1813
1815{
1816 ARegion *region = params->region;
1817 const wmNotifier *wmn = params->notifier;
1818
1819 /* context changes */
1820 switch (wmn->category) {
1821 case NC_ANIMATION:
1822 switch (wmn->data) {
1823 case ND_KEYFRAME_PROP:
1824 case ND_NLA_ACTCHANGE:
1825 ED_region_tag_redraw(region);
1826 break;
1827 case ND_NLA:
1828 case ND_KEYFRAME:
1829 if (ELEM(wmn->action, NA_EDITED, NA_ADDED, NA_REMOVED)) {
1830 ED_region_tag_redraw(region);
1831 }
1832 break;
1833 }
1834 break;
1835 case NC_SCENE:
1836 switch (wmn->data) {
1837 case ND_FRAME:
1838 case ND_OB_ACTIVE:
1839 case ND_OB_SELECT:
1840 case ND_OB_VISIBLE:
1841 case ND_MODE:
1842 case ND_LAYER:
1843 case ND_LAYER_CONTENT:
1844 case ND_TOOLSETTINGS:
1845 case ND_TRANSFORM:
1846 ED_region_tag_redraw(region);
1847 break;
1848 }
1849 switch (wmn->action) {
1850 case NA_EDITED:
1851 ED_region_tag_redraw(region);
1852 break;
1853 }
1854 break;
1855 case NC_OBJECT:
1856 switch (wmn->data) {
1857 case ND_BONE_ACTIVE:
1858 case ND_BONE_SELECT:
1859 case ND_BONE_COLLECTION:
1860 case ND_TRANSFORM:
1861 case ND_POSE:
1862 case ND_DRAW:
1863 case ND_KEYS:
1864 case ND_MODIFIER:
1865 case ND_SHADERFX:
1866 ED_region_tag_redraw(region);
1867 break;
1868 }
1869 break;
1870 case NC_GEOM:
1871 switch (wmn->data) {
1872 case ND_DATA:
1873 case ND_VERTEX_GROUP:
1874 case ND_SELECT:
1875 ED_region_tag_redraw(region);
1876 break;
1877 }
1878 if (wmn->action == NA_EDITED) {
1879 ED_region_tag_redraw(region);
1880 }
1881 break;
1882 case NC_TEXTURE:
1883 case NC_MATERIAL:
1884 /* for brush textures */
1885 ED_region_tag_redraw(region);
1886 break;
1887 case NC_BRUSH:
1888 /* NA_SELECTED is used on brush changes */
1889 if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
1890 ED_region_tag_redraw(region);
1891 }
1892 break;
1893 case NC_SPACE:
1894 if (wmn->data == ND_SPACE_VIEW3D) {
1895 ED_region_tag_redraw(region);
1896 }
1897 break;
1898 case NC_ID:
1899 if (wmn->action == NA_RENAME) {
1900 ED_region_tag_redraw(region);
1901 }
1902 break;
1903 case NC_GPENCIL:
1904 if ((wmn->data & (ND_DATA | ND_GPENCIL_EDITMODE)) || (wmn->action == NA_EDITED)) {
1905 ED_region_tag_redraw(region);
1906 }
1907 break;
1908 case NC_IMAGE:
1909 /* Update for the image layers in texture paint. */
1910 if (wmn->action == NA_EDITED) {
1911 ED_region_tag_redraw(region);
1912 }
1913 break;
1914 case NC_WM:
1915 if (wmn->data == ND_XR_DATA_CHANGED) {
1916 ED_region_tag_redraw(region);
1917 }
1918 break;
1919 }
1920}
1921
1922/* add handlers, stuff you only do once or on area/region changes */
1924{
1925 wmKeyMap *keymap;
1926
1927 ED_region_panels_init(wm, region);
1928
1929 keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1930 WM_event_add_keymap_handler(&region->handlers, keymap);
1931}
1932
1933static void view3d_tools_region_draw(const bContext *C, ARegion *region)
1934{
1935 const char *contexts[] = {CTX_data_mode_string(C), nullptr};
1936 ED_region_panels_ex(C, region, WM_OP_INVOKE_REGION_WIN, contexts);
1937}
1938
1940{
1942 C,
1943 region,
1944 (RGN_ALIGN_ENUM_FROM_MASK(region->alignment) == RGN_ALIGN_TOP) ?
1947}
1948
1949/* add handlers, stuff you only do once or on area/region changes */
1951{
1952 using namespace blender::ed;
1953 wmKeyMap *keymap = WM_keymap_ensure(
1954 wm->defaultconf, "3D View Generic", SPACE_VIEW3D, RGN_TYPE_WINDOW);
1955 WM_event_add_keymap_handler(&region->handlers, keymap);
1956
1957 asset::shelf::region_init(wm, region);
1958}
1959
1960/* area (not region) level listener */
1962{
1963 ScrArea *area = params->area;
1964 const wmNotifier *wmn = params->notifier;
1965 View3D *v3d = static_cast<View3D *>(area->spacedata.first);
1966
1967 /* context changes */
1968 switch (wmn->category) {
1969 case NC_SCENE:
1970 switch (wmn->data) {
1971 case ND_WORLD: {
1972 const bool use_scene_world = V3D_USES_SCENE_WORLD(v3d);
1973 if (v3d->flag2 & V3D_HIDE_OVERLAYS || use_scene_world) {
1975 }
1976 break;
1977 }
1978 }
1979 break;
1980 case NC_WORLD:
1981 switch (wmn->data) {
1982 case ND_WORLD_DRAW:
1983 case ND_WORLD:
1986 }
1987 break;
1988 }
1989 break;
1990 case NC_MATERIAL:
1991 switch (wmn->data) {
1992 case ND_NODES:
1993 if (v3d->shading.type == OB_TEXTURE) {
1995 }
1996 break;
1997 }
1998 break;
1999 }
2000}
2001
2002static void space_view3d_refresh(const bContext *C, ScrArea *area)
2003{
2004 View3D *v3d = (View3D *)area->spacedata.first;
2006
2009 CTX_data_scene(C),
2011 CTX_wm_manager(C),
2012 CTX_wm_window(C),
2013 v3d,
2014 CTX_wm_area(C),
2015 true,
2016 U.smooth_viewtx);
2017 }
2018}
2019
2021 const blender::bke::id::IDRemapper &mappings)
2022{
2023 if (mappings.apply(reinterpret_cast<ID **>(&v3d->ob_center), ID_REMAP_APPLY_DEFAULT) ==
2025 {
2026 /* Otherwise, bone-name may remain valid...
2027 * We could be smart and check this, too? */
2028 v3d->ob_center_bone[0] = '\0';
2029 }
2030}
2031
2033 SpaceLink *slink,
2034 View3D *v3d,
2035 const blender::bke::id::IDRemapper &mappings,
2036 const bool is_local)
2037{
2038 if (mappings.apply(reinterpret_cast<ID **>(&v3d->camera), ID_REMAP_APPLY_DEFAULT) ==
2040 {
2041 /* 3D view might be inactive, in that case needs to use slink->regionbase */
2042 ListBase *regionbase = (slink == area->spacedata.first) ? &area->regionbase :
2043 &slink->regionbase;
2044 LISTBASE_FOREACH (ARegion *, region, regionbase) {
2045 if (region->regiontype == RGN_TYPE_WINDOW) {
2046 RegionView3D *rv3d = is_local ? ((RegionView3D *)region->regiondata)->localvd :
2047 static_cast<RegionView3D *>(region->regiondata);
2048 if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
2049 rv3d->persp = RV3D_PERSP;
2050 }
2051 }
2052 }
2053 }
2054}
2055
2056static void view3d_id_remap(ScrArea *area,
2057 SpaceLink *slink,
2058 const blender::bke::id::IDRemapper &mappings)
2059{
2061 FILTER_ID_MC))
2062 {
2063 return;
2064 }
2065
2066 View3D *view3d = (View3D *)slink;
2067 view3d_id_remap_v3d(area, slink, view3d, mappings, false);
2068 view3d_id_remap_v3d_ob_centers(view3d, mappings);
2069 if (view3d->localvd != nullptr) {
2070 /* Object centers in local-view aren't used, see: #52663 */
2071 view3d_id_remap_v3d(area, slink, view3d->localvd, mappings, true);
2072 /* Remapping is potentially modifying ID pointers, and there is a local View3D, mark it for a
2073 * check for emptiness. */
2075 }
2076 BKE_viewer_path_id_remap(&view3d->viewer_path, mappings);
2077}
2078
2079static void view3d_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data)
2080{
2081 View3D *v3d = reinterpret_cast<View3D *>(space_link);
2082
2085 if (v3d->localvd) {
2087
2088 /* If potentially modifying ID pointers, and there is a local View3D, mark it for a check for
2089 * emptiness. */
2090 const int flags = BKE_lib_query_foreachid_process_flags_get(data);
2091 if ((flags & IDWALK_READONLY) == 0) {
2093 }
2094 }
2096}
2097
2099{
2100 View3D *v3d = (View3D *)sl;
2101
2102 memset(&v3d->runtime, 0x0, sizeof(v3d->runtime));
2103
2104 if (v3d->gpd) {
2105 BLO_read_struct(reader, bGPdata, &v3d->gpd);
2106 BKE_gpencil_blend_read_data(reader, v3d->gpd);
2107 }
2108 BLO_read_struct(reader, RegionView3D, &v3d->localvd);
2109
2110 /* render can be quite heavy, set to solid on load */
2111 if (v3d->shading.type == OB_RENDER) {
2112 v3d->shading.type = OB_SOLID;
2113 }
2114 v3d->shading.prev_type = OB_SOLID;
2115
2117
2119
2121}
2122
2124{
2125 View3D *v3d = (View3D *)sl;
2126 BLO_write_struct(writer, View3D, v3d);
2127
2128 if (v3d->localvd) {
2129 BLO_write_struct(writer, View3D, v3d->localvd);
2130 }
2131
2133
2135}
2136
2138{
2139 using namespace blender::ed;
2140 std::unique_ptr<SpaceType> st = std::make_unique<SpaceType>();
2141 ARegionType *art;
2142
2143 st->spaceid = SPACE_VIEW3D;
2144 STRNCPY(st->name, "View3D");
2145
2146 st->create = view3d_create;
2147 st->free = view3d_free;
2148 st->init = view3d_init;
2149 st->exit = view3d_exit;
2150 st->listener = space_view3d_listener;
2151 st->refresh = space_view3d_refresh;
2152 st->duplicate = view3d_duplicate;
2153 st->operatortypes = view3d_operatortypes;
2154 st->keymap = view3d_keymap;
2155 st->dropboxes = view3d_dropboxes;
2156 st->gizmos = view3d_widgets;
2157 st->context = view3d_context;
2158 st->id_remap = view3d_id_remap;
2159 st->foreach_id = view3d_foreach_id;
2160 st->blend_read_data = view3d_space_blend_read_data;
2161 st->blend_read_after_liblink = nullptr;
2162 st->blend_write = view3d_space_blend_write;
2163
2164 /* regions: main window */
2165 art = MEM_cnew<ARegionType>("spacetype view3d main region");
2176 art->lock = 1; /* can become flag, see BKE_spacedata_draw_locks */
2177 BLI_addhead(&st->regiontypes, art);
2178
2179 /* regions: list-view/buttons */
2180 art = MEM_cnew<ARegionType>("spacetype view3d buttons region");
2181 art->regionid = RGN_TYPE_UI;
2189 BLI_addhead(&st->regiontypes, art);
2190
2192
2193 /* regions: tool(bar) */
2194 art = MEM_cnew<ARegionType>("spacetype view3d tools region");
2195 art->regionid = RGN_TYPE_TOOLS;
2197 art->prefsizey = 50; /* XXX */
2204 BLI_addhead(&st->regiontypes, art);
2205
2206 /* regions: tool header */
2207 art = MEM_cnew<ARegionType>("spacetype view3d tool header region");
2209 art->prefsizey = HEADERY;
2215 BLI_addhead(&st->regiontypes, art);
2216
2217 /* regions: header */
2218 art = MEM_cnew<ARegionType>("spacetype view3d header region");
2220 art->prefsizey = HEADERY;
2226 BLI_addhead(&st->regiontypes, art);
2227
2228 /* regions: asset shelf */
2229 art = MEM_cnew<ARegionType>("spacetype view3d asset shelf region");
2232 art->duplicate = asset::shelf::region_duplicate;
2233 art->free = asset::shelf::region_free;
2234 art->on_poll_success = asset::shelf::region_on_poll_success;
2235 art->listener = asset::shelf::region_listen;
2236 art->message_subscribe = asset::shelf::region_message_subscribe;
2237 art->poll = asset::shelf::regions_poll;
2238 art->snap_size = asset::shelf::region_snap;
2239 art->on_user_resize = asset::shelf::region_on_user_resize;
2240 art->context = asset::shelf::context;
2242 art->layout = asset::shelf::region_layout;
2243 art->draw = asset::shelf::region_draw;
2244 BLI_addhead(&st->regiontypes, art);
2245
2246 /* regions: asset shelf header */
2247 art = MEM_cnew<ARegionType>("spacetype view3d asset shelf header region");
2250 art->init = asset::shelf::header_region_init;
2251 art->poll = asset::shelf::regions_poll;
2252 art->draw = asset::shelf::header_region;
2253 art->listener = asset::shelf::header_region_listen;
2254 art->context = asset::shelf::context;
2255 BLI_addhead(&st->regiontypes, art);
2256 asset::shelf::types_register(art, SPACE_VIEW3D);
2257
2258 /* regions: hud */
2259 art = ED_area_type_hud(st->spaceid);
2260 BLI_addhead(&st->regiontypes, art);
2261
2262 /* regions: xr */
2263 art = MEM_cnew<ARegionType>("spacetype view3d xr region");
2264 art->regionid = RGN_TYPE_XR;
2265 BLI_addhead(&st->regiontypes, art);
2266
2268 MEM_cnew<MenuType>(__func__, blender::ed::geometry::node_group_operator_assets_menu()));
2269 WM_menutype_add(MEM_cnew<MenuType>(
2271
2272 BKE_spacetype_register(std::move(st));
2273}
Main runtime representation of an asset.
IDProperty * BKE_asset_metadata_idprop_find(const AssetMetaData *asset_data, const char *name) ATTR_WARN_UNUSED_RESULT
Definition asset.cc:186
const char * CTX_data_mode_string(const bContext *C)
eContextObjectMode
@ CTX_MODE_VERTEX_GPENCIL_LEGACY
@ CTX_MODE_WEIGHT_GPENCIL_LEGACY
@ CTX_MODE_EDIT_POINT_CLOUD
@ CTX_MODE_SCULPT_GPENCIL_LEGACY
@ CTX_MODE_PAINT_GREASE_PENCIL
@ CTX_MODE_PAINT_GPENCIL_LEGACY
@ CTX_MODE_EDIT_CURVE
@ CTX_MODE_PAINT_TEXTURE
@ CTX_MODE_EDIT_SURFACE
@ CTX_MODE_SCULPT_GREASE_PENCIL
@ CTX_MODE_PARTICLE
@ CTX_MODE_SCULPT
@ CTX_MODE_OBJECT
@ CTX_MODE_EDIT_MESH
@ CTX_MODE_EDIT_GREASE_PENCIL
@ CTX_MODE_SCULPT_CURVES
@ CTX_MODE_EDIT_TEXT
@ CTX_MODE_EDIT_CURVES
@ CTX_MODE_EDIT_ARMATURE
@ CTX_MODE_EDIT_LATTICE
@ CTX_MODE_WEIGHT_GREASE_PENCIL
@ CTX_MODE_VERTEX_GREASE_PENCIL
@ CTX_MODE_PAINT_VERTEX
@ CTX_MODE_EDIT_METABALL
@ CTX_MODE_PAINT_WEIGHT
@ CTX_MODE_EDIT_GPENCIL_LEGACY
@ CTX_MODE_POSE
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
View3D * CTX_wm_view3d(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)
#define IDP_Int(prop)
void IDP_FreeProperty(IDProperty *prop)
Definition idprop.cc:1227
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition idprop.cc:861
#define IDP_Array(prop)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
void BKE_view_layer_base_deselect_all(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
void BKE_view_layer_base_select_and_set_active(ViewLayer *view_layer, Base *selbase)
Object * BKE_view_layer_edit_object_get(const ViewLayer *view_layer)
ID * BKE_libblock_find_session_uid(Main *bmain, short type, uint32_t session_uid)
Definition lib_id.cc:1675
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
@ IDWALK_CB_DIRECT_WEAK_LINK
int BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
Definition lib_query.cc:120
@ IDWALK_READONLY
@ ID_REMAP_RESULT_SOURCE_UNASSIGNED
@ ID_REMAP_APPLY_DEFAULT
General operations, lookup, etc. for blender objects.
std::optional< blender::Bounds< blender::float3 > > BKE_object_boundbox_get(const Object *ob)
void BKE_object_dimensions_eval_cached_get(Object *ob, float r_vec[3])
Depsgraph * BKE_scene_get_depsgraph(const Scene *scene, const ViewLayer *view_layer)
Definition scene.cc:3364
void BKE_screen_view3d_shading_blend_read_data(BlendDataReader *reader, View3DShading *shading)
Definition screen.cc:1055
void BKE_spacetype_register(std::unique_ptr< SpaceType > st)
Definition screen.cc:268
void BKE_screen_view3d_shading_blend_write(BlendWriter *writer, View3DShading *shading)
Definition screen.cc:1048
SpaceType * BKE_spacetype_from_id(int spaceid)
Definition screen.cc:243
ARegionType * BKE_regiontype_from_id(const SpaceType *st, int regionid)
Definition screen.cc:253
void BKE_screen_view3d_sync(View3D *v3d, Scene *scene)
Definition screen.cc:945
void BKE_screen_view3d_do_versions_250(View3D *v3d, ListBase *regions)
Definition screen.cc:1265
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:50
#define ATTR_FALLTHROUGH
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:90
#define LISTBASE_FOREACH(type, var, list)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:110
#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])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
void rescale_m4(float mat[4][4], const float scale[3])
void mat4_to_size(float size[3], const float M[4][4])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
#define STRNCPY(dst, src)
Definition BLI_string.h:593
#define ARRAY_SIZE(arr)
#define ARRAY_SET_ITEMS(...)
#define UNUSED_VARS_NDEBUG(...)
#define ELEM(...)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct(reader, struct_name, ptr_p)
#define TIP_(msgid)
#define BPy_BEGIN_ALLOW_THREADS
Definition BPY_extern.hh:50
#define BPy_END_ALLOW_THREADS
Definition BPY_extern.hh:54
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
#define FILTER_ID_OB
Definition DNA_ID.h:1181
#define FILTER_ID_MC
Definition DNA_ID.h:1177
@ ID_RECALC_SELECT
Definition DNA_ID.h:1068
#define FILTER_ID_MA
Definition DNA_ID.h:1175
#define ID_IS_EDITABLE(_id)
Definition DNA_ID.h:658
#define ID_IS_OVERRIDE_LIBRARY(_id)
Definition DNA_ID.h:683
#define FILTER_ID_IM
Definition DNA_ID.h:1171
ID_Type
@ ID_IM
@ ID_NT
@ ID_WO
@ ID_MA
@ ID_GR
@ ID_OB
Object groups, one object can be in many groups at once.
#define DNA_struct_default_alloc(struct_name)
@ BASE_ENABLED_VIEWPORT
@ NTREE_GEOMETRY
@ OB_TEXTURE
@ OB_SOLID
@ OB_RENDER
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_SCULPT
Object is a sort of wrapper for general info.
#define OB_DATA_SUPPORT_ID(_id_type)
@ OB_EMPTY
@ OB_CAMERA
@ OB_EMPTY_IMAGE
#define BASE_SELECTABLE(v3d, base)
#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_HIDDEN_BY_USER
@ SPACE_EMPTY
@ SPACE_VIEW3D
@ FILE_AUTOSELECT
@ USER_HEADER_BOTTOM
@ V3D_SHADING_BACKGROUND_WORLD
#define V3D_USES_SCENE_WORLD(v3d)
@ RV3D_GPULIGHT_UPDATE
@ V3D_RUNTIME_LOCAL_MAYBE_EMPTY
@ RV3D_CAMOB
@ RV3D_PERSP
@ RV3D_LOCK_ROTATION
@ V3D_SHOW_VIEWER
@ V3D_HIDE_OVERLAYS
@ V3D_LOCAL_COLLECTIONS
@ V3D_XR_SESSION_MIRROR
@ RV3D_VIEW_USER
void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
void DRW_engine_external_free(RegionView3D *rv3d)
void ED_outliner_select_sync_from_object_tag(bContext *C)
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:414
ARegionType * ED_area_type_hud(int space_type)
void ED_area_do_mgs_subscribe_for_tool_ui(const wmRegionMessageSubscribeParams *params)
Definition area.cc:429
bool ED_region_overlap_isect_any_xy(const ScrArea *area, const int event_xy[2])
Definition area_query.cc:49
void ED_region_header(const bContext *C, ARegion *region)
Definition area.cc:3646
void ED_region_header_init(ARegion *region)
Definition area.cc:3661
void ED_area_tag_redraw_regiontype(ScrArea *area, int regiontype)
Definition area.cc:726
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:3099
void ED_region_header_with_button_sections(const bContext *C, ARegion *region, uiButtonSectionsAlign align)
Definition area.cc:3653
int ED_region_generic_tools_region_snap_size(const ARegion *region, int size, int axis)
Definition area_utils.cc:41
void ED_region_tag_redraw_cursor(ARegion *region)
Definition area.cc:646
void ED_area_tag_refresh(ScrArea *area)
Definition area.cc:737
void ED_region_generic_tools_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
Definition area_utils.cc:29
void ED_region_panels_init(wmWindowManager *wm, ARegion *region)
Definition area.cc:3343
void ED_region_tag_redraw(ARegion *region)
Definition area.cc:634
@ ED_KEYMAP_ASSET_SHELF
Definition ED_screen.hh:735
@ ED_KEYMAP_UI
Definition ED_screen.hh:725
@ ED_KEYMAP_HEADER
Definition ED_screen.hh:731
@ ED_KEYMAP_TOOL
Definition ED_screen.hh:727
@ ED_KEYMAP_GPENCIL
Definition ED_screen.hh:733
@ ED_KEYMAP_GIZMO
Definition ED_screen.hh:726
@ ED_KEYMAP_VIEW2D
Definition ED_screen.hh:728
@ ED_KEYMAP_FRAMES
Definition ED_screen.hh:730
@ ED_KEYMAP_FOOTER
Definition ED_screen.hh:732
void ED_region_do_msg_notify_tag_redraw(bContext *C, wmMsgSubscribeKey *msg_key, wmMsgSubscribeValue *msg_val)
Definition area.cc:381
void ED_region_panels_ex(const bContext *C, ARegion *region, wmOperatorCallContext op_context, const char *contexts[])
Definition area.cc:3326
void ED_region_panels_draw(const bContext *C, ARegion *region)
Definition area.cc:3277
void VIEW3D_GGT_xform_gizmo_context(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_shear(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_gizmo(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_extrude(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_cage(wmGizmoGroupType *gzgt)
void ED_undo_push(bContext *C, const char *str)
Definition ed_undo.cc:104
V3DSnapCursorState * ED_view3d_cursor_snap_state_create()
V3DSnapCursorState * ED_view3d_cursor_snap_state_active_get()
Object * ED_view3d_give_object_under_cursor(bContext *C, const int mval[2])
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])
bool ED_view3d_is_object_under_cursor(bContext *C, const int mval[2])
void ED_view3d_cursor_snap_state_free(V3DSnapCursorState *state)
RenderEngineType * ED_view3d_engine_type(const Scene *scene, int drawtype)
V3DSnapCursorData * ED_view3d_cursor_snap_data_get()
#define GPU_matrix_mul(x)
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
#define UI_SIDEBAR_PANEL_WIDTH
#define UI_TOOLBAR_WIDTH
@ TH_GIZMO_PRIMARY
void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
@ WM_JOB_TYPE_RENDER_PREVIEW
Definition WM_api.hh:1579
#define NC_WORLD
Definition WM_types.hh:354
#define ND_SHADING
Definition WM_types.hh:444
#define ND_WORLD
Definition WM_types.hh:419
#define ND_ASSET_LIST_READING
Definition WM_types.hh:516
#define NC_ID
Definition WM_types.hh:362
#define NC_NODE
Definition WM_types.hh:361
#define NC_GEOM
Definition WM_types.hh:360
#define ND_NLA_ACTCHANGE
Definition WM_types.hh:465
#define ND_DRAW
Definition WM_types.hh:428
#define NC_BRUSH
Definition WM_types.hh:352
#define ND_OB_ACTIVE
Definition WM_types.hh:407
#define NC_WM
Definition WM_types.hh:341
#define ND_DATA
Definition WM_types.hh:475
#define ND_GPENCIL_EDITMODE
Definition WM_types.hh:470
#define ND_LIGHTING_DRAW
Definition WM_types.hh:451
#define ND_RENDER_OPTIONS
Definition WM_types.hh:402
#define ND_SPACE_ASSET_PARAMS
Definition WM_types.hh:491
#define NC_ANIMATION
Definition WM_types.hh:355
#define NC_VIEWER_PATH
Definition WM_types.hh:373
#define ND_VERTEX_GROUP
Definition WM_types.hh:476
#define ND_DISPLAY
Definition WM_types.hh:458
#define ND_LOD
Definition WM_types.hh:435
#define NC_SCREEN
Definition WM_types.hh:344
#define NC_MOVIECLIP
Definition WM_types.hh:364
#define ND_SKETCH
Definition WM_types.hh:394
#define ND_MODE
Definition WM_types.hh:412
#define ND_OB_SELECT
Definition WM_types.hh:409
#define ND_ANIMPLAY
Definition WM_types.hh:391
#define NC_SCENE
Definition WM_types.hh:345
#define NA_ADDED
Definition WM_types.hh:552
#define ND_OB_VISIBLE
Definition WM_types.hh:410
#define ND_LAYER_CONTENT
Definition WM_types.hh:420
#define NC_GROUP
Definition WM_types.hh:350
#define ND_NODES
Definition WM_types.hh:403
#define ND_TOOLSETTINGS
Definition WM_types.hh:416
#define ND_MODIFIER
Definition WM_types.hh:429
#define ND_POSE
Definition WM_types.hh:425
#define NA_EDITED
Definition WM_types.hh:550
#define ND_PARTICLE
Definition WM_types.hh:432
#define ND_KEYFRAME_PROP
Definition WM_types.hh:462
#define NC_MATERIAL
Definition WM_types.hh:347
#define NC_LAMP
Definition WM_types.hh:349
#define NC_IMAGE
Definition WM_types.hh:351
#define ND_CONSTRAINT
Definition WM_types.hh:431
#define NC_WORKSPACE
Definition WM_types.hh:343
#define ND_UNDO
Definition WM_types.hh:384
#define ND_MARKERS
Definition WM_types.hh:400
#define NC_CAMERA
Definition WM_types.hh:368
#define ND_FRAME
Definition WM_types.hh:401
#define NC_ASSET
Definition WM_types.hh:371
#define NA_REMOVED
Definition WM_types.hh:553
#define ND_SELECT
Definition WM_types.hh:474
#define NC_GPENCIL
Definition WM_types.hh:366
#define ND_NLA
Definition WM_types.hh:464
#define NC_TEXTURE
Definition WM_types.hh:348
#define NS_VIEW3D_GPU
Definition WM_types.hh:542
#define ND_LIGHTING
Definition WM_types.hh:450
#define ND_BONE_ACTIVE
Definition WM_types.hh:426
#define ND_TRANSFORM
Definition WM_types.hh:423
#define ND_LAYER
Definition WM_types.hh:417
@ WM_OP_INVOKE_REGION_WIN
Definition WM_types.hh:219
#define ND_BONE_COLLECTION
Definition WM_types.hh:441
#define ND_KEYS
Definition WM_types.hh:430
#define NA_RENAME
Definition WM_types.hh:554
#define ND_ASSET_CATALOGS
Definition WM_types.hh:520
#define ND_NODE_GIZMO
Definition WM_types.hh:482
#define ND_HISTORY
Definition WM_types.hh:382
#define NC_LIGHTPROBE
Definition WM_types.hh:369
@ WM_DRAG_ASSET
Definition WM_types.hh:1154
@ WM_DRAG_ID
Definition WM_types.hh:1153
#define ND_POINTCACHE
Definition WM_types.hh:433
#define ND_XR_DATA_CHANGED
Definition WM_types.hh:385
#define ND_SHADERFX
Definition WM_types.hh:438
#define ND_WORLD_DRAW
Definition WM_types.hh:454
#define ND_LAYOUTBROWSE
Definition WM_types.hh:389
#define ND_DRAW_ANIMVIZ
Definition WM_types.hh:440
#define ND_BONE_SELECT
Definition WM_types.hh:427
#define ND_SPACE_VIEW3D
Definition WM_types.hh:494
#define ND_KEYFRAME
Definition WM_types.hh:461
#define ND_LAYOUTSET
Definition WM_types.hh:393
#define NC_OBJECT
Definition WM_types.hh:346
#define ND_SCENEBROWSE
Definition WM_types.hh:399
#define NS_VIEW3D_SHADING
Definition WM_types.hh:543
#define ND_LAYOUTDELETE
Definition WM_types.hh:390
#define ND_NODE_ASSET_DATA
Definition WM_types.hh:481
#define ND_ANIMCHAN
Definition WM_types.hh:463
#define ND_SHADING_LINKS
Definition WM_types.hh:446
#define ND_SHADING_DRAW
Definition WM_types.hh:445
#define NC_SPACE
Definition WM_types.hh:359
#define NA_SELECTED
Definition WM_types.hh:555
#define ND_DRAW_RENDER_VIEWPORT
Definition WM_types.hh:437
unsigned int U
Definition btGjkEpa3.h:78
IDRemapperApplyResult apply(ID **r_id_ptr, IDRemapperApplyOptions options, ID *id_self=nullptr) const
bool contains_mappings_for_any(IDTypeFilter filter) const
const Depsgraph * depsgraph
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
#define GS(x)
Definition iris.cc:202
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_dupallocN)(const void *vmemh)
Definition mallocn.cc:39
static ulong state[N]
MenuType node_group_operator_assets_menu_unassigned()
std::string drop_named_material_tooltip(bContext *C, const char *name, const int mval[2])
std::string drop_geometry_nodes_tooltip(bContext *C, PointerRNA *properties, const int mval[2])
T midpoint(const T &a, const T &b)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
int RNA_int_get(PointerRNA *ptr, const char *name)
void RNA_struct_property_unset(PointerRNA *ptr, const char *identifier)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
static void view3d_main_region_init(wmWindowManager *wm, ARegion *region)
static void view3d_ob_drop_copy_external_asset(bContext *C, wmDrag *drag, wmDropBox *drop)
void ED_view3d_check_mats_rv3d(RegionView3D *rv3d)
static void view3d_exit(wmWindowManager *, ScrArea *area)
static bool view3d_world_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static void view3d_id_remap(ScrArea *area, SpaceLink *slink, const blender::bke::id::IDRemapper &mappings)
static bool view3d_ob_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static bool view3d_collection_drop_poll_local_id(bContext *C, wmDrag *drag, const wmEvent *event)
static bool view3d_object_data_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static void view3d_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
static void view3d_tools_header_region_draw(const bContext *C, ARegion *region)
static void view3d_collection_drop_copy_local_id(bContext *, wmDrag *drag, wmDropBox *drop)
static void view3d_free(SpaceLink *sl)
static void space_view3d_listener(const wmSpaceTypeListenerParams *params)
void ED_view3d_clear_mats_rv3d(RegionView3D *rv3d)
static bool view3d_ima_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static bool view3d_ima_bg_is_camera_view(bContext *C)
static bool view3d_collection_drop_poll_external_asset(bContext *C, wmDrag *drag, const wmEvent *event)
void ED_view3d_init_mats_rv3d(const Object *ob, RegionView3D *rv3d)
static SpaceLink * view3d_duplicate(SpaceLink *sl)
static void view3d_widgets()
static void view3d_ob_drop_matrix_from_snap(V3DSnapCursorState *snap_state, Object *ob, float obmat_final[4][4])
static void view3d_main_region_listener(const wmRegionListenerParams *params)
static std::string view3d_object_data_drop_tooltip(bContext *, wmDrag *, const int[2], wmDropBox *)
void ED_view3d_stop_render_preview(wmWindowManager *wm, ARegion *region)
static void view3d_header_region_draw(const bContext *C, ARegion *region)
static bool view3d_ima_empty_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static bool view3d_ob_drop_poll_local_id(bContext *C, wmDrag *drag, const wmEvent *event)
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 bool view3d_ima_bg_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static void view3d_header_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
static void view3d_geometry_nodes_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
static void view3d_main_region_message_subscribe(const wmRegionMessageSubscribeParams *params)
static void view3d_buttons_region_layout(const bContext *C, ARegion *region)
static bool view3d_ob_drop_poll_external_asset(bContext *C, wmDrag *drag, const wmEvent *event)
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 std::string view3d_geometry_nodes_drop_tooltip(bContext *C, wmDrag *, const int xy[2], wmDropBox *drop)
static void view3d_ob_drop_on_exit(wmDropBox *drop, wmDrag *)
static bool view3d_drop_in_main_region_poll(bContext *C, const wmEvent *event)
static void view3d_do_msg_notify_workbench_view_update(bContext *C, wmMsgSubscribeKey *, wmMsgSubscribeValue *msg_val)
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)
static void view3d_id_drop_copy_with_type(bContext *C, wmDrag *drag, wmDropBox *drop)
static void view3d_collection_drop_copy_external_asset(bContext *C, wmDrag *drag, wmDropBox *drop)
void ED_spacetype_view3d()
static void view3d_main_region_free(ARegion *region)
static bool view3d_drop_id_in_main_region_poll(bContext *C, wmDrag *drag, const wmEvent *event, ID_Type id_type)
static void * view3d_main_region_duplicate(void *poin)
static std::string view3d_mat_drop_tooltip(bContext *C, wmDrag *drag, const int xy[2], wmDropBox *)
static void view3d_dropboxes()
static void view3d_ob_drop_copy_local_id(bContext *, wmDrag *drag, wmDropBox *drop)
static bool view3d_geometry_nodes_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static bool view3d_mat_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
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)
static bool view3d_collection_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
static void view3d_ob_drop_on_enter(wmDropBox *drop, wmDrag *drag)
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)
static void view3d_id_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop)
static ID_Type view3d_drop_id_in_main_region_poll_get_id_type(bContext *C, wmDrag *drag, const wmEvent *event)
unsigned int uint32_t
Definition stdint.h:80
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)
The meta-data of an asset. By creating and giving this for a data-block (ID.asset_data),...
short flag
Depsgraph * depsgraph
Definition DRW_engine.hh:49
ViewLayer * view_layer
Definition DRW_engine.hh:51
ARegion * region
Definition DRW_engine.hh:52
RenderEngineType * engine_type
Definition DRW_engine.hh:54
Definition DNA_ID.h:413
char name[66]
Definition DNA_ID.h:425
void * first
ListBase wm
Definition BKE_main.hh:239
char empty_drawtype
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
float plane_omat[3][3]
Definition ED_view3d.hh:332
struct IDProperty * prop
void(* properties_storage_free)(void *properties_storage)
struct SceneStats * local_stats
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
wmDropBox * active_dropbox
Definition WM_types.hh:1248
const AssetRepresentationHandle * asset
Definition WM_types.hh:1195
eWM_DragDataType type
Definition WM_types.hh:1282
wmDragActiveDropState drop_state
Definition WM_types.hh:1289
void * draw_data
Definition WM_types.hh:1350
PointerRNA * ptr
Definition WM_types.hh:1368
void(* on_exit)(wmDropBox *drop, wmDrag *drag)
Definition WM_types.hh:1323
void(* on_enter)(wmDropBox *drop, wmDrag *drag)
Definition WM_types.hh:1319
void(* draw_droptip)(bContext *C, wmWindow *win, wmDrag *drag, const int xy[2])
Definition WM_types.hh:1339
int xy[2]
Definition WM_types.hh:726
int mval[2]
Definition WM_types.hh:728
unsigned int data
Definition WM_types.hh:325
unsigned int action
Definition WM_types.hh:325
unsigned int category
Definition WM_types.hh:325
unsigned int subtype
Definition WM_types.hh:325
void * reference
Definition WM_types.hh:327
struct wmKeyConfig * defaultconf
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_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_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
AssetMetaData * WM_drag_get_asset_meta_data(const wmDrag *drag, int idcode)
wmDropBox * WM_dropbox_add(ListBase *lb, const char *idname, bool(*poll)(bContext *C, wmDrag *drag, const wmEvent *event), void(*copy)(bContext *C, wmDrag *drag, wmDropBox *drop), void(*cancel)(Main *bmain, wmDrag *drag, wmDropBox *drop), WMDropboxTooltipFunc tooltip)
void WM_drag_draw_item_name_fn(bContext *, wmWindow *win, wmDrag *drag, const int xy[2])
void WM_drag_free_imported_drag_ID(Main *bmain, wmDrag *drag, wmDropBox *drop)
Free asset ID imported for canceled drop.
bool WM_drag_asset_will_import_linked(const wmDrag *drag)
ID * WM_drag_asset_id_import(const bContext *C, wmDragAsset *asset_drag, const int flag_extra)
const char * WM_drag_get_item_name(wmDrag *drag)
bool WM_drag_is_ID_type(const wmDrag *drag, int idcode)
ID * WM_drag_get_local_ID_or_import_from_asset(const bContext *C, const wmDrag *drag, int idcode)
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
wmDragAsset * WM_drag_get_asset_data(const wmDrag *drag, int idcode)
ID * WM_drag_get_local_ID(const wmDrag *drag, short idcode)
int xy[2]
Definition wm_draw.cc:170
void WM_draw_region_free(ARegion *region)
Definition wm_draw.cc:1603
wmEventHandler_Dropbox * WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes)
wmEventHandler_Keymap * WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
void WM_main_add_notifier(uint type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
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:597
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition wm_keymap.cc:897
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_operator_properties_id_lookup_set_from_id(PointerRNA *ptr, const ID *id)
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)