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