def read(self, fileName) -> List[TeaFrame]: f = open(fileName, "rb") data = f.read() f.close() self.log.debug("Read %i bytes from file %s" % (len(data), fileName)) pos = 0 header = THEA_HEADER.from_buffer_copy(data, pos) pos += sizeof(THEA_HEADER) self.log.debug( "Header - Identity: {0}; Version: {1}; Frames: {2}; Groups {3}; KeyFrames {4}" .format(header.identity, header.version, header.nb_frames, header.nb_groups, header.nb_key_frames)) results = [] for i in range(header.nb_key_frames): # self.log.debug("Reading Keyframe {0}".format(i)) if header.version == 2014: kf = THEA_KEYFRAME_2014.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2014) elif header.version == 2015: kf = THEA_KEYFRAME_2015.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2015) if kf.info_frame: self.log.info("Keyframe str: " + kf.info_frame.decode('iso-8859-1')) else: raise SerializationException("Unknown version: " + str(header.version)) if kf.flag_frame not in (-1, 9): raise UnexpectedValueException("flag_frame = " + str(kf.flag_frame)) if kf.master_key_frame not in (0, 1): raise UnexpectedValueException("master_key_frame = " + str(kf.master_key_frame)) if kf.key_frame not in (0, 1): raise UnexpectedValueException("key_frame = " + str(kf.key_frame)) if kf.key_move not in (0, 1): raise UnexpectedValueException("key_move = " + str(kf.key_move)) if kf.key_orient not in (0, 1): raise UnexpectedValueException("key_orient = " + str(kf.key_orient)) if kf.key_morph not in (0, 1): raise UnexpectedValueException("key_morph = " + str(kf.key_morph)) duration = kf.num_frame flags = kf.flag_frame # Global translation translation = None if kf.key_move != 0: translation = SavedVec3.from_buffer_copy(data, pos) pos += sizeof(SavedVec3) # Global rotation rotation = None if kf.key_orient != 0: pos += 8 # skip THEO_ANGLE rotation = ArxQuat.from_buffer_copy(data, pos) pos += sizeof(ArxQuat) # Global Morph if kf.key_morph != 0: morph = THEA_MORPH.from_buffer_copy(data, pos) pos += sizeof(THEA_MORPH) if morph.unknown1 != -1: raise UnexpectedValueException("unknown1 = " + str(morph.unknown1)) if morph.unknown2 != -1: raise UnexpectedValueException("unknown2 = " + str(morph.unknown2)) self.log.debug("Frame {0} Morph: {1} {2}".format( i, morph.unknown3, morph.unknown4)) # pos += 16; # skip THEA_MORPH # Now go for Group Rotations/Translations/scaling for each GROUP groupsList = THEO_GROUPANIM * header.nb_groups groups = groupsList.from_buffer_copy(data, pos) pos += sizeof(groupsList) # Has a sound sample ? num_sample = c_int32.from_buffer_copy(data, pos) pos += sizeof(c_int32) if num_sample.value != -1: sample = THEA_SAMPLE.from_buffer_copy(data, pos) pos += sizeof(THEA_SAMPLE) self.log.debug("sample_size: {0}".format(sample.sample_size)) pos += sample.sample_size # skip data pos += 4 # skip num_sfx # self.log.debug("Pos: {0}".format(pos)) results.append( TeaFrame(duration=duration, flags=flags, translation=translation, rotation=rotation, groups=groups)) # Sanity check the deserialized data first = True grouplen = 0 for f in results: if first: grouplen = len(f.groups) first = False else: if grouplen != len(f.groups): raise UnexpectedValueException( "Group count does not match!") for g in f.groups: if g.key_group not in (0, 1): raise UnexpectedValueException("key_group = {}".format( g.key_group)) self.log.debug("File loaded") return results
def read(self, fileName): f = open(fileName, "rb") data = f.read() f.close() self.log.info("Read %i bytes from file %s" % (len(data), fileName)) pos = 0 header = THEA_HEADER.from_buffer_copy(data, pos) pos += sizeof(THEA_HEADER) self.log.info("Header - Identity: {0}; Version: {1}; Frames: {2}; Groups {3}; KeyFrames {4}".format(header.identity, header.version, header.nb_frames, header.nb_groups, header.nb_key_frames)) results = [] for i in range(header.nb_key_frames): frame = {} #self.log.debug("Reading Keyframe {0}".format(i)) if header.version == 2014: kf = THEA_KEYFRAME_2014.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2014) elif header.version == 2015: kf = THEA_KEYFRAME_2015.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2015) if kf.info_frame: self.log.info("Keyframe str: " + kf.info_frame.decode('iso-8859-1')) else: raise SerializationException("Unknown version: " + str(header.version)) if kf.flag_frame not in (-1, 9): raise UnexpectedValueException("flag_frame = " + str(kf.flag_frame)) if kf.master_key_frame not in (0, 1): raise UnexpectedValueException("master_key_frame = " + str(kf.master_key_frame)) if kf.key_frame not in (0, 1): raise UnexpectedValueException("key_frame = " + str(kf.key_frame)) if kf.key_move not in (0, 1): raise UnexpectedValueException("key_move = " + str(kf.key_move)) if kf.key_orient not in (0, 1): raise UnexpectedValueException("key_orient = " + str(kf.key_orient)) if kf.key_morph not in (0, 1): raise UnexpectedValueException("key_morph = " + str(kf.key_morph)) frame['duration'] = kf.num_frame frame['flags'] = kf.flag_frame # Global translation if kf.key_move != 0: trans = SavedVec3.from_buffer_copy(data, pos) pos += sizeof(SavedVec3) frame['translation'] = trans # Global rotation if kf.key_orient != 0: pos += 8; # skip THEO_ANGLE rot = ArxQuat.from_buffer_copy(data, pos) pos += sizeof(ArxQuat) frame['rotation'] = rot # Global Morph if kf.key_morph != 0: morph = THEA_MORPH.from_buffer_copy(data, pos) pos += sizeof(THEA_MORPH) if morph.unknown1 != -1: raise UnexpectedValueException("unknown1 = " + str(morph.unknown1)) if morph.unknown2 != -1: raise UnexpectedValueException("unknown2 = " + str(morph.unknown2)) self.log.debug("Frame {0} Morph: {1} {2}".format(i, morph.unknown3, morph.unknown4)) #pos += 16; # skip THEA_MORPH # Now go for Group Rotations/Translations/scaling for each GROUP groupsList = THEO_GROUPANIM * header.nb_groups groups = groupsList.from_buffer_copy(data, pos) pos += sizeof(groupsList) frame['groups'] = groups # Has a sound sample ? num_sample = c_int32.from_buffer_copy(data, pos) pos += sizeof(c_int32) if num_sample.value != -1: sample = THEA_SAMPLE.from_buffer_copy(data, pos) pos += sizeof(THEA_SAMPLE) self.log.debug("sample_size: {0}".format(sample.sample_size)) pos += sample.sample_size # skip data pos += 4 # skip num_sfx #self.log.debug("Pos: {0}".format(pos)) results.append(frame) self.log.info("File loaded") return results
def read(self, fileName): f = open(fileName, "rb") data = f.read() f.close() self.log.info("Loaded %i bytes from file %s" % (len(data), fileName)) pos = 0 header = THEA_HEADER.from_buffer_copy(data, pos) pos += sizeof(THEA_HEADER) self.log.info("Identity: {0}; Version: {1}; Frames: {2}; Groups {3}; KeyFrames {4}".format(header.identity, header.version, header.nb_frames, header.nb_groups, header.nb_key_frames)) results = [] for i in range(header.nb_key_frames): frame = {} #self.log.debug("Reading Keyframe {0}".format(i)) kf = THEA_KEYFRAME_2015.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2015) frame['duration'] = kf.num_frame frame['flags'] = kf.flag_frame # Global translation if kf.key_move != 0: trans = SavedVec3.from_buffer_copy(data, pos) pos += sizeof(SavedVec3) frame['translation'] = trans # Global rotation if kf.key_orient != 0: pos += 8; # skip THEO_ANGLE rot = ArxQuat.from_buffer_copy(data, pos) pos += sizeof(ArxQuat) frame['rotation'] = rot # Global Morph if kf.key_morph != 0: pos += 16; # skip THEA_MORPH # Now go for Group Rotations/Translations/scaling for each GROUP groupsList = THEO_GROUPANIM * header.nb_groups groups = groupsList.from_buffer_copy(data, pos) pos += sizeof(groupsList) frame['groups'] = groups # Has a sound sample ? num_sample = c_int32.from_buffer_copy(data, pos) pos += sizeof(c_int32) if num_sample.value != -1: sample = THEA_SAMPLE.from_buffer_copy(data, pos) pos += sizeof(THEA_SAMPLE) self.log.debug("sample_size: {0}".format(sample.sample_size)) pos += sample.sample_size # skip data pos += 4 # skip num_sfx #self.log.debug("Pos: {0}".format(pos)) results.append(frame) return results
def read(self, fileName): f = open(fileName, "rb") data = f.read() f.close() self.log.info("Loaded %i bytes from file %s" % (len(data), fileName)) pos = 0 header = THEA_HEADER.from_buffer_copy(data, pos) pos += sizeof(THEA_HEADER) self.log.info( "Identity: {0}; Version: {1}; Frames: {2}; Groups {3}; KeyFrames {4}" .format(header.identity, header.version, header.nb_frames, header.nb_groups, header.nb_key_frames)) results = [] for i in range(header.nb_key_frames): frame = {} #self.log.debug("Reading Keyframe {0}".format(i)) kf = THEA_KEYFRAME_2015.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2015) frame['duration'] = kf.num_frame frame['flags'] = kf.flag_frame # Global translation if kf.key_move != 0: trans = SavedVec3.from_buffer_copy(data, pos) pos += sizeof(SavedVec3) frame['translation'] = trans # Global rotation if kf.key_orient != 0: pos += 8 # skip THEO_ANGLE rot = ArxQuat.from_buffer_copy(data, pos) pos += sizeof(ArxQuat) frame['rotation'] = rot # Global Morph if kf.key_morph != 0: pos += 16 # skip THEA_MORPH # Now go for Group Rotations/Translations/scaling for each GROUP groupsList = THEO_GROUPANIM * header.nb_groups groups = groupsList.from_buffer_copy(data, pos) pos += sizeof(groupsList) frame['groups'] = groups # Has a sound sample ? num_sample = c_int32.from_buffer_copy(data, pos) pos += sizeof(c_int32) if num_sample.value != -1: sample = THEA_SAMPLE.from_buffer_copy(data, pos) pos += sizeof(THEA_SAMPLE) self.log.debug("sample_size: {0}".format(sample.sample_size)) pos += sample.sample_size # skip data pos += 4 # skip num_sfx #self.log.debug("Pos: {0}".format(pos)) results.append(frame) return results
def read(self, fileName) -> List[TeaFrame]: f = open(fileName, "rb") data = f.read() f.close() self.log.debug("Read %i bytes from file %s" % (len(data), fileName)) pos = 0 header = THEA_HEADER.from_buffer_copy(data, pos) pos += sizeof(THEA_HEADER) self.log.debug( "Header - Identity: {0}; Version: {1}; Frames: {2}; Groups {3}; KeyFrames {4}".format(header.identity, header.version, header.nb_frames, header.nb_groups, header.nb_key_frames)) results = [] for i in range(header.nb_key_frames): # self.log.debug("Reading Keyframe {0}".format(i)) if header.version == 2014: kf = THEA_KEYFRAME_2014.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2014) elif header.version == 2015: kf = THEA_KEYFRAME_2015.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2015) if kf.info_frame: self.log.info("Keyframe str: " + kf.info_frame.decode('iso-8859-1')) else: raise SerializationException("Unknown version: " + str(header.version)) if kf.flag_frame not in (-1, 9): raise UnexpectedValueException("flag_frame = " + str(kf.flag_frame)) if kf.master_key_frame not in (0, 1): raise UnexpectedValueException("master_key_frame = " + str(kf.master_key_frame)) if kf.key_frame not in (0, 1): raise UnexpectedValueException("key_frame = " + str(kf.key_frame)) if kf.key_move not in (0, 1): raise UnexpectedValueException("key_move = " + str(kf.key_move)) if kf.key_orient not in (0, 1): raise UnexpectedValueException("key_orient = " + str(kf.key_orient)) if kf.key_morph not in (0, 1): raise UnexpectedValueException("key_morph = " + str(kf.key_morph)) duration = kf.num_frame flags = kf.flag_frame # Global translation translation = None if kf.key_move != 0: translation = SavedVec3.from_buffer_copy(data, pos) pos += sizeof(SavedVec3) # Global rotation rotation = None if kf.key_orient != 0: pos += 8; # skip THEO_ANGLE rotation = ArxQuat.from_buffer_copy(data, pos) pos += sizeof(ArxQuat) # Global Morph if kf.key_morph != 0: morph = THEA_MORPH.from_buffer_copy(data, pos) pos += sizeof(THEA_MORPH) if morph.unknown1 != -1: raise UnexpectedValueException("unknown1 = " + str(morph.unknown1)) if morph.unknown2 != -1: raise UnexpectedValueException("unknown2 = " + str(morph.unknown2)) self.log.debug("Frame {0} Morph: {1} {2}".format(i, morph.unknown3, morph.unknown4)) # pos += 16; # skip THEA_MORPH # Now go for Group Rotations/Translations/scaling for each GROUP groupsList = THEO_GROUPANIM * header.nb_groups groups = groupsList.from_buffer_copy(data, pos) pos += sizeof(groupsList) # Has a sound sample ? num_sample = c_int32.from_buffer_copy(data, pos) pos += sizeof(c_int32) if num_sample.value != -1: sample = THEA_SAMPLE.from_buffer_copy(data, pos) pos += sizeof(THEA_SAMPLE) self.log.debug("sample_size: {0}".format(sample.sample_size)) pos += sample.sample_size # skip data pos += 4 # skip num_sfx # self.log.debug("Pos: {0}".format(pos)) results.append(TeaFrame( duration=duration, flags=flags, translation=translation, rotation=rotation, groups=groups )) # Sanity check the deserialized data first = True grouplen = 0 for f in results: if first: grouplen = len(f.groups) first = False else: if grouplen != len(f.groups): raise UnexpectedValueException("Group count does not match!") for g in f.groups: if g.key_group not in (0, 1): raise UnexpectedValueException("key_group = {}".format(g.key_group)) self.log.debug("File loaded") return results
def read(self, fileName): f = open(fileName, "rb") data = f.read() f.close() self.log.info("Read %i bytes from file %s" % (len(data), fileName)) pos = 0 header = THEA_HEADER.from_buffer_copy(data, pos) pos += sizeof(THEA_HEADER) self.log.info( "Header - Identity: {0}; Version: {1}; Frames: {2}; Groups {3}; KeyFrames {4}" .format(header.identity, header.version, header.nb_frames, header.nb_groups, header.nb_key_frames)) results = [] for i in range(header.nb_key_frames): frame = {} #self.log.debug("Reading Keyframe {0}".format(i)) if header.version == 2014: kf = THEA_KEYFRAME_2014.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2014) elif header.version == 2015: kf = THEA_KEYFRAME_2015.from_buffer_copy(data, pos) pos += sizeof(THEA_KEYFRAME_2015) if kf.info_frame: self.log.info("Keyframe str: " + kf.info_frame.decode('iso-8859-1')) else: raise SerializationException("Unknown version: " + str(header.version)) if kf.flag_frame not in (-1, 9): raise UnexpectedValueException("flag_frame = " + str(kf.flag_frame)) if kf.master_key_frame not in (0, 1): raise UnexpectedValueException("master_key_frame = " + str(kf.master_key_frame)) if kf.key_frame not in (0, 1): raise UnexpectedValueException("key_frame = " + str(kf.key_frame)) if kf.key_move not in (0, 1): raise UnexpectedValueException("key_move = " + str(kf.key_move)) if kf.key_orient not in (0, 1): raise UnexpectedValueException("key_orient = " + str(kf.key_orient)) if kf.key_morph not in (0, 1): raise UnexpectedValueException("key_morph = " + str(kf.key_morph)) frame['duration'] = kf.num_frame frame['flags'] = kf.flag_frame # Global translation if kf.key_move != 0: trans = SavedVec3.from_buffer_copy(data, pos) pos += sizeof(SavedVec3) frame['translation'] = trans # Global rotation if kf.key_orient != 0: pos += 8 # skip THEO_ANGLE rot = ArxQuat.from_buffer_copy(data, pos) pos += sizeof(ArxQuat) frame['rotation'] = rot # Global Morph if kf.key_morph != 0: morph = THEA_MORPH.from_buffer_copy(data, pos) pos += sizeof(THEA_MORPH) if morph.unknown1 != -1: raise UnexpectedValueException("unknown1 = " + str(morph.unknown1)) if morph.unknown2 != -1: raise UnexpectedValueException("unknown2 = " + str(morph.unknown2)) self.log.debug("Frame {0} Morph: {1} {2}".format( i, morph.unknown3, morph.unknown4)) #pos += 16; # skip THEA_MORPH # Now go for Group Rotations/Translations/scaling for each GROUP groupsList = THEO_GROUPANIM * header.nb_groups groups = groupsList.from_buffer_copy(data, pos) pos += sizeof(groupsList) frame['groups'] = groups # Has a sound sample ? num_sample = c_int32.from_buffer_copy(data, pos) pos += sizeof(c_int32) if num_sample.value != -1: sample = THEA_SAMPLE.from_buffer_copy(data, pos) pos += sizeof(THEA_SAMPLE) self.log.debug("sample_size: {0}".format(sample.sample_size)) pos += sample.sample_size # skip data pos += 4 # skip num_sfx #self.log.debug("Pos: {0}".format(pos)) results.append(frame) self.log.info("File loaded") return results