如何解读Blender的SDNA结构字段类型索引?

How to interpret Blender's SDNA structure field type index?

正如有人评论说不可能转储“.blend”文件的内容,我开始为“.blend”文件编写解析器 ;-) 到目前为止,我可以解析所有 文件块 SDNA。然而,当它要将文件块的数据读入相应的结构字段时,我 运行 陷入了一个我真的不知道如何解决的问题(由于缺乏适当的文档):

如果结构的第 n 个字段具有类型索引 i,我如何确定类型 i是结构递归,还是简单类型?

例如FileGlobal有一个字段short subversion,其中short的类型索引是2。显然short不是复合结构,但是如何解析器决定?

在我的解析器的 SDNA 中 STRC 索引 2 是 ListBase,而 TYPE 索引 2 是 short。显然类型索引在两个表中都有效,只是意义不同...

我的解析器是不是错了,或者有什么问题?作为参考,以下是我看到的 SDNA 的一些详细信息:

file-header: BLENDER version 279 little-endian 64-bit ptr
...
file-block: code DNA1 size 90700 addr 55b81c6e7c80 SDNA 0 count 1
SDNA: names 4291
SDNA: NAME #0=*next
SDNA: NAME #1=*prev
SDNA: NAME #2=*data
...
SDNA: types 706
SDNA: TYPE #0=char
SDNA: TYPE #1=uchar
SDNA: TYPE #2=short
...
SDNA: TLEN #0=1
SDNA: TLEN #1=1
SDNA: TLEN #2=2
...
SDNA: structures 621
SDNA: STRC #0=stype 12 nfields 2
...
SDNA: STRC #2=stype 14 nfields 2
SDNA: STRC  field #0=ftype 11 name 3
SDNA: STRC  field #1=ftype 11 name 4
...

见解?

由于还没有答案,我试着逐个回答我的问题(据我所知):

首先,文件块中给出的 SDNA 索引似乎是 STRC table 中类型 的 索引。然而,索引 0 处类型的 类型编号 是 12。固定偏移量 (12) 一直持续到索引 12,其中类型为 26。所以实际上你需要另一个 table (倒排索引)匹配类型数字到[=11中类型索引=] table.

由于table中的第一个类型号是12,前十二个类型号似乎用于这些原始类型:charucharshort, ushort, int, long, ulong, float, double, int64_t, uint64_t, void

但是 STRC 中不存在这些类型。所以类型 #2 不存在于倒排索引中,因此它必须是原始(非复合)类型。

不幸的是,上面的规则似乎有例外:STRC 中的 字段类型 不是(像 SDNA 索引一样)[=10= 的索引],而是一个类型的数字,所以你需要在那里使用倒排索引。当使用递归例程解码时(像我一样)例程必须知道处理的是“type index”还是“type number”。