Blender V4.5
idtype.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include <array>
10#include <cstring>
11
12#include "BLI_ghash.h"
13#include "BLI_utildefines.h"
14
15#include "BLT_translation.hh"
16
17#include "DNA_ID.h"
19#include "DNA_node_types.h"
20#include "DNA_scene_types.h"
21
22#include "BKE_node.hh"
23
24#include "BKE_idtype.hh"
25
26// static CLG_LogRef LOG = {"bke.idtype"};
27
29{
30 const IDCacheKey *key = static_cast<const IDCacheKey *>(key_v);
33 return uint(hash);
34}
35
36bool BKE_idtype_cache_key_cmp(const void *key_a_v, const void *key_b_v)
37{
38 const IDCacheKey *key_a = static_cast<const IDCacheKey *>(key_a_v);
39 const IDCacheKey *key_b = static_cast<const IDCacheKey *>(key_b_v);
40 return (key_a->id_session_uid != key_b->id_session_uid) ||
41 (key_a->identifier != key_b->identifier);
42}
43
44static std::array<IDTypeInfo *, INDEX_ID_MAX> id_types;
45
46static void id_type_init()
47{
48 int init_types_num = 0;
49
50#define INIT_TYPE(_id_code) \
51 { \
52 BLI_assert(IDType_##_id_code.main_listbase_index == INDEX_##_id_code); \
53 id_types[INDEX_##_id_code] = &IDType_##_id_code; \
54 init_types_num++; \
55 } \
56 (void)0
57
98
99 /* Special case. */
102 init_types_num++;
103
104 BLI_assert_msg(init_types_num == INDEX_ID_MAX, "Some IDTypeInfo initialization is missing");
105 UNUSED_VARS_NDEBUG(init_types_num);
106
107 { /* Inspect which ID types can be animated, so that IDType_ID_AC.dependencies_id_types can be
108 * set to include those. The runtime ID* cache of #animrig::Slot will point to any
109 * ID that is animated by it, and thus can point to any animatable ID type. */
110 IDType_ID_AC.dependencies_id_types = 0;
111 for (const IDTypeInfo *id_type : id_types) {
112 const bool is_animatable = (id_type->flags & IDTYPE_FLAGS_NO_ANIMDATA) == 0;
113 if (is_animatable) {
114 IDType_ID_AC.dependencies_id_types |= id_type->id_filter;
115 }
116 }
117 }
118
119#undef INIT_TYPE
120}
121
123{
124 /* Initialize data-block types. */
125 id_type_init();
126}
127
129{
130 if (idtype_index >= 0 && idtype_index < int(id_types.size())) {
131 const IDTypeInfo *id_type = id_types[size_t(idtype_index)];
132 if (id_type && id_type->name[0] != '\0') {
133 BLI_assert_msg(BKE_idtype_idcode_to_index(id_type->id_code) == idtype_index,
134 "Critical inconsistency in ID type information");
135 return id_type;
136 }
137 }
138
139 return nullptr;
140}
141
146
151
152static const IDTypeInfo *idtype_get_info_from_name(const char *idtype_name)
153{
154 for (const IDTypeInfo *id_type : id_types) {
155 if (id_type && STREQ(idtype_name, id_type->name)) {
156 return id_type;
157 }
158 }
159
160 return nullptr;
161}
162
163/* Various helpers/wrappers around #IDTypeInfo structure. */
164
165const char *BKE_idtype_idcode_to_name(const short idcode)
166{
167 const IDTypeInfo *id_type = BKE_idtype_get_info_from_idcode(idcode);
168 BLI_assert(id_type != nullptr);
169 return id_type != nullptr ? id_type->name : nullptr;
170}
171
172const char *BKE_idtype_idcode_to_name_plural(const short idcode)
173{
174 const IDTypeInfo *id_type = BKE_idtype_get_info_from_idcode(idcode);
175 BLI_assert(id_type != nullptr);
176 return id_type != nullptr ? id_type->name_plural : nullptr;
177}
178
179const char *BKE_idtype_idcode_to_translation_context(const short idcode)
180{
181 const IDTypeInfo *id_type = BKE_idtype_get_info_from_idcode(idcode);
182 BLI_assert(id_type != nullptr);
183 return id_type != nullptr ? id_type->translation_context : BLT_I18NCONTEXT_DEFAULT;
184}
185
186short BKE_idtype_idcode_from_name(const char *idtype_name)
187{
188 const IDTypeInfo *id_type = idtype_get_info_from_name(idtype_name);
189 BLI_assert(id_type);
190 return id_type != nullptr ? id_type->id_code : 0;
191}
192
193bool BKE_idtype_idcode_is_valid(const short idcode)
194{
195 return BKE_idtype_get_info_from_idcode(idcode) != nullptr ? true : false;
196}
197
198bool BKE_idtype_idcode_is_linkable(const short idcode)
199{
200 const IDTypeInfo *id_type = BKE_idtype_get_info_from_idcode(idcode);
201 BLI_assert(id_type != nullptr);
202 return id_type != nullptr ? (id_type->flags & IDTYPE_FLAGS_NO_LIBLINKING) == 0 : false;
203}
204
206{
207 const IDTypeInfo *id_type = BKE_idtype_get_info_from_idcode(idcode);
208 BLI_assert(id_type != nullptr);
209 if (id_type != nullptr && (id_type->flags & IDTYPE_FLAGS_ONLY_APPEND) != 0) {
210 /* Only appendable ID types should also always be linkable. */
212 return true;
213 }
214 return false;
215}
216
218{
219 const IDTypeInfo *id_type = BKE_idtype_get_info_from_idcode(idcode);
220 BLI_assert(id_type != nullptr);
221 if (id_type != nullptr && (id_type->flags & IDTYPE_FLAGS_APPEND_IS_REUSABLE) != 0) {
222 /* All appendable ID types should also always be linkable. */
224 return true;
225 }
226 return false;
227}
228
229int BKE_idtype_idcode_to_index(const short idcode)
230{
231#define CASE_IDINDEX(_id) \
232 case ID_##_id: \
233 return INDEX_ID_##_id
234
235 switch ((ID_Type)idcode) {
236 CASE_IDINDEX(AC);
237 CASE_IDINDEX(AR);
239 CASE_IDINDEX(CA);
240 CASE_IDINDEX(CF);
241 CASE_IDINDEX(CU_LEGACY);
242 CASE_IDINDEX(GD_LEGACY);
243 CASE_IDINDEX(GP);
244 CASE_IDINDEX(GR);
246 CASE_IDINDEX(IM);
247 CASE_IDINDEX(IP);
248 CASE_IDINDEX(KE);
249 CASE_IDINDEX(LA);
250 CASE_IDINDEX(LI);
251 CASE_IDINDEX(LS);
253 CASE_IDINDEX(MA);
254 CASE_IDINDEX(MB);
255 CASE_IDINDEX(MC);
256 CASE_IDINDEX(ME);
257 CASE_IDINDEX(MSK);
258 CASE_IDINDEX(NT);
259 CASE_IDINDEX(OB);
260 CASE_IDINDEX(PA);
261 CASE_IDINDEX(PAL);
262 CASE_IDINDEX(PC);
263 CASE_IDINDEX(PT);
264 CASE_IDINDEX(LP);
265 CASE_IDINDEX(SCE);
266 CASE_IDINDEX(SCR);
267 CASE_IDINDEX(SPK);
268 CASE_IDINDEX(SO);
269 CASE_IDINDEX(TE);
270 CASE_IDINDEX(TXT);
271 CASE_IDINDEX(VF);
272 CASE_IDINDEX(VO);
273 CASE_IDINDEX(WM);
274 CASE_IDINDEX(WO);
275 CASE_IDINDEX(WS);
276 }
277
278 /* Special naughty boy... */
279 if (idcode == ID_LINK_PLACEHOLDER) {
280 return INDEX_ID_NULL;
281 }
282
283 return -1;
284
285#undef CASE_IDINDEX
286}
287
289{
290#define CASE_IDINDEX(_id) \
291 case FILTER_ID_##_id: \
292 return INDEX_ID_##_id
293
294 switch (id_filter) {
295 CASE_IDINDEX(AC);
296 CASE_IDINDEX(AR);
298 CASE_IDINDEX(CA);
299 CASE_IDINDEX(CF);
300 CASE_IDINDEX(CU_LEGACY);
301 CASE_IDINDEX(GD_LEGACY);
302 CASE_IDINDEX(GP);
303 CASE_IDINDEX(GR);
305 CASE_IDINDEX(IM);
306 CASE_IDINDEX(IP);
307 CASE_IDINDEX(KE);
308 CASE_IDINDEX(LA);
309 CASE_IDINDEX(LI);
310 CASE_IDINDEX(LS);
312 CASE_IDINDEX(MA);
313 CASE_IDINDEX(MB);
314 CASE_IDINDEX(MC);
315 CASE_IDINDEX(ME);
316 CASE_IDINDEX(MSK);
317 CASE_IDINDEX(NT);
318 CASE_IDINDEX(OB);
319 CASE_IDINDEX(PA);
320 CASE_IDINDEX(PAL);
321 CASE_IDINDEX(PC);
322 CASE_IDINDEX(PT);
323 CASE_IDINDEX(LP);
324 CASE_IDINDEX(SCE);
325 CASE_IDINDEX(SCR);
326 CASE_IDINDEX(SPK);
327 CASE_IDINDEX(SO);
328 CASE_IDINDEX(TE);
329 CASE_IDINDEX(TXT);
330 CASE_IDINDEX(VF);
331 CASE_IDINDEX(VO);
332 CASE_IDINDEX(WM);
333 CASE_IDINDEX(WO);
334 CASE_IDINDEX(WS);
335 }
336
337 /* No handling of #ID_LINK_PLACEHOLDER or #INDEX_ID_NULL here. */
338
339 return -1;
340
341#undef CASE_IDINDEX
342}
343
344short BKE_idtype_index_to_idcode(const int idtype_index)
345{
346 const IDTypeInfo *id_type = BKE_idtype_get_info_from_idtype_index(idtype_index);
347 if (id_type) {
348 return id_type->id_code;
349 }
350
352 return -1;
353}
354
356{
357 const IDTypeInfo *id_type = BKE_idtype_get_info_from_idtype_index(idtype_index);
358 if (id_type) {
359 return id_type->id_filter;
360 }
361
363 return 0;
364}
365
370
375
376short BKE_idtype_idcode_iter_step(int *idtype_index)
377{
378 return (*idtype_index < int(id_types.size())) ? BKE_idtype_index_to_idcode((*idtype_index)++) :
379 0;
380}
381
383 IDTypeForeachCacheFunctionCallback function_callback,
384 void *user_data)
385{
386 const IDTypeInfo *type_info = BKE_idtype_get_info_from_id(id);
387 if (type_info->foreach_cache != nullptr) {
388 type_info->foreach_cache(id, function_callback, user_data);
389 }
390
391 /* Handle 'private IDs'. */
393 if (nodetree != nullptr) {
394 type_info = BKE_idtype_get_info_from_id(&nodetree->id);
395 if (type_info == nullptr) {
396 /* Very old .blend file seem to have empty names for their embedded node trees, see
397 * `blo_do_versions_250()`. Assume those are node-trees then. */
399 }
400 if (type_info->foreach_cache != nullptr) {
401 type_info->foreach_cache(&nodetree->id, function_callback, user_data);
402 }
403 }
404
405 if (GS(id->name) == ID_SCE) {
406 Scene *scene = (Scene *)id;
407 if (scene->master_collection != nullptr) {
409 if (type_info->foreach_cache != nullptr) {
410 type_info->foreach_cache(&scene->master_collection->id, function_callback, user_data);
411 }
412 }
413 }
414}
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
Definition BKE_idtype.hh:44
@ IDTYPE_FLAGS_NO_ANIMDATA
Definition BKE_idtype.hh:46
@ IDTYPE_FLAGS_ONLY_APPEND
Definition BKE_idtype.hh:38
@ IDTYPE_FLAGS_NO_LIBLINKING
Definition BKE_idtype.hh:32
void(*)(ID *id, const IDCacheKey *cache_key, void **cache_p, uint flags, void *user_data) IDTypeForeachCacheFunctionCallback
IDTypeInfo IDType_ID_AC
IDTypeInfo IDType_ID_LINK_PLACEHOLDER
Definition lib_id.cc:89
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
size_t BLI_ghashutil_combine_hash(size_t hash_a, size_t hash_b)
unsigned int BLI_ghashutil_uinthash(unsigned int key)
unsigned int uint
#define UNUSED_VARS_NDEBUG(...)
#define STREQ(a, b)
#define BLT_I18NCONTEXT_DEFAULT
ID and Library types, which are fundamental for SDNA.
@ INDEX_ID_NULL
Definition DNA_ID.h:1266
ID_Type
@ ID_WM
@ ID_CA
@ ID_AR
@ ID_MC
@ ID_CF
@ ID_LI
@ ID_TE
@ ID_IM
@ ID_VO
@ ID_WS
@ ID_NT
@ ID_LA
@ ID_KE
@ ID_TXT
@ ID_SO
@ ID_SCE
@ ID_LS
@ ID_MSK
@ ID_CV
@ ID_PAL
@ ID_BR
@ ID_LP
@ ID_WO
@ ID_MA
@ ID_AC
@ ID_SCR
@ ID_CU_LEGACY
@ ID_GD_LEGACY
@ ID_VF
@ ID_ME
@ ID_IP
@ ID_GR
@ ID_SPK
@ ID_MB
@ ID_LT
@ ID_OB
@ ID_GP
@ ID_PA
@ ID_PT
@ ID_PC
Object groups, one object can be in many groups at once.
return true
#define BR
Definition boxpack_2d.cc:77
unsigned long long int uint64_t
#define ID_LINK_PLACEHOLDER
#define INDEX_ID_MAX
#define GS(a)
#define INIT_TYPE(_id_code)
#define CASE_IDINDEX(_id)
const IDTypeInfo * BKE_idtype_get_info_from_idtype_index(const int idtype_index)
Definition idtype.cc:128
const IDTypeInfo * BKE_idtype_get_info_from_idcode(const short id_code)
Definition idtype.cc:142
static void id_type_init()
Definition idtype.cc:46
const IDTypeInfo * BKE_idtype_get_info_from_id(const ID *id)
Definition idtype.cc:147
const char * BKE_idtype_idcode_to_name_plural(const short idcode)
Definition idtype.cc:172
const char * BKE_idtype_idcode_to_name(const short idcode)
Definition idtype.cc:165
bool BKE_idtype_cache_key_cmp(const void *key_a_v, const void *key_b_v)
Definition idtype.cc:36
const char * BKE_idtype_idcode_to_translation_context(const short idcode)
Definition idtype.cc:179
bool BKE_idtype_idcode_is_only_appendable(const short idcode)
Definition idtype.cc:205
bool BKE_idtype_idcode_is_linkable(const short idcode)
Definition idtype.cc:198
bool BKE_idtype_idcode_is_valid(const short idcode)
Definition idtype.cc:193
static const IDTypeInfo * idtype_get_info_from_name(const char *idtype_name)
Definition idtype.cc:152
void BKE_idtype_init()
Definition idtype.cc:122
int BKE_idtype_idfilter_to_index(const uint64_t id_filter)
Definition idtype.cc:288
void BKE_idtype_id_foreach_cache(ID *id, IDTypeForeachCacheFunctionCallback function_callback, void *user_data)
Definition idtype.cc:382
short BKE_idtype_idcode_from_name(const char *idtype_name)
Definition idtype.cc:186
short BKE_idtype_idfilter_to_idcode(const uint64_t idfilter)
Definition idtype.cc:371
bool BKE_idtype_idcode_append_is_reusable(const short idcode)
Definition idtype.cc:217
static std::array< IDTypeInfo *, INDEX_ID_MAX > id_types
Definition idtype.cc:44
short BKE_idtype_idcode_iter_step(int *idtype_index)
Definition idtype.cc:376
int BKE_idtype_idcode_to_index(const short idcode)
Definition idtype.cc:229
short BKE_idtype_index_to_idcode(const int idtype_index)
Definition idtype.cc:344
uint64_t BKE_idtype_index_to_idfilter(const int idtype_index)
Definition idtype.cc:355
uint BKE_idtype_cache_key_hash(const void *key_v)
Definition idtype.cc:28
uint64_t BKE_idtype_idcode_to_idfilter(const short idcode)
Definition idtype.cc:366
#define LT
bNodeTree * node_tree_from_id(ID *id)
Definition node.cc:4840
#define CV
#define hash
Definition noise_c.cc:154
unsigned int id_session_uid
Definition BKE_idtype.hh:74
size_t identifier
Definition BKE_idtype.hh:79
short id_code
const char * name
const char * name_plural
IDTypeForeachCacheFunction foreach_cache
uint64_t id_filter
uint32_t flags
const char * translation_context
Definition DNA_ID.h:404
char name[66]
Definition DNA_ID.h:415
struct Collection * master_collection