Blender  V3.3
light.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 <stdlib.h>
9 
10 #include "MEM_guardedalloc.h"
11 
12 /* Allow using deprecated functionality for .blend file I/O. */
13 #define DNA_DEPRECATED_ALLOW
14 
15 #include "DNA_anim_types.h"
16 #include "DNA_defaults.h"
17 #include "DNA_light_types.h"
18 #include "DNA_material_types.h"
19 #include "DNA_node_types.h"
20 #include "DNA_object_types.h"
21 #include "DNA_scene_types.h"
22 #include "DNA_texture_types.h"
23 
24 #include "BLI_math.h"
25 #include "BLI_utildefines.h"
26 
27 #include "BKE_anim_data.h"
28 #include "BKE_colortools.h"
29 #include "BKE_icons.h"
30 #include "BKE_idtype.h"
31 #include "BKE_lib_id.h"
32 #include "BKE_lib_query.h"
33 #include "BKE_light.h"
34 #include "BKE_main.h"
35 #include "BKE_node.h"
36 
37 #include "BLT_translation.h"
38 
39 #include "DEG_depsgraph.h"
40 
41 #include "BLO_read_write.h"
42 
43 static void light_init_data(ID *id)
44 {
45  Light *la = (Light *)id;
47 
49 
50  la->curfalloff = BKE_curvemapping_add(1, 0.0f, 1.0f, 1.0f, 0.0f);
52 }
53 
64 static void light_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag)
65 {
66  Light *la_dst = (Light *)id_dst;
67  const Light *la_src = (const Light *)id_src;
68 
69  const bool is_localized = (flag & LIB_ID_CREATE_LOCAL) != 0;
70  /* We always need allocation of our private ID data. */
71  const int flag_private_id_data = flag & ~LIB_ID_CREATE_NO_ALLOCATE;
72 
73  la_dst->curfalloff = BKE_curvemapping_copy(la_src->curfalloff);
74 
75  if (la_src->nodetree) {
76  if (is_localized) {
77  la_dst->nodetree = ntreeLocalize(la_src->nodetree);
78  }
79  else {
81  bmain, (ID *)la_src->nodetree, (ID **)&la_dst->nodetree, flag_private_id_data);
82  }
83  }
84 
85  if ((flag & LIB_ID_COPY_NO_PREVIEW) == 0) {
86  BKE_previewimg_id_copy(&la_dst->id, &la_src->id);
87  }
88  else {
89  la_dst->preview = NULL;
90  }
91 }
92 
93 static void light_free_data(ID *id)
94 {
95  Light *la = (Light *)id;
96 
98 
99  /* is no lib link block, but light extension */
100  if (la->nodetree) {
102  MEM_freeN(la->nodetree);
103  la->nodetree = NULL;
104  }
105 
107  BKE_icon_id_delete(&la->id);
108  la->id.icon_id = 0;
109 }
110 
112 {
113  Light *lamp = (Light *)id;
114  if (lamp->nodetree) {
115  /* nodetree **are owned by IDs**, treat them as mere sub-data and not real ID! */
118  }
119 }
120 
121 static void light_blend_write(BlendWriter *writer, ID *id, const void *id_address)
122 {
123  Light *la = (Light *)id;
124 
125  /* write LibData */
126  BLO_write_id_struct(writer, Light, id_address, &la->id);
127  BKE_id_blend_write(writer, &la->id);
128 
129  if (la->adt) {
130  BKE_animdata_blend_write(writer, la->adt);
131  }
132 
133  if (la->curfalloff) {
135  }
136 
137  /* Node-tree is integral part of lights, no libdata. */
138  if (la->nodetree) {
139  BLO_write_struct(writer, bNodeTree, la->nodetree);
140  ntreeBlendWrite(writer, la->nodetree);
141  }
142 
143  BKE_previewimg_blend_write(writer, la->preview);
144 }
145 
146 static void light_blend_read_data(BlendDataReader *reader, ID *id)
147 {
148  Light *la = (Light *)id;
149  BLO_read_data_address(reader, &la->adt);
150  BKE_animdata_blend_read_data(reader, la->adt);
151 
152  BLO_read_data_address(reader, &la->curfalloff);
153  if (la->curfalloff) {
155  }
156 
157  BLO_read_data_address(reader, &la->preview);
158  BKE_previewimg_blend_read(reader, la->preview);
159 }
160 
161 static void light_blend_read_lib(BlendLibReader *reader, ID *id)
162 {
163  Light *la = (Light *)id;
164  BLO_read_id_address(reader, la->id.lib, &la->ipo); // XXX deprecated - old animation system
165 }
166 
167 static void light_blend_read_expand(BlendExpander *expander, ID *id)
168 {
169  Light *la = (Light *)id;
170  BLO_expand(expander, la->ipo); // XXX deprecated - old animation system
171 }
172 
174  .id_code = ID_LA,
175  .id_filter = FILTER_ID_LA,
176  .main_listbase_index = INDEX_ID_LA,
177  .struct_size = sizeof(Light),
178  .name = "Light",
179  .name_plural = "lights",
180  .translation_context = BLT_I18NCONTEXT_ID_LIGHT,
182  .asset_type_info = NULL,
183 
185  .copy_data = light_copy_data,
186  .free_data = light_free_data,
187  .make_local = NULL,
188  .foreach_id = light_foreach_id,
189  .foreach_cache = NULL,
190  .foreach_path = NULL,
191  .owner_get = NULL,
192 
193  .blend_write = light_blend_write,
194  .blend_read_data = light_blend_read_data,
195  .blend_read_lib = light_blend_read_lib,
196  .blend_read_expand = light_blend_read_expand,
197 
198  .blend_read_undo_preserve = NULL,
199 
200  .lib_override_apply_post = NULL,
201 };
202 
203 Light *BKE_light_add(Main *bmain, const char *name)
204 {
205  Light *la;
206 
207  la = BKE_id_new(bmain, ID_LA, name);
208 
209  return la;
210 }
211 
213 {
214  DEG_debug_print_eval(depsgraph, __func__, la->id.name, la);
215 }
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_curvemapping_init(struct CurveMapping *cumap)
Definition: colortools.c:1235
struct CurveMapping * BKE_curvemapping_copy(const struct CurveMapping *cumap)
void BKE_curvemapping_blend_read(struct BlendDataReader *reader, struct CurveMapping *cumap)
Definition: colortools.c:1300
void BKE_curvemapping_blend_write(struct BlendWriter *writer, const struct CurveMapping *cumap)
void BKE_curvemapping_free(struct CurveMapping *cumap)
Definition: colortools.c:103
struct CurveMapping * BKE_curvemapping_add(int tot, float minx, float miny, float maxx, float maxy)
Definition: colortools.c:72
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
General operations, lookup, etc. for blender lights.
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
#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_LIGHT
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_LA
Definition: DNA_ID.h:1033
#define FILTER_ID_LA
Definition: DNA_ID.h:907
@ ID_LA
Definition: DNA_ID_enums.h:55
#define DNA_struct_default_get(struct_name)
Definition: DNA_defaults.h:29
struct Light Light
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
Light lamp
const Depsgraph * depsgraph
static void light_blend_read_expand(BlendExpander *expander, ID *id)
Definition: light.c:167
static void light_foreach_id(ID *id, LibraryForeachIDData *data)
Definition: light.c:111
Light * BKE_light_add(Main *bmain, const char *name)
Definition: light.c:203
void BKE_light_eval(struct Depsgraph *depsgraph, Light *la)
Definition: light.c:212
IDTypeInfo IDType_ID_LA
Definition: light.c:173
static void light_blend_read_data(BlendDataReader *reader, ID *id)
Definition: light.c:146
static void light_blend_read_lib(BlendLibReader *reader, ID *id)
Definition: light.c:161
static void light_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition: light.c:121
static void light_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag)
Definition: light.c:64
static void light_free_data(ID *id)
Definition: light.c:93
static void light_init_data(ID *id)
Definition: light.c:43
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
short id_code
Definition: BKE_idtype.h:114
Definition: DNA_ID.h:368
struct Library * lib
Definition: DNA_ID.h:372
int icon_id
Definition: DNA_ID.h:389
char name[66]
Definition: DNA_ID.h:378
struct PreviewImage * preview
struct AnimData * adt
struct CurveMapping * curfalloff
struct bNodeTree * nodetree
Definition: BKE_main.h:121