support for reading old blend files (some missing struct members)

This commit is contained in:
2014-12-18 11:32:31 +01:00
parent 5f619eef9f
commit afbebb8cf8
2 changed files with 14 additions and 5 deletions

View File

@@ -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)

View File

@@ -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)