def read(self, reader: ByteIO): self.version = reader.read_uint32() if self.version!=7: if self.version == 402653184: reader.insert_begin(b'\x07') self.version = reader.read_uint32() print('VTX FILE WAS "PROTECTED", but screew it :P') else: raise NotImplementedError('VTX version {} is not supported!'.format(self.version)) self.vertex_cache_size = reader.read_uint32() self.max_bones_per_strip = reader.read_uint16() self.max_bones_per_tri = reader.read_uint16() self.max_bones_per_vertex = reader.read_uint32() self.checksum = reader.read_uint32() self.lodCount = reader.read_uint32() self.material_replacement_list_offset = reader.read_uint32() self.bodyPartCount = reader.read_uint32() self.bodyPartOffset = reader.read_uint32() global max_bones_per_vertex max_bones_per_vertex = self.max_bones_per_vertex if self.bodyPartOffset > 0: reader.seek(self.bodyPartOffset) try: for _ in range(self.bodyPartCount): self.vtx_body_parts.append(SourceVtxBodyPart().read(reader)) except struct.error: global extra_8 extra_8 = False self.vtx_body_parts.clear() reader.seek(self.bodyPartOffset) for _ in range(self.bodyPartCount): self.vtx_body_parts.append(SourceVtxBodyPart().read(reader)) if self.material_replacement_list_offset > 0: reader.seek(self.material_replacement_list_offset) for _ in range(self.lodCount): self.material_replacement_lists.append(MaterialReplacementList().read(reader))
def read(self, reader: ByteIO): self.id = reader.read_fourcc() if self.id != 'IDSV': if self.id[:-1] == 'DSV': reader.insert_begin(b'I') self.id = reader.read_fourcc() print('VVD FILE WAS "PROTECTED", but screew it :P') else: raise NotImplementedError('VVD format {} is not supported!'.format(self.id)) self.version = reader.read_uint32() self.checksum = reader.read_uint32() self.lod_count = reader.read_uint32() self.lod_vertex_count = [reader.read_uint32() for _ in range(8)] self.fixup_count = reader.read_uint32() self.fixup_table_offset = reader.read_uint32() self.vertex_data_offset = reader.read_uint32() self.tangent_data_offset = reader.read_uint32() self.fixed_vertexes_by_lod = [[]] * self.lod_count if self.lod_count <= 0: return reader.seek(self.vertex_data_offset) for _ in range(self.lod_vertex_count[0]): self.vertexes.append(SourceVertex().read(reader)) reader.seek(self.fixup_table_offset) if self.fixup_count > 0: for _ in range(self.fixup_count): self.fixups.append(SourceVvdFixup().read(reader)) if self.lod_count > 0: for lod_index in range(self.lod_count): for fixup_index in range(len(self.fixups)): fixup = self.fixups[fixup_index] if fixup.lod_index >= lod_index: for j in range(fixup.vertex_count): vertex = self.vertexes[fixup.vertex_index + j] self.fixed_vertexes_by_lod[lod_index].append(vertex)