3 maxd
= [(-1e9
, "none", -1, -1) for i
in range (8)]
4 mind
= [( 1e9
, "none", -1, -1) for i
in range (8)]
7 from struct
import unpack
13 return math
.sqrt (reduce (lambda a
,b
:b
*b
+a
, F
,0))
16 # boy, am i proud for this...
17 return reduce(lambda s
,v
:"01"[v
]+s
,[(b
>>i
)&1 for i
in range(l
)],"")
23 bitlen
= [9,5][j
== i
]
25 lut
.append ((bitindex
, bitlen
))
28 bitlut
= [makelut (i
) for i
in range (4)]
33 lut
= [-256, +128, +64, +32, +16, +8, +4, +2, +1]
38 lut
= [-16, +8, +4, +2, +1]
45 def notkalms (v
, len):
53 y
= math
.acos (x
) * 57.2957795
59 def __init__ (self
, file):
63 return unpack ("<I", buf
)[0]
66 tmppos
= r32 (0x50 + 3*4)
67 secpos
= r32 (tmppos
+ 15*4)
73 return unpack ("<I", data
[pos
:pos
+4])[0]
75 return unpack ("<H", data
[pos
:pos
+2])[0]
77 return unpack ("B", data
[pos
:pos
+1])[0]
79 bonecount
= r32 (hdrpos
+ 20)
81 tmp
= r32 (hdrpos
+ 16)
82 offs
= unpack ("<%dI" % bonecount
, data
[tmp
:tmp
+ bonecount
*4])
84 tmp
= r32 (hdrpos
+ 8)
85 flags
= unpack ("%dB" % bonecount
, data
[tmp
:tmp
+ bonecount
])
87 posecount
= r16 (hdrpos
+ 4)
90 bonedata
= data
[offs
[index
]:]
95 quaternion
= unpack ("<4f", bonedata
[:16])
96 bone
= (quaternion
, None)
99 floats
= unpack ("<6f", bonedata
[:24])
100 offset
= unpack ("<I", bonedata
[24:28])[0]
101 subdata
= data
[offset
:]
102 payload
= map (lambda k
: unpack ("<3H", subdata
[k
*6:(k
+1)*6]),
104 bone
= (floats
, payload
)
107 floats
= unpack ("<5f", bonedata
[:20])
108 offset
= unpack ("<I", bonedata
[20:24])[0]
109 subdata
= data
[offset
:offset
+posecount
*2]
110 payload
= unpack ("<%dH" % posecount
, subdata
)
111 bone
= (floats
, payload
)
114 floats
= unpack ("<8f", bonedata
[:32])
115 offset
= unpack ("<I", bonedata
[32:36])[0]
116 subdata
= data
[offset
:offset
+posecount
*4]
117 payload
= unpack ("<%dI" % posecount
, subdata
)
118 bone
= (floats
, payload
)
122 self
.bones
= map (rbone
, range (bonecount
))
123 self
.posecount
= posecount
125 def zerotest (self
, path
):
126 for i
, (flag
, (floats
, payload
)) in enumerate (self
.bones
):
127 if flag
in [3,4,5,6]:
131 if floats
[i
] > maxd
[i
][0]:
132 maxd
[i
] = (floats
[i
], path
, i
, flag
)
133 if floats
[i
] < mind
[i
][0]:
134 mind
[i
] = (floats
[i
], path
, i
, flag
)
136 def twentytest (self
, path
):
137 for i
, (flag
, (floats
, payload
)) in enumerate (self
.bones
):
142 if floats
[i
] > maxd
[i
][0]:
143 maxd
[i
] = (floats
[i
], path
, i
, flag
)
144 if floats
[i
] < mind
[i
][0]:
145 mind
[i
] = (floats
[i
], path
, i
, flag
)
147 def thirtytest (self
, path
):
148 for i
, (flag
, (floats
, payload
)) in enumerate (self
.bones
):
153 if floats
[i
] > maxd
[i
][0]:
154 maxd
[i
] = (floats
[i
], path
, i
, flag
)
155 if floats
[i
] < mind
[i
][0]:
156 mind
[i
] = (floats
[i
], path
, i
, flag
)
158 def showbone (self
, index
, bone
, below
):
159 (flag
, (floats
, payload
)) = bone
160 print "[%2d] %d bone%d" % (index
, flag
, index
)
161 for i
, f
in enumerate (floats
):
162 print " (%d) % .13f (% e)" % (i
, f
, f
)
165 print "magnitude %f" % magn (floats
)
169 for i
, (x
,y
,z
) in enumerate (payload
):
170 print " (%3d) %04x %04x %04x" % (i
, x
, y
, z
)
173 print "degrees1(?) % f" % (180.0 * floats
[0] / math
.pi
)
174 print "degrees2(?) % f" % (180.0 * floats
[1] / math
.pi
)
175 print "magnitude %f" % magn (floats
[2:])
177 for i
, h
in enumerate (payload
):
178 print " (%2d) %04x" % (i
, h
)
181 s1
= sum (floats
[:4])
182 s2
= sum (floats
[4:])
184 # print "% .13f %e" % (magn (floats[3:6]), magn (floats[3:6]))
185 # print "% .13f % .13f % .13f\n% e, % e, % e" % (s1, s2, s3,
188 lut
= bitlut
[flag
- 3]
189 for i
, d
in enumerate (payload
):
190 l
= [((d
>> b
[0]) & ((1 << b
[1]) - 1), b
[1]) for b
in lut
]
191 (x
,xl
), (y
,yl
), (z
,zl
), (w
,wl
) = l
197 print " (%2d) %08x %s %s %s %s" % (i
, d
, xs
, ys
, zs
, ws
),
202 print "%*d %*d %*d %*d" % (xl
, kalms (x
, xl
),
207 print "% 4d % 4d % 4d % 4d" % (kalms (x
, xl
),
212 fl
= map (lambda (v
, l
): fkalms (v
, l
), l
)
213 fl
[0] = fl
[0] * floats
[4] + floats
[0]
214 fl
[1] = fl
[1] * floats
[5] + floats
[1]
215 fl
[2] = fl
[2] * floats
[6] + floats
[2]
216 fl
[3] = fl
[3] * floats
[7] + floats
[3]
217 print "% f % f % f % f (%f)" % (fl
[0], fl
[1], fl
[2], fl
[3],
222 print "% f % f % f % f" % (fkalms2 (x
, xl
, floats
),
223 fkalms2 (y
, yl
, floats
),
224 fkalms2 (z
, zl
, floats
),
225 fkalms2 (w
, wl
, floats
))
227 def show (self
, below
= False):
228 print "flags = %s" % str ([b
[0] for b
in self
.bones
])
229 print "poses = %d" % self
.posecount
231 for index
, bone
in enumerate (self
.bones
):
232 self
.showbone (index
, bone
, below
)
238 file = open (path
, "rb")
240 # anb.zerotest (path)
241 # anb.twentytest (path)
245 if len (sys
.argv
) < 2:
246 if sys
.stdin
.isatty ():
247 sys
.stderr
.write ("path please")
250 for line
in sys
.stdin
:
253 file = open (path
, "rb")
255 # anb.zerotest (path)
256 anb
.twentytest (path
)
257 # anb.thirtytest (path)
262 # shamelessly stolen from git
270 for path
in sys
.argv
[1:]:
277 os
.execl ("/bin/sh", "sh", "-c", os
.getenv ("PAGER", default
="less"))
279 if __name__
== "__main__":
282 (v
, path
, index
, flag
) = maxd
[i
]
283 print "max %d: % f %s %d %d" % (i
, v
, path
, index
, flag
)
285 (v
, path
, index
, flag
) = mind
[i
]
286 print "min %d: % f %s %d %d" % (i
, v
, path
, index
, flag
)