3 from struct
import unpack
6 return s
[p
:p
+s
[p
:].find ("\x00")]
9 def __init__ (self
, ropos
, pos
, n
, data
):
14 srf
= data
[spos
:spos
+288]
15 if srf
[:4] <> "SRF\x00":
16 raise "sourface %d at %08x, bad signature" % (n
, spos
+ ropos
), srf
[:4]
18 self
.D04_10
= unpack ("<3I", srf
[4:0x10])
19 self
.tricount
= self
.D04_10
[0]
20 self
.stripcount
= self
.D04_10
[1]
21 self
.nameoff
= self
.D04_10
[2]
24 stru
= unpack ("<4BfII", srf
[0x10+i
*16:0x10+(i
+1)*16])
25 self
.hdr1
.append (stru
)
27 self
.hdr2
= unpack ("<I2f5I", srf
[0x40:0x60])
28 self
.hdr3
= unpack ("<48I", srf
[0x60:288])
32 print " [%d] %s (%08x)" % (self
.n
, cstr (self
.rodata
, self
.nameoff
),
33 self
.ropos
+ self
.spos
)
34 print " triangle count %d" % self
.tricount
35 print " strip count %d" % self
.stripcount
36 # print " %s" % cstr (self.rodata, self.D04_10[2])
37 # print " %08x %d" % (self.D04_10[2], self.D04_10[2])
38 # print " | %08x %d" % (self.D04_10[2] + self.ropos, self.D04_10[2] + self.ropos)
41 for stru
in self
.hdr1
:
43 print " %d, %d, %d, %d" % (stru
[0], stru
[1], stru
[2], stru
[3])
45 print " %08x %d" % (stru
[5], stru
[5])
46 print " %08x %d" % (stru
[6], stru
[6])
53 print " [%d] % f" % (j
, v
)
55 print " [%d] %08x %d" % (j
, v
, v
)
62 print " [%d] %08x %d" % (j
, v
, v
)
66 def __init__ (self
, pos
, data
):
67 buf
= data
[pos
:pos
+32]
68 D
= unpack ("<8I", buf
)
75 self
.stripcount
= D
[6]
79 print " at %08x size %d (ends at %08x)" % (self
.offs
+ ropos
,
81 self
.offs
+ self
.size
+ ropos
)
82 print " surface %d" % self
.surf
83 print " triangle count %d" % self
.tricount
84 print " strip count %d" % self
.stripcount
86 print " !!! unknown at 04 = %08x %d" % (self
.unk_D_04
, self
.unk_D_04
)
87 print " unknown at 0C = %08x %d" % (self
.unk_D_0C
, self
.unk_D_0C
)
89 print " !!! unknown at 1c = %08x %d" % (self
.unk_D_1C
, self
.unk_D_1C
)
92 def geom (self
, ropos
, count
):
94 for surf
in range (count
):
96 print "Surface %d %08x:" % (surf
, pos
+ ropos
)
99 bytes
= unpack ("<12B", buf
[:12])
100 if bytes
[2] <> 0 or bytes
[6] <> 0 or bytes
[10] <> 0:
101 raise "Unexpected sequence at %08x %s" % (ropos
+ pos
,
102 buf
[:12].encode ("hex"))
115 print " %08x:" % (pos
+ ropos
)
116 bytes
= unpack ("<4B", buf
[pos
:pos
+4])
125 print " %d %02x count=%d %02x" % (index
, mask
, count
, kind
),
126 if kind
>> 4 <> 0 and mask
<> 0x80:
127 print " (NON 80 MASK)"
133 for i
in range (count
):
135 t
= unpack ("<BBH3I",buf
[pos
:pos
+16])
136 print " (%04x(%d) %02x %d)" % (t
[2], t
[2],
138 print " %08x %d" % (t
[3], t
[3])
139 print " %08x %d" % (t
[4], t
[4])
140 print " %08x %d" % (t
[5], t
[5])
143 t
= unpack ("<3fI",buf
[pos
:pos
+16])
151 for i
in range (count
):
152 F
= unpack ("<3f", buf
[pos
:pos
+12])
154 print " v % f, % f, % f" % (F
[0], F
[1], F
[2])
156 Fn
= math
.sqrt (F
[0]*F
[0] + F
[1]*F
[1] + F
[2]*F
[2])
157 print " n % f, % f, % f -> %f" % (F
[0], F
[1], F
[2], Fn
)
161 for i
in range (count
):
162 h
= unpack ("<4h", buf
[pos
:pos
+8])
163 H
= unpack ("<4H", buf
[pos
:pos
+8])
164 #print buf[pos:pos+8].encode ("hex")
165 print " %04x %04x %04x %04x | % 5d % 5d % 5d % 5d" % (H
[0], H
[1],
173 raise "5 with non zero mask?"
176 for i
in range (count
):
177 B
= unpack ("<4B", buf
[pos
:pos
+4])
178 print " %02x %02x %02x %02x (%3d, %3d, %3d, %3d)" % (B
[0], B
[1],
185 if mask
<> 0 or count
<> 0 or index
<> 0:
186 raise "0x17 with invalid stuff"
189 for i
in range (count
):
190 h
= unpack ("<2h", buf
[pos
:pos
+4])
191 H
= unpack ("<2H", buf
[pos
:pos
+4])
192 print " %04x %04x | % 5d % 5d" % (H
[0], H
[1], h
[0], h
[1])
195 elif kind
== 0x00 and index
== 0x00 and mask
== 0x00 and count
== 0x00:
196 pos
= (pos
+ 15) & ~
15
197 print " POS %08x" % (pos
+ropos
)
201 raise "Unknown kind", hex (kind
)
203 def __init__ (self
, file, xff
):
204 rodata
= xff
.sections
[1]
206 file.seek (rodata
[1][7])
207 data
= file.read (rodata
[1][2])
209 hdr
= data
[xff
.off_sign
:][:0x80]
210 if hdr
[:4] <> "NMO\x00":
211 raise "bad signature", hdr
[:4]
213 self
.D7
= unpack ("<7I", hdr
[4:0x20])
214 self
.F4
= unpack ("<4f", hdr
[0x20:0x30])
215 self
.D4
= unpack ("<4I", hdr
[0x20:0x30])
219 s
= hdr
[0x30+i
*0x10:0x30+(i
+1)*0x10]
220 u
= unpack ("<4I", s
)
223 self
.data0
= data
[self
.hdrs
[0][0]:self
.hdrs
[0][0]+144]
226 for i
in range (self
.hdrs
[1][1]):
227 pos
= self
.hdrs
[1][0] + i
*32
228 tdata
= data
[pos
:pos
+32]
229 if tdata
[:4] <> "TEX\x00":
230 raise "bad tex object %d at %08x" % (i
, pos
), tdata
[:4]
231 stru
= unpack ("<5I2H2H", tdata
[4:0x20])
233 name
= cstr (data
, nameoff
)
234 tex
= (name
,) + stru
[1:]
235 self
.texs
.append (tex
)
238 for i
in range (self
.hdrs
[2][1]):
239 self
.srfs
.append (SRF (rodata
[1][7], self
.hdrs
[2][0], i
, data
))
242 for i
in range (self
.hdrs
[3][1]):
243 pos
= self
.hdrs
[3][0] + i
*32
244 # stru = unpack ("<8I", data[pos:pos+32])
245 self
.hdr3
.append (HDR3 (pos
, data
))
248 self
.geom (rodata
[1][7], self
.hdrs
[3][1] )
250 print "Unexpected error:", sys
.exc_info()
256 print " [%d] %08x %d" % (i
, d
, d
)
261 print " [%d] %08x % f" % (i
, self
.D4
[i
], f
)
267 print " %08x (%08x) offset" % (u
[0], u
[0] + self
.rodata
[1][7])
268 print " %08x %d count" % (u
[1], u
[1])
272 # print " %08x" % (u[0] + 144)
275 print cstr (self
.data
, u
[0])
278 for i
in range (len (self
.hdr3
)):
281 hdr3
.pr (self
.rodata
[1][7])
283 ## for j in range (len (v)):
286 ## vvv = vv + self.rodata[1][7]
287 ## print " [%d] %08x %d %08x %d" % (j, vv, vv, vvv, vvv)
289 ## vvv = v[4] + vv + self.rodata[1][7]
290 ## print " [%d] %08x %d %08x %d" % (j, vv, vv, vvv, vvv)
292 ## print " [%d] %08x %d" % (j, vv, vv)
296 for tex
in self
.texs
:
297 print " [%4d] %s" % (nr
, tex
[0])
299 print " %08x %d" % (tex
[i
+1], tex
[i
+1])
300 print " %dx%d" % (tex
[7], tex
[8])
304 for srf
in self
.srfs
:
309 f
= open (sys
.argv
[1], "rb")
314 #rodata = x.sections[1]