Exemplo n.º 1
0
 def read(self, reader: ByteIO):
     header_chunks = reader.get_items()
     for tex_chunk in header_chunks:
         reader.seek(tex_chunk.offset)
         if tex_chunk.type == 20:
             self.chunk_name = reader.read_ascii_string(reader.read_int32())
         if tex_chunk.type == 21:
             self.name = Path(reader.read_ascii_string(reader.read_int32()))
         if tex_chunk.type == 1:
             texture_data_chunks = reader.get_items()
             for tex_data in texture_data_chunks:
                 reader.seek(tex_data.offset)
                 if tex_data.type == 20:
                     reader.skip(3)
                     items3 = reader.get_items()[:1]
                     for n, item3 in enumerate(items3):
                         reader.seek(item3.offset)
                         flag = reader.read_fmt('BBBB')
                         if flag == (36, 0, 65, 0):
                             items4 = reader.get_items()
                             for item4 in items4:
                                 reader.seek(item4.offset)
                                 if item4.type == 20:
                                     self.width = reader.read_int32()
                                 if item4.type == 21:
                                     self.height = reader.read_int32()
                                 if item4.type == 23:
                                     self.format = reader.read_int32()
                                 if item4.type == 22:
                                     self.offset = reader.tell()
                             reader.seek(self.offset)
                             if self.format == 7:
                                 pixel_mode = ('bcn', 1, 0)
                             elif self.format == 11:
                                 pixel_mode = ('bcn', 3, 0)
                             elif self.format == 9:
                                 pixel_mode = ('bcn', 2, 0)
                             # elif self.format == 5:
                             #     pixel_mode = ('bcn', 7, 0)
                             else:
                                 raise NotImplementedError(
                                     'Format:{} is not supported yet'.
                                     format(self.format))
                             im_data = reader.read_bytes(self.width *
                                                         self.height * 4)
                             image = Image.frombuffer(
                                 'RGBA', (self.width, self.height), im_data,
                                 *pixel_mode)
                             del im_data
                             tex_path = self.path / 'textures'
                             os.makedirs(tex_path, exist_ok=True)
                             image.save(tex_path / self.name.with_name(
                                 self.name.stem).with_suffix('.tga'))
Exemplo n.º 2
0
    def read(self, reader: ByteIO):
        items = reader.get_items()
        for item in items:
            item.seek_to()

            if item.type == 20:
                self.chunk_name = reader.read_ascii_string(reader.read_int32())
            if item.type == 21:
                self.name = reader.read_ascii_string(reader.read_int32())
            if item.type == 100:
                self.temp_path = reader.read_ascii_string(reader.read_int32())

            if item.type == 1:
                items2 = item.get_items()
                for item2 in items2:
                    item2.seek_to()
                    if item2.type == 30:
                        item2.seek_to()
                        self.size = reader.read_uint32()
                    if item2.type == 31:
                        self.data = reader.read_bytes(self.size)
Exemplo n.º 3
0
 def read(self, reader: ByteIO):
     items = reader.get_items()
     for item in items:
         reader.seek(item.offset)
         if item.type == 20:
             self.chunk_name = reader.read_ascii_string(reader.read_int32())
         if item.type == 21:
             self.name = reader.read_ascii_string(reader.read_int32())
         if item.type == 30:
             items2 = reader.get_items()
             for item2 in items2:
                 reader.seek(item2.offset)
                 if item2.type == 20:
                     self.diffuse = reader.read_ascii_string(
                         reader.read_int32())
         if item.type == 32:
             items2 = reader.get_items()
             for item2 in items2:
                 reader.seek(item2.offset)
                 if item2.type == 20:
                     self.glow = reader.read_ascii_string(
                         reader.read_int32())
         if item.type == 42 or item.type == 50:
             items2 = reader.get_items()
             for item2 in items2:
                 reader.seek(item2.offset)
                 if item2.type == 20:
                     self.normal = reader.read_ascii_string(
                         reader.read_int32())
         if item.type == 44:
             items2 = reader.get_items()
             for item2 in items2:
                 reader.seek(item2.offset)
                 if item2.type == 20:
                     self.mask = reader.read_ascii_string(
                         reader.read_int32())
         if item.type == 49:
             items2 = reader.get_items()
             for item2 in items2:
                 reader.seek(item2.offset)
                 if item2.type == 20:
                     self.something1 = reader.read_ascii_string(
                         reader.read_int32())
Exemplo n.º 4
0
 def read(self, reader: ByteIO):
     self.section1 = reader.read_uint32()
     self.offset1 = reader.read_uint32()
     self.section2 = reader.read_int32()
     self.offset2 = reader.read_int32()
Exemplo n.º 5
0
 def read(self, reader: ByteIO):
     self.file_hash = reader.read_uint32()
     self.local_type_hash = reader.read_uint32()
     self.chunk_id = reader.read_int32()
     self.offset = reader.read_int32()
Exemplo n.º 6
0
 def read(self, reader: ByteIO):
     self.archive_id = reader.read_int32()
     self.size = reader.read_int32()
Exemplo n.º 7
0
    def read(self, reader: ByteIO):
        items = reader.get_items()
        for item in items:
            reader.seek(item.offset)
            if item.type == 20:
                self.chunk_name = reader.read_ascii_string(reader.read_int32())
            if item.type == 21:
                self.name = reader.read_ascii_string(reader.read_int32())
                # print('New model',self.name)
            if item.type == 30:
                items2 = reader.get_items()
                for item2 in items2:
                    reader.seek(item2.offset)
                    if item2.type == 1:
                        items3 = reader.get_items()
                        for item3 in items3:
                            reader.seek(item3.offset)
                            flag = reader.read_fmt('BBBB')
                            if flag == (103, 0, 65, 0):
                                mesh_chunk = None
                                mat_chunk = None
                                items4 = reader.get_items()
                                for item4 in items4:
                                    reader.seek(item4.offset)

                                    if item4.type == 31:
                                        items5 = reader.get_items()
                                        for item5 in items5:
                                            reader.seek(item5.offset)
                                            if item5.type == 20:
                                                mesh_chunk = reader.read_ascii_string(
                                                    reader.read_int32())
                                    if item4.type == 33:
                                        items5 = reader.get_items()
                                        for item5 in items5:
                                            reader.seek(item5.offset)
                                            if item5.type == 20:
                                                mat_chunk = reader.read_ascii_string(
                                                    reader.read_int32())
                                if mesh_chunk and mat_chunk:
                                    self.model_data.append(
                                        [mesh_chunk, mat_chunk])
            if item.type == 33:
                items2 = reader.get_items()
                for item2 in items2:
                    reader.seek(item2.offset)
                    if item2.type == 20:
                        tmp = reader.read_int32()
                    if item2.type == 21:
                        self.bone_count = reader.read_int32()
                    if item2.type == 22:
                        self.stream_offset = reader.tell()
                reader.seek(self.stream_offset)
                if self.bone_count:
                    for m in range(self.bone_count):
                        tm = reader.tell()
                        bone = Bone()
                        bone.name = reader.read_ascii_string(32)
                        bone.matrix = reader.read_fmt('f' * 16)
                        reader.skip(4 * 7)
                        bone.skin_id = reader.read_int32()
                        bone.parent = reader.read_int32()
                        reader.skip(4 * 3)
                        self.bones.append(bone)
                        reader.seek(tm + 144)
                        self.name_list[bone.skin_id] = bone.name
            if item.type == 35:
                items2 = reader.get_items()
                for item2 in items2:
                    reader.seek(item2.offset)
                    if item2.type == 1:
                        items3 = reader.get_items()
                        for item3 in items3:
                            reader.seek(item3.offset)
                            flag = reader.read_fmt('BBBB')
                            if flag == (160, 0, 65, 0):
                                items4 = reader.get_items()
                                count = 0
                                stream_offset = 0
                                for item4 in items4:
                                    reader.seek(item4.offset)
                                    if item4.type == 22:
                                        count = reader.read_int32()
                                    if item4.type == 23:
                                        stream_offset = reader.tell()
                                if count:
                                    reader.seek(stream_offset)
                                    self.bone_map_list.append([
                                        reader.read_int32()
                                        for _ in range(count)
                                    ])
Exemplo n.º 8
0
    def read(self, reader: ByteIO):
        header_chunks = reader.get_items()
        for item in header_chunks:
            reader.seek(item.offset)

            if item.type == 20:
                self.chunk_name = reader.read_ascii_string(reader.read_int32())
            if item.type == 21:
                self.name = reader.read_ascii_string(reader.read_int32())
            if item.type == 1:
                items = reader.get_items()
                for item in items:
                    reader.seek(item.offset)

                    if item.type == 10:
                        items2 = reader.get_items()
                        for item2 in items2:
                            reader.seek(item2.offset)
                            if item2.type == 21:
                                self.indices_count = reader.read_int32()
                            if item2.type == 22:
                                self.indices_offset = reader.tell()
                        if self.indices_count is not None:
                            self.mode = 1
                            reader.seek(self.indices_offset)
                            self.indices = [
                                reader.read_uint16()
                                for _ in range(self.indices_count)
                            ]

                    if item.type == 21:
                        items2 = reader.get_items()
                        for item2 in items2:
                            reader.seek(item2.offset)
                            if item2.type == 21:
                                self.indices_count = reader.read_int32()
                            if item2.type == 22:
                                self.indices_offset = reader.tell()
                        if self.indices_count is not None:
                            self.mode = 2
                            reader.seek(self.indices_offset)
                            self.indices = [
                                reader.read_uint16()
                                for _ in range(self.indices_count)
                            ]

                    if item.type == 11:
                        items2 = reader.get_items()
                        for item2 in items2:
                            reader.seek(item2.offset)
                            if item2.type == 20:
                                items3 = reader.get_items()
                                for item3 in items3:
                                    reader.seek(item3.offset)

                                    if item3.type == 21:
                                        self.vert_stride = reader.read_int32()
                                    if item3.type == 22:
                                        self.vert_item_count = reader.read_int32(
                                        )
                                    if item3.type == 23:
                                        self.vert_offset = reader.tell()
                                    reader.seek(self.vert_offset)
                                off = 0
                                for k in range(self.vert_item_count):
                                    a, b, c, d = reader.read_fmt('BBBB')
                                    # print k,a,b,c,d,vertStrideSize
                                    if c == 1: self.pos_offset = off
                                    if c == 5 and a == 0:
                                        self.uv_offset = off
                                    # print k,a,b,c,d,vertStrideSize
                                    if c == 11: self.skin_ind_offset = off
                                    if c == 10: self.skin_weight_offset = off
                                    if d == 2: off += 12
                                    if d == 1: off += 8
                                    if d == 3: off += 16
                                    if d == 4: off += 1
                                    if d == 7: off += 1
                                    if d == 15: off += 4
                            if item2.type == 21:
                                self.vert_count = reader.read_int32()
                            if item2.type == 22:
                                self.stream_offset = reader.tell()
        reader.seek(self.stream_offset)
        for k in range(self.vert_count):
            tk = reader.tell()
            if self.pos_offset is not None:
                reader.seek(self.pos_offset + tk)
                self.vertices.append(reader.read_fmt('fff'))
            if self.uv_offset is not None:
                reader.seek(self.uv_offset + tk)
                self.uv.append([reader.read_float(), 1 - reader.read_float()])
            if self.skin_ind_offset:
                # reader.seek(self.skin_ind_offset + tk)
                i1, i2, i3 = reader.read_fmt('BBB')
                self.weight_inds.append([i1, i2])
            if self.skin_weight_offset:
                # reader.seek(self.skin_weight_offset + tk)
                w1, w2 = reader.read_fmt('BB')
                w3 = 255 - (w1 + w2)
                self.weight_weight.append([w1, w2])
            reader.seek(tk + self.vert_stride)
Exemplo n.º 9
0
    def read(self, reader: ByteIO):
        items = reader.get_items()
        for item in items:
            item.seek_to()

            if item.type == 20:
                self.chunk_name = reader.read_ascii_string(reader.read_int32())
            if item.type == 21:
                self.name = reader.read_ascii_string(reader.read_int32())
                print(self.name)
            if item.type == 1:
                items2 = item.get_items()
                for item2 in items2:
                    item2.seek_to()
                    if item2.type == 10:
                        reader.skip(3)
                        items4 = item2.get_items()
                        for item4 in items4:
                            item4.seek_to()
                            flag = reader.read_fmt('BBBB')
                            print(flag)
                            if flag == (7, 0, 65, 0):  #bone
                                items5 = item4.get_items()
                                for item5 in items5:
                                    print(item5)
                                    item5.seek_to()

                                    if item5.type == 20:
                                        b_name = reader.read_ascii_string(
                                            reader.read_int32())
                                        print('\t', b_name)
                                        self.bone_names.append(b_name)
                                    if item5.type == 24:
                                        items6 = item5.get_items()
                                        for item6 in items6:
                                            item6.seek_to()
                                            if item6.type == 21:
                                                self.frame_count = reader.read_uint32(
                                                )
                                            if item6.type == 22:
                                                self.frame_offset = reader.tell(
                                                )
                                        if self.frame_offset and self.frame_count:
                                            for _ in range(self.frame_count):
                                                self.anim_data.append(
                                                    reader.read_bytes(16))

                                    if item5.type == 25:
                                        items6 = item5.get_items()
                                        for item6 in items6:
                                            item6.seek_to()
                                            if item6.type == 21:
                                                items7 = item5.get_items()
                                                for item7 in items7:
                                                    item7.seek_to()
                                                    if item7.type == 22:
                                                        self.frame_count = reader.read_uint32(
                                                        )
                                                    if item7.type == 23:
                                                        self.frame_offset = reader.tell(
                                                        )
                                                    if item7.type == 30:
                                                        self.frame_count2 = reader.read_uint32(
                                                        )
                                                    if item7.type == 31:
                                                        self.frame_offset2 = reader.tell(
                                                        )

                                        if self.frame_offset and self.frame_count:
                                            reader.seek(self.frame_offset)
                                            for _ in range(self.frame_count):
                                                self.anim_data2.append(
                                                    reader.read_bytes(6))
                                        if self.frame_offset2 and self.frame_count2:
                                            reader.seek(self.frame_offset2)
                                            for _ in range(self.frame_count2):
                                                self.anim_data3.append(
                                                    reader.read_bytes(8))
Exemplo n.º 10
0
 def read(self, reader: ByteIO):
     self.name_hash = reader.read_uint32()
     self.type_hash = reader.read_uint32()
     self.chunk_id = reader.read_int32()
     self.offset = reader.read_int32()
Exemplo n.º 11
0
 def read(self, reader: ByteIO):
     self.unk1 = reader.read_int32()
     self.size = reader.read_int32()