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