support for reading old blend files (some missing struct members)
This commit is contained in:
@@ -388,10 +388,15 @@ class BlendFileBlock:
|
|||||||
# Utility get/set
|
# Utility get/set
|
||||||
#
|
#
|
||||||
# avoid inline pointer casting
|
# avoid inline pointer casting
|
||||||
def get_pointer(self, path, sdna_index_refine=None):
|
def get_pointer(self, path, default=..., sdna_index_refine=None):
|
||||||
if sdna_index_refine is None:
|
if sdna_index_refine is None:
|
||||||
sdna_index_refine = self.sdna_index
|
sdna_index_refine = self.sdna_index
|
||||||
result = self.get(path, sdna_index_refine=sdna_index_refine)
|
result = self.get(path, default, sdna_index_refine=sdna_index_refine)
|
||||||
|
|
||||||
|
# default
|
||||||
|
if type(result) is not int:
|
||||||
|
return result
|
||||||
|
|
||||||
assert(self.file.structs[sdna_index_refine].field_from_path(self.file.header, self.file.handle, path).dna_name.is_pointer)
|
assert(self.file.structs[sdna_index_refine].field_from_path(self.file.header, self.file.handle, path).dna_name.is_pointer)
|
||||||
if result != 0:
|
if result != 0:
|
||||||
# possible (but unlikely)
|
# possible (but unlikely)
|
||||||
|
@@ -416,7 +416,8 @@ class FilePath:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_block_IM(block, basedir, extra_info, level):
|
def _from_block_IM(block, basedir, extra_info, level):
|
||||||
if block[b'source'] not in {C_defs.IMA_SRC_FILE, C_defs.IMA_SRC_SEQUENCE, C_defs.IMA_SRC_MOVIE}:
|
# old files miss this
|
||||||
|
if block.get(b'source', -1) not in {C_defs.IMA_SRC_FILE, C_defs.IMA_SRC_SEQUENCE, C_defs.IMA_SRC_MOVIE}:
|
||||||
return
|
return
|
||||||
if block[b'packedfile']:
|
if block[b'packedfile']:
|
||||||
return
|
return
|
||||||
@@ -438,7 +439,10 @@ class FilePath:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_block_ME(block, basedir, extra_info, level):
|
def _from_block_ME(block, basedir, extra_info, level):
|
||||||
block_external = block.get_pointer(b'ldata.external')
|
block_external = block.get_pointer(b'ldata.external', None)
|
||||||
|
if block_external is None:
|
||||||
|
block_external = block.get_pointer(b'fdata.external', None)
|
||||||
|
|
||||||
if block_external is not None:
|
if block_external is not None:
|
||||||
yield FPElem_block_path(basedir, level, (block_external, b'filename')), extra_info
|
yield FPElem_block_path(basedir, level, (block_external, b'filename')), extra_info
|
||||||
|
|
||||||
@@ -559,7 +563,7 @@ class ExpandID:
|
|||||||
yield item.get_pointer(b'id', sdna_index_refine=sdna_index_bNode)
|
yield item.get_pointer(b'id', sdna_index_refine=sdna_index_bNode)
|
||||||
|
|
||||||
def _expand_generic_nodetree_id(block):
|
def _expand_generic_nodetree_id(block):
|
||||||
block_ntree = block.get_pointer(b'nodetree')
|
block_ntree = block.get_pointer(b'nodetree', None)
|
||||||
if block_ntree is not None:
|
if block_ntree is not None:
|
||||||
yield from ExpandID._expand_generic_nodetree(block_ntree)
|
yield from ExpandID._expand_generic_nodetree(block_ntree)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user