This repository has been archived by the owner on Apr 28, 2024. It is now read-only.
/
fmt_ioi_tex.py
119 lines (87 loc) · 3.44 KB
/
fmt_ioi_tex.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
from inc_noesis import *
def registerNoesisTypes():
handle = noesis.register("IO Iterective textures", ".tex")
noesis.setHandlerTypeCheck(handle, ioCheckType)
noesis.setHandlerLoadRGBA(handle, ioLoadRGBA)
return 1
class ioTexure:
def __init__(self):
self.pos = 0
self.sectionSize = 0
self.textureDataSize = 0
self.width = 0
self.height = 0
self.name = ""
self.data = None
self.id = None
def readHeader(self, filereader):
self.sectionSize = filereader.readUInt()
self.id = filereader.readBytes(4).decode("ascii").rstrip('\0')
filereader.seek(8, NOESEEK_REL)
self.width = filereader.readUShort()
self.height = filereader.readUShort()
filereader.seek(16, NOESEEK_REL)
self.name = filereader.readString()
def readData(self, reader):
if self.id == "NLAP":
size1 = reader.readUInt()
indexes = reader.readBytes(size1)
size2 = reader.readUInt()
palleteRGBA = reader.readBytes(size2*4)
# apply pallete
self.data = bytearray(self.height * self.width * 4)
for i in range(size1):
self.data[i*4 + 0] = palleteRGBA[indexes[i]*4 + 0]
self.data[i*4 + 1] = palleteRGBA[indexes[i]*4 + 1]
self.data[i*4 + 2] = palleteRGBA[indexes[i]*4 + 2]
self.data[i*4 + 3] = palleteRGBA[indexes[i]*4 + 3]
else:
self.textureDataSize = reader.readUInt()
self.data = reader.readBytes(self.textureDataSize)
def read(self, reader):
self.pos = reader.tell()
self.readHeader(reader)
self.readData(reader)
reader.seek(self.pos + self.sectionSize, NOESEEK_ABS) #skip
class ioTEXFile:
def __init__(self, reader):
self.filereader = reader
self.size1 = 0
self.size2 = 0
self.textures = []
def parseHeader(self):
self.filereader.seek(0, NOESEEK_ABS)
self.size1 = self.filereader.readUInt()
self.size2 = self.filereader.readUInt()
self.filereader.readUInt()
self.filereader.readUInt()
return 0
def readTextures(self):
while self.size1 > self.filereader.tell():
tex = ioTexure()
tex.read(self.filereader)
self.textures.append(tex)
def read(self):
self.parseHeader()
self.readTextures()
def ioCheckType(data):
file = ioTEXFile(NoeBitStream(data))
if file.parseHeader() != 0:
return 0
return 1
def ioLoadRGBA(data, texList):
file = ioTEXFile(NoeBitStream(data))
if file.parseHeader() != 0:
return 0
file.read()
# noesis.logPopup()
ids = {"ABGR": noesis.NOESISTEX_RGBA32, "1TXD": noesis.NOESISTEX_DXT1, \
"3TXD": noesis.NOESISTEX_DXT3, "NLAP": noesis.NOESISTEX_RGBA32}
for tex in file.textures:
type = ids.get(tex.id, None)
if type:
texList.append(NoeTexture(tex.name, tex.height, tex.width, tex.data, \
type))
else:
print(tex.id)
return 1