Как интерпретировать индекс типа поля структуры Blender SDNA? - PullRequest
0 голосов
/ 27 января 2019

Когда кто-то заметил, что невозможно выгрузить содержимое файла ".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
...

Insights?

1 Ответ

0 голосов
/ 02 февраля 2019

Поскольку ответа пока нет, я пытаюсь ответить на мой вопрос по частям (по мере его изучения):

Во-первых, индекс SDNA, указанный в блоке файла, кажетсябыть индексом типа в таблице STRC.Однако номер типа типа с индексом 0 равен 12. Это фиксированное смещение (12) продолжается до индекса 12, где тип равен 26. Так что на самом деле вам нужна другая таблица ( инвертированный индекс ) соответствует номеру типа индексу типа в таблице STRC.

Поскольку первый номер типа в этой таблице равен 12, онкажется, что первые двенадцать типов типов используются для этих примитивных типов: char, uchar, short, ushort, int, long, ulong, float, double, int64_t, uint64_t, void

Однако эти типы не существуют в STRC.Таким образом, тип № 2 отсутствует в инвертированном индексе, поэтому он должен быть примитивным (не составным) типом.

К сожалению, существуют исключения из приведенных выше правил: типы полей в STRC не является (как и индекс SDNA) индексом в SDNA, а является номером типа , поэтому вам нужно использовать инвертированный индекс там.При использовании рекурсивной подпрограммы для декодирования (как и я) подпрограмма должна знать, обрабатывает ли « индекс типа » или « номер типа ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...