如何解读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,前十二个类型号似乎用于这些原始类型:char
、uchar
、short
, ushort
, int
, long
, ulong
, float
, double
, int64_t
, uint64_t
, void
但是 STRC
中不存在这些类型。所以类型 #2 不存在于倒排索引中,因此它必须是原始(非复合)类型。
不幸的是,上面的规则似乎有例外:STRC
中的 字段类型 不是(像 SDNA 索引一样)[=10= 的索引],而是一个类型的数字,所以你需要在那里使用倒排索引。当使用递归例程解码时(像我一样)例程必须知道处理的是“type index”还是“type number”。
正如有人评论说不可能转储“.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,前十二个类型号似乎用于这些原始类型:char
、uchar
、short
, ushort
, int
, long
, ulong
, float
, double
, int64_t
, uint64_t
, void
但是 STRC
中不存在这些类型。所以类型 #2 不存在于倒排索引中,因此它必须是原始(非复合)类型。
不幸的是,上面的规则似乎有例外:STRC
中的 字段类型 不是(像 SDNA 索引一样)[=10= 的索引],而是一个类型的数字,所以你需要在那里使用倒排索引。当使用递归例程解码时(像我一样)例程必须知道处理的是“type index”还是“type number”。