如何解释Blender的SDNA结构域类型索引?

时间:2019-01-27 19:59:36

标签: field blender file-format

当有人评论说不可能转储“ .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
...

见解?

1 个答案:

答案 0 :(得分:-1)

由于目前还没有答案,我正在逐个回答我的问题(据我所知):

首先,文件块中给出的SDNA索引似乎是STRC表中类型的索引。但是,索引为0的类型的类型编号为12。该固定偏移量(12)一直持续到索引12,该类型为26。因此,实际上您需要另一个表(倒排索引< / em>),将类型编号STRC表中类型的索引匹配。

由于该表中的第一个类型编号为12,因此似乎前十二个类型编号用于以下原始类型:charucharshort,{{1} },ushortintlongulongfloatdoubleint64_tuint64_t < / p>

但是void中不存在这些类型。因此,类型2没有出现在倒排索引中,因此它必须是原始(非复合)类型。

不幸的是,上述规则似乎有例外:STRC中的字段类型不是(例如SDNA索引)索引到STRC的索引,而是< em> type number ,因此您需要在此处使用倒排索引。使用递归例程进行解码时(例如我),例程必须知道是处理“ 类型索引”还是处理“ 类型编号”。