Skip to content

Instantly share code, notes, and snippets.

@daeken
Created October 24, 2015 23:55
Show Gist options
  • Save daeken/25539d3d0c5d5ab70b9e to your computer and use it in GitHub Desktop.
Save daeken/25539d3d0c5d5ab70b9e to your computer and use it in GitHub Desktop.
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