2 from struct
import unpack
6 return s
[p
:p
+s
[p
:].find ("\x00")]
15 return math
.sqrt (reduce (lambda a
,b
:b
*b
+a
, F
,0))
18 return reduce(lambda s
,v
:str(v
)+s
,[(b
>>i
)&1for i
in range(l
)],"")
21 return reduce(lambda s
,v
:str(v
)+s
,[(d
>>(i
+s
))&1for i
in range(l
)],"")
25 lut
= [-256, +128, +64, +32, +16, +8, +4, +2, +1]
31 lut
= [-16, +8, +4, +2, +1]
37 # return (a + (1 << (l-1))) / float (1 << l)
38 # return (a) / float (1 << (l))
46 return (b0
, b1
, b2
, b3
)
54 return map (signb
, bytes (D
))
58 return map (lambda b
: b
, sbs
)
61 return "[" + ", ".join (map (lambda f
: "% f" % f
, F
)) + "]"
65 data
= self
.data
[self
.xff
.off_sign
+17*4:]
67 x
= self
.xff
.off_sign
+17*4
68 print "hdr at %08x" % (x
+ self
.roff
)
70 D
= unpack ("<2I", data
[:8])
72 print "%08x %08x" % (D
[0], D
[1])
75 self
.some
.append ((x
+ self
.roff
, D
[0]))
78 print "hdr at %08x" % (x
+ self
.roff
)
81 D
= unpack ("<2I", data
[:8])
83 print "%08x %08x" % (D
[0], D
[1])
86 self
.some1
.append ((x
+ self
.roff
, D
[0]))
89 def __init__ (self
, file, xff
):
91 rodata
= xff
.sections
[1]
93 self
.roff
= rodata
[1][7]
95 data
= file.read ()#rodata[1][2])
97 self
.D
= unpack ("<17I", data
[self
.xff
.off_sign
:self
.xff
.off_sign
+17*4])
99 self
.bone_count
= self
.D
[5]
100 self
.boneD
= unpack ("<%dI" % self
.bone_count
,
101 sub4 (data
, self
.D
[4], self
.bone_count
))
102 self
.boneB
= unpack ("<%dB" % (self
.bone_count
+ 3),
103 sub1 (data
, self
.D
[2], self
.bone_count
+ 3))
106 # F = unpack ("<4f", data[0x13c:0x14c])
107 # print "magn %f" % magn (F)
115 print "[%2d] %d %08x %08x" % (n
, b
, d
, d
+ self
.roff
)
117 F
= unpack ("<4f", data
[d
:d
+16])
118 print " magn % f" % magn (F
)
122 print " (%d) % 13.13f (% e)" % (i
, f
, f
)
125 F
= unpack ("<5f", data
[d
:d
+20])
126 print " magn % f" % magn (F
[2:])
129 print " (%d) % 13.13f (% e)" % (i
, f
, f
)
133 F
= unpack ("<6f", data
[d
:d
+24])
134 for i
, f
in enumerate (F
):
135 print " (%d) % 13.13f (% e)" % (i
, f
, f
)
140 F
= unpack ("<8f", data
[d
:d
+32])
141 print " magn % f" % magn (F
[:])
142 for i
, f
in enumerate (F
):
144 sys
.stderr
.write ("fuck it %d\n" % n
)
145 print " (%d) % 13.13f (% e)" % (i
, f
, f
)
146 f
= math
.fabs (F
[4]) + math
.fabs (F
[5]) + math
.fabs (F
[6]) + math
.fabs (F
[7])
150 print " end at %08x %08x" % (d
+incr
, d
+incr
+self
.roff
)
152 buf
= data
[d
+incr
:d
+incr
+4]
153 d1
= unpack ("<I", buf
)[0]
154 print " %08x %08x %d" % (d1
, d1
+ self
.roff
, d1
)
155 count
= self
.D
[1] & 0xffff
161 subd
= data
[d1
:d1
+count
*2]
162 D
= unpack ("<%dH" % count
, subd
)
163 for i
in range (count
):
164 print " [%2d] %04x %d" % (i
, D
[i
], D
[i
])
167 subd
= data
[d1
:d1
+count
*6]
168 for i
in range (count
):
169 data
= unpack ("<3H", subd
[:6])
171 print " [%2d] %04x %04x %04x" % (i
, data
[0], data
[1], data
[2])
173 elif b
== 6 or b
== 3 or b
== 4 or b
== 5:
175 subd
= data
[d1
:d1
+count
*4]
176 D
= unpack ("<%dI" % count
, subd
)
177 for i
in range (count
):
180 z
= (d
>>9) & ((1<<9)-1)
181 y
= (d
>>18) & ((1<<9)-1)
184 starts
= [27, 18, 9, 0]
185 lengths
= [5, 9, 9, 9]
187 starts
= [23, 18, 9, 0]
188 lengths
= [9, 5, 9, 9]
190 starts
= [23, 14, 9, 0]
191 lengths
= [9, 9, 5, 9]
193 starts
= [23, 14, 5, 0]
194 lengths
= [9, 9, 9, 5]
196 ## print " [%2d] %08x %10d (%s %s %s %s)" % (i, D[i], D[i],
201 # print " %s" % bits (D[i], 32)
202 # print " [%2d] %08x %10d (% 4d, % 4d, % 4d, % 4d) (%s %s %s %s)" % \
203 x
= bit9 (D
[i
], starts
[0], lengths
[0])
204 y
= bit9 (D
[i
], starts
[1], lengths
[1])
205 z
= bit9 (D
[i
], starts
[2], lengths
[2])
206 w
= bit9 (D
[i
], starts
[3], lengths
[3])
208 # print " [%2d] %08x %10d (% f, % f, % f, % f: %f) (%s %s %s %s)" % \
209 print " [%2d] %08x %10d (%4d, %4d, %4d, %4d) (%s %s %s %s)" % \
210 (i
, D
[i
], D
[i
], x
, y
, z
, w
,
211 bits1 (D
[i
], starts
[0], lengths
[0]),
212 bits1 (D
[i
], starts
[1], lengths
[1]),
213 bits1 (D
[i
], starts
[2], lengths
[2]),
214 bits1 (D
[i
], starts
[3], lengths
[3]))
219 subd
= data
[d1
:d1
+count
*4]
220 D
= unpack ("<%dI" % count
, subd
)
221 F
= unpack ("<%df" % count
, subd
)
222 for i
in range (count
):
223 print " [%2d] %08x %f %d" % (i
, D
[i
], F
[i
], D
[i
])
226 print " end2 at %08x %08x" % (pos
, pos
+ self
.roff
)
228 def proff (self
, n
, s
):
230 print "D[%2d] %08x %08x %d (%s)" % (n
, d
, d
+self
.roff
, d
, s
)
233 print "roff %08x" % self
.roff
234 print "off_sign %08x" % self
.xff
.off_sign
235 print "at %08x" % (self
.roff
+ self
.xff
.off_sign
)
236 print "D[ 0] %08x" % self
.D
[0]
237 print "D[ 1] %08x" % self
.D
[1]
238 self
.proff (2, "per bone byte")
239 for i
in range (3, 4):
241 print "D[%2d] %08x %08x %d" % (i
, d
, d
+self
.roff
, d
)
243 self
.proff (4, "per bone dword")
244 print "D[ 5] %d (bone count)" % self
.D
[5]
246 if self
.xff
.off_sign
!= self
.D
[10]:
247 print "D[10] !!! %08x %d" % (self
.D
[10], self
.D
[10])
249 # print "%d" % (self.D[10] - self.D[7])
251 for i
in range (6, 9) + range (10, 17):
253 print "D[%2d] %08x %08x %d" % (i
, d
, d
+self
.roff
, d
)
255 for i
in range (self
.bone_count
):
257 if i
== self
.bone_count
- 1:
260 diff
= "%4d" % (self
.boneD
[i
+1] - d
)
261 print "boneD[%2d] %08x %08x %4d(%s)" % (i
, d
, d
+ self
.roff
, d
, diff
),
263 print "FLAG %3d %02x" % (b
, b
)
265 for i
in range (len (self
.some
)):
266 (off
, d
) = self
.some
[i
]
267 x
= unpack ('<I', self
.data
[d
:d
+4])[0]
268 print "[%2d] %08x %08x (%04x) |" % (i
, d
, d
+ self
.roff
, x
),
269 (off
, d
) = self
.some1
[i
]
270 print "[%2d] %08x %08x" % (i
, d
, d
+ self
.roff
)
272 for i
in range (self
.bone_count
):
276 f
= open (sys
.argv
[1], "rb")