Blender V5.0
screen.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9/* Allow using deprecated functionality for .blend file I/O. */
10#define DNA_DEPRECATED_ALLOW
11
12#ifdef WIN32
13# include "BLI_winstuff.h"
14#endif
15
16#include <fmt/format.h>
17
18#include <cmath>
19#include <cstdio>
20#include <cstring>
21
22#include "MEM_guardedalloc.h"
23
24#include "DNA_defaults.h"
25#include "DNA_scene_types.h"
26#include "DNA_screen_types.h"
27#include "DNA_space_types.h"
28#include "DNA_userdef_types.h"
29#include "DNA_view3d_types.h"
30
31#include "BLI_listbase.h"
32#include "BLI_math_rotation.h"
33#include "BLI_math_vector.h"
34#include "BLI_rect.h"
35#include "BLI_string.h"
36#include "BLI_string_utf8.h"
37#include "BLI_utildefines.h"
38
39#include "BLT_translation.hh"
40
41#include "BKE_idprop.hh"
42#include "BKE_idtype.hh"
43#include "BKE_lib_id.hh"
44#include "BKE_lib_query.hh"
45#include "BKE_preview_image.hh"
46#include "BKE_screen.hh"
47
48#include "BLO_read_write.hh"
49
50/* TODO(@JulianEisel): For asset shelf region reading/writing. Region read/write should be done via
51 * a #ARegionType callback. */
53
54#ifdef WITH_PYTHON
55# include "BPY_extern.hh"
56#endif
57
58#include "WM_types.hh"
59
60#include "CLG_log.h"
61
62static CLG_LogRef LOG_BLEND_DOVERSION = {"blend.doversion"};
63
64using blender::Span;
66using blender::Vector;
67
68/* -------------------------------------------------------------------- */
71
72static void screen_free_data(ID *id)
73{
74 bScreen *screen = (bScreen *)id;
75
76 /* No animation-data here. */
77
78 LISTBASE_FOREACH (ARegion *, region, &screen->regionbase) {
79 BKE_area_region_free(nullptr, region);
80 }
81
82 BLI_freelistN(&screen->regionbase);
83
85
87
88 /* Region and timer are freed by the window manager. */
89 /* Cannot use MEM_SAFE_FREE, as #wmTooltipState type is only defined in `WM_types.hh`, which is
90 * currently not included here. */
91 if (screen->tool_tip) {
92 MEM_freeN(static_cast<void *>(screen->tool_tip));
93 screen->tool_tip = nullptr;
94 }
95}
96
98{
100
101 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
102 SpaceType *space_type = BKE_spacetype_from_id(sl->spacetype);
103
104 if (space_type && space_type->foreach_id) {
105 space_type->foreach_id(sl, data);
106 }
107 }
108}
109
111{
112 bScreen *screen = reinterpret_cast<bScreen *>(id);
114
117 }
118
119 if (flag & IDWALK_INCLUDE_UI) {
120 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
122 }
123 }
124}
125
126static void screen_blend_write(BlendWriter *writer, ID *id, const void *id_address)
127{
128 bScreen *screen = (bScreen *)id;
129
130 /* write LibData */
131 /* in 2.50+ files, the file identifier for screens is patched, forward compatibility */
132 BLO_write_struct_at_address_with_filecode(writer, ID_SCRN, bScreen, id_address, screen);
133 BKE_id_blend_write(writer, &screen->id);
134
135 BKE_previewimg_blend_write(writer, screen->preview);
136
137 /* direct data */
139}
140
142{
143 bool success = true;
144
145 screen->regionbase.first = screen->regionbase.last = nullptr;
146 screen->context = nullptr;
147 screen->active_region = nullptr;
148 screen->animtimer = nullptr; /* saved in rare cases */
149 screen->tool_tip = nullptr;
150 screen->scrubbing = false;
151
152 BLO_read_struct(reader, PreviewImage, &screen->preview);
153 BKE_previewimg_blend_read(reader, screen->preview);
154
156 printf("Error reading Screen %s... removing it.\n", screen->id.name + 2);
157 success = false;
158 }
159
160 return success;
161}
162
163/* NOTE: file read without screens option G_FILE_NO_UI;
164 * check lib pointers in call below */
166{
167 bScreen *screen = reinterpret_cast<bScreen *>(id);
168
169 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
170 BKE_screen_area_blend_read_after_liblink(reader, &screen->id, area);
171 }
172}
173
175 /*id_code*/ bScreen::id_type,
176 /*id_filter*/ FILTER_ID_SCR,
177 /* NOTE: Can actually link to any ID type through UI (e.g. Outliner Editor).
178 * This is handled separately though. */
179 /*dependencies_id_types*/ FILTER_ID_SCE,
180 /*main_listbase_index*/ INDEX_ID_SCR,
181 /*struct_size*/ sizeof(bScreen),
182 /*name*/ "Screen",
183 /*name_plural*/ N_("screens"),
184 /*translation_context*/ BLT_I18NCONTEXT_ID_SCREEN,
187 /*asset_type_info*/ nullptr,
188
189 /*init_data*/ nullptr,
190 /*copy_data*/ nullptr,
191 /*free_data*/ screen_free_data,
192 /*make_local*/ nullptr,
193 /*foreach_id*/ screen_foreach_id,
194 /*foreach_cache*/ nullptr,
195 /*foreach_path*/ nullptr,
196 /*foreach_working_space_color*/ nullptr,
197 /*owner_pointer_get*/ nullptr,
198
199 /*blend_write*/ screen_blend_write,
200 /* Cannot be used yet, because #direct_link_screen has a return value. */
201 /*blend_read_data*/ nullptr,
202 /*blend_read_after_liblink*/ screen_blend_read_after_liblink,
203
204 /*blend_read_undo_preserve*/ nullptr,
205
206 /*lib_override_apply_post*/ nullptr,
207};
208
210
211/* -------------------------------------------------------------------- */
214
217{
218 static Vector<std::unique_ptr<SpaceType>> space_types;
219 return space_types;
220}
221
222/* not SpaceType itself */
224{
225 LISTBASE_FOREACH (ARegionType *, art, &this->regiontypes) {
226#ifdef WITH_PYTHON
228#endif
229 BLI_freelistN(&art->drawcalls);
230
231 LISTBASE_FOREACH (PanelType *, pt, &art->paneltypes) {
232 if (pt->rna_ext.free) {
233 pt->rna_ext.free(pt->rna_ext.data);
234 }
235
236 BLI_freelistN(&pt->children);
237 }
238
239 LISTBASE_FOREACH (HeaderType *, ht, &art->headertypes) {
240 if (ht->rna_ext.free) {
241 ht->rna_ext.free(ht->rna_ext.data);
242 }
243 }
244
245 BLI_freelistN(&art->paneltypes);
246 BLI_freelistN(&art->headertypes);
247 }
248
250}
251
253{
254 get_space_types().clear_and_shrink();
255}
256
258{
259 for (std::unique_ptr<SpaceType> &st : get_space_types()) {
260 if (st->spaceid == spaceid) {
261 return st.get();
262 }
263 }
264 return nullptr;
265}
266
268{
270 if (art->regionid == regionid) {
271 return art;
272 }
273 }
274 return nullptr;
275}
276
281
282void BKE_spacetype_register(std::unique_ptr<SpaceType> st)
283{
284 /* sanity check */
285 SpaceType *stype = BKE_spacetype_from_id(st->spaceid);
286 if (stype) {
287 printf("error: redefinition of spacetype %s\n", stype->name);
288 return;
289 }
290
291 get_space_types().append(std::move(st));
292}
293
294bool BKE_spacetype_exists(int spaceid)
295{
296 return BKE_spacetype_from_id(spaceid) != nullptr;
297}
298
300
301/* -------------------------------------------------------------------- */
304
306{
307 LISTBASE_FOREACH (SpaceLink *, sl, lb) {
308 SpaceType *st = BKE_spacetype_from_id(sl->spacetype);
309
310 /* free regions for pushed spaces */
311 LISTBASE_FOREACH (ARegion *, region, &sl->regionbase) {
312 BKE_area_region_free(st, region);
313 }
314
315 BLI_freelistN(&sl->regionbase);
316
317 if (st && st->free) {
318 st->free(sl);
319 }
320 }
321
322 BLI_freelistN(lb);
323}
324
325static void panel_list_copy(ListBase *newlb, const ListBase *lb)
326{
327 BLI_listbase_clear(newlb);
328
329 LISTBASE_FOREACH (const Panel *, old_panel, lb) {
330 Panel *new_panel = BKE_panel_new(old_panel->type);
331 Panel_Runtime *new_runtime = new_panel->runtime;
332 *new_panel = *old_panel;
333 new_panel->runtime = new_runtime;
334 new_panel->activedata = nullptr;
335 new_panel->drawname = nullptr;
336
338 new_panel->layout_panel_states_clock = old_panel->layout_panel_states_clock;
339 LISTBASE_FOREACH (LayoutPanelState *, src_state, &old_panel->layout_panel_states) {
340 LayoutPanelState *new_state = MEM_dupallocN<LayoutPanelState>(__func__, *src_state);
341 new_state->idname = BLI_strdup(src_state->idname);
342 BLI_addtail(&new_panel->layout_panel_states, new_state);
343 }
344
345 BLI_addtail(newlb, new_panel);
346 panel_list_copy(&new_panel->children, &old_panel->children);
347 }
348}
349
351{
352 ARegion *dst = static_cast<ARegion *>(MEM_dupallocN(region));
353
354 dst->runtime = MEM_new<blender::bke::ARegionRuntime>(__func__);
355 dst->runtime->type = region->runtime->type;
356 dst->runtime->do_draw = region->runtime->do_draw;
357
358 dst->prev = dst->next = nullptr;
361
362 /* use optional regiondata callback */
363 if (region->regiondata) {
365
366 if (art && art->duplicate) {
367 dst->regiondata = art->duplicate(region->regiondata);
368 }
369 else if (region->flag & RGN_FLAG_TEMP_REGIONDATA) {
370 dst->regiondata = nullptr;
371 }
372 else {
373 dst->regiondata = MEM_dupallocN(region->regiondata);
374 }
375 }
376
377 panel_list_copy(&dst->panels, &region->panels);
378
383
384 return dst;
385}
386
388{
389 ARegion *region = MEM_callocN<ARegion>(__func__);
390 region->runtime = MEM_new<blender::bke::ARegionRuntime>(__func__);
391 return region;
392}
393
394/* from lb_src to lb_dst, lb_dst is supposed to be freed */
395static void region_copylist(SpaceType *st, ListBase *lb_dst, ListBase *lb_src)
396{
397 /* to be sure */
398 BLI_listbase_clear(lb_dst);
399
400 LISTBASE_FOREACH (ARegion *, region, lb_src) {
401 ARegion *region_new = BKE_area_region_copy(st, region);
402 BLI_addtail(lb_dst, region_new);
403 }
404}
405
407{
408 BLI_listbase_clear(lb_dst); /* to be sure */
409
410 LISTBASE_FOREACH (SpaceLink *, sl, lb_src) {
411 SpaceType *st = BKE_spacetype_from_id(sl->spacetype);
412
413 if (st && st->duplicate) {
414 SpaceLink *slnew = st->duplicate(sl);
415
416 BLI_addtail(lb_dst, slnew);
417
418 region_copylist(st, &slnew->regionbase, &sl->regionbase);
419 }
420 }
421}
422
424{
425 for (std::unique_ptr<SpaceType> &st : get_space_types()) {
426 LISTBASE_FOREACH (ARegionType *, art, &st->regiontypes) {
427 if (lock_flags != 0) {
428 art->do_lock = (art->lock & lock_flags);
429 }
430 else {
431 art->do_lock = 0;
432 }
433 }
434 }
435}
436
438 const ScrArea *area,
439 int region_type)
440{
441 const bool is_slink_active = slink == area->spacedata.first;
442 const ListBase *regionbase = (is_slink_active) ? &area->regionbase : &slink->regionbase;
443 ARegion *region = nullptr;
444
445 BLI_assert(BLI_findindex(&area->spacedata, slink) != -1);
446
447 LISTBASE_FOREACH (ARegion *, region_iter, regionbase) {
448 if (region_iter->regiontype == region_type) {
449 region = region_iter;
450 break;
451 }
452 }
453
454 /* Should really unit test this instead. */
455 BLI_assert(!is_slink_active || region == BKE_area_find_region_type(area, region_type));
456
457 return region;
458}
459
460static void (*spacedata_id_remap_cb)(ScrArea *area,
461 SpaceLink *sl,
462 ID *old_id,
463 ID *new_id) = nullptr;
464
465void BKE_spacedata_callback_id_remap_set(void (*func)(ScrArea *area, SpaceLink *sl, ID *, ID *))
466{
468}
469
471{
473 spacedata_id_remap_cb(area, sl, id, nullptr);
474 }
475}
476
481
486
488{
490 return;
491 }
492
493 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
494 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
495 if (region->runtime->gizmo_map != nullptr) {
496 region_refresh_tag_gizmomap_callback(region->runtime->gizmo_map);
497 }
498 }
499 }
500}
501
503{
504 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
505 area->runtime.tool = nullptr;
506 area->runtime.is_tool_set = false;
507 }
508}
509
513static void (*region_free_gizmomap_callback)(wmGizmoMap *) = nullptr;
514
516{
518}
519
521 const StringRef idname,
522 const bool default_closed)
523{
524 const uint32_t logical_time = ++panel->layout_panel_states_clock;
525 /* Overflow happened, reset all last used times. Not sure if this will ever happen in practice,
526 * but better handle the overflow explicitly. */
527 if (logical_time == 0) {
529 state->last_used = 0;
530 }
531 }
533 if (state->idname == idname) {
534 state->last_used = logical_time;
535 return state;
536 }
537 }
539 state->idname = BLI_strdupn(idname.data(), idname.size());
541 state->last_used = logical_time;
543 return state;
544}
545
547{
548 Panel *panel = MEM_callocN<Panel>(__func__);
549 panel->runtime = MEM_new<Panel_Runtime>(__func__);
550 panel->type = panel_type;
551 if (panel_type) {
552 STRNCPY_UTF8(panel->panelname, panel_type->idname);
553 }
554 return panel;
555}
556
562
564{
566 MEM_SAFE_FREE(panel->drawname);
567
571 }
572
573 MEM_delete(panel->runtime);
574 MEM_freeN(panel);
575}
576
578{
579 LISTBASE_FOREACH_MUTABLE (Panel *, child_panel, &panel->children) {
581 }
582 BKE_panel_free(panel);
583}
584
586{
587 LISTBASE_FOREACH_MUTABLE (Panel *, panel, panels) {
588 /* Delete custom data just for parent panels to avoid a double deletion. */
589 if (panel->runtime->custom_data_ptr) {
590 MEM_delete(panel->runtime->custom_data_ptr);
591 }
593 }
594 BLI_listbase_clear(panels);
595}
596
598{
599 if (st) {
601
602 if (art && art->free) {
603 art->free(region);
604 }
605
606 if (region->regiondata && !(region->flag & RGN_FLAG_TEMP_REGIONDATA)) {
607 printf("regiondata free error\n");
608 }
609 }
610 else if (region->runtime->type && region->runtime->type->free) {
611 region->runtime->type->free(region);
612 }
613
615
616 LISTBASE_FOREACH (uiList *, uilst, &region->ui_lists) {
617 if (uilst->dyn_data && uilst->dyn_data->free_runtime_data_fn) {
618 uilst->dyn_data->free_runtime_data_fn(uilst);
619 }
620 if (uilst->properties) {
621 IDP_FreeProperty(uilst->properties);
622 }
623 MEM_SAFE_FREE(uilst->dyn_data);
624 }
625
626 if (region->runtime->gizmo_map != nullptr) {
627 region_free_gizmomap_callback(region->runtime->gizmo_map);
628 }
629
630 BLI_freelistN(&region->ui_lists);
631 BLI_freelistN(&region->ui_previews);
632 BLI_freelistN(&region->runtime->panels_category);
634 BLI_freelistN(&region->view_states);
635 MEM_delete(region->runtime);
636}
637
639{
641
642 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
643 BKE_area_region_free(st, region);
644 }
645
646 MEM_SAFE_FREE(area->global);
648
650
652}
653
655{
656 LISTBASE_FOREACH_MUTABLE (ScrArea *, area, &area_map->areabase) {
658 }
659
660 BLI_freelistN(&area_map->vertbase);
661 BLI_freelistN(&area_map->edgebase);
662 BLI_freelistN(&area_map->areabase);
663}
664
666{
667 screen_free_data(&screen->id);
668}
669
671
672/* -------------------------------------------------------------------- */
675
677{
679 LISTBASE_FOREACH (ScrEdge *, se, &screen->edgebase) {
680 if (se->v1 == v1 && se->v2 == v2) {
681 return se;
682 }
683 }
684
685 return nullptr;
686}
687
689{
690 if (*v1 > *v2) {
691 ScrVert *tmp = *v1;
692 *v1 = *v2;
693 *v2 = tmp;
694 }
695}
696
698{
699 LISTBASE_FOREACH (ScrVert *, verg, &screen->vertbase) {
700 if (verg->newv == nullptr) { /* !!! */
701 ScrVert *v1 = verg->next;
702 while (v1) {
703 if (v1->newv == nullptr) { /* !?! */
704 if (v1->vec.x == verg->vec.x && v1->vec.y == verg->vec.y) {
705 // printf("doublevert\n");
706 v1->newv = verg;
707 }
708 }
709 v1 = v1->next;
710 }
711 }
712 }
713
714 /* replace pointers in edges and faces */
715 LISTBASE_FOREACH (ScrEdge *, se, &screen->edgebase) {
716 if (se->v1->newv) {
717 se->v1 = se->v1->newv;
718 }
719 if (se->v2->newv) {
720 se->v2 = se->v2->newv;
721 }
722 /* edges changed: so.... */
723 BKE_screen_sort_scrvert(&(se->v1), &(se->v2));
724 }
725 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
726 if (area->v1->newv) {
727 area->v1 = area->v1->newv;
728 }
729 if (area->v2->newv) {
730 area->v2 = area->v2->newv;
731 }
732 if (area->v3->newv) {
733 area->v3 = area->v3->newv;
734 }
735 if (area->v4->newv) {
736 area->v4 = area->v4->newv;
737 }
738 }
739
740 /* remove */
741 LISTBASE_FOREACH_MUTABLE (ScrVert *, verg, &screen->vertbase) {
742 if (verg->newv) {
743 BLI_remlink(&screen->vertbase, verg);
744 MEM_freeN(verg);
745 }
746 }
747}
748
750{
751 /* compare */
752 LISTBASE_FOREACH (ScrEdge *, verg, &screen->edgebase) {
753 ScrEdge *se = verg->next;
754 while (se) {
755 ScrEdge *sn = se->next;
756 if (verg->v1 == se->v1 && verg->v2 == se->v2) {
757 BLI_remlink(&screen->edgebase, se);
758 MEM_freeN(se);
759 }
760 se = sn;
761 }
762 }
763}
764
766{
767 /* sets flags when edge is used in area */
768 int a = 0;
769 LISTBASE_FOREACH_INDEX (ScrArea *, area, &screen->areabase, a) {
770 ScrEdge *se = BKE_screen_find_edge(screen, area->v1, area->v2);
771 if (se == nullptr) {
772 printf("error: area %d edge 1 doesn't exist\n", a);
773 }
774 else {
775 se->flag = 1;
776 }
777 se = BKE_screen_find_edge(screen, area->v2, area->v3);
778 if (se == nullptr) {
779 printf("error: area %d edge 2 doesn't exist\n", a);
780 }
781 else {
782 se->flag = 1;
783 }
784 se = BKE_screen_find_edge(screen, area->v3, area->v4);
785 if (se == nullptr) {
786 printf("error: area %d edge 3 doesn't exist\n", a);
787 }
788 else {
789 se->flag = 1;
790 }
791 se = BKE_screen_find_edge(screen, area->v4, area->v1);
792 if (se == nullptr) {
793 printf("error: area %d edge 4 doesn't exist\n", a);
794 }
795 else {
796 se->flag = 1;
797 }
798 }
799 LISTBASE_FOREACH_MUTABLE (ScrEdge *, se, &screen->edgebase) {
800 if (se->flag == 0) {
801 BLI_remlink(&screen->edgebase, se);
802 MEM_freeN(se);
803 }
804 else {
805 se->flag = 0;
806 }
807 }
808}
809
811{
812 /* we assume edges are ok */
813 LISTBASE_FOREACH (ScrEdge *, se, &screen->edgebase) {
814 se->v1->flag = 1;
815 se->v2->flag = 1;
816 }
817
818 LISTBASE_FOREACH_MUTABLE (ScrVert *, sv, &screen->vertbase) {
819 if (sv->flag == 0) {
820 BLI_remlink(&screen->vertbase, sv);
821 MEM_freeN(sv);
822 }
823 else {
824 sv->flag = 0;
825 }
826 }
827}
828
830
831/* -------------------------------------------------------------------- */
834
835ARegion *BKE_region_find_in_listbase_by_type(const ListBase *regionbase, const int region_type)
836{
837 LISTBASE_FOREACH (ARegion *, region, regionbase) {
838 if (region->regiontype == region_type) {
839 return region;
840 }
841 }
842
843 return nullptr;
844}
845
846ARegion *BKE_area_find_region_type(const ScrArea *area, int region_type)
847{
848 if (area) {
849 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
850 if (region->regiontype == region_type) {
851 return region;
852 }
853 }
854 }
855
856 return nullptr;
857}
858
860{
861 if (area == nullptr) {
862 return nullptr;
863 }
864
865 ARegion *region = static_cast<ARegion *>(
867 if (region && (region->regiontype == RGN_TYPE_WINDOW)) {
868 return region;
869 }
870
871 /* fall back to any */
873}
874
875ARegion *BKE_area_find_region_xy(const ScrArea *area, const int regiontype, const int xy[2])
876{
877 if (area == nullptr) {
878 return nullptr;
879 }
880
881 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
882 if (ELEM(regiontype, RGN_TYPE_ANY, region->regiontype)) {
883 if (BLI_rcti_isect_pt_v(&region->winrct, xy)) {
884 return region;
885 }
886 }
887 }
888 return nullptr;
889}
890
891ARegion *BKE_screen_find_region_type(const bScreen *screen, const int region_type)
892{
893 LISTBASE_FOREACH (ARegion *, region, &screen->regionbase) {
894 if (region_type == region->regiontype) {
895 return region;
896 }
897 }
898 return nullptr;
899}
900
901ARegion *BKE_screen_find_region_xy(const bScreen *screen, const int regiontype, const int xy[2])
902{
903 LISTBASE_FOREACH (ARegion *, region, &screen->regionbase) {
904 if (ELEM(regiontype, RGN_TYPE_ANY, region->regiontype)) {
905 if (BLI_rcti_isect_pt_v(&region->winrct, xy)) {
906 return region;
907 }
908 }
909 }
910 return nullptr;
911}
912
914{
915 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
916 if (BLI_findindex(&area->spacedata, sl) != -1) {
917 return area;
918 }
919 }
920
921 return nullptr;
922}
923
924std::optional<std::string> BKE_screen_path_from_screen_to_space(const PointerRNA *ptr)
925{
926 if (GS(ptr->owner_id->name) != ID_SCR) {
928 return std::nullopt;
929 }
930
931 const bScreen *screen = reinterpret_cast<const bScreen *>(ptr->owner_id);
932 const SpaceLink *link = static_cast<const SpaceLink *>(ptr->data);
933
934 int area_index;
935 LISTBASE_FOREACH_INDEX (const ScrArea *, area, &screen->areabase, area_index) {
936 const int space_index = BLI_findindex(&area->spacedata, link);
937 if (space_index != -1) {
938 return fmt::format("areas[{}].spaces[{}]", area_index, space_index);
939 }
940 }
941 return std::nullopt;
942}
943
944ScrArea *BKE_screen_find_big_area(const bScreen *screen, const int spacetype, const short min)
945{
946 ScrArea *big = nullptr;
947 int maxsize = 0;
948
949 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
950 if (ELEM(spacetype, SPACE_TYPE_ANY, area->spacetype)) {
951 if (min <= area->winx && min <= area->winy) {
952 int size = area->winx * area->winy;
953 if (size > maxsize) {
954 maxsize = size;
955 big = area;
956 }
957 }
958 }
959 }
960
961 return big;
962}
963
965 const int spacetype,
966 const int xy[2])
967{
968 LISTBASE_FOREACH (ScrArea *, area, &areamap->areabase) {
969 /* Test area's outer screen verts, not inner `area->totrct`. */
970 if (xy[0] >= area->v1->vec.x && xy[0] <= area->v4->vec.x && xy[1] >= area->v1->vec.y &&
971 xy[1] <= area->v2->vec.y)
972 {
973 if (ELEM(spacetype, SPACE_TYPE_ANY, area->spacetype)) {
974 return area;
975 }
976 break;
977 }
978 }
979 return nullptr;
980}
981ScrArea *BKE_screen_find_area_xy(const bScreen *screen, const int spacetype, const int xy[2])
982{
983 return BKE_screen_area_map_find_area_xy(AREAMAP_FROM_SCREEN(screen), spacetype, xy);
984}
985
987{
988 if (v3d->scenelock && v3d->localvd == nullptr) {
989 v3d->camera = scene->camera;
990
991 if (v3d->camera == nullptr) {
992 LISTBASE_FOREACH (ARegion *, region, &v3d->regionbase) {
993 if (region->regiontype == RGN_TYPE_WINDOW) {
994 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
995 if (rv3d->persp == RV3D_CAMOB) {
996 rv3d->persp = RV3D_PERSP;
997 }
998 }
999 }
1000 }
1001 }
1002}
1003
1005{
1006 /* are there cameras in the views that are not in the scene? */
1007 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
1008 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
1009 if (sl->spacetype == SPACE_VIEW3D) {
1010 View3D *v3d = (View3D *)sl;
1011 BKE_screen_view3d_sync(v3d, scene);
1012 }
1013 }
1014 }
1015}
1016
1018{
1019 const View3DShading *shading_default = DNA_struct_default_get(View3DShading);
1020 memcpy(shading, shading_default, sizeof(*shading));
1021}
1022
1024 const int space_type,
1025 const int xy[2])
1026{
1027 ScrArea *area = BKE_screen_find_area_xy(screen, space_type, xy);
1028 if (!area) {
1029 return nullptr;
1030 }
1032}
1033
1034/* Magic zoom calculation, no idea what it signifies, if you find out, tell me! -zr
1035 *
1036 * Simple, its magic dude! Well, to be honest,
1037 * this gives a natural feeling zooming with multiple keypad presses (ton). */
1038
1040{
1041 return powf((float(M_SQRT2) + camzoom / 50.0f), 2.0f) / 4.0f;
1042}
1043
1045{
1046 return ((sqrtf(4.0f * zoomfac) - float(M_SQRT2)) * 50.0f);
1047}
1048
1050{
1051 return ELEM(screen->state, SCREENMAXIMIZED, SCREENFULL);
1052}
1053
1054bool BKE_screen_is_used(const bScreen *screen)
1055{
1056 return (screen->winid != 0);
1057}
1058
1060{
1061 int alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP;
1062 LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
1063 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
1064 if (ELEM(region->regiontype, RGN_TYPE_HEADER, RGN_TYPE_TOOL_HEADER)) {
1066 region->alignment = RGN_ALIGN_TOP;
1067 continue;
1068 }
1069 region->alignment = alignment;
1070 }
1071 if (region->regiontype == RGN_TYPE_FOOTER) {
1073 region->alignment = RGN_ALIGN_BOTTOM;
1074 continue;
1075 }
1076 region->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_TOP : RGN_ALIGN_BOTTOM;
1077 }
1078 }
1079 }
1080 screen->do_refresh = true;
1081}
1082
1084
1085/* -------------------------------------------------------------------- */
1088
1090{
1091 if (shading->prop) {
1092 IDP_BlendWrite(writer, shading->prop);
1093 }
1094}
1095
1097{
1098 if (shading->prop) {
1099 BLO_read_struct(reader, IDProperty, &shading->prop);
1100 IDP_BlendDataRead(reader, &shading->prop);
1101 }
1102}
1103
1104static void write_region(BlendWriter *writer, ARegion *region, int spacetype)
1105{
1106 ARegion region_copy = *region;
1107 region_copy.runtime = nullptr;
1108 BLO_write_struct_at_address(writer, ARegion, region, &region_copy);
1109
1110 if (region->regiondata) {
1111 if (region->flag & RGN_FLAG_TEMP_REGIONDATA) {
1112 return;
1113 }
1114
1115 if (region->regiontype == RGN_TYPE_ASSET_SHELF) {
1117 return;
1118 }
1119
1120 switch (spacetype) {
1121 case SPACE_VIEW3D:
1122 if (region->regiontype == RGN_TYPE_WINDOW) {
1123 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
1124 BLO_write_struct(writer, RegionView3D, rv3d);
1125
1126 if (rv3d->localvd) {
1127 BLO_write_struct(writer, RegionView3D, rv3d->localvd);
1128 }
1129 if (rv3d->clipbb) {
1130 BLO_write_struct(writer, BoundBox, rv3d->clipbb);
1131 }
1132 }
1133 else {
1134 printf("regiondata write missing!\n");
1135 }
1136 break;
1137 default:
1138 printf("regiondata write missing!\n");
1139 }
1140 }
1141}
1142
1143static void write_uilist(BlendWriter *writer, uiList *ui_list)
1144{
1145 BLO_write_struct(writer, uiList, ui_list);
1146
1147 if (ui_list->properties) {
1148 IDP_BlendWrite(writer, ui_list->properties);
1149 }
1150}
1151
1152static void write_panel_list(BlendWriter *writer, ListBase *lb)
1153{
1154 LISTBASE_FOREACH (Panel *, panel, lb) {
1155 Panel panel_copy = *panel;
1156 panel_copy.runtime_flag = 0;
1157 panel_copy.runtime = nullptr;
1158 BLO_write_struct_at_address(writer, Panel, panel, &panel_copy);
1159 BLO_write_struct_list(writer, LayoutPanelState, &panel->layout_panel_states);
1160 LISTBASE_FOREACH (LayoutPanelState *, state, &panel->layout_panel_states) {
1161 BLO_write_string(writer, state->idname);
1162 }
1163 write_panel_list(writer, &panel->children);
1164 }
1165}
1166
1167static void write_area(BlendWriter *writer, ScrArea *area)
1168{
1169 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
1170 write_region(writer, region, area->spacetype);
1171 write_panel_list(writer, &region->panels);
1172
1173 LISTBASE_FOREACH (PanelCategoryStack *, pc_act, &region->panels_category_active) {
1174 BLO_write_struct(writer, PanelCategoryStack, pc_act);
1175 }
1176
1177 LISTBASE_FOREACH (uiList *, ui_list, &region->ui_lists) {
1178 write_uilist(writer, ui_list);
1179 }
1180
1181 LISTBASE_FOREACH (uiPreview *, ui_preview, &region->ui_previews) {
1182 BLO_write_struct(writer, uiPreview, ui_preview);
1183 }
1184
1185 LISTBASE_FOREACH (uiViewStateLink *, view_state, &region->view_states) {
1186 BLO_write_struct(writer, uiViewStateLink, view_state);
1187 }
1188 }
1189
1190 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
1191 LISTBASE_FOREACH (ARegion *, region, &sl->regionbase) {
1192 write_region(writer, region, sl->spacetype);
1193 }
1194
1195 SpaceType *space_type = BKE_spacetype_from_id(sl->spacetype);
1196 if (space_type && space_type->blend_write) {
1197 space_type->blend_write(writer, sl);
1198 }
1199 }
1200}
1201
1203{
1204 BLO_write_struct_list(writer, ScrVert, &area_map->vertbase);
1205 BLO_write_struct_list(writer, ScrEdge, &area_map->edgebase);
1206 LISTBASE_FOREACH (ScrArea *, area, &area_map->areabase) {
1207 area->butspacetype = area->spacetype; /* Just for compatibility, will be reset below. */
1208
1209 BLO_write_struct(writer, ScrArea, area);
1210
1212
1213 write_area(writer, area);
1214
1215 area->butspacetype = SPACE_EMPTY; /* Unset again, was changed above. */
1216 }
1217}
1218
1219static void remove_least_recently_used_panel_states(Panel &panel, const int64_t max_kept)
1220{
1223 all_states.append(state);
1224 }
1225 if (all_states.size() <= max_kept) {
1226 return;
1227 }
1228 std::sort(all_states.begin(),
1229 all_states.end(),
1230 [](const LayoutPanelState *a, const LayoutPanelState *b) {
1231 return a->last_used < b->last_used;
1232 });
1233 for (LayoutPanelState *state : all_states.as_span().drop_back(max_kept)) {
1236 }
1237}
1238
1240{
1241 BLO_read_struct_list(reader, Panel, lb);
1242
1243 LISTBASE_FOREACH (Panel *, panel, lb) {
1244 panel->runtime = MEM_new<Panel_Runtime>(__func__);
1245 panel->runtime_flag = 0;
1246 panel->activedata = nullptr;
1247 panel->type = nullptr;
1248 panel->drawname = nullptr;
1249 BLO_read_struct_list(reader, LayoutPanelState, &panel->layout_panel_states);
1250 LISTBASE_FOREACH (LayoutPanelState *, state, &panel->layout_panel_states) {
1251 BLO_read_string(reader, &state->idname);
1252 }
1253 /* Reduce the number of panel states to a reasonable number. This avoids the list getting
1254 * arbitrarily large over time. Ideally this could be done more eagerly and not only when
1255 * loading the file. However, it's hard to make sure that no other code is currently
1256 * referencing the panel states in other cases. */
1258 direct_link_panel_list(reader, &panel->children);
1259 }
1260}
1261
1262static void direct_link_region(BlendDataReader *reader, ARegion *region, int spacetype)
1263{
1264 direct_link_panel_list(reader, &region->panels);
1265
1267
1268 BLO_read_struct_list(reader, uiList, &region->ui_lists);
1270
1271 /* The area's search filter is runtime only, so we need to clear the active flag on read. */
1272 /* Clear runtime flags (e.g. search filter is runtime only). */
1274
1275 LISTBASE_FOREACH (uiList *, ui_list, &region->ui_lists) {
1276 ui_list->type = nullptr;
1277 ui_list->dyn_data = nullptr;
1278 BLO_read_struct(reader, IDProperty, &ui_list->properties);
1279 IDP_BlendDataRead(reader, &ui_list->properties);
1280 }
1281
1282 BLO_read_struct_list(reader, uiPreview, &region->ui_previews);
1283 LISTBASE_FOREACH (uiPreview *, ui_preview, &region->ui_previews) {
1284 ui_preview->id_session_uid = MAIN_ID_SESSION_UID_UNSET;
1285 ui_preview->tag = 0;
1286 }
1287
1288 if (spacetype == SPACE_EMPTY) {
1289 /* unknown space type, don't leak regiondata */
1290 region->regiondata = nullptr;
1291 }
1292 else if (region->flag & RGN_FLAG_TEMP_REGIONDATA) {
1293 /* Runtime data, don't use. */
1294 region->regiondata = nullptr;
1295 }
1296 else {
1297 if (spacetype == SPACE_VIEW3D) {
1298 if (region->regiontype == RGN_TYPE_WINDOW) {
1299 BLO_read_struct(reader, RegionView3D, &region->regiondata);
1300
1301 if (region->regiondata == nullptr) {
1302 /* To avoid crashing on some old files. */
1303 region->regiondata = MEM_callocN<RegionView3D>("region view3d");
1304 }
1305
1306 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
1307
1308 BLO_read_struct(reader, RegionView3D, &rv3d->localvd);
1309 BLO_read_struct(reader, BoundBox, &rv3d->clipbb);
1310
1311 rv3d->view_render = nullptr;
1312 rv3d->sms = nullptr;
1313 rv3d->smooth_timer = nullptr;
1314
1315 rv3d->rflag &= ~(RV3D_NAVIGATING | RV3D_PAINTING);
1316 rv3d->runtime_viewlock = 0;
1317 }
1318 }
1319 if (region->regiontype == RGN_TYPE_ASSET_SHELF) {
1321 }
1322 }
1323
1324 region->runtime = MEM_new<blender::bke::ARegionRuntime>(__func__);
1325 region->v2d.sms = nullptr;
1326 region->v2d.alpha_hor = region->v2d.alpha_vert = 255; /* visible by default */
1327}
1328
1330{
1331 LISTBASE_FOREACH (ARegion *, region, regions) {
1332 if (region->regiontype == RGN_TYPE_WINDOW && region->regiondata == nullptr) {
1333 RegionView3D *rv3d;
1334
1335 rv3d = MEM_callocN<RegionView3D>("region v3d patch");
1336 rv3d->persp = char(v3d->persp);
1337 rv3d->view = char(v3d->view);
1338 rv3d->dist = v3d->dist;
1339 copy_v3_v3(rv3d->ofs, v3d->ofs);
1340 copy_qt_qt(rv3d->viewquat, v3d->viewquat);
1341 region->regiondata = rv3d;
1342 }
1343 }
1344
1345 /* this was not initialized correct always */
1346 if (v3d->gridsubdiv == 0) {
1347 v3d->gridsubdiv = 10;
1348 }
1349}
1350
1351static void direct_link_area(BlendDataReader *reader, ScrArea *area)
1352{
1353 BLO_read_struct_list(reader, SpaceLink, &(area->spacedata));
1354 BLO_read_struct_list(reader, ARegion, &(area->regionbase));
1355
1357 area->type = nullptr; /* spacetype callbacks */
1358
1359 area->runtime = ScrArea_Runtime{};
1360
1361 /* Should always be unset so that rna_Area_type_get works correctly. */
1362 area->butspacetype = SPACE_EMPTY;
1363
1364 area->region_active_win = -1;
1365
1367
1368 BLO_read_struct(reader, ScrGlobalAreaData, &area->global);
1369
1370 /* if we do not have the spacetype registered we cannot
1371 * free it, so don't allocate any new memory for such spacetypes. */
1372 if (!BKE_spacetype_exists(area->spacetype)) {
1373 /* Hint for versioning code to replace deprecated space types. */
1374 area->butspacetype = area->spacetype;
1375
1376 area->spacetype = SPACE_EMPTY;
1377 }
1378
1379 LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
1380 direct_link_region(reader, region, area->spacetype);
1381 }
1382
1383 /* accident can happen when read/save new file with older version */
1384 /* 2.50: we now always add spacedata for info */
1385 if (area->spacedata.first == nullptr) {
1386 SpaceInfo *sinfo = MEM_callocN<SpaceInfo>("spaceinfo");
1387 area->spacetype = sinfo->spacetype = SPACE_INFO;
1388 BLI_addtail(&area->spacedata, sinfo);
1389 }
1390 /* add local view3d too */
1391 else if (area->spacetype == SPACE_VIEW3D) {
1393 &area->regionbase);
1394 }
1395
1396 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
1397 BLO_read_struct_list(reader, ARegion, &(sl->regionbase));
1398
1399 /* if we do not have the spacetype registered we cannot
1400 * free it, so don't allocate any new memory for such spacetypes. */
1401 if (!BKE_spacetype_exists(sl->spacetype)) {
1402 sl->spacetype = SPACE_EMPTY;
1403 }
1404
1405 LISTBASE_FOREACH (ARegion *, region, &sl->regionbase) {
1406 direct_link_region(reader, region, sl->spacetype);
1407 }
1408
1409 SpaceType *space_type = BKE_spacetype_from_id(sl->spacetype);
1410 if (space_type && space_type->blend_read_data) {
1411 space_type->blend_read_data(reader, sl);
1412 }
1413 }
1414
1416
1417 BLO_read_struct(reader, ScrVert, &area->v1);
1418 BLO_read_struct(reader, ScrVert, &area->v2);
1419 BLO_read_struct(reader, ScrVert, &area->v3);
1420 BLO_read_struct(reader, ScrVert, &area->v4);
1421}
1422
1424{
1425 BLO_read_struct_list(reader, ScrVert, &area_map->vertbase);
1426 BLO_read_struct_list(reader, ScrEdge, &area_map->edgebase);
1427 BLO_read_struct_list(reader, ScrArea, &area_map->areabase);
1428 LISTBASE_FOREACH (ScrArea *, area, &area_map->areabase) {
1429 direct_link_area(reader, area);
1430 }
1431
1432 /* edges */
1433 LISTBASE_FOREACH (ScrEdge *, se, &area_map->edgebase) {
1434 BLO_read_struct(reader, ScrVert, &se->v1);
1435 BLO_read_struct(reader, ScrVert, &se->v2);
1436 BKE_screen_sort_scrvert(&se->v1, &se->v2);
1437
1438 if (se->v1 == nullptr) {
1439 BLI_remlink(&area_map->edgebase, se);
1440
1441 return false;
1442 }
1443 }
1444
1445 return true;
1446}
1447
1452static void regions_remove_invalid(SpaceType *space_type, ListBase *regionbase)
1453{
1454 LISTBASE_FOREACH_MUTABLE (ARegion *, region, regionbase) {
1455 if (BKE_regiontype_from_id(space_type, region->regiontype) != nullptr) {
1456 continue;
1457 }
1458
1460 "Region type %d missing in space type \"%s\" (id: %d) - removing region",
1461 region->regiontype,
1462 space_type->name,
1463 space_type->spaceid);
1464
1465 BKE_area_region_free(space_type, region);
1466 BLI_freelinkN(regionbase, region);
1467 }
1468}
1469
1471{
1472 LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
1473 SpaceType *space_type = BKE_spacetype_from_id(sl->spacetype);
1474 ListBase *regionbase = (sl == area->spacedata.first) ? &area->regionbase : &sl->regionbase;
1475
1476 /* We cannot restore the region type without a valid space type. So delete all regions to make
1477 * sure no data is kept around that can't be restored safely (like the type dependent
1478 * #ARegion.regiondata). */
1479 if (!space_type) {
1480 LISTBASE_FOREACH_MUTABLE (ARegion *, region, regionbase) {
1481 BKE_area_region_free(nullptr, region);
1482 BLI_freelinkN(regionbase, region);
1483 }
1484
1485 continue;
1486 }
1487
1488 if (space_type->blend_read_after_liblink) {
1489 space_type->blend_read_after_liblink(reader, parent_id, sl);
1490 }
1491
1492 regions_remove_invalid(space_type, regionbase);
1493 }
1494}
#define IDP_BlendDataRead(reader, prop)
void IDP_FreeProperty(IDProperty *prop)
Definition idprop.cc:1251
void IDP_BlendWrite(BlendWriter *writer, const IDProperty *prop)
Definition idprop.cc:1461
@ IDTYPE_FLAGS_NO_ANIMDATA
Definition BKE_idtype.hh:49
@ IDTYPE_FLAGS_ONLY_APPEND
Definition BKE_idtype.hh:41
@ IDTYPE_FLAGS_NO_COPY
Definition BKE_idtype.hh:33
@ IDTYPE_FLAGS_NO_MEMFILE_UNDO
Definition BKE_idtype.hh:58
IDTypeInfo IDType_ID_SCR
Definition screen.cc:174
#define MAIN_ID_SESSION_UID_UNSET
void BKE_id_blend_write(BlendWriter *writer, ID *id)
Definition lib_id.cc:2631
#define BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data_, func_call_)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
@ IDWALK_CB_NOP
LibraryForeachIDFlag BKE_lib_query_foreachid_process_flags_get(const LibraryForeachIDData *data)
Definition lib_query.cc:129
@ IDWALK_DO_DEPRECATED_POINTERS
@ IDWALK_INCLUDE_UI
void BKE_previewimg_blend_write(BlendWriter *writer, const PreviewImage *prv)
void BKE_previewimg_free(PreviewImage **prv)
void BKE_previewimg_blend_read(BlendDataReader *reader, PreviewImage *prv)
ARegionDrawLockFlags
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:586
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:534
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:270
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
Definition listbase.cc:497
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:111
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:131
void void void void void void BLI_duplicatelist(ListBase *dst, const ListBase *src) ATTR_NONNULL(1
#define M_SQRT2
void copy_qt_qt(float q[4], const float a[4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
bool BLI_rcti_isect_pt_v(const struct rcti *rect, const int xy[2])
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
Definition string.cc:41
char * BLI_strdupn(const char *str, size_t len) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition string.cc:30
#define STRNCPY_UTF8(dst, src)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define ELEM(...)
Compatibility-like things for windows.
#define BLO_write_struct_at_address_with_filecode(writer, filecode, struct_name, address, data_ptr)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_string(BlendDataReader *reader, char **ptr_p)
Definition readfile.cc:5828
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_write_struct_list(writer, struct_name, list_ptr)
#define BLO_read_struct(reader, struct_name, ptr_p)
#define BLO_write_struct_at_address(writer, struct_name, address, data_ptr)
#define BLT_I18NCONTEXT_ID_SCREEN
void BPY_callback_screen_free(ARegionType *art)
#define CLOG_WARN(clg_ref,...)
Definition CLG_log.h:189
#define FILTER_ID_SCR
Definition DNA_ID.h:1233
@ INDEX_ID_SCR
Definition DNA_ID.h:1352
#define FILTER_ID_SCE
Definition DNA_ID.h:1217
@ ID_SCR
#define ID_SCRN
#define DNA_struct_default_get(struct_name)
@ LAYOUT_PANEL_STATE_FLAG_OPEN
@ AREA_FLAG_ACTIVE_TOOL_UPDATE
#define AREAMAP_FROM_SCREEN(screen)
@ RGN_ALIGN_BOTTOM
@ RGN_ALIGN_TOP
@ SCREENFULL
@ SCREENMAXIMIZED
@ RGN_TYPE_TOOL_HEADER
@ RGN_TYPE_WINDOW
@ RGN_TYPE_ASSET_SHELF
@ RGN_TYPE_FOOTER
@ RGN_TYPE_HEADER
@ RGN_FLAG_POLL_FAILED
@ RGN_FLAG_TEMP_REGIONDATA
@ RGN_FLAG_SEARCH_FILTER_ACTIVE
#define RGN_TYPE_ANY
@ SPACE_OUTLINER
@ SPACE_USERPREF
@ SPACE_FILE
@ SPACE_PROPERTIES
@ SPACE_EMPTY
@ SPACE_VIEW3D
@ SPACE_INFO
#define SPACE_TYPE_ANY
@ USER_HEADER_BOTTOM
@ RV3D_PAINTING
@ RV3D_NAVIGATING
@ RV3D_CAMOB
@ RV3D_PERSP
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
#define U
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v2
long long int int64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
constexpr int64_t size() const
constexpr const char * data() const
int64_t size() const
void append(const T &value)
Span< T > as_span() const
#define powf(x, y)
#define GS(x)
#define printf(...)
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void * MEM_dupallocN(const void *vmemh)
Definition mallocn.cc:143
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
static ulong state[N]
void region_blend_read_data(BlendDataReader *reader, ARegion *region)
void region_blend_write(BlendWriter *writer, ARegion *region)
#define sqrtf
static void(* region_refresh_tag_gizmomap_callback)(wmGizmoMap *)
Definition screen.cc:480
static void area_region_panels_free_recursive(Panel *panel)
Definition screen.cc:577
static void(* region_free_gizmomap_callback)(wmGizmoMap *)
Definition screen.cc:513
void BKE_screen_remove_unused_scrverts(bScreen *screen)
Definition screen.cc:810
void BKE_screen_view3d_shading_blend_read_data(BlendDataReader *reader, View3DShading *shading)
Definition screen.cc:1096
bool BKE_screen_is_used(const bScreen *screen)
Definition screen.cc:1054
void BKE_screen_area_map_blend_write(BlendWriter *writer, ScrAreaMap *area_map)
Definition screen.cc:1202
void BKE_spacetypes_free()
Definition screen.cc:252
static void regions_remove_invalid(SpaceType *space_type, ListBase *regionbase)
Definition screen.cc:1452
void BKE_screen_remove_unused_scredges(bScreen *screen)
Definition screen.cc:765
static void screen_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition screen.cc:126
ARegion * BKE_area_find_region_xy(const ScrArea *area, const int regiontype, const int xy[2])
Definition screen.cc:875
void BKE_spacedata_copylist(ListBase *lb_dst, ListBase *lb_src)
Definition screen.cc:406
static void layout_panel_state_delete(LayoutPanelState *state)
Definition screen.cc:557
LayoutPanelState * BKE_panel_layout_panel_state_ensure(Panel *panel, const StringRef idname, const bool default_closed)
Definition screen.cc:520
float BKE_screen_view3d_zoom_from_fac(float zoomfac)
Definition screen.cc:1044
void BKE_screen_area_blend_read_after_liblink(BlendLibReader *reader, ID *parent_id, ScrArea *area)
Definition screen.cc:1470
void BKE_spacedata_callback_id_remap_set(void(*func)(ScrArea *area, SpaceLink *sl, ID *, ID *))
Definition screen.cc:465
ARegion * BKE_screen_find_main_region_at_xy(const bScreen *screen, const int space_type, const int xy[2])
Definition screen.cc:1023
void BKE_screen_remove_double_scrverts(bScreen *screen)
Definition screen.cc:697
bool BKE_screen_blend_read_data(BlendDataReader *reader, bScreen *screen)
Definition screen.cc:141
void BKE_spacetype_register(std::unique_ptr< SpaceType > st)
Definition screen.cc:282
ARegion * BKE_area_find_region_active_win(const ScrArea *area)
Definition screen.cc:859
void BKE_spacedata_freelist(ListBase *lb)
Definition screen.cc:305
static void write_area(BlendWriter *writer, ScrArea *area)
Definition screen.cc:1167
std::optional< std::string > BKE_screen_path_from_screen_to_space(const PointerRNA *ptr)
Definition screen.cc:924
ScrArea * BKE_screen_area_map_find_area_xy(const ScrAreaMap *areamap, const int spacetype, const int xy[2])
Definition screen.cc:964
ARegion * BKE_area_region_new()
Definition screen.cc:387
static void region_copylist(SpaceType *st, ListBase *lb_dst, ListBase *lb_src)
Definition screen.cc:395
Span< std::unique_ptr< SpaceType > > BKE_spacetypes_list()
Definition screen.cc:277
void BKE_screen_view3d_shading_blend_write(BlendWriter *writer, View3DShading *shading)
Definition screen.cc:1089
void BKE_region_callback_free_gizmomap_set(void(*callback)(wmGizmoMap *))
Definition screen.cc:515
ARegion * BKE_screen_find_region_xy(const bScreen *screen, const int regiontype, const int xy[2])
Definition screen.cc:901
void BKE_screen_sort_scrvert(ScrVert **v1, ScrVert **v2)
Definition screen.cc:688
ScrEdge * BKE_screen_find_edge(const bScreen *screen, ScrVert *v1, ScrVert *v2)
Definition screen.cc:676
static void remove_least_recently_used_panel_states(Panel &panel, const int64_t max_kept)
Definition screen.cc:1219
static void direct_link_panel_list(BlendDataReader *reader, ListBase *lb)
Definition screen.cc:1239
static void write_region(BlendWriter *writer, ARegion *region, int spacetype)
Definition screen.cc:1104
static Vector< std::unique_ptr< SpaceType > > & get_space_types()
Definition screen.cc:216
void BKE_screen_area_free(ScrArea *area)
Definition screen.cc:638
bool BKE_spacetype_exists(int spaceid)
Definition screen.cc:294
SpaceType * BKE_spacetype_from_id(int spaceid)
Definition screen.cc:257
static void write_panel_list(BlendWriter *writer, ListBase *lb)
Definition screen.cc:1152
ARegionType * BKE_regiontype_from_id(const SpaceType *st, int regionid)
Definition screen.cc:267
void BKE_screen_header_alignment_reset(bScreen *screen)
Definition screen.cc:1059
ARegion * BKE_region_find_in_listbase_by_type(const ListBase *regionbase, const int region_type)
Definition screen.cc:835
void BKE_screen_area_map_free(ScrAreaMap *area_map)
Definition screen.cc:654
static CLG_LogRef LOG_BLEND_DOVERSION
Definition screen.cc:62
void BKE_spacedata_draw_locks(ARegionDrawLockFlags lock_flags)
Definition screen.cc:423
void BKE_spacedata_id_unref(ScrArea *area, SpaceLink *sl, ID *id)
Definition screen.cc:470
ARegion * BKE_screen_find_region_type(const bScreen *screen, const int region_type)
Definition screen.cc:891
void BKE_area_region_free(SpaceType *st, ARegion *region)
Definition screen.cc:597
void BKE_screen_gizmo_tag_refresh(bScreen *screen)
Definition screen.cc:487
bool BKE_screen_is_fullscreen_area(const bScreen *screen)
Definition screen.cc:1049
bool BKE_screen_area_map_blend_read_data(BlendDataReader *reader, ScrAreaMap *area_map)
Definition screen.cc:1423
ScrArea * BKE_screen_find_big_area(const bScreen *screen, const int spacetype, const short min)
Definition screen.cc:944
static void(* spacedata_id_remap_cb)(ScrArea *area, SpaceLink *sl, ID *old_id, ID *new_id)
Definition screen.cc:460
void BKE_screen_view3d_scene_sync(bScreen *screen, Scene *scene)
Definition screen.cc:1004
void BKE_panel_free(Panel *panel)
Definition screen.cc:563
void BKE_screen_remove_double_scredges(bScreen *screen)
Definition screen.cc:749
void BKE_region_callback_refresh_tag_gizmomap_set(void(*callback)(wmGizmoMap *))
Definition screen.cc:482
void BKE_screen_runtime_refresh_for_blendfile(bScreen *screen)
Definition screen.cc:502
float BKE_screen_view3d_zoom_to_fac(float camzoom)
Definition screen.cc:1039
Panel * BKE_panel_new(PanelType *panel_type)
Definition screen.cc:546
void BKE_screen_view3d_shading_init(View3DShading *shading)
Definition screen.cc:1017
ARegion * BKE_area_find_region_type(const ScrArea *area, int region_type)
Definition screen.cc:846
ScrArea * BKE_screen_find_area_xy(const bScreen *screen, const int spacetype, const int xy[2])
Definition screen.cc:981
ARegion * BKE_area_region_copy(const SpaceType *st, const ARegion *region)
Definition screen.cc:350
void BKE_screen_view3d_sync(View3D *v3d, Scene *scene)
Definition screen.cc:986
ScrArea * BKE_screen_find_area_from_space(const bScreen *screen, const SpaceLink *sl)
Definition screen.cc:913
static void direct_link_area(BlendDataReader *reader, ScrArea *area)
Definition screen.cc:1351
static void write_uilist(BlendWriter *writer, uiList *ui_list)
Definition screen.cc:1143
void BKE_area_region_panels_free(ListBase *panels)
Definition screen.cc:585
static void screen_foreach_id(ID *id, LibraryForeachIDData *data)
Definition screen.cc:110
ARegion * BKE_spacedata_find_region_type(const SpaceLink *slink, const ScrArea *area, int region_type)
Definition screen.cc:437
void BKE_screen_view3d_do_versions_250(View3D *v3d, ListBase *regions)
Definition screen.cc:1329
static void screen_blend_read_after_liblink(BlendLibReader *reader, ID *id)
Definition screen.cc:165
void BKE_screen_free_data(bScreen *screen)
Definition screen.cc:665
static void direct_link_region(BlendDataReader *reader, ARegion *region, int spacetype)
Definition screen.cc:1262
void BKE_screen_foreach_id_screen_area(LibraryForeachIDData *data, ScrArea *area)
Definition screen.cc:97
static void panel_list_copy(ListBase *newlb, const ListBase *lb)
Definition screen.cc:325
static void screen_free_data(ID *id)
Definition screen.cc:72
#define min(a, b)
Definition sort.cc:36
void(* free)(ARegion *)
void *(* duplicate)(void *poin)
void * regiondata
struct ARegion * prev
ListBase panels_category_active
ListBase ui_previews
ARegionRuntimeHandle * runtime
struct ARegion * next
ListBase panels
ListBase ui_lists
ListBase view_states
Definition DNA_ID.h:414
char name[258]
Definition DNA_ID.h:432
void * last
void * first
char idname[BKE_ST_MAXNAME]
struct PanelType * type
ListBase layout_panel_states
struct Panel_Runtime * runtime
uint32_t layout_panel_states_clock
void * activedata
short runtime_flag
char * drawname
char panelname[64]
ListBase children
struct SmoothView3DStore * sms
struct ViewRender * view_render
struct RegionView3D * localvd
struct wmTimer * smooth_timer
struct BoundBox * clipbb
struct Object * camera
ListBase vertbase
ListBase edgebase
ListBase areabase
struct bToolRef * tool
ListBase handlers
ScrVert * v2
ListBase actionzones
ScrVert * v3
ListBase spacedata
short region_active_win
struct SpaceType * type
bScreen * full
ScrArea_Runtime runtime
ScrVert * v1
ListBase regionbase
ScrGlobalAreaData * global
ScrVert * v4
ScrVert * v1
struct ScrEdge * next
ScrVert * v2
struct ScrVert * next
struct ScrVert * newv
ListBase regiontypes
SpaceLink *(* duplicate)(SpaceLink *sl)
void(* free)(SpaceLink *sl)
Definition BKE_screen.hh:95
void(* blend_read_data)(BlendDataReader *reader, SpaceLink *space_link)
void(* blend_read_after_liblink)(BlendLibReader *reader, ID *parent_id, SpaceLink *space_link)
~SpaceType()
Definition screen.cc:223
char name[BKE_ST_MAXNAME]
Definition BKE_screen.hh:83
void(* blend_write)(BlendWriter *writer, SpaceLink *space_link)
void(* foreach_id)(SpaceLink *space_link, LibraryForeachIDData *data)
char alpha_vert
struct SmoothView2DStore * sms
struct IDProperty * prop
struct Object * camera
short gridsubdiv
struct View3D * localvd
short scenelock
ListBase regionbase
ListBase edgebase
PreviewImage * preview
ListBase regionbase
struct wmTooltipState * tool_tip
ListBase vertbase
struct wmTimer * animtimer
ListBase areabase
struct ARegion * active_region
IDProperty * properties
short y
short x
#define N_(msgid)
int xy[2]
Definition wm_draw.cc:178
PointerRNA * ptr
Definition wm_files.cc:4238
uint8_t flag
Definition wm_window.cc:145