Created
October 24, 2015 23:55
-
-
Save daeken/25539d3d0c5d5ab70b9e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
from Struct import Struct as S | |
class Header(S): | |
def __format__(self): | |
self.magic = S.string(4) | |
self.version = S.uint32 | |
self.direntries = Direntry()[17] | |
class Direntry(S): | |
def __format__(self): | |
self.offset, self.length = S.uint32[2] | |
class Texture(S): | |
def __format__(self): | |
self.name = S.string(64, stripNulls=True) | |
self.surface_flags = S.uint32 | |
self.content_flags = S.uint32 | |
class Plane(S): | |
def __format__(self): | |
self.normal = S.float[3] | |
self.dist = S.float | |
class Node(S): | |
def __format__(self): | |
self.plane = S.uint32 | |
self.children = S.uint32[2] | |
self.mins = S.uint32[3] | |
self.maxs = S.uint32[3] | |
class Leaf(S): | |
def __format__(self): | |
self.cluster = S.uint32 | |
self.area = S.uint32 | |
self.mins = S.uint32[3] | |
self.maxs = S.uint32[3] | |
self.leafface = S.uint32 | |
self.n_leaffaces = S.uint32 | |
self.leafbrush = S.uint32 | |
self.n_leafbrushes = S.uint32 | |
class LeafFace(S): | |
def __format__(self): | |
self.face = S.uint32 | |
class LeafBrush(S): | |
def __format__(self): | |
self.brush = S.uint32 | |
class Model(S): | |
def __format__(self): | |
self.mins = S.float[3] | |
self.maxs = S.float[3] | |
self.face = S.uint32 | |
self.n_faces = S.uint32 | |
self.brush = S.uint32 | |
self.n_brushes = S.uint32 | |
class Brush(S): | |
def __format__(self): | |
self.brushside = S.uint32 | |
self.n_brushsides = S.uint32 | |
self.texture = S.uint32 | |
class BrushSide(S): | |
def __format__(self): | |
self.plane = S.uint32 | |
self.texture = S.uint32 | |
class Vertex(S): | |
def __format__(self): | |
self.position = S.float[3] | |
self.texcoords = S.float[4] | |
self.normal = S.float[3] | |
self.color = S.uint8[4] | |
class Meshvert(S): | |
def __format__(self): | |
self.offset = S.uint32 | |
class Effect(S): | |
def __format__(self): | |
self.name = S.string(64, stripNulls=True) | |
self.brush = S.uint32 | |
self.unknown = S.uint32 # How is this unknown? | |
class Face(S): | |
def __format__(self): | |
self.texture, self.effect, self.type = S.uint32[3] | |
self.vertex, self.n_vertices = S.uint32[2] | |
self.meshvert, self.n_meshverts = S.uint32[2] | |
self.lm_index = S.uint32 | |
self.lm_start = S.uint32[2] | |
self.lm_size = S.uint32[2] | |
self.lm_origin = S.float[3] | |
self.lm_vec_S = S.float[3] | |
self.lm_vec_T = S.float[3] | |
self.normal = S.float[3] | |
self.size = S.uint32[2] | |
def main(fn): | |
def decode(lump, cls): | |
size = len(cls()) | |
fp.seek(header.direntries[lump].offset) | |
return [cls(unpack=fp) for i in xrange(header.direntries[lump].length / size)] | |
fp = file(fn, 'rb') | |
header = Header(unpack=fp) | |
fp.seek(header.direntries[0].offset) | |
entities = fp.read(header.direntries[0].length) | |
#print entities | |
textures = decode(1, Texture) | |
planes = decode(2, Plane) | |
nodes = decode(3, Node) | |
leafs = decode(4, Leaf) | |
leaffaces = decode(5, LeafFace) | |
leafbrushes = decode(6, LeafBrush) | |
models = decode(7, Model) | |
brushes = decode(8, Brush) | |
brushsides = decode(9, BrushSide) | |
vertices = decode(10, Vertex) | |
meshverts = decode(11, Meshvert) | |
effects = decode(12, Effect) | |
faces = decode(13, Face) | |
if __name__=='__main__': | |
main(*sys.argv[1:]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment