| #!/usr/bin/python2.4 |
| # |
| # Copyright 2007 The Android Open Source Project |
| |
| """Dump Quake ms2 files. |
| |
| Useful for debugging Quake. |
| """ |
| |
| # ms2 file format |
| # int32 numcommands |
| # int32 numorder |
| # int32 commands[numcommands] |
| # int32 vertexorder[numorder] |
| # |
| # Where a command is |
| # |
| # >= 0 --> strip(n) |
| # < 0 --> fan(-n) |
| # followed by struct { float s; float t; } st[n]; |
| |
| import array |
| import sys |
| |
| def readInt32(f): |
| a = array.array('i') |
| a.read(f, 1) |
| return a[0] |
| |
| def readFloat32(f): |
| a = array.array('f') |
| a.read(f, 1) |
| return a[0] |
| |
| def dumpms2(path): |
| f = open(path, "rw") |
| numCommands = readInt32(f) |
| numOrder = readInt32(f) |
| commandIndex = 0 |
| |
| # Seek ahead and read the vertex order information |
| f.seek(4 + 4 + 4 * numCommands) |
| vertexOrder = array.array('i') |
| vertexOrder.read(f, numOrder) |
| |
| # Read commands |
| f.seek(4 + 4) |
| vertexOrderIndex = 0 |
| |
| while commandIndex < numCommands: |
| cmd = readInt32(f) |
| commandIndex = commandIndex + 1 |
| if cmd == 0: |
| break |
| elif(cmd > 0): |
| # strip |
| print "strip ", cmd |
| for i in range(cmd): |
| s = readFloat32(f) |
| t = readFloat32(f) |
| print "[", i, "] ", vertexOrder[vertexOrderIndex], \ |
| " (", s, ",", t, ")" |
| commandIndex += 2 |
| vertexOrderIndex += 1 |
| else: |
| # fan |
| print "fan ", -cmd |
| for i in range(-cmd): |
| s = readFloat32(f) |
| t = readFloat32(f) |
| print "[", i, "] ", vertexOrder[vertexOrderIndex], \ |
| " (", s, ",", t, ")" |
| commandIndex += 2 |
| vertexOrderIndex += 1 |
| |
| f.close() |
| |
| if __name__ == '__main__': |
| dumpms2(sys.argv[1]) |