









源文为Blender官方文档:ID Datablocks
对象,网格,材质,场景,这些都是ID数据块的例子。 它们通常在DNA_{某种类型}_types.h头文件中定义。
ID数据块是以一组公共属性开始的内存块。 在C中,这被建模为一个结构,它嵌入ID类型的结构作为第一个字段。 如果它有动画数据的形式的动画数据结构,这必须是第二个字段。
typedef struct Mesh { ID id; struct AnimData *adt; … };
datablock的名称(pointer->id.name)对数据块的类型进行编码。 例如,在Blender用户界面中呈现的带有名称“Suzanne”的网格实际上在数据块中被命名为“MESuzanne”。 这可以用于将ID*id转换为正确的类型。 函数GS(name)可从这样的名称中获取并返回一个常量,该常量表明ID数据类型:if(GS(id->name)==ID_SC)...可以用来测试ID数据块是否是场景。
在2020年初之前,ID数据块的类型在Blender中被硬编码。 作为代码清理日工作的一部分,这些被转换为运行时数据结构(参见T73719)。 本节描述ID类型注册的新方法。
运行时类型信息存储在IDTypeInfo结构中。 这包含结构的元数据,以及指向一般操作(创建、复制、删除、make local等)的函数的指针。 这是此类结构的一个例子,本例是Objects:
IDTypeInfo IDType_ID_OB = { .id_code = ID_OB, .id_filter = FILTER_ID_OB, .main_listbase_index = INDEX_ID_OB, .struct_size = sizeof(Object), .name = "Object", .name_plural = "objects", .translation_context = BLT_I18NCONTEXT_ID_OBJECT, .flags = 0, .init_data = object_init_data, .copy_data = object_copy_data, .free_data = object_free_data, .make_local = object_make_local, };
要添加新的IDTypeInfo需要:
1、在相关的BKE实现文件(如:mesh.c定义ID_ME,等等)定义IDTypeInfo.
2、在BKE_IDType.h中添加新IDType的 extern声明
3、在idtype.c的id_type_init()中注册新的IDTypeInfo。
有许多函数可以用来帮助处理ID数据块。把它们列在这里肯定会过时的,你只要通读BKE_idtype.h。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。