Blender  V2.93
space_view3d.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2008 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <stdio.h>
25 #include <string.h>
26 
27 #include "DNA_defaults.h"
28 #include "DNA_gpencil_types.h"
29 #include "DNA_lightprobe_types.h"
30 #include "DNA_material_types.h"
31 #include "DNA_object_types.h"
32 #include "DNA_scene_types.h"
33 
34 #include "MEM_guardedalloc.h"
35 
36 #include "BLI_blenlib.h"
37 #include "BLI_math.h"
38 #include "BLI_utildefines.h"
39 
40 #include "BLT_translation.h"
41 
42 #include "BKE_context.h"
43 #include "BKE_curve.h"
44 #include "BKE_global.h"
45 #include "BKE_icons.h"
46 #include "BKE_idprop.h"
47 #include "BKE_lattice.h"
48 #include "BKE_main.h"
49 #include "BKE_mball.h"
50 #include "BKE_mesh.h"
51 #include "BKE_object.h"
52 #include "BKE_scene.h"
53 #include "BKE_screen.h"
54 #include "BKE_workspace.h"
55 
56 #include "ED_render.h"
57 #include "ED_screen.h"
58 #include "ED_space_api.h"
59 #include "ED_transform.h"
60 
61 #include "GPU_matrix.h"
62 
63 #include "DRW_engine.h"
64 
65 #include "WM_api.h"
66 #include "WM_message.h"
67 #include "WM_toolsystem.h"
68 #include "WM_types.h"
69 
70 #include "RE_engine.h"
71 #include "RE_pipeline.h"
72 
73 #include "RNA_access.h"
74 
75 #include "UI_interface.h"
76 #include "UI_resources.h"
77 
78 #ifdef WITH_PYTHON
79 # include "BPY_extern.h"
80 #endif
81 
82 #include "DEG_depsgraph.h"
83 
84 #include "view3d_intern.h" /* own include */
85 
86 /* ******************** manage regions ********************* */
87 
88 /* function to always find a regionview3d context inside 3D window */
90 {
92 
93  if (rv3d == NULL) {
95  if (area && area->spacetype == SPACE_VIEW3D) {
97  if (region) {
98  rv3d = region->regiondata;
99  }
100  }
101  }
102  return rv3d;
103 }
104 
105 /* ideally would return an rv3d but in some cases the region is needed too
106  * so return that, the caller can then access the region->regiondata */
108 {
110 
111  *r_v3d = NULL;
112  *r_region = NULL;
113 
114  if (area && area->spacetype == SPACE_VIEW3D) {
115  ARegion *region = CTX_wm_region(C);
116  View3D *v3d = (View3D *)area->spacedata.first;
117 
118  if (region) {
119  RegionView3D *rv3d;
120  if ((region->regiontype == RGN_TYPE_WINDOW) && (rv3d = region->regiondata) &&
121  (rv3d->viewlock & RV3D_LOCK_ROTATION) == 0) {
122  *r_v3d = v3d;
123  *r_region = region;
124  return true;
125  }
126 
127  if (ED_view3d_area_user_region(area, v3d, r_region)) {
128  *r_v3d = v3d;
129  return true;
130  }
131  }
132  }
133 
134  return false;
135 }
136 
141 bool ED_view3d_area_user_region(const ScrArea *area, const View3D *v3d, ARegion **r_region)
142 {
143  RegionView3D *rv3d = NULL;
144  ARegion *region_unlock_user = NULL;
145  ARegion *region_unlock = NULL;
146  const ListBase *region_list = (v3d == area->spacedata.first) ? &area->regionbase :
147  &v3d->regionbase;
148 
150 
151  LISTBASE_FOREACH (ARegion *, region, region_list) {
152  /* find the first unlocked rv3d */
153  if (region->regiondata && region->regiontype == RGN_TYPE_WINDOW) {
154  rv3d = region->regiondata;
155  if ((rv3d->viewlock & RV3D_LOCK_ROTATION) == 0) {
156  region_unlock = region;
157  if (ELEM(rv3d->persp, RV3D_PERSP, RV3D_CAMOB)) {
158  region_unlock_user = region;
159  break;
160  }
161  }
162  }
163  }
164 
165  /* camera/perspective view get priority when the active region is locked */
166  if (region_unlock_user) {
167  *r_region = region_unlock_user;
168  return true;
169  }
170 
171  if (region_unlock) {
172  *r_region = region_unlock;
173  return true;
174  }
175 
176  return false;
177 }
178 
179 /* Most of the time this isn't needed since you could assume the view matrix was
180  * set while drawing, however when functions like mesh_foreachScreenVert are
181  * called by selection tools, we can't be sure this object was the last.
182  *
183  * for example, transparent objects are drawn after editmode and will cause
184  * the rv3d mat's to change and break selection.
185  *
186  * 'ED_view3d_init_mats_rv3d' should be called before
187  * view3d_project_short_clip and view3d_project_short_noclip in cases where
188  * these functions are not used during draw_object
189  */
190 void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d)
191 {
192  /* local viewmat and persmat, to calculate projections */
193  mul_m4_m4m4(rv3d->viewmatob, rv3d->viewmat, ob->obmat);
194  mul_m4_m4m4(rv3d->persmatob, rv3d->persmat, ob->obmat);
195 
196  /* initializes object space clipping, speeds up clip tests */
197  ED_view3d_clipping_local(rv3d, ob->obmat);
198 }
199 
200 void ED_view3d_init_mats_rv3d_gl(struct Object *ob, struct RegionView3D *rv3d)
201 {
202  ED_view3d_init_mats_rv3d(ob, rv3d);
203 
204  /* we have to multiply instead of loading viewmatob to make
205  * it work with duplis using displists, otherwise it will
206  * override the dupli-matrix */
207  GPU_matrix_mul(ob->obmat);
208 }
209 
210 #ifdef DEBUG
211 /* ensure we correctly initialize */
212 void ED_view3d_clear_mats_rv3d(struct RegionView3D *rv3d)
213 {
214  zero_m4(rv3d->viewmatob);
215  zero_m4(rv3d->persmatob);
216 }
217 
218 void ED_view3d_check_mats_rv3d(struct RegionView3D *rv3d)
219 {
222 }
223 #endif
224 
226 {
227  RegionView3D *rv3d = region->regiondata;
228 
229  if (rv3d->render_engine) {
230 #ifdef WITH_PYTHON
232 #endif
233 
235 
236 #ifdef WITH_PYTHON
238 #endif
239 
241  rv3d->render_engine = NULL;
242  }
243 
244  /* A bit overkill but this make sure the viewport is reset completely. (fclem) */
245  WM_draw_region_free(region, false);
246 }
247 
249 {
250  wmWindowManager *wm = bmain->wm.first;
251 
252  if (v3d->shading.type != OB_RENDER) {
253  ARegion *region;
254 
255  for (region = area->regionbase.first; region; region = region->next) {
256  if ((region->regiontype == RGN_TYPE_WINDOW) && region->regiondata) {
257  ED_view3d_stop_render_preview(wm, region);
258  break;
259  }
260  }
261  }
262 }
263 
264 /* ******************** default callbacks for view3d space ***************** */
265 
267 {
268  ARegion *region;
269  View3D *v3d;
270  RegionView3D *rv3d;
271 
273 
274  if (scene) {
275  v3d->camera = scene->camera;
276  }
277 
278  /* tool header */
279  region = MEM_callocN(sizeof(ARegion), "tool header for view3d");
280 
281  BLI_addtail(&v3d->regionbase, region);
285 
286  /* header */
287  region = MEM_callocN(sizeof(ARegion), "header for view3d");
288 
289  BLI_addtail(&v3d->regionbase, region);
290  region->regiontype = RGN_TYPE_HEADER;
292 
293  /* tool shelf */
294  region = MEM_callocN(sizeof(ARegion), "toolshelf for view3d");
295 
296  BLI_addtail(&v3d->regionbase, region);
297  region->regiontype = RGN_TYPE_TOOLS;
298  region->alignment = RGN_ALIGN_LEFT;
299  region->flag = RGN_FLAG_HIDDEN;
300 
301  /* buttons/list view */
302  region = MEM_callocN(sizeof(ARegion), "buttons for view3d");
303 
304  BLI_addtail(&v3d->regionbase, region);
305  region->regiontype = RGN_TYPE_UI;
306  region->alignment = RGN_ALIGN_RIGHT;
307  region->flag = RGN_FLAG_HIDDEN;
308 
309  /* main region */
310  region = MEM_callocN(sizeof(ARegion), "main region for view3d");
311 
312  BLI_addtail(&v3d->regionbase, region);
313  region->regiontype = RGN_TYPE_WINDOW;
314 
315  region->regiondata = MEM_callocN(sizeof(RegionView3D), "region view3d");
316  rv3d = region->regiondata;
317  rv3d->viewquat[0] = 1.0f;
318  rv3d->persp = RV3D_PERSP;
319  rv3d->view = RV3D_VIEW_USER;
320  rv3d->dist = 10.0;
321 
322  return (SpaceLink *)v3d;
323 }
324 
325 /* not spacelink itself */
326 static void view3d_free(SpaceLink *sl)
327 {
328  View3D *vd = (View3D *)sl;
329 
330  if (vd->localvd) {
331  MEM_freeN(vd->localvd);
332  }
333 
334  if (vd->runtime.properties_storage) {
336  }
337 
338  if (vd->shading.prop) {
340  vd->shading.prop = NULL;
341  }
342 }
343 
344 /* spacetype; init callback */
346 {
347 }
348 
350 {
351  View3D *v3do = (View3D *)sl;
352  View3D *v3dn = MEM_dupallocN(sl);
353 
354  /* clear or remove stuff from old */
355 
356  if (v3dn->localvd) {
357  v3dn->localvd = NULL;
359  }
360  /* Only one View3D is allowed to have this flag! */
362 
363  v3dn->local_collections_uuid = 0;
365 
366  if (v3dn->shading.type == OB_RENDER) {
367  v3dn->shading.type = OB_SOLID;
368  }
369 
370  if (v3dn->shading.prop) {
371  v3dn->shading.prop = IDP_CopyProperty(v3do->shading.prop);
372  }
373 
374  /* copy or clear inside new stuff */
375 
377 
378  return (SpaceLink *)v3dn;
379 }
380 
381 /* add handlers, stuff you only do once or on area/region changes */
383 {
384  ListBase *lb;
385  wmKeyMap *keymap;
386 
387  /* object ops. */
388 
389  /* important to be before Pose keymap since they can both be enabled at once */
390  keymap = WM_keymap_ensure(wm->defaultconf, "Paint Face Mask (Weight, Vertex, Texture)", 0, 0);
391  WM_event_add_keymap_handler(&region->handlers, keymap);
392 
393  keymap = WM_keymap_ensure(wm->defaultconf, "Paint Vertex Selection (Weight, Vertex)", 0, 0);
394  WM_event_add_keymap_handler(&region->handlers, keymap);
395 
396  /* Before 'Weight/Vertex Paint' so adding curve points is not overridden. */
397  keymap = WM_keymap_ensure(wm->defaultconf, "Paint Curve", 0, 0);
398  WM_event_add_keymap_handler(&region->handlers, keymap);
399 
400  /* Before 'Pose' so weight paint menus aren't overridden by pose menus. */
401  keymap = WM_keymap_ensure(wm->defaultconf, "Weight Paint", 0, 0);
402  WM_event_add_keymap_handler(&region->handlers, keymap);
403 
404  keymap = WM_keymap_ensure(wm->defaultconf, "Vertex Paint", 0, 0);
405  WM_event_add_keymap_handler(&region->handlers, keymap);
406 
407  /* pose is not modal, operator poll checks for this */
408  keymap = WM_keymap_ensure(wm->defaultconf, "Pose", 0, 0);
409  WM_event_add_keymap_handler(&region->handlers, keymap);
410 
411  keymap = WM_keymap_ensure(wm->defaultconf, "Object Mode", 0, 0);
412  WM_event_add_keymap_handler(&region->handlers, keymap);
413 
414  keymap = WM_keymap_ensure(wm->defaultconf, "Curve", 0, 0);
415  WM_event_add_keymap_handler(&region->handlers, keymap);
416 
417  keymap = WM_keymap_ensure(wm->defaultconf, "Image Paint", 0, 0);
418  WM_event_add_keymap_handler(&region->handlers, keymap);
419 
420  keymap = WM_keymap_ensure(wm->defaultconf, "Sculpt", 0, 0);
421  WM_event_add_keymap_handler(&region->handlers, keymap);
422 
423  keymap = WM_keymap_ensure(wm->defaultconf, "Mesh", 0, 0);
424  WM_event_add_keymap_handler(&region->handlers, keymap);
425 
426  keymap = WM_keymap_ensure(wm->defaultconf, "Armature", 0, 0);
427  WM_event_add_keymap_handler(&region->handlers, keymap);
428 
429  keymap = WM_keymap_ensure(wm->defaultconf, "Metaball", 0, 0);
430  WM_event_add_keymap_handler(&region->handlers, keymap);
431 
432  keymap = WM_keymap_ensure(wm->defaultconf, "Lattice", 0, 0);
433  WM_event_add_keymap_handler(&region->handlers, keymap);
434 
435  keymap = WM_keymap_ensure(wm->defaultconf, "Particle", 0, 0);
436  WM_event_add_keymap_handler(&region->handlers, keymap);
437 
438  /* editfont keymap swallows all... */
439  keymap = WM_keymap_ensure(wm->defaultconf, "Font", 0, 0);
440  WM_event_add_keymap_handler(&region->handlers, keymap);
441 
442  keymap = WM_keymap_ensure(wm->defaultconf, "Object Non-modal", 0, 0);
443  WM_event_add_keymap_handler(&region->handlers, keymap);
444 
445  keymap = WM_keymap_ensure(wm->defaultconf, "Frames", 0, 0);
446  WM_event_add_keymap_handler(&region->handlers, keymap);
447 
448  /* own keymap, last so modes can override it */
449  keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, 0);
450  WM_event_add_keymap_handler(&region->handlers, keymap);
451 
452  keymap = WM_keymap_ensure(wm->defaultconf, "3D View", SPACE_VIEW3D, 0);
453  WM_event_add_keymap_handler(&region->handlers, keymap);
454 
455  /* add drop boxes */
457 
459 }
460 
462 {
463  ED_view3d_stop_render_preview(wm, region);
464 }
465 
467 {
469  return ED_region_overlap_isect_any_xy(area, &event->x) == false;
470 }
471 
473  wmDrag *drag,
474  const wmEvent *event)
475 {
476  const ScrArea *area = CTX_wm_area(C);
477 
478  if (ED_region_overlap_isect_any_xy(area, &event->x)) {
479  return 0;
480  }
481  if (!view3d_drop_in_main_region_poll(C, event)) {
482  return 0;
483  }
484 
485  ID *local_id = WM_drag_get_local_ID(drag, 0);
486  if (local_id) {
487  return GS(local_id->name);
488  }
489 
490  wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0);
491  if (asset_drag) {
492  return asset_drag->id_type;
493  }
494 
495  return 0;
496 }
497 
499  wmDrag *drag,
500  const wmEvent *event,
501  ID_Type id_type)
502 {
503  if (!view3d_drop_in_main_region_poll(C, event)) {
504  return false;
505  }
506 
507  return WM_drag_is_ID_type(drag, id_type);
508 }
509 
511  wmDrag *drag,
512  const wmEvent *event,
513  const char **UNUSED(r_tooltip))
514 {
515  return view3d_drop_id_in_main_region_poll(C, drag, event, ID_OB);
516 }
517 
519  wmDrag *drag,
520  const wmEvent *event,
521  const char **UNUSED(r_tooltip))
522 {
523  return view3d_drop_id_in_main_region_poll(C, drag, event, ID_GR);
524 }
525 
527  wmDrag *drag,
528  const wmEvent *event,
529  const char **UNUSED(r_tooltip))
530 {
531  return view3d_drop_id_in_main_region_poll(C, drag, event, ID_MA);
532 }
533 
535  wmDrag *drag,
536  const wmEvent *event,
537  const char **r_tooltip)
538 {
540  if (id_type) {
541  if (OB_DATA_SUPPORT_ID(id_type)) {
542  *r_tooltip = TIP_("Create object instance from object-data");
543  return true;
544  }
545  }
546  return false;
547 }
548 
550  wmDrag *drag,
551  const wmEvent *event,
552  const char **UNUSED(r_tooltip))
553 {
555  return false;
556  }
557  if (drag->type == WM_DRAG_PATH) {
558  /* rule might not work? */
559  return (ELEM(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_MOVIE));
560  }
561 
562  return WM_drag_is_ID_type(drag, ID_IM);
563 }
564 
566 {
568  if ((rv3d && (rv3d->persp == RV3D_CAMOB))) {
569  View3D *v3d = CTX_wm_view3d(C);
570  if (v3d && v3d->camera && v3d->camera->type == OB_CAMERA) {
571  return true;
572  }
573  }
574  return false;
575 }
576 
578  wmDrag *drag,
579  const wmEvent *event,
580  const char **r_tooltip)
581 {
582  if (!view3d_ima_drop_poll(C, drag, event, r_tooltip)) {
583  return false;
584  }
585 
586  if (ED_view3d_is_object_under_cursor(C, event->mval)) {
587  return false;
588  }
589 
591 }
592 
594  wmDrag *drag,
595  const wmEvent *event,
596  const char **r_tooltip)
597 {
598  if (!view3d_ima_drop_poll(C, drag, event, r_tooltip)) {
599  return false;
600  }
601 
603 
604  if (ob == NULL) {
605  return true;
606  }
607 
608  if (ob->type == OB_EMPTY && ob->empty_drawtype == OB_EMPTY_IMAGE) {
609  return true;
610  }
611 
612  return false;
613 }
614 
616  wmDrag *drag,
617  const wmEvent *UNUSED(event),
618  const char **UNUSED(r_tooltip))
619 {
620  return (drag->type == WM_DRAG_PATH) && (drag->icon == ICON_FILE_VOLUME);
621 }
622 
623 static void view3d_ob_drop_copy(wmDrag *drag, wmDropBox *drop)
624 {
626 
627  RNA_string_set(drop->ptr, "name", id->name + 2);
628 }
629 
631 {
633 
634  RNA_string_set(drop->ptr, "name", id->name + 2);
635 }
636 
637 static void view3d_id_drop_copy(wmDrag *drag, wmDropBox *drop)
638 {
640 
641  RNA_string_set(drop->ptr, "name", id->name + 2);
642 }
643 
645 {
647 
648  RNA_string_set(drop->ptr, "name", id->name + 2);
649  RNA_enum_set(drop->ptr, "type", GS(id->name));
650 }
651 
652 static void view3d_id_path_drop_copy(wmDrag *drag, wmDropBox *drop)
653 {
655 
656  if (id) {
657  RNA_string_set(drop->ptr, "name", id->name + 2);
658  RNA_struct_property_unset(drop->ptr, "filepath");
659  }
660  else if (drag->path[0]) {
661  RNA_string_set(drop->ptr, "filepath", drag->path);
662  RNA_struct_property_unset(drop->ptr, "image");
663  }
664 }
665 
667 {
668  PointerRNA op_ptr;
669 
671 
673  /* Only do auto bake if eevee is the active engine */
674  return;
675  }
676 
677  wmOperatorType *ot = WM_operatortype_find("SCENE_OT_light_cache_bake", true);
679  RNA_int_set(&op_ptr, "delay", 200);
680  RNA_enum_set_identifier(C, &op_ptr, "subset", "DIRTY");
681 
683 
685 }
686 
687 /* region dropbox definition */
688 static void view3d_dropboxes(void)
689 {
691 
692  WM_dropbox_add(lb,
693  "OBJECT_OT_add_named",
697  WM_dropbox_add(lb,
698  "OBJECT_OT_drop_named_material",
702  WM_dropbox_add(lb,
703  "VIEW3D_OT_background_image_add",
707  WM_dropbox_add(lb,
708  "OBJECT_OT_drop_named_image",
712  WM_dropbox_add(lb,
713  "OBJECT_OT_volume_import",
717  WM_dropbox_add(lb,
718  "OBJECT_OT_collection_instance_add",
722  WM_dropbox_add(lb,
723  "OBJECT_OT_data_instance_add",
727 }
728 
729 static void view3d_widgets(void)
730 {
733 
742  /* TODO(campbell): Not working well enough, disable for now. */
743 #if 0
745 #endif
746 
755 
758 
760 
763 }
764 
765 /* type callback, not region itself */
766 static void view3d_main_region_free(ARegion *region)
767 {
768  RegionView3D *rv3d = region->regiondata;
769 
770  if (rv3d) {
771  if (rv3d->localvd) {
772  MEM_freeN(rv3d->localvd);
773  }
774  if (rv3d->clipbb) {
775  MEM_freeN(rv3d->clipbb);
776  }
777 
778  if (rv3d->render_engine) {
780  }
781 
782  if (rv3d->depths) {
783  if (rv3d->depths->depths) {
784  MEM_freeN(rv3d->depths->depths);
785  }
786  MEM_freeN(rv3d->depths);
787  }
788  if (rv3d->sms) {
789  MEM_freeN(rv3d->sms);
790  }
791 
792  MEM_freeN(rv3d);
793  region->regiondata = NULL;
794  }
795 }
796 
797 /* copy regiondata */
798 static void *view3d_main_region_duplicate(void *poin)
799 {
800  if (poin) {
801  RegionView3D *rv3d = poin, *new;
802 
803  new = MEM_dupallocN(rv3d);
804  if (rv3d->localvd) {
805  new->localvd = MEM_dupallocN(rv3d->localvd);
806  }
807  if (rv3d->clipbb) {
808  new->clipbb = MEM_dupallocN(rv3d->clipbb);
809  }
810 
811  new->depths = NULL;
812  new->render_engine = NULL;
813  new->sms = NULL;
814  new->smooth_timer = NULL;
815 
816  return new;
817  }
818  return NULL;
819 }
820 
822 {
823  wmWindow *window = params->window;
824  ScrArea *area = params->area;
825  ARegion *region = params->region;
826  wmNotifier *wmn = params->notifier;
827  const Scene *scene = params->scene;
828  View3D *v3d = area->spacedata.first;
829  RegionView3D *rv3d = region->regiondata;
830  wmGizmoMap *gzmap = region->gizmo_map;
831 
832  /* context changes */
833  switch (wmn->category) {
834  case NC_WM:
835  if (ELEM(wmn->data, ND_UNDO)) {
837  }
838  else if (ELEM(wmn->data, ND_XR_DATA_CHANGED)) {
839  /* Only cause a redraw if this a VR session mirror. Should more features be added that
840  * require redraws, we could pass something to wmn->reference, e.g. the flag value. */
841  if (v3d->flag & V3D_XR_SESSION_MIRROR) {
842  ED_region_tag_redraw(region);
843  }
844  }
845  break;
846  case NC_ANIMATION:
847  switch (wmn->data) {
848  case ND_KEYFRAME_PROP:
849  case ND_NLA_ACTCHANGE:
850  ED_region_tag_redraw(region);
851  break;
852  case ND_NLA:
853  case ND_KEYFRAME:
854  if (ELEM(wmn->action, NA_EDITED, NA_ADDED, NA_REMOVED)) {
855  ED_region_tag_redraw(region);
856  }
857  break;
858  case ND_ANIMCHAN:
860  ED_region_tag_redraw(region);
861  }
862  break;
863  }
864  break;
865  case NC_SCENE:
866  switch (wmn->data) {
867  case ND_SCENEBROWSE:
868  case ND_LAYER_CONTENT:
869  ED_region_tag_redraw(region);
871  break;
872  case ND_LAYER:
873  if (wmn->reference) {
875  }
876  ED_region_tag_redraw(region);
878  break;
879  case ND_OB_ACTIVE:
880  case ND_OB_SELECT:
882  case ND_FRAME:
883  case ND_TRANSFORM:
884  case ND_OB_VISIBLE:
885  case ND_RENDER_OPTIONS:
886  case ND_MARKERS:
887  case ND_MODE:
888  ED_region_tag_redraw(region);
890  break;
891  case ND_WORLD:
892  /* handled by space_view3d_listener() for v3d access */
893  break;
895  if (v3d->camera && (scene == wmn->reference)) {
896  if (rv3d->persp == RV3D_CAMOB) {
897  ED_region_tag_redraw(region);
898  }
899  }
900  break;
901  }
902  }
903  if (wmn->action == NA_EDITED) {
904  ED_region_tag_redraw(region);
905  }
906  break;
907  case NC_OBJECT:
908  switch (wmn->data) {
909  case ND_BONE_ACTIVE:
910  case ND_BONE_SELECT:
911  case ND_TRANSFORM:
912  case ND_POSE:
913  case ND_DRAW:
914  case ND_MODIFIER:
915  case ND_SHADERFX:
916  case ND_CONSTRAINT:
917  case ND_KEYS:
918  case ND_PARTICLE:
919  case ND_POINTCACHE:
920  case ND_LOD:
921  ED_region_tag_redraw(region);
923  break;
924  case ND_DRAW_ANIMVIZ:
925  ED_region_tag_redraw(region);
926  break;
927  }
928  switch (wmn->action) {
929  case NA_ADDED:
930  ED_region_tag_redraw(region);
931  break;
932  }
933  break;
934  case NC_GEOM:
935  switch (wmn->data) {
936  case ND_SELECT: {
939  }
940  case ND_DATA:
941  ED_region_tag_redraw(region);
943  break;
944  case ND_VERTEX_GROUP:
945  ED_region_tag_redraw(region);
946  break;
947  }
948  switch (wmn->action) {
949  case NA_EDITED:
950  ED_region_tag_redraw(region);
951  break;
952  }
953  break;
954  case NC_CAMERA:
955  switch (wmn->data) {
957  if (v3d->camera && (v3d->camera->data == wmn->reference)) {
958  if (rv3d->persp == RV3D_CAMOB) {
959  ED_region_tag_redraw(region);
960  }
961  }
962  break;
963  }
964  }
965  break;
966  case NC_GROUP:
967  /* all group ops for now */
968  ED_region_tag_redraw(region);
969  break;
970  case NC_BRUSH:
971  switch (wmn->action) {
972  case NA_EDITED:
974  break;
975  case NA_SELECTED:
976  /* used on brush changes - needed because 3d cursor
977  * has to be drawn if clone brush is selected */
978  ED_region_tag_redraw(region);
979  break;
980  }
981  break;
982  case NC_MATERIAL:
983  switch (wmn->data) {
984  case ND_SHADING:
985  case ND_NODES:
986  /* TODO(sergey): This is a bit too much updates, but needed to
987  * have proper material drivers update in the viewport.
988  *
989  * How to solve?
990  */
991  ED_region_tag_redraw(region);
992  break;
993  case ND_SHADING_DRAW:
994  case ND_SHADING_LINKS:
995  ED_region_tag_redraw(region);
996  break;
997  }
998  break;
999  case NC_WORLD:
1000  switch (wmn->data) {
1001  case ND_WORLD_DRAW:
1002  /* handled by space_view3d_listener() for v3d access */
1003  break;
1004  case ND_WORLD:
1005  /* Needed for updating world materials */
1006  ED_region_tag_redraw(region);
1007  break;
1008  }
1009  break;
1010  case NC_LAMP:
1011  switch (wmn->data) {
1012  case ND_LIGHTING:
1013  /* TODO(sergey): This is a bit too much, but needed to
1014  * handle updates from new depsgraph.
1015  */
1016  ED_region_tag_redraw(region);
1017  break;
1018  case ND_LIGHTING_DRAW:
1019  ED_region_tag_redraw(region);
1020  WM_gizmomap_tag_refresh(gzmap);
1021  break;
1022  }
1023  break;
1024  case NC_LIGHTPROBE:
1026  break;
1027  case NC_IMAGE:
1028  /* this could be more fine grained checks if we had
1029  * more context than just the region */
1030  ED_region_tag_redraw(region);
1031  break;
1032  case NC_TEXTURE:
1033  /* same as above */
1034  ED_region_tag_redraw(region);
1035  break;
1036  case NC_MOVIECLIP:
1037  if (wmn->data == ND_DISPLAY || wmn->action == NA_EDITED) {
1038  ED_region_tag_redraw(region);
1039  }
1040  break;
1041  case NC_SPACE:
1042  if (wmn->data == ND_SPACE_VIEW3D) {
1043  if (wmn->subtype == NS_VIEW3D_GPU) {
1044  rv3d->rflag |= RV3D_GPULIGHT_UPDATE;
1045  }
1046  else if (wmn->subtype == NS_VIEW3D_SHADING) {
1047 #ifdef WITH_XR_OPENXR
1048  ED_view3d_xr_shading_update(G_MAIN->wm.first, v3d, scene);
1049 #endif
1050 
1051  ViewLayer *view_layer = WM_window_get_active_view_layer(window);
1053  if (depsgraph) {
1054  ED_render_view3d_update(depsgraph, window, area, true);
1055  }
1056  }
1057  ED_region_tag_redraw(region);
1058  WM_gizmomap_tag_refresh(gzmap);
1059  }
1060  break;
1061  case NC_ID:
1063  ED_region_tag_redraw(region);
1064  }
1065  break;
1066  case NC_SCREEN:
1067  switch (wmn->data) {
1068  case ND_ANIMPLAY:
1069  case ND_SKETCH:
1070  ED_region_tag_redraw(region);
1071  break;
1072  case ND_LAYOUTBROWSE:
1073  case ND_LAYOUTDELETE:
1074  case ND_LAYOUTSET:
1075  WM_gizmomap_tag_refresh(gzmap);
1076  ED_region_tag_redraw(region);
1077  break;
1078  case ND_LAYER:
1079  ED_region_tag_redraw(region);
1080  break;
1081  }
1082 
1083  break;
1084  case NC_GPENCIL:
1085  if (wmn->data == ND_DATA || ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
1086  ED_region_tag_redraw(region);
1087  }
1088  break;
1089  }
1090 }
1091 
1093 {
1094  struct wmMsgBus *mbus = params->message_bus;
1095  const bContext *C = params->context;
1096  ScrArea *area = params->area;
1097  ARegion *region = params->region;
1098 
1099  /* Developer note: there are many properties that impact 3D view drawing,
1100  * so instead of subscribing to individual properties, just subscribe to types
1101  * accepting some redundant redraws.
1102  *
1103  * For other space types we might try avoid this, keep the 3D view as an exceptional case! */
1104  wmMsgParams_RNA msg_key_params = {{0}};
1105 
1106  /* Only subscribe to types. */
1107  StructRNA *type_array[] = {
1108  &RNA_Window,
1109 
1110  /* These object have properties that impact drawing. */
1111  &RNA_AreaLight,
1112  &RNA_Camera,
1113  &RNA_Light,
1114  &RNA_Speaker,
1115  &RNA_SunLight,
1116 
1117  /* General types the 3D view depends on. */
1118  &RNA_Object,
1119  &RNA_UnitSettings, /* grid-floor */
1120 
1123  &RNA_World,
1124  };
1125 
1126  wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
1127  .owner = region,
1128  .user_data = region,
1130  };
1131 
1132  for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
1133  msg_key_params.ptr.type = type_array[i];
1134  WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
1135  }
1136 
1137  /* Subscribe to a handful of other properties. */
1138  RegionView3D *rv3d = region->regiondata;
1139 
1140  WM_msg_subscribe_rna_anon_prop(mbus, RenderSettings, engine, &msg_sub_value_region_tag_redraw);
1142  mbus, RenderSettings, resolution_x, &msg_sub_value_region_tag_redraw);
1144  mbus, RenderSettings, resolution_y, &msg_sub_value_region_tag_redraw);
1146  mbus, RenderSettings, pixel_aspect_x, &msg_sub_value_region_tag_redraw);
1148  mbus, RenderSettings, pixel_aspect_y, &msg_sub_value_region_tag_redraw);
1149  if (rv3d->persp == RV3D_CAMOB) {
1151  mbus, RenderSettings, use_border, &msg_sub_value_region_tag_redraw);
1152  }
1153 
1154  WM_msg_subscribe_rna_anon_type(mbus, SceneEEVEE, &msg_sub_value_region_tag_redraw);
1155  WM_msg_subscribe_rna_anon_type(mbus, SceneDisplay, &msg_sub_value_region_tag_redraw);
1156  WM_msg_subscribe_rna_anon_type(mbus, ObjectDisplay, &msg_sub_value_region_tag_redraw);
1157 
1158  ViewLayer *view_layer = CTX_data_view_layer(C);
1159  Object *obact = OBACT(view_layer);
1160  if (obact != NULL) {
1161  switch (obact->mode) {
1162  case OB_MODE_PARTICLE_EDIT:
1163  WM_msg_subscribe_rna_anon_type(mbus, ParticleEdit, &msg_sub_value_region_tag_redraw);
1164  break;
1165  default:
1166  break;
1167  }
1168  }
1169 
1170  {
1171  wmMsgSubscribeValue msg_sub_value_region_tag_refresh = {
1172  .owner = region,
1173  .user_data = area,
1175  };
1176  WM_msg_subscribe_rna_anon_prop(mbus, Object, mode, &msg_sub_value_region_tag_refresh);
1177  WM_msg_subscribe_rna_anon_prop(mbus, LayerObjects, active, &msg_sub_value_region_tag_refresh);
1178  }
1179 }
1180 
1181 /* concept is to retrieve cursor type context-less */
1183 {
1184  if (WM_cursor_set_from_tool(win, area, region)) {
1185  return;
1186  }
1187 
1188  ViewLayer *view_layer = WM_window_get_active_view_layer(win);
1189  Object *obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
1190  if (obedit) {
1192  }
1193  else {
1195  }
1196 }
1197 
1198 /* add handlers, stuff you only do once or on area/region changes */
1200 {
1201  wmKeyMap *keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, 0);
1202 
1203  WM_event_add_keymap_handler(&region->handlers, keymap);
1204 
1205  ED_region_header_init(region);
1206 }
1207 
1208 static void view3d_header_region_draw(const bContext *C, ARegion *region)
1209 {
1210  ED_region_header(C, region);
1211 }
1212 
1214 {
1215  ARegion *region = params->region;
1216  wmNotifier *wmn = params->notifier;
1217 
1218  /* context changes */
1219  switch (wmn->category) {
1220  case NC_SCENE:
1221  switch (wmn->data) {
1222  case ND_FRAME:
1223  case ND_OB_ACTIVE:
1224  case ND_OB_SELECT:
1225  case ND_OB_VISIBLE:
1226  case ND_MODE:
1227  case ND_LAYER:
1228  case ND_TOOLSETTINGS:
1229  case ND_LAYER_CONTENT:
1230  case ND_RENDER_OPTIONS:
1231  ED_region_tag_redraw(region);
1232  break;
1233  }
1234  break;
1235  case NC_SPACE:
1236  if (wmn->data == ND_SPACE_VIEW3D) {
1237  ED_region_tag_redraw(region);
1238  }
1239  break;
1240  case NC_GPENCIL:
1241  if (wmn->data & ND_GPENCIL_EDITMODE) {
1242  ED_region_tag_redraw(region);
1243  }
1244  else if (wmn->action == NA_EDITED) {
1245  ED_region_tag_redraw(region);
1246  }
1247  break;
1248  case NC_BRUSH:
1249  ED_region_tag_redraw(region);
1250  break;
1251  }
1252 
1253  /* From topbar, which ones are needed? split per header? */
1254  /* Disable for now, re-enable if needed, or remove - campbell. */
1255 #if 0
1256  /* context changes */
1257  switch (wmn->category) {
1258  case NC_WM:
1259  if (wmn->data == ND_HISTORY) {
1260  ED_region_tag_redraw(region);
1261  }
1262  break;
1263  case NC_SCENE:
1264  if (wmn->data == ND_MODE) {
1265  ED_region_tag_redraw(region);
1266  }
1267  break;
1268  case NC_SPACE:
1269  if (wmn->data == ND_SPACE_VIEW3D) {
1270  ED_region_tag_redraw(region);
1271  }
1272  break;
1273  case NC_GPENCIL:
1274  if (wmn->data == ND_DATA) {
1275  ED_region_tag_redraw(region);
1276  }
1277  break;
1278  }
1279 #endif
1280 }
1281 
1283 {
1284  struct wmMsgBus *mbus = params->message_bus;
1285  ARegion *region = params->region;
1286 
1287  wmMsgParams_RNA msg_key_params = {{0}};
1288 
1289  /* Only subscribe to types. */
1290  StructRNA *type_array[] = {
1292  };
1293 
1294  wmMsgSubscribeValue msg_sub_value_region_tag_redraw = {
1295  .owner = region,
1296  .user_data = region,
1298  };
1299 
1300  for (int i = 0; i < ARRAY_SIZE(type_array); i++) {
1301  msg_key_params.ptr.type = type_array[i];
1302  WM_msg_subscribe_rna_params(mbus, &msg_key_params, &msg_sub_value_region_tag_redraw, __func__);
1303  }
1304 }
1305 
1306 /* add handlers, stuff you only do once or on area/region changes */
1308 {
1309  wmKeyMap *keymap;
1310 
1311  ED_region_panels_init(wm, region);
1312 
1313  keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, 0);
1314  WM_event_add_keymap_handler(&region->handlers, keymap);
1315 }
1316 
1318  ARegion *region,
1319  const char *category_override)
1320 {
1321  const enum eContextObjectMode mode = CTX_data_mode_enum(C);
1322 
1323  const char *contexts_base[4] = {NULL};
1324  contexts_base[0] = CTX_data_mode_string(C);
1325 
1326  const char **contexts = &contexts_base[1];
1327 
1328  switch (mode) {
1329  case CTX_MODE_EDIT_MESH:
1330  ARRAY_SET_ITEMS(contexts, ".mesh_edit");
1331  break;
1332  case CTX_MODE_EDIT_CURVE:
1333  ARRAY_SET_ITEMS(contexts, ".curve_edit");
1334  break;
1335  case CTX_MODE_EDIT_SURFACE:
1336  ARRAY_SET_ITEMS(contexts, ".curve_edit");
1337  break;
1338  case CTX_MODE_EDIT_TEXT:
1339  ARRAY_SET_ITEMS(contexts, ".text_edit");
1340  break;
1342  ARRAY_SET_ITEMS(contexts, ".armature_edit");
1343  break;
1345  ARRAY_SET_ITEMS(contexts, ".mball_edit");
1346  break;
1347  case CTX_MODE_EDIT_LATTICE:
1348  ARRAY_SET_ITEMS(contexts, ".lattice_edit");
1349  break;
1350  case CTX_MODE_POSE:
1351  ARRAY_SET_ITEMS(contexts, ".posemode");
1352  break;
1353  case CTX_MODE_SCULPT:
1354  ARRAY_SET_ITEMS(contexts, ".paint_common", ".sculpt_mode");
1355  break;
1356  case CTX_MODE_PAINT_WEIGHT:
1357  ARRAY_SET_ITEMS(contexts, ".paint_common", ".weightpaint");
1358  break;
1359  case CTX_MODE_PAINT_VERTEX:
1360  ARRAY_SET_ITEMS(contexts, ".paint_common", ".vertexpaint");
1361  break;
1363  ARRAY_SET_ITEMS(contexts, ".paint_common", ".imagepaint");
1364  break;
1365  case CTX_MODE_PARTICLE:
1366  ARRAY_SET_ITEMS(contexts, ".paint_common", ".particlemode");
1367  break;
1368  case CTX_MODE_OBJECT:
1369  ARRAY_SET_ITEMS(contexts, ".objectmode");
1370  break;
1372  ARRAY_SET_ITEMS(contexts, ".greasepencil_paint");
1373  break;
1375  ARRAY_SET_ITEMS(contexts, ".greasepencil_sculpt");
1376  break;
1378  ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1379  break;
1381  ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1382  break;
1383  default:
1384  break;
1385  }
1386 
1387  switch (mode) {
1389  ARRAY_SET_ITEMS(contexts, ".greasepencil_paint");
1390  break;
1392  ARRAY_SET_ITEMS(contexts, ".greasepencil_sculpt");
1393  break;
1395  ARRAY_SET_ITEMS(contexts, ".greasepencil_weight");
1396  break;
1397  case CTX_MODE_EDIT_GPENCIL:
1398  ARRAY_SET_ITEMS(contexts, ".greasepencil_edit");
1399  break;
1401  ARRAY_SET_ITEMS(contexts, ".greasepencil_vertex");
1402  break;
1403  default:
1404  break;
1405  }
1406 
1407  ListBase *paneltypes = &region->type->paneltypes;
1408 
1409  /* Allow drawing 3D view toolbar from non 3D view space type. */
1410  if (category_override != NULL) {
1413  paneltypes = &art->paneltypes;
1414  }
1415 
1416  ED_region_panels_layout_ex(C, region, paneltypes, contexts_base, category_override);
1417 }
1418 
1419 static void view3d_buttons_region_layout(const bContext *C, ARegion *region)
1420 {
1422 }
1423 
1425 {
1426  ARegion *region = params->region;
1427  wmNotifier *wmn = params->notifier;
1428 
1429  /* context changes */
1430  switch (wmn->category) {
1431  case NC_ANIMATION:
1432  switch (wmn->data) {
1433  case ND_KEYFRAME_PROP:
1434  case ND_NLA_ACTCHANGE:
1435  ED_region_tag_redraw(region);
1436  break;
1437  case ND_NLA:
1438  case ND_KEYFRAME:
1439  if (ELEM(wmn->action, NA_EDITED, NA_ADDED, NA_REMOVED)) {
1440  ED_region_tag_redraw(region);
1441  }
1442  break;
1443  }
1444  break;
1445  case NC_SCENE:
1446  switch (wmn->data) {
1447  case ND_FRAME:
1448  case ND_OB_ACTIVE:
1449  case ND_OB_SELECT:
1450  case ND_OB_VISIBLE:
1451  case ND_MODE:
1452  case ND_LAYER:
1453  case ND_LAYER_CONTENT:
1454  case ND_TOOLSETTINGS:
1455  ED_region_tag_redraw(region);
1456  break;
1457  }
1458  switch (wmn->action) {
1459  case NA_EDITED:
1460  ED_region_tag_redraw(region);
1461  break;
1462  }
1463  break;
1464  case NC_OBJECT:
1465  switch (wmn->data) {
1466  case ND_BONE_ACTIVE:
1467  case ND_BONE_SELECT:
1468  case ND_TRANSFORM:
1469  case ND_POSE:
1470  case ND_DRAW:
1471  case ND_KEYS:
1472  case ND_MODIFIER:
1473  case ND_SHADERFX:
1474  ED_region_tag_redraw(region);
1475  break;
1476  }
1477  break;
1478  case NC_GEOM:
1479  switch (wmn->data) {
1480  case ND_DATA:
1481  case ND_VERTEX_GROUP:
1482  case ND_SELECT:
1483  ED_region_tag_redraw(region);
1484  break;
1485  }
1486  if (wmn->action == NA_EDITED) {
1487  ED_region_tag_redraw(region);
1488  }
1489  break;
1490  case NC_TEXTURE:
1491  case NC_MATERIAL:
1492  /* for brush textures */
1493  ED_region_tag_redraw(region);
1494  break;
1495  case NC_BRUSH:
1496  /* NA_SELECTED is used on brush changes */
1497  if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
1498  ED_region_tag_redraw(region);
1499  }
1500  break;
1501  case NC_SPACE:
1502  if (wmn->data == ND_SPACE_VIEW3D) {
1503  ED_region_tag_redraw(region);
1504  }
1505  break;
1506  case NC_ID:
1507  if (wmn->action == NA_RENAME) {
1508  ED_region_tag_redraw(region);
1509  }
1510  break;
1511  case NC_GPENCIL:
1512  if ((wmn->data & (ND_DATA | ND_GPENCIL_EDITMODE)) || (wmn->action == NA_EDITED)) {
1513  ED_region_tag_redraw(region);
1514  }
1515  break;
1516  case NC_IMAGE:
1517  /* Update for the image layers in texture paint. */
1518  if (wmn->action == NA_EDITED) {
1519  ED_region_tag_redraw(region);
1520  }
1521  break;
1522  case NC_WM:
1523  if (wmn->data == ND_XR_DATA_CHANGED) {
1524  ED_region_tag_redraw(region);
1525  }
1526  break;
1527  }
1528 }
1529 
1530 /* add handlers, stuff you only do once or on area/region changes */
1532 {
1533  wmKeyMap *keymap;
1534 
1535  ED_region_panels_init(wm, region);
1536 
1537  keymap = WM_keymap_ensure(wm->defaultconf, "3D View Generic", SPACE_VIEW3D, 0);
1538  WM_event_add_keymap_handler(&region->handlers, keymap);
1539 }
1540 
1541 static void view3d_tools_region_draw(const bContext *C, ARegion *region)
1542 {
1543  ED_region_panels_ex(C, region, (const char *[]){CTX_data_mode_string(C), NULL});
1544 }
1545 
1546 /* area (not region) level listener */
1548 {
1549  ScrArea *area = params->area;
1550  wmNotifier *wmn = params->notifier;
1551  View3D *v3d = area->spacedata.first;
1552 
1553  /* context changes */
1554  switch (wmn->category) {
1555  case NC_SCENE:
1556  switch (wmn->data) {
1557  case ND_WORLD:
1558  if (v3d->flag2 & V3D_HIDE_OVERLAYS) {
1560  }
1561  break;
1562  }
1563  break;
1564  case NC_WORLD:
1565  switch (wmn->data) {
1566  case ND_WORLD_DRAW:
1567  case ND_WORLD:
1570  }
1571  break;
1572  }
1573  break;
1574  case NC_MATERIAL:
1575  switch (wmn->data) {
1576  case ND_NODES:
1577  if (v3d->shading.type == OB_TEXTURE) {
1579  }
1580  break;
1581  }
1582  break;
1583  }
1584 }
1585 
1587 {
1590 
1591  if (lcache && (lcache->flag & LIGHTCACHE_UPDATE_AUTO) != 0) {
1592  lcache->flag &= ~LIGHTCACHE_UPDATE_AUTO;
1594  }
1595 }
1596 
1597 const char *view3d_context_dir[] = {
1598  "active_base",
1599  "active_object",
1600  NULL,
1601 };
1602 
1603 static int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
1604 {
1605  /* fallback to the scene layer,
1606  * allows duplicate and other object operators to run outside the 3d view */
1607 
1608  if (CTX_data_dir(member)) {
1610  }
1611  else if (CTX_data_equals(member, "active_base")) {
1613  ViewLayer *view_layer = CTX_data_view_layer(C);
1614  if (view_layer->basact) {
1615  Object *ob = view_layer->basact->object;
1616  /* if hidden but in edit mode, we still display, can happen with animation */
1617  if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 ||
1618  (ob->mode != OB_MODE_OBJECT)) {
1620  }
1621  }
1622 
1623  return 1;
1624  }
1625  else if (CTX_data_equals(member, "active_object")) {
1626  /* In most cases the active object is the `view_layer->basact->object`.
1627  * For the 3D view however it can be NULL when hidden.
1628  *
1629  * This is ignored in the case the object is in any mode (besides object-mode),
1630  * since the object's mode impacts the current tool, cursor, gizmos etc.
1631  * If we didn't have this exception, changing visibility would need to perform
1632  * many of the the same updates as changing the objects mode.
1633  *
1634  * Further, there are multiple ways to hide objects - by collection, by object type, etc.
1635  * it's simplest if all these methods behave consistently - respecting the object-mode
1636  * without showing the object.
1637  *
1638  * See T85532 for alternatives that were considered. */
1639  ViewLayer *view_layer = CTX_data_view_layer(C);
1640  if (view_layer->basact) {
1641  Object *ob = view_layer->basact->object;
1642  /* if hidden but in edit mode, we still display, can happen with animation */
1643  if ((view_layer->basact->flag & BASE_VISIBLE_DEPSGRAPH) != 0 ||
1644  (ob->mode != OB_MODE_OBJECT)) {
1646  }
1647  }
1648 
1649  return 1;
1650  }
1651  else {
1652  return 0; /* not found */
1653  }
1654 
1655  return -1; /* found but not available */
1656 }
1657 
1658 static void view3d_id_remap(ScrArea *area, SpaceLink *slink, ID *old_id, ID *new_id)
1659 {
1660  View3D *v3d;
1661  ARegion *region;
1662  bool is_local = false;
1663 
1664  if (!ELEM(GS(old_id->name), ID_OB, ID_MA, ID_IM, ID_MC)) {
1665  return;
1666  }
1667 
1668  for (v3d = (View3D *)slink; v3d; v3d = v3d->localvd, is_local = true) {
1669  if ((ID *)v3d->camera == old_id) {
1670  v3d->camera = (Object *)new_id;
1671  if (!new_id) {
1672  /* 3D view might be inactive, in that case needs to use slink->regionbase */
1673  ListBase *regionbase = (slink == area->spacedata.first) ? &area->regionbase :
1674  &slink->regionbase;
1675  for (region = regionbase->first; region; region = region->next) {
1676  if (region->regiontype == RGN_TYPE_WINDOW) {
1677  RegionView3D *rv3d = is_local ? ((RegionView3D *)region->regiondata)->localvd :
1678  region->regiondata;
1679  if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
1680  rv3d->persp = RV3D_PERSP;
1681  }
1682  }
1683  }
1684  }
1685  }
1686 
1687  /* Values in local-view aren't used, see: T52663 */
1688  if (is_local == false) {
1689  if ((ID *)v3d->ob_center == old_id) {
1690  v3d->ob_center = (Object *)new_id;
1691  /* Otherwise, bonename may remain valid...
1692  * We could be smart and check this, too? */
1693  if (new_id == NULL) {
1694  v3d->ob_center_bone[0] = '\0';
1695  }
1696  }
1697  }
1698 
1699  if (is_local) {
1700  break;
1701  }
1702  }
1703 }
1704 
1705 /* only called once, from space/spacetypes.c */
1707 {
1708  SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype view3d");
1709  ARegionType *art;
1710 
1711  st->spaceid = SPACE_VIEW3D;
1712  strncpy(st->name, "View3D", BKE_ST_MAXNAME);
1713 
1714  st->create = view3d_create;
1715  st->free = view3d_free;
1716  st->init = view3d_init;
1721  st->keymap = view3d_keymap;
1723  st->gizmos = view3d_widgets;
1724  st->context = view3d_context;
1725  st->id_remap = view3d_id_remap;
1726 
1727  /* regions: main window */
1728  art = MEM_callocN(sizeof(ARegionType), "spacetype view3d main region");
1729  art->regionid = RGN_TYPE_WINDOW;
1739  art->lock = 1; /* can become flag, see BKE_spacedata_draw_locks */
1740  BLI_addhead(&st->regiontypes, art);
1741 
1742  /* regions: listview/buttons */
1743  art = MEM_callocN(sizeof(ARegionType), "spacetype view3d buttons region");
1744  art->regionid = RGN_TYPE_UI;
1751  art->draw = ED_region_panels_draw;
1752  BLI_addhead(&st->regiontypes, art);
1753 
1755 
1756  /* regions: tool(bar) */
1757  art = MEM_callocN(sizeof(ARegionType), "spacetype view3d tools region");
1758  art->regionid = RGN_TYPE_TOOLS;
1759  art->prefsizex = 58; /* XXX */
1760  art->prefsizey = 50; /* XXX */
1767  BLI_addhead(&st->regiontypes, art);
1768 
1769  /* regions: tool header */
1770  art = MEM_callocN(sizeof(ARegionType), "spacetype view3d tool header region");
1772  art->prefsizey = HEADERY;
1778  BLI_addhead(&st->regiontypes, art);
1779 
1780  /* regions: header */
1781  art = MEM_callocN(sizeof(ARegionType), "spacetype view3d header region");
1782  art->regionid = RGN_TYPE_HEADER;
1783  art->prefsizey = HEADERY;
1789  BLI_addhead(&st->regiontypes, art);
1790 
1791  /* regions: hud */
1792  art = ED_area_type_hud(st->spaceid);
1793  BLI_addhead(&st->regiontypes, art);
1794 
1796 }
struct ScrArea * CTX_wm_area(const bContext *C)
Definition: context.c:714
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1034
void CTX_data_dir_set(bContextDataResult *result, const char **dir)
Definition: context.c:672
bool CTX_data_equals(const char *member, const char *str)
Definition: context.c:623
void CTX_data_pointer_set(bContextDataResult *result, struct ID *id, StructRNA *type, void *data)
Definition: context.c:638
void CTX_data_id_pointer_set(bContextDataResult *result, struct ID *id)
Definition: context.c:633
bool CTX_data_dir(const char *member)
Definition: context.c:628
eContextObjectMode
Definition: BKE_context.h:114
@ CTX_MODE_EDIT_GPENCIL
Definition: BKE_context.h:130
@ CTX_MODE_EDIT_CURVE
Definition: BKE_context.h:116
@ CTX_MODE_PAINT_TEXTURE
Definition: BKE_context.h:126
@ CTX_MODE_EDIT_SURFACE
Definition: BKE_context.h:117
@ CTX_MODE_WEIGHT_GPENCIL
Definition: BKE_context.h:132
@ CTX_MODE_PARTICLE
Definition: BKE_context.h:127
@ CTX_MODE_SCULPT
Definition: BKE_context.h:123
@ CTX_MODE_VERTEX_GPENCIL
Definition: BKE_context.h:133
@ CTX_MODE_OBJECT
Definition: BKE_context.h:128
@ CTX_MODE_EDIT_MESH
Definition: BKE_context.h:115
@ CTX_MODE_EDIT_TEXT
Definition: BKE_context.h:118
@ CTX_MODE_EDIT_ARMATURE
Definition: BKE_context.h:119
@ CTX_MODE_SCULPT_GPENCIL
Definition: BKE_context.h:131
@ CTX_MODE_EDIT_LATTICE
Definition: BKE_context.h:121
@ CTX_MODE_PAINT_GPENCIL
Definition: BKE_context.h:129
@ CTX_MODE_PAINT_VERTEX
Definition: BKE_context.h:125
@ CTX_MODE_EDIT_METABALL
Definition: BKE_context.h:120
@ CTX_MODE_PAINT_WEIGHT
Definition: BKE_context.h:124
@ CTX_MODE_POSE
Definition: BKE_context.h:122
struct ViewLayer * CTX_data_view_layer(const bContext *C)
Definition: context.c:1044
struct View3D * CTX_wm_view3d(const bContext *C)
Definition: context.c:760
const char * CTX_data_mode_string(const bContext *C)
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:725
struct RegionView3D * CTX_wm_region_view3d(const bContext *C)
Definition: context.c:769
enum eContextObjectMode CTX_data_mode_enum(const bContext *C)
Definition: context.c:1174
#define G_MAIN
Definition: BKE_global.h:232
void IDP_FreeProperty(struct IDProperty *prop)
Definition: idprop.c:1040
struct IDProperty * IDP_CopyProperty(const struct IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
General operations, lookup, etc. for blender objects.
struct Depsgraph * BKE_scene_get_depsgraph(const struct Scene *scene, const struct ViewLayer *view_layer)
bool BKE_scene_uses_blender_eevee(const struct Scene *scene)
void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene)
Definition: screen.c:1023
#define BKE_ST_MAXNAME
Definition: BKE_screen.h:68
struct ARegion * BKE_area_find_region_active_win(struct ScrArea *area)
Definition: screen.c:918
void BKE_spacetype_register(struct SpaceType *st)
Definition: screen.c:420
struct SpaceType * BKE_spacetype_from_id(int spaceid)
Definition: screen.c:382
struct ARegionType * BKE_regiontype_from_id(const struct SpaceType *st, int regionid)
#define BLI_assert(a)
Definition: BLI_assert.h:58
#define ATTR_FALLTHROUGH
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:87
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
#define BLI_ASSERT_ZERO_M4(m)
void zero_m4(float m[4][4])
Definition: math_matrix.c:46
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
Definition: math_matrix.c:262
#define ARRAY_SIZE(arr)
#define ARRAY_SET_ITEMS(...)
#define UNUSED(x)
#define ELEM(...)
#define TIP_(msgid)
#define BPy_BEGIN_ALLOW_THREADS
Definition: BPY_extern.h:62
#define BPy_END_ALLOW_THREADS
Definition: BPY_extern.h:66
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
ID_Type
Definition: DNA_ID_enums.h:56
@ ID_MC
Definition: DNA_ID_enums.h:85
@ ID_IM
Definition: DNA_ID_enums.h:65
@ ID_MA
Definition: DNA_ID_enums.h:63
@ ID_GR
Definition: DNA_ID_enums.h:77
@ ID_OB
Definition: DNA_ID_enums.h:59
#define DNA_struct_default_alloc(struct_name)
Definition: DNA_defaults.h:47
@ BASE_VISIBLE_DEPSGRAPH
@ LIGHTCACHE_UPDATE_AUTO
@ OB_TEXTURE
@ OB_SOLID
@ OB_RENDER
@ OB_MODE_PARTICLE_EDIT
@ OB_MODE_OBJECT
Object is a sort of wrapper for general info.
#define OB_DATA_SUPPORT_ID(_id_type)
@ OB_EMPTY_IMAGE
@ OB_EMPTY
@ OB_CAMERA
#define OBEDIT_FROM_VIEW_LAYER(view_layer)
#define OBACT(_view_layer)
#define HEADERY
@ RGN_ALIGN_BOTTOM
@ RGN_ALIGN_LEFT
@ RGN_ALIGN_TOP
@ RGN_ALIGN_RIGHT
@ RGN_FLAG_HIDDEN
@ RGN_FLAG_HIDDEN_BY_USER
@ RGN_TYPE_TOOL_HEADER
@ RGN_TYPE_UI
@ RGN_TYPE_WINDOW
@ RGN_TYPE_HEADER
@ RGN_TYPE_TOOLS
@ SPACE_VIEW3D
@ USER_HEADER_BOTTOM
@ V3D_SHADING_BACKGROUND_WORLD
#define RV3D_GPULIGHT_UPDATE
#define RV3D_CAMOB
#define V3D_XR_SESSION_MIRROR
@ RV3D_LOCK_ROTATION
@ V3D_RUNTIME_XR_SESSION_ROOT
#define RV3D_PERSP
#define V3D_HIDE_OVERLAYS
#define V3D_LOCAL_COLLECTIONS
#define RV3D_VIEW_USER
void ED_render_view3d_update(struct Depsgraph *depsgraph, struct wmWindow *window, struct ScrArea *area, const bool updated)
Definition: render_update.c:69
void ED_region_header(const struct bContext *C, struct ARegion *region)
void ED_region_tag_redraw_cursor(struct ARegion *region)
Definition: area.c:679
void ED_region_do_msg_notify_tag_redraw(struct bContext *C, struct wmMsgSubscribeKey *msg_key, struct wmMsgSubscribeValue *msg_val)
void ED_area_do_mgs_subscribe_for_tool_ui(const struct wmRegionMessageSubscribeParams *params)
bool ED_region_overlap_isect_any_xy(const ScrArea *area, const int event_xy[2])
Definition: area_query.c:64
int ED_region_generic_tools_region_snap_size(const struct ARegion *region, int size, int axis)
void ED_region_generic_tools_region_message_subscribe(const struct wmRegionMessageSubscribeParams *params)
void ED_region_panels_ex(const struct bContext *C, struct ARegion *region, const char *contexts[])
void ED_region_panels_draw(const struct bContext *C, struct ARegion *region)
void ED_area_do_mgs_subscribe_for_tool_header(const struct wmRegionMessageSubscribeParams *params)
struct ARegionType * ED_area_type_hud(int space_type)
void ED_area_tag_redraw_regiontype(ScrArea *area, int type)
Definition: area.c:763
void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *region)
Definition: area.c:3090
void ED_region_tag_redraw(struct ARegion *region)
Definition: area.c:667
void ED_region_header_init(struct ARegion *region)
Definition: area.c:3358
void ED_area_tag_refresh(ScrArea *area)
Definition: area.c:774
void ED_region_panels_layout_ex(const struct bContext *C, struct ARegion *region, struct ListBase *paneltypes, const char *contexts[], const char *category_override)
@ ED_KEYMAP_UI
Definition: ED_screen.h:440
@ ED_KEYMAP_HEADER
Definition: ED_screen.h:446
@ ED_KEYMAP_TOOL
Definition: ED_screen.h:442
@ ED_KEYMAP_GPENCIL
Definition: ED_screen.h:448
@ ED_KEYMAP_GIZMO
Definition: ED_screen.h:441
@ ED_KEYMAP_VIEW2D
Definition: ED_screen.h:443
@ ED_KEYMAP_FRAMES
Definition: ED_screen.h:445
void VIEW3D_GGT_xform_gizmo_context(struct wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_gizmo(struct wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_shear(struct wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_extrude(struct wmGizmoGroupType *gzgt)
void VIEW3D_GGT_xform_cage(struct wmGizmoGroupType *gzgt)
#define ED_view3d_clear_mats_rv3d(rv3d)
Definition: ED_view3d.h:582
bool ED_view3d_is_object_under_cursor(struct bContext *C, const int mval[2])
void ED_view3d_clipping_local(struct RegionView3D *rv3d, const float mat[4][4])
Definition: view3d_edit.c:4921
#define ED_view3d_check_mats_rv3d(rv3d)
Definition: ED_view3d.h:583
struct Object * ED_view3d_give_object_under_cursor(struct bContext *C, const int mval[2])
#define GPU_matrix_mul(x)
Definition: GPU_matrix.h:223
Read Guarded memory(de)allocation.
StructRNA RNA_AreaLight
StructRNA RNA_View3DShading
StructRNA RNA_ObjectBase
StructRNA RNA_View3DOverlay
StructRNA RNA_Light
StructRNA RNA_SunLight
StructRNA RNA_Speaker
StructRNA RNA_Window
StructRNA RNA_Object
StructRNA RNA_Camera
StructRNA RNA_World
StructRNA RNA_UnitSettings
#define C
Definition: RandGen.cpp:39
#define UI_SIDEBAR_PANEL_WIDTH
Definition: UI_interface.h:245
@ WM_JOB_TYPE_RENDER_PREVIEW
Definition: WM_api.h:737
#define NC_WORLD
Definition: WM_types.h:288
#define ND_SHADING
Definition: WM_types.h:377
#define ND_WORLD
Definition: WM_types.h:353
#define NC_ID
Definition: WM_types.h:296
#define NC_GEOM
Definition: WM_types.h:294
#define ND_NLA_ACTCHANGE
Definition: WM_types.h:398
#define ND_DRAW
Definition: WM_types.h:362
#define NC_BRUSH
Definition: WM_types.h:286
#define ND_OB_ACTIVE
Definition: WM_types.h:340
#define NC_WM
Definition: WM_types.h:276
#define ND_DATA
Definition: WM_types.h:408
#define WM_DRAG_PATH
Definition: WM_types.h:876
#define ND_GPENCIL_EDITMODE
Definition: WM_types.h:403
#define ND_LIGHTING_DRAW
Definition: WM_types.h:384
#define ND_RENDER_OPTIONS
Definition: WM_types.h:335
#define NC_ANIMATION
Definition: WM_types.h:289
#define ND_VERTEX_GROUP
Definition: WM_types.h:409
#define ND_DISPLAY
Definition: WM_types.h:391
@ WM_OP_INVOKE_DEFAULT
Definition: WM_types.h:197
#define ND_LOD
Definition: WM_types.h:369
#define NC_SCREEN
Definition: WM_types.h:278
#define NC_MOVIECLIP
Definition: WM_types.h:298
#define ND_SKETCH
Definition: WM_types.h:327
#define ND_MODE
Definition: WM_types.h:345
#define ND_OB_SELECT
Definition: WM_types.h:342
#define ND_ANIMPLAY
Definition: WM_types.h:323
#define NC_SCENE
Definition: WM_types.h:279
#define NA_ADDED
Definition: WM_types.h:464
#define ND_OB_VISIBLE
Definition: WM_types.h:343
#define ND_LAYER_CONTENT
Definition: WM_types.h:354
#define NC_GROUP
Definition: WM_types.h:284
#define ND_NODES
Definition: WM_types.h:336
#define ND_TOOLSETTINGS
Definition: WM_types.h:349
#define ND_MODIFIER
Definition: WM_types.h:363
#define ND_POSE
Definition: WM_types.h:359
#define NA_EDITED
Definition: WM_types.h:462
#define ND_PARTICLE
Definition: WM_types.h:366
#define ND_KEYFRAME_PROP
Definition: WM_types.h:395
#define NC_MATERIAL
Definition: WM_types.h:281
#define NC_LAMP
Definition: WM_types.h:283
#define NC_IMAGE
Definition: WM_types.h:285
#define ND_CONSTRAINT
Definition: WM_types.h:365
#define ND_UNDO
Definition: WM_types.h:316
#define ND_MARKERS
Definition: WM_types.h:333
#define NC_CAMERA
Definition: WM_types.h:302
#define ND_FRAME
Definition: WM_types.h:334
#define NA_REMOVED
Definition: WM_types.h:465
#define ND_SELECT
Definition: WM_types.h:407
#define NC_GPENCIL
Definition: WM_types.h:300
#define ND_NLA
Definition: WM_types.h:397
#define NC_TEXTURE
Definition: WM_types.h:282
#define NS_VIEW3D_GPU
Definition: WM_types.h:454
#define ND_LIGHTING
Definition: WM_types.h:383
#define ND_BONE_ACTIVE
Definition: WM_types.h:360
#define ND_TRANSFORM
Definition: WM_types.h:357
#define ND_LAYER
Definition: WM_types.h:350
#define ND_KEYS
Definition: WM_types.h:364
#define NA_RENAME
Definition: WM_types.h:466
#define ND_HISTORY
Definition: WM_types.h:314
#define NC_LIGHTPROBE
Definition: WM_types.h:303
#define ND_POINTCACHE
Definition: WM_types.h:367
#define ND_XR_DATA_CHANGED
Definition: WM_types.h:317
#define ND_SHADERFX
Definition: WM_types.h:372
#define ND_WORLD_DRAW
Definition: WM_types.h:387
#define ND_LAYOUTBROWSE
Definition: WM_types.h:321
#define ND_DRAW_ANIMVIZ
Definition: WM_types.h:374
#define ND_BONE_SELECT
Definition: WM_types.h:361
#define ND_SPACE_VIEW3D
Definition: WM_types.h:423
#define ND_KEYFRAME
Definition: WM_types.h:394
#define ND_LAYOUTSET
Definition: WM_types.h:326
#define NC_OBJECT
Definition: WM_types.h:280
#define ND_SCENEBROWSE
Definition: WM_types.h:332
#define NS_VIEW3D_SHADING
Definition: WM_types.h:455
#define ND_LAYOUTDELETE
Definition: WM_types.h:322
#define ND_ANIMCHAN
Definition: WM_types.h:396
#define ND_SHADING_LINKS
Definition: WM_types.h:379
#define ND_SHADING_DRAW
Definition: WM_types.h:378
#define NC_SPACE
Definition: WM_types.h:293
#define NA_SELECTED
Definition: WM_types.h:467
#define ND_DRAW_RENDER_VIEWPORT
Definition: WM_types.h:370
unsigned int U
Definition: btGjkEpa3.h:78
Scene scene
const Depsgraph * depsgraph
void RE_engine_free(RenderEngine *engine)
Definition: engine.c:161
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
#define GS(x)
Definition: iris.c:241
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:42
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
static void area(int d1, int d2, int e1, int e2, float weights[2])
bool active
all scheduled work for the GPU.
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:6550
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:6319
void RNA_enum_set_identifier(bContext *C, PointerRNA *ptr, const char *name, const char *id)
Definition: rna_access.c:6425
void RNA_struct_property_unset(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:6697
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
Definition: rna_access.c:6413
static void view3d_main_region_init(wmWindowManager *wm, ARegion *region)
Definition: space_view3d.c:382
static bool view3d_ima_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(r_tooltip))
Definition: space_view3d.c:549
static SpaceLink * view3d_duplicate(SpaceLink *sl)
Definition: space_view3d.c:349
static int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d)
Definition: space_view3d.c:190
static void view3d_free(SpaceLink *sl)
Definition: space_view3d.c:326
static void space_view3d_listener(const wmSpaceTypeListenerParams *params)
static bool view3d_volume_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), const char **UNUSED(r_tooltip))
Definition: space_view3d.c:615
static SpaceLink * view3d_create(const ScrArea *UNUSED(area), const Scene *scene)
Definition: space_view3d.c:266
static bool view3d_ima_bg_is_camera_view(bContext *C)
Definition: space_view3d.c:565
bool ED_view3d_context_user_region(bContext *C, View3D **r_v3d, ARegion **r_region)
Definition: space_view3d.c:107
static void view3d_collection_drop_copy(wmDrag *drag, wmDropBox *drop)
Definition: space_view3d.c:630
static void view3d_main_region_listener(const wmRegionListenerParams *params)
Definition: space_view3d.c:821
static void view3d_widgets(void)
Definition: space_view3d.c:729
void ED_view3d_stop_render_preview(wmWindowManager *wm, ARegion *region)
Definition: space_view3d.c:225
static void view3d_header_region_draw(const bContext *C, ARegion *region)
static void view3d_id_drop_copy_with_type(wmDrag *drag, wmDropBox *drop)
Definition: space_view3d.c:644
static void view3d_tools_region_draw(const bContext *C, ARegion *region)
static void view3d_header_region_init(wmWindowManager *wm, ARegion *region)
static void view3d_main_region_exit(wmWindowManager *wm, ARegion *region)
Definition: space_view3d.c:461
static bool view3d_ima_empty_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **r_tooltip)
Definition: space_view3d.c:593
static void view3d_lightcache_update(bContext *C)
Definition: space_view3d.c:666
static bool view3d_collection_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(r_tooltip))
Definition: space_view3d.c:518
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_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(area))
Definition: space_view3d.c:345
static void space_view3d_refresh(const bContext *C, ScrArea *UNUSED(area))
static void view3d_id_remap(ScrArea *area, SpaceLink *slink, ID *old_id, ID *new_id)
static void view3d_tools_region_init(wmWindowManager *wm, ARegion *region)
static bool view3d_drop_in_main_region_poll(bContext *C, const wmEvent *event)
Definition: space_view3d.c:466
const char * view3d_context_dir[]
void ED_spacetype_view3d(void)
static bool view3d_object_data_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **r_tooltip)
Definition: space_view3d.c:534
static void view3d_id_drop_copy(wmDrag *drag, wmDropBox *drop)
Definition: space_view3d.c:637
static void view3d_main_region_cursor(wmWindow *win, ScrArea *area, ARegion *region)
static void view3d_id_path_drop_copy(wmDrag *drag, wmDropBox *drop)
Definition: space_view3d.c:652
static void view3d_buttons_region_listener(const wmRegionListenerParams *params)
static bool view3d_ima_bg_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **r_tooltip)
Definition: space_view3d.c:577
static void view3d_main_region_free(ARegion *region)
Definition: space_view3d.c:766
static void view3d_ob_drop_copy(wmDrag *drag, wmDropBox *drop)
Definition: space_view3d.c:623
static bool view3d_drop_id_in_main_region_poll(bContext *C, wmDrag *drag, const wmEvent *event, ID_Type id_type)
Definition: space_view3d.c:498
static bool view3d_ob_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(r_tooltip))
Definition: space_view3d.c:510
static bool view3d_mat_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event, const char **UNUSED(r_tooltip))
Definition: space_view3d.c:526
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)
RegionView3D * ED_view3d_context_rv3d(bContext *C)
Definition: space_view3d.c:89
static void * view3d_main_region_duplicate(void *poin)
Definition: space_view3d.c:798
static void view3d_buttons_region_init(wmWindowManager *wm, ARegion *region)
static void view3d_dropboxes(void)
Definition: space_view3d.c:688
void ED_view3d_shade_update(Main *bmain, View3D *v3d, ScrArea *area)
Definition: space_view3d.c:248
bool ED_view3d_area_user_region(const ScrArea *area, const View3D *v3d, ARegion **r_region)
Definition: space_view3d.c:141
void ED_view3d_init_mats_rv3d_gl(struct Object *ob, struct RegionView3D *rv3d)
Definition: space_view3d.c:200
static ID_Type view3d_drop_id_in_main_region_poll_get_id_type(bContext *C, wmDrag *drag, const wmEvent *event)
Definition: space_view3d.c:472
void(* draw)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:169
void(* exit)(struct wmWindowManager *wm, struct ARegion *region)
Definition: BKE_screen.h:167
void(* message_subscribe)(const wmRegionMessageSubscribeParams *params)
Definition: BKE_screen.h:185
void(* cursor)(struct wmWindow *win, struct ScrArea *area, struct ARegion *region)
Definition: BKE_screen.h:197
int(* snap_size)(const struct ARegion *region, int size, int axis)
Definition: BKE_screen.h:181
short lock
Definition: BKE_screen.h:229
void(* listener)(const wmRegionListenerParams *params)
Definition: BKE_screen.h:183
int keymapflag
Definition: BKE_screen.h:226
void(* free)(struct ARegion *)
Definition: BKE_screen.h:187
void *(* duplicate)(void *poin)
Definition: BKE_screen.h:190
void(* layout)(const struct bContext *C, struct ARegion *region)
Definition: BKE_screen.h:179
void(* init)(struct wmWindowManager *wm, struct ARegion *region)
Definition: BKE_screen.h:165
ListBase paneltypes
Definition: BKE_screen.h:216
void * regiondata
struct ARegion * next
ListBase handlers
short alignment
short regiontype
struct wmGizmoMap * gizmo_map
struct ARegionType * type
short flag
struct Object * object
Definition: DNA_ID.h:273
char name[66]
Definition: DNA_ID.h:283
void * first
Definition: DNA_listBase.h:47
Definition: BKE_main.h:116
ListBase wm
Definition: BKE_main.h:175
char empty_drawtype
float obmat[4][4]
void * data
struct StructRNA * type
Definition: RNA_types.h:51
float viewmatob[4][4]
struct RenderEngine * render_engine
struct SmoothView3DStore * sms
float viewquat[4]
float persmat[4][4]
struct RegionView3D * localvd
float viewmat[4][4]
float persmatob[4][4]
struct ViewDepths * depths
struct BoundBox * clipbb
struct LightCache * light_cache_data
struct Object * camera
struct SceneEEVEE eevee
struct SpaceLink *(* duplicate)(struct SpaceLink *sl)
Definition: BKE_screen.h:104
ListBase regiontypes
Definition: BKE_screen.h:130
void(* keymap)(struct wmKeyConfig *keyconf)
Definition: BKE_screen.h:109
void(* operatortypes)(void)
Definition: BKE_screen.h:107
void(* gizmos)(void)
Definition: BKE_screen.h:114
void(* free)(struct SpaceLink *sl)
Definition: BKE_screen.h:88
struct SpaceLink *(* create)(const struct ScrArea *area, const struct Scene *scene)
Definition: BKE_screen.h:86
void(* refresh)(const struct bContext *C, struct ScrArea *area)
Definition: BKE_screen.h:101
void(* listener)(const wmSpaceTypeListenerParams *params)
Definition: BKE_screen.h:95
void(* init)(struct wmWindowManager *wm, struct ScrArea *area)
Definition: BKE_screen.h:91
int spaceid
Definition: BKE_screen.h:81
bContextDataCallback context
Definition: BKE_screen.h:117
void(* id_remap)(struct ScrArea *area, struct SpaceLink *sl, struct ID *old_id, struct ID *new_id)
Definition: BKE_screen.h:120
char name[BKE_ST_MAXNAME]
Definition: BKE_screen.h:80
void(* dropboxes)(void)
Definition: BKE_screen.h:111
struct IDProperty * prop
View3D_Runtime runtime
struct Object * camera
struct View3D * localvd
char ob_center_bone[64]
char spacetype
unsigned short local_collections_uuid
struct Object * ob_center
ListBase regionbase
View3DShading shading
float * depths
Definition: ED_view3d.h:91
struct Base * basact
int id_type
Definition: WM_types.h:899
char path[1024]
Definition: WM_types.h:909
int icon
Definition: WM_types.h:905
int type
Definition: WM_types.h:907
struct PointerRNA * ptr
Definition: WM_types.h:953
int mval[2]
Definition: WM_types.h:583
int x
Definition: WM_types.h:581
unsigned int data
Definition: WM_types.h:260
unsigned int action
Definition: WM_types.h:260
unsigned int category
Definition: WM_types.h:260
unsigned int subtype
Definition: WM_types.h:260
void * reference
Definition: WM_types.h:262
struct wmKeyConfig * defaultconf
void view3d_buttons_register(ARegionType *art)
void view3d_main_region_draw(const bContext *C, ARegion *region)
Definition: view3d_draw.c:1577
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_light_spot(wmGizmoGroupType *gzgt)
void VIEW3D_GGT_light_area(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_keymap(struct wmKeyConfig *keyconf)
Definition: view3d_ops.c:224
void VIEW3D_GGT_placement(struct wmGizmoGroupType *gzgt)
void view3d_operatortypes(void)
Definition: view3d_ops.c:150
void WM_cursor_set(wmWindow *win, int curs)
Definition: wm_cursors.c:142
bool WM_cursor_set_from_tool(struct wmWindow *win, const ScrArea *area, const ARegion *region)
Definition: wm_cursors.c:190
@ WM_CURSOR_DEFAULT
Definition: wm_cursors.h:34
@ WM_CURSOR_EDIT
Definition: wm_cursors.h:38
ID * WM_drag_get_local_ID_or_import_from_asset(const wmDrag *drag, int idcode)
Definition: wm_dragdrop.c:392
void WM_drag_free_imported_drag_ID(struct Main *bmain, wmDrag *drag, wmDropBox *drop)
Free asset ID imported for cancelled drop.
Definition: wm_dragdrop.c:419
wmDropBox * WM_dropbox_add(ListBase *lb, const char *idname, bool(*poll)(bContext *, wmDrag *, const wmEvent *, const char **), void(*copy)(wmDrag *, wmDropBox *), void(*cancel)(struct Main *, wmDrag *, wmDropBox *))
Definition: wm_dragdrop.c:96
ID * WM_drag_get_local_ID(const wmDrag *drag, short idcode)
Definition: wm_dragdrop.c:335
bool WM_drag_is_ID_type(const wmDrag *drag, int idcode)
Definition: wm_dragdrop.c:363
ListBase * WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
Definition: wm_dragdrop.c:77
wmDragAsset * WM_drag_get_asset_data(const wmDrag *drag, int idcode)
Definition: wm_dragdrop.c:368
void WM_draw_region_free(ARegion *region, bool hide)
Definition: wm_draw.c:1086
wmEventHandler_Dropbox * WM_event_add_dropbox_handler(ListBase *handlers, ListBase *dropboxes)
wmEventHandler_Keymap * WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap)
int WM_operator_name_call_ptr(bContext *C, wmOperatorType *ot, short context, PointerRNA *properties)
wmOperatorType * ot
Definition: wm_files.c:3156
wmGizmoGroupTypeRef * WM_gizmogrouptype_append_and_link(wmGizmoMapType *gzmap_type, void(*wtfunc)(struct wmGizmoGroupType *))
wmGizmoGroupType * WM_gizmogrouptype_append(void(*wtfunc)(struct wmGizmoGroupType *))
wmGizmoMapType * WM_gizmomaptype_ensure(const struct wmGizmoMapType_Params *gzmap_params)
void WM_gizmomap_tag_refresh(wmGizmoMap *gzmap)
Definition: wm_gizmo_map.c:323
void WM_gizmotype_append(void(*gtfunc)(struct wmGizmoType *))
void WM_jobs_kill_type(struct wmWindowManager *wm, void *owner, int job_type)
Definition: wm_jobs.c:572
wmKeyMap * WM_keymap_ensure(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
Definition: wm_keymap.c:852
#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(struct wmMsgBus *mbus, const wmMsgParams_RNA *msg_key_params, const wmMsgSubscribeValue *msg_val_params, const char *id_repr)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
Definition: wm_operators.c:584
void WM_operator_properties_free(PointerRNA *ptr)
Definition: wm_operators.c:711
void WM_toolsystem_do_msg_notify_tag_refresh(bContext *C, wmMsgSubscribeKey *UNUSED(msg_key), wmMsgSubscribeValue *msg_val)
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
Definition: wm_window.c:2286