惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
D
Docker
J
Java Code Geeks
腾讯CDC
Blog — PlanetScale
Blog — PlanetScale
G
Google Developers Blog
M
MIT News - Artificial intelligence
L
LangChain Blog
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
博客园 - Franky
GbyAI
GbyAI
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
N
Netflix TechBlog - Medium
B
Blog RSS Feed
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News

博客园 - 平凡人

std::atomic linux学习-目录 C++设计模式--PIMPL c++的RAII C++技术之---标准容器的值语义 blender学习系列之--CLOG Blender中的DNA QT元对象系统(Meta-Object System) Blender内存管理库(bf_intern_guardedalloc) IDA\Windbg调试 - 平凡人 - 博客园 IOCTL(CTL_CODE) 内核开发速查表 Blender中的事件处理器 Blender:SDNA QT信号和槽 利用QEventLoop实现同步等待信号槽返回结果 Blender文档翻译:Operators tutorial(操作教程) Blender文档翻译:Operators Blender文档翻译:RNA Blender文档翻译-Blender库数据的通用属性
Blender文档翻译:ID Datablocks(ID数据块)
平凡人 · 2020-10-24 · via 博客园 - 平凡人

   ID数据块

源文为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数据块是否是场景。

 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,
};

添加新ID类型

     要添加新的IDTypeInfo需要:

  1、在相关的BKE实现文件(如:mesh.c定义ID_ME,等等)定义IDTypeInfo.

    • 将static callbacks(回调函数)和IDTypeInfo结构放在这些文件的开头。
    • 如果您需要额外的帮助器,那么只需要将它们的forward声明放在那里,并在IDTypeInfo定义之后实现它们。 这使得每个ID类型实现文件的公共信息和特定API之间能够保持一致的清晰分离。
    • IDTypeInfo应该从其idcode命名开始(例如:object的IDType_ID_OB)。

  2、在BKE_IDType.h中添加新IDType的 extern声明

  3、在idtype.c的id_type_init()中注册新的IDTypeInfo。

处理ID类型的函数

     有许多函数可以用来帮助处理ID数据块。把它们列在这里肯定会过时的,你只要通读BKE_idtype.h。