1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#!/usr/bin/python2.4 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# Copyright 2007 The Android Open Source Project 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich"""Dump Quake ms2 files. 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichUseful for debugging Quake. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich""" 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# ms2 file format 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# int32 numcommands 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# int32 numorder 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# int32 commands[numcommands] 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# int32 vertexorder[numorder] 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# Where a command is 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# >= 0 --> strip(n) 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# < 0 --> fan(-n) 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich# followed by struct { float s; float t; } st[n]; 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport array 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport sys 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdef readInt32(f): 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich a = array.array('i') 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich a.read(f, 1) 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return a[0] 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdef readFloat32(f): 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich a = array.array('f') 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich a.read(f, 1) 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return a[0] 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichdef dumpms2(path): 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f = open(path, "rw") 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich numCommands = readInt32(f) 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich numOrder = readInt32(f) 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich commandIndex = 0 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich # Seek ahead and read the vertex order information 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f.seek(4 + 4 + 4 * numCommands) 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vertexOrder = array.array('i') 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vertexOrder.read(f, numOrder) 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich # Read commands 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f.seek(4 + 4) 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vertexOrderIndex = 0 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich while commandIndex < numCommands: 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich cmd = readInt32(f) 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich commandIndex = commandIndex + 1 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if cmd == 0: 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich elif(cmd > 0): 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich # strip 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich print "strip ", cmd 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for i in range(cmd): 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = readFloat32(f) 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = readFloat32(f) 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich print "[", i, "] ", vertexOrder[vertexOrderIndex], \ 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich " (", s, ",", t, ")" 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich commandIndex += 2 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vertexOrderIndex += 1 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich else: 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich # fan 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich print "fan ", -cmd 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich for i in range(-cmd): 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich s = readFloat32(f) 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich t = readFloat32(f) 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich print "[", i, "] ", vertexOrder[vertexOrderIndex], \ 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich " (", s, ",", t, ")" 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich commandIndex += 2 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich vertexOrderIndex += 1 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich f.close() 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichif __name__ == '__main__': 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich dumpms2(sys.argv[1]) 80