예제 #1
0
    def read_field(self, reader: ByteIO):
        count = self.count
        if count == 0: count = 1
        exit_point = 0
        if self.indirection_bytes:
            if self.indirection_level > 1:
                raise NotImplementedError(
                    'More than one indirection, not yet handled')
            if self.count > 0:
                raise NotImplementedError(
                    'Indirection.Count > 0 && field.Count > 0')
            indir = self.indirection_bytes[0]
            entry = reader.tell()
            offset = reader.read_uint32()

            if indir == 0x03:
                pass
                if not offset:
                    return None
                exit_point = reader.tell()
                # with reader.save_current_pos():
                #     reader.seek(entry+offset)
                # return self.read_field_data(reader)
            elif indir == 0x04:
                # data = []
                count = reader.read_uint32()
                exit_point = reader.tell()
                # if count>0:
                #     with reader.save_current_pos():
                #         reader.seek(entry + offset)
                #         for _ in range(count):
                #             data.append(self.read_field(reader))
                #         return data
            else:
                raise NotImplementedError("Unknown indirection. ({0})".format(
                    hex(indir)))
            if self.count > 0 and self.indirection_level > 0:
                array = []
                with reader.save_current_pos():
                    reader.seek(entry + offset)
                    for _ in range(count):
                        data = self.read_field_data(reader)
                        array.append(data)
                if exit_point:
                    reader.seek(exit_point)
                return array
            else:
                array = []
                with reader.save_current_pos():
                    reader.seek(entry + offset)
                    for _ in range(count):
                        data = self.read_field_data(reader)
                        array.append(data)
                if exit_point:
                    reader.seek(exit_point)
                return array
        else:
            if exit_point:
                reader.seek(exit_point)
            return self.read_field_data(reader)
예제 #2
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.name_offset = reader.read_int32()
     self.name = reader.read_from_offset(entry + self.name_offset,
                                                              reader.read_ascii_string)
     entry = reader.tell()
     self.value_offset = reader.read_int32()
     self.value = reader.read_from_offset(entry + self.value_offset,
                                         reader.read_ascii_string)
예제 #3
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.content_relative_filename_offset = reader.read_int32()
     self.content_relative_filename = reader.read_from_offset(entry + self.content_relative_filename_offset,
                                                              reader.read_ascii_string)
     entry = reader.tell()
     self.content_search_path_offset = reader.read_int32()
     self.content_search_path = reader.read_from_offset(entry + self.content_search_path_offset,
                                                        reader.read_ascii_string)
예제 #4
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.string_offset = reader.read_int32()
     self.string = reader.read_from_offset(entry + self.string_offset, reader.read_ascii_string)
     entry = reader.tell()
     self.compiler_identifier_offset = reader.read_int32()
     self.compiler_identifier = reader.read_from_offset(entry + self.compiler_identifier_offset,
                                                        reader.read_ascii_string)
     self.fingerprint = reader.read_uint32()
     self.user_data = reader.read_uint32()
예제 #5
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.parameter_name_offset = reader.read_int32()
     self.parameter_name = reader.read_from_offset(entry + self.parameter_name_offset,
                                                   reader.read_ascii_string)
     entry = reader.tell()
     self.parameter_type_offset = reader.read_int32()
     self.parameter_type = reader.read_from_offset(entry + self.parameter_type_offset,
                                                   reader.read_ascii_string)
     self.fingerprint = reader.read_uint32()
     self.fingerprint_default = reader.read_uint32()
예제 #6
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.material_id = reader.read_int16()
     self.replacement_material_name_offset = reader.read_int32()
     self.replacement_material_name = reader.read_from_offset(self.replacement_material_name_offset,
                                                              reader.read_ascii_string)
     return self
예제 #7
0
    def read(self, reader: ByteIO):

        entry = reader.tell()
        self.vertex_count = reader.read_uint32()
        self.vertex_offset = reader.read_uint32()
        self.index_count = reader.read_uint32()
        self.index_offset = reader.read_uint32()
        self.strip_count = reader.read_uint32()
        self.strip_offset = reader.read_uint32()
        self.flags = StripGroupFlags(reader.read_uint8())
        global extra_8
        if extra_8:
            self.topology_indices_count = reader.read_uint32()
            self.topology_offset = reader.read_uint32()

        with reader.save_current_pos():
            reader.seek(entry + self.index_offset)
            for _ in range(self.index_count):
                self.vtx_indexes.append(reader.read_uint16())
            reader.seek(entry + self.vertex_offset)
            for _ in range(self.vertex_count):
                SourceVtxVertex().read(reader, self)
            reader.seek(entry + self.strip_offset)
            for _ in range(self.strip_count):
                SourceVtxStrip().read(reader, self)
            if extra_8:
                reader.seek(entry + self.topology_offset)
                # for _ in range(self.topology_indices_count):
                self.topology = (reader.read_bytes(self.topology_indices_count * 2))

        return self
예제 #8
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.name = reader.read_ascii_string()
     reader.seek(entry + 36)
     self.format = DXGI_FORMAT(reader.read_int32())
     self.offset = reader.read_uint32()
     reader.skip(12)
예제 #9
0
 def read(self, reader: ByteIO):
     self.r_id = reader.read_int64()
     entry = reader.tell()
     self.resource_name_offset = reader.read_int64()
     if self.resource_name_offset:
         self.resource_name = reader.read_from_offset(
             entry + self.resource_name_offset, reader.read_ascii_string)
예제 #10
0
    def read(self, reader: ByteIO):
        entry = reader.tell()
        self.model_count, self.model_offset = reader.read_fmt('II')

        with reader.save_current_pos():
            reader.seek(entry + self.model_offset)
            for _ in range(self.model_count):
                self.vtx_models.append(SourceVtxModel().read(reader))
        return self
예제 #11
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.lodCount, self.lodOffset = reader.read_fmt('ii')
     with reader.save_current_pos():
         if self.lodCount > 0 and self.lodOffset != 0:
             reader.seek(entry + self.lodOffset)
             for _ in range(self.lodCount):
                 self.vtx_model_lods.append(SourceVtxModelLod().read(reader, self))
     return self
예제 #12
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.scale = [reader.read_uint32() for _ in range(6)]
     self.offset = [reader.read_uint32() for _ in range(6)]
     for offset in self.offset:
         with reader.save_current_pos():
             reader.seek(entry + offset)
             self.theAnimValues.append(SourceMdlAnimationValue(reader.read_uint16()))
     return self
예제 #13
0
 def read(self, reader: ByteIO):
     fourcc = reader.read_bytes(4)
     assert tuple(fourcc) == self.SIG, 'Invalid KV Signature'
     encoding = reader.read_bytes(16)
     assert tuple(encoding) == self.ENCODING, 'Unrecognized KV3 Encoding'
     format = reader.read_bytes(16)
     assert tuple(format) == self.FORMAT, 'Unrecognised KV3 Format'
     self.flags = reader.read_bytes(4)
     if self.flags[3] & 0x80:
         self.buffer.write_bytes(
             reader.read_bytes(self.info_block.block_size -
                               (reader.tell() -
                                self.info_block.absolute_offset)))
     working = True
     while reader.tell() != reader.size() and working:
         block_mask = reader.read_uint16()
         for i in range(16):
             if block_mask & (1 << i) > 0:
                 offset_and_size = reader.read_uint16()
                 offset = ((offset_and_size & 0xFFF0) >> 4) + 1
                 size = (offset_and_size & 0x000F) + 3
                 lookup_size = offset if offset < size else size
                 entry = self.buffer.tell()
                 self.buffer.seek(entry - offset)
                 data = self.buffer.read_bytes(lookup_size)
                 self.buffer.seek(entry)
                 while size > 0:
                     self.buffer.write_bytes(
                         data[:lookup_size if lookup_size < size else size])
                     size -= lookup_size
             else:
                 data = reader.read_int8()
                 self.buffer.write_int8(data)
             if self.buffer.size() == (self.flags[2] << 16) + (
                     self.flags[1] << 8) + self.flags[0]:
                 working = False
                 break
     self.buffer.seek(0)
     string_count = self.buffer.read_uint32()
     for i in range(string_count):
         self.strings.append(self.buffer.read_ascii_string())
     self.parse(self.buffer, self.kv, True)
     self.buffer.close()
     del self.buffer
예제 #14
0
 def read(self, reader: ByteIO):
     self.introspection_version = reader.read_int32()
     self.s_id = reader.read_int32()
     entry = reader.tell()
     self.name_offset = reader.read_int32()
     self.name = reader.read_from_offset(entry + self.name_offset,
                                         reader.read_ascii_string)
     self.disc_crc = reader.read_int32()
     self.user_version = reader.read_uint32()
     entry = reader.tell()
     self.field_offset = reader.read_int32()
     self.field_count = reader.read_int32()
     with reader.save_current_pos():
         if self.field_count > 0:
             reader.seek(entry + self.field_offset)
             for n in range(self.field_count):
                 field = NTROEnumField(self)
                 field.read(reader)
                 self.fields.append(field)
예제 #15
0
 def read(self, reader: ByteIO, block_info: InfoBlock = None):
     self.info_block = block_info
     entry = reader.tell()
     self.name_offset = reader.read_int32()
     self.name = reader.read_from_offset(entry + self.name_offset,
                                         reader.read_ascii_string)
     self.count = reader.read_int16()
     self.on_disc_size = reader.read_int16()
     entry = reader.tell()
     self.indirection_bytes_offset = reader.read_int32()
     self.indirection_level = reader.read_int32()
     with reader.save_current_pos():
         reader.seek(entry + self.indirection_bytes_offset)
         indir_level = self.indirection_level if self.indirection_level < 10 else 10
         for _ in range(indir_level):
             self.indirection_bytes.append(reader.read_int8())
     self.data_type = reader.read_int32()
     self.type = KeyValueDataType(reader.read_int16())
     reader.skip(2)
예제 #16
0
 def read(self, reader: ByteIO, mdl: SourceMdlFileDataV10):
     self.boneOffset = reader.tell()
     self.name = reader.read_ascii_string(32)
     self.parentBoneIndex = reader.read_int32()
     self.flags = reader.read_int32()
     self.boneControllerIndex = [reader.read_int32() for _ in range(6)]
     self.position.read(reader)
     self.rotation.read(reader)
     self.scale = [reader.read_float() for _ in range(6)]
     mdl.bones.append(self)
예제 #17
0
 def read(self, reader: ByteIO, block_info: InfoBlock = None):
     self.info_block = block_info
     self.entry = reader.tell()
     self.resource_entry_offset = reader.read_int32()
     self.resource_count = reader.read_int32()
     with reader.save_current_pos():
         reader.seek(self.entry + self.resource_entry_offset)
         for n in range(self.resource_count):
             resource = RERLResource()
             resource.read(reader)
             self.resources.append(resource)
예제 #18
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.nameOffset = reader.read_uint32()
     self.thePathFileName = reader.read_from_offset(
         entry + self.nameOffset, reader.read_ascii_string)
     self.flags = reader.read_uint32()
     self.used = reader.read_uint32()
     self.unused1 = reader.read_uint32()
     self.materialP = reader.read_uint32()
     self.clientMaterialP = reader.read_uint32()
     self.unused = [reader.read_uint32() for _ in range(5)]
예제 #19
0
 def read_struct(self, reader: ByteIO):
     # print('Reading struct {}'.format(self.name))
     struct_data = {}
     entry = reader.tell()
     for field in self.fields:
         reader.seek(entry + field.on_disc_size)
         struct_data[field.name] = field.read_field(reader)
     # print(struct_data)
     reader.seek(entry + self.disc_size)
     # print(struct_data)
     return struct_data
예제 #20
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.replacements_count = reader.read_int32()
     self.replacement_offset = reader.read_int32()
     with reader.save_current_pos():
         reader.seek(entry + self.replacement_offset)
         for _ in range(self.replacements_count):
             mat = MaterialReplacement()
             mat.read(reader)
             self.replacements.append(mat)
     return self
예제 #21
0
 def read(self, reader: ByteIO):
     entry = reader.tell()
     self.strip_group_count = reader.read_uint32()
     self.strip_group_offset = reader.read_uint32()
     self.flags = reader.read_uint8()
     with reader.save_current_pos():
         if self.strip_group_offset > 0:
             reader.seek(entry + self.strip_group_offset)
             for _ in range(self.strip_group_count):
                 self.vtx_strip_groups.append(SourceVtxStripGroup().read(reader))
     return self
예제 #22
0
 def read(self, reader: ByteIO, block_info: InfoBlock = None):
     self.info_block = block_info
     entry = reader.tell()
     self.vertex_offset = reader.read_uint32()
     self.vertex_count = reader.read_uint32()
     with reader.save_current_pos():
         reader.seek(entry + self.vertex_offset)
         for _ in range(self.vertex_count):
             v_buffer = VertexBuffer()
             v_buffer.read(reader)
             self.vertex_buffer.append(v_buffer)
     entry = reader.tell()
     self.index_offset = reader.read_uint32()
     self.index_count = reader.read_uint32()
     with reader.save_current_pos():
         reader.seek(entry + self.index_offset)
         for _ in range(self.index_count):
             i_buffer = IndexBuffer()
             i_buffer.read(reader)
             self.index_buffer.append(i_buffer)
예제 #23
0
 def read(self,reader:ByteIO):
     entry = reader.tell()
     self.cycle = reader.read_float()
     self.eventIndex = reader.read_uint32()
     self.eventType = reader.read_uint32()
     self.options = [reader.read_uint8() for _ in range(64)]
     self.nameOffset = reader.read_uint32()
     if self.nameOffset:
         self.theName = reader.read_from_offset(self.nameOffset+entry,reader.read_ascii_string)
     else:
         self.theName = str(self.eventIndex)
     return self
예제 #24
0
 def read(self, reader: ByteIO, block_info: InfoBlock = None):
     self.info_block = block_info
     self.introspection_version = reader.read_int32()
     entry = reader.tell()
     self.struct_offset = reader.read_int32()
     self.struct_count = reader.read_int32()
     with reader.save_current_pos():
         reader.seek(entry + self.struct_offset)
         for n in range(self.struct_count):
             struct = NTROStruct(self)
             struct.read(reader)
             self.structs.append(struct)
     entry = reader.tell()
     self.enum_offset = reader.read_int32()
     self.enum_count = reader.read_int32()
     with reader.save_current_pos():
         reader.seek(entry + self.enum_offset)
         for n in range(self.enum_count):
             enum = NTROEnum(self)
             enum.read(reader)
             self.enums.append(enum)
예제 #25
0
 def read(self, reader: ByteIO, model: SourceVtxModel):
     entry = reader.tell()
     self.lod = len(model.vtx_model_lods)
     self.meshCount = reader.read_uint32()
     self.meshOffset = reader.read_uint32()
     self.switchPoint = reader.read_float()
     with reader.save_current_pos():
         if self.meshOffset > 0:
             reader.seek(entry + self.meshOffset)
             for _ in range(self.meshCount):
                 self.vtx_meshes.append(SourceVtxMesh().read(reader))
     return self
예제 #26
0
 def read(self, reader: ByteIO):
     self.count = reader.read_uint32()
     self.size = reader.read_uint32()
     entry = reader.tell()
     self.attributes_offset = reader.read_uint32()
     self.attributes_count = reader.read_uint32()
     with reader.save_current_pos():
         reader.seek(entry + self.attributes_offset)
         for _ in range(self.attributes_count):
             v_attrib = VertexAttribute()
             v_attrib.read(reader)
             self.attributes.append(v_attrib)
     entry = reader.tell()
     self.offset = reader.read_uint32()
     self.total_size = reader.read_uint32()
     with reader.save_current_pos():
         reader.seek(entry + self.offset)
         assert self.total_size == self.size * self.count
         self.buffer = ByteIO(byte_object=reader.read_bytes(self.count *
                                                            self.size))
     self.read_buffer()
예제 #27
0
 def read(self, reader: ByteIO):
     self.count = reader.read_uint32()
     self.size = reader.read_uint32()
     self.unk1 = reader.read_uint32()
     self.unk2 = reader.read_uint32()
     entry = reader.tell()
     self.offset = reader.read_uint32()
     self.total_size = reader.read_uint32()
     with reader.save_current_pos():
         reader.seek(entry + self.offset)
         assert self.total_size == self.size * self.count
         self.buffer = ByteIO(byte_object=reader.read_bytes(self.count *
                                                            self.size))
     self.read_buffer()
예제 #28
0
    def read(self, reader: ByteIO, stripgroup: SourceVtxStripGroup):
        entry = reader.tell()
        self.index_count = reader.read_uint32()
        self.index_mesh_index = reader.read_uint32()
        self.vertex_count = reader.read_uint32()
        self.vertex_mesh_index = reader.read_uint32()
        self.bone_count = reader.read_uint16()
        self.flags = StripHeaderFlags(reader.read_uint8())
        self.bone_state_change_count = reader.read_uint32()
        self.bone_state_change_offset = reader.read_uint32()
        global extra_8
        if extra_8:
            self.topology_indices_count = reader.read_int32()
            self.topology_offset = reader.read_int32()
        # print('Strip end',reader.tell())

        stripgroup.vtx_strips.append(self)
예제 #29
0
    def read(self, reader: ByteIO, MDL: SourceMdlFileData):
        entry = reader.tell()
        self.entry = entry
        self.baseHeaderOffset = reader.read_int32()
        self.nameOffset = reader.read_int32()
        self.theName = reader.read_from_offset(entry + self.nameOffset, reader.read_ascii_string)
        self.fps = reader.read_float()
        self.flags = self.STUDIO(reader.read_uint32())
        self.frameCount = reader.read_uint32()
        self.movementCount = reader.read_uint32()
        self.movementOffset = reader.read_uint32()

        self.unused1 = [reader.read_uint32() for _ in range(6)]
        self.animBlock = reader.read_uint32()
        self.animOffset = reader.read_uint32()


        self.ikRuleCount = reader.read_uint32()
        self.ikRuleOffset = reader.read_uint32()
        self.animblockIkRuleOffset = reader.read_uint32()
        self.localHierarchyCount = reader.read_uint32()
        self.localHierarchyOffset = reader.read_uint32()


        self.sectionOffset = reader.read_uint32()
        self.sectionFrameCount = reader.read_uint32()

        self.spanFrameCount = reader.read_uint16()
        self.spanCount = reader.read_uint16()
        self.spanOffset = reader.read_uint32()
        self.spanStallTime = reader.read_float()
        self.fileOffsetStart2 = entry + self.spanOffset
        self.fileOffsetEnd2 = entry + self.spanOffset-1
        if self.spanFrameCount!=0 or self.spanCount!=0 or self.spanOffset!=0 or self.spanStallTime!=0:
            for bone_index in range(len(MDL.bones)):
                bone = MDL.bones[bone_index] #type: SourceMdlBone
                if bone.flags & SourceMdlBone.BONE_HAS_SAVEFRAME_POS:
                    self.fileOffsetEnd2 += self.spanCount * 6
                if bone.flags & SourceMdlBone.BONE_HAS_SAVEFRAME_ROT:
                    self.fileOffsetEnd2 += self.spanCount * 8




        return self
예제 #30
0
    def read(self, reader: ByteIO):
        entry = reader.tell()
        self.boneIndex = reader.read_uint32()
        self.boneNewParentIndex = reader.read_uint32()
        self.startInfluence = reader.read_float()
        self.peakInfluence = reader.read_float()
        self.tailInfluence = reader.read_float()
        self.endInfluence = reader.read_float()
        self.startFrameIndex = reader.read_uint32()
        self.localAnimOffset = reader.read_uint32()

        if self.localAnimOffset != 0:
            with reader.save_current_pos():
                reader.seek(entry + self.localAnimOffset)
                self.theLocalAnims.read(reader)

        self.unused = [reader.read_uint32() for _ in range(4)]
        return self