Blender  V3.3
world.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2001-2002 NaN Holding BV. All rights reserved. */
3 
8 #include <math.h>
9 #include <stdlib.h>
10 #include <string.h>
11 
12 #include "MEM_guardedalloc.h"
13 
14 /* Allow using deprecated functionality for .blend file I/O. */
15 #define DNA_DEPRECATED_ALLOW
16 
17 #include "DNA_defaults.h"
18 #include "DNA_scene_types.h"
19 #include "DNA_texture_types.h"
20 #include "DNA_world_types.h"
21 
22 #include "BLI_listbase.h"
23 #include "BLI_utildefines.h"
24 
25 #include "BKE_anim_data.h"
26 #include "BKE_icons.h"
27 #include "BKE_idtype.h"
28 #include "BKE_lib_id.h"
29 #include "BKE_lib_query.h"
30 #include "BKE_main.h"
31 #include "BKE_node.h"
32 #include "BKE_world.h"
33 
34 #include "BLT_translation.h"
35 
36 #include "DRW_engine.h"
37 
38 #include "DEG_depsgraph.h"
39 
40 #include "GPU_material.h"
41 
42 #include "BLO_read_write.h"
43 
45 static void world_free_data(ID *id)
46 {
47  World *wrld = (World *)id;
48 
50 
51  /* is no lib link block, but world extension */
52  if (wrld->nodetree) {
54  MEM_freeN(wrld->nodetree);
55  wrld->nodetree = NULL;
56  }
57 
59 
60  BKE_icon_id_delete((struct ID *)wrld);
62 
64 }
65 
66 static void world_init_data(ID *id)
67 {
68  World *wrld = (World *)id;
70 
72 }
73 
84 static void world_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag)
85 {
86  World *wrld_dst = (World *)id_dst;
87  const World *wrld_src = (const World *)id_src;
88 
89  const bool is_localized = (flag & LIB_ID_CREATE_LOCAL) != 0;
90  /* We always need allocation of our private ID data. */
91  const int flag_private_id_data = flag & ~LIB_ID_CREATE_NO_ALLOCATE;
92 
93  if (wrld_src->nodetree) {
94  if (is_localized) {
95  wrld_dst->nodetree = ntreeLocalize(wrld_src->nodetree);
96  }
97  else {
99  bmain, (ID *)wrld_src->nodetree, (ID **)&wrld_dst->nodetree, flag_private_id_data);
100  }
101  }
102 
103  BLI_listbase_clear(&wrld_dst->gpumaterial);
104  BLI_listbase_clear((ListBase *)&wrld_dst->drawdata);
105 
106  if ((flag & LIB_ID_COPY_NO_PREVIEW) == 0) {
107  BKE_previewimg_id_copy(&wrld_dst->id, &wrld_src->id);
108  }
109  else {
110  wrld_dst->preview = NULL;
111  }
112 
113  if (wrld_src->lightgroup) {
114  wrld_dst->lightgroup = (LightgroupMembership *)MEM_dupallocN(wrld_src->lightgroup);
115  }
116 }
117 
119 {
120  World *world = (World *)id;
121 
122  if (world->nodetree) {
123  /* nodetree **are owned by IDs**, treat them as mere sub-data and not real ID! */
126  }
127 }
128 
129 static void world_blend_write(BlendWriter *writer, ID *id, const void *id_address)
130 {
131  World *wrld = (World *)id;
132 
133  /* Clean up, important in undo case to reduce false detection of changed datablocks. */
135 
136  /* write LibData */
137  BLO_write_id_struct(writer, World, id_address, &wrld->id);
138  BKE_id_blend_write(writer, &wrld->id);
139 
140  if (wrld->adt) {
141  BKE_animdata_blend_write(writer, wrld->adt);
142  }
143 
144  /* nodetree is integral part of world, no libdata */
145  if (wrld->nodetree) {
146  BLO_write_struct(writer, bNodeTree, wrld->nodetree);
147  ntreeBlendWrite(writer, wrld->nodetree);
148  }
149 
150  BKE_previewimg_blend_write(writer, wrld->preview);
151 
152  if (wrld->lightgroup) {
154  }
155 }
156 
157 static void world_blend_read_data(BlendDataReader *reader, ID *id)
158 {
159  World *wrld = (World *)id;
160  BLO_read_data_address(reader, &wrld->adt);
161  BKE_animdata_blend_read_data(reader, wrld->adt);
162 
163  BLO_read_data_address(reader, &wrld->preview);
164  BKE_previewimg_blend_read(reader, wrld->preview);
166 
167  BLO_read_data_address(reader, &wrld->lightgroup);
168 }
169 
170 static void world_blend_read_lib(BlendLibReader *reader, ID *id)
171 {
172  World *wrld = (World *)id;
173  BLO_read_id_address(reader, wrld->id.lib, &wrld->ipo); /* XXX deprecated, old animation system */
174 }
175 
176 static void world_blend_read_expand(BlendExpander *expander, ID *id)
177 {
178  World *wrld = (World *)id;
179  BLO_expand(expander, wrld->ipo); /* XXX deprecated, old animation system */
180 }
181 
183  .id_code = ID_WO,
184  .id_filter = FILTER_ID_WO,
185  .main_listbase_index = INDEX_ID_WO,
186  .struct_size = sizeof(World),
187  .name = "World",
188  .name_plural = "worlds",
189  .translation_context = BLT_I18NCONTEXT_ID_WORLD,
191  .asset_type_info = NULL,
192 
194  .copy_data = world_copy_data,
195  .free_data = world_free_data,
196  .make_local = NULL,
197  .foreach_id = world_foreach_id,
198  .foreach_cache = NULL,
199  .foreach_path = NULL,
200  .owner_get = NULL,
201 
202  .blend_write = world_blend_write,
203  .blend_read_data = world_blend_read_data,
204  .blend_read_lib = world_blend_read_lib,
205  .blend_read_expand = world_blend_read_expand,
206 
207  .blend_read_undo_preserve = NULL,
208 
209  .lib_override_apply_post = NULL,
210 };
211 
212 World *BKE_world_add(Main *bmain, const char *name)
213 {
214  World *wrld;
215 
216  wrld = BKE_id_new(bmain, ID_WO, name);
217 
218  return wrld;
219 }
220 
222 {
225 }
void BKE_animdata_blend_read_data(struct BlendDataReader *reader, struct AnimData *adt)
Definition: anim_data.c:1443
void BKE_animdata_blend_write(struct BlendWriter *writer, struct AnimData *adt)
Definition: anim_data.c:1421
void BKE_icon_id_delete(struct ID *id)
Definition: icons.cc:870
void BKE_previewimg_free(struct PreviewImage **prv)
Definition: icons.cc:283
void BKE_previewimg_id_copy(struct ID *new_id, const struct ID *old_id)
void BKE_previewimg_blend_read(struct BlendDataReader *reader, struct PreviewImage *prv)
Definition: icons.cc:615
void BKE_previewimg_blend_write(struct BlendWriter *writer, const struct PreviewImage *prv)
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
Definition: BKE_idtype.h:39
@ LIB_ID_CREATE_NO_ALLOCATE
Definition: BKE_lib_id.h:130
@ LIB_ID_COPY_NO_PREVIEW
Definition: BKE_lib_id.h:150
@ LIB_ID_CREATE_LOCAL
Definition: BKE_lib_id.h:139
struct ID * BKE_id_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, int flag)
void BKE_id_blend_write(struct BlendWriter *writer, struct ID *id)
Definition: lib_id.c:2008
void * BKE_id_new(struct Main *bmain, short type, const char *name)
Definition: lib_id.c:1159
#define BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(_data, _func_call)
void BKE_library_foreach_ID_embedded(struct LibraryForeachIDData *data, struct ID **id_pp)
Definition: lib_query.c:147
void ntreeBlendWrite(struct BlendWriter *writer, struct bNodeTree *ntree)
Definition: node.cc:519
void ntreeFreeEmbeddedTree(struct bNodeTree *ntree)
Definition: node.cc:3112
#define BLI_assert(a)
Definition: BLI_assert.h:46
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:273
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
#define BLO_read_data_address(reader, ptr_p)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_id_address(reader, lib, id_ptr_p)
#define BLO_expand(expander, id)
#define BLT_I18NCONTEXT_ID_WORLD
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:35
void DEG_debug_print_eval(struct Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address)
@ INDEX_ID_WO
Definition: DNA_ID.h:1014
#define FILTER_ID_WO
Definition: DNA_ID.h:925
@ ID_WO
Definition: DNA_ID_enums.h:59
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
struct World World
void DRW_drawdata_free(struct ID *id)
Definition: draw_manager.c:911
void GPU_material_free(struct ListBase *gpumaterial)
Definition: gpu_material.c:171
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
static void init_data(ModifierData *md)
World world
const Depsgraph * depsgraph
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:28
short id_code
Definition: BKE_idtype.h:114
Definition: DNA_ID.h:368
struct Library * lib
Definition: DNA_ID.h:372
char name[66]
Definition: DNA_ID.h:378
Definition: BKE_main.h:121
struct bNodeTree * nodetree
struct LightgroupMembership * lightgroup
struct PreviewImage * preview
DrawDataList drawdata
ListBase gpumaterial
struct AnimData * adt
static void world_blend_read_expand(BlendExpander *expander, ID *id)
Definition: world.c:176
static void world_blend_read_lib(BlendLibReader *reader, ID *id)
Definition: world.c:170
void BKE_world_eval(struct Depsgraph *depsgraph, World *world)
Definition: world.c:221
static void world_free_data(ID *id)
Definition: world.c:45
World * BKE_world_add(Main *bmain, const char *name)
Definition: world.c:212
static void world_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition: world.c:129
static void world_blend_read_data(BlendDataReader *reader, ID *id)
Definition: world.c:157
IDTypeInfo IDType_ID_WO
Definition: world.c:182
static void world_foreach_id(ID *id, LibraryForeachIDData *data)
Definition: world.c:118
static void world_init_data(ID *id)
Definition: world.c:66
static void world_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag)
Definition: world.c:84