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