Pre-process texture defs.

The st-vectors are now fully calculated as per qfbsp's algorithm.
The Texinfo class tries to create unique texture defintions.
This commit is contained in:
Bill Currie 2012-09-04 16:59:02 +09:00
parent 446016e84e
commit 95e2a5b21a

View file

@ -1,6 +1,6 @@
# vim:ts=4:et # vim:ts=4:et
from mathutils import Vector from mathutils import Vector, Quaternion
from .script import Script from .script import Script
@ -10,31 +10,48 @@ class Entity:
self.b = [] self.b = []
pass pass
texdefs=[]
class Texinfo: class Texinfo:
def __init__(self, script, plane): def __init__(self, name, s_vec, t_vec, s_offs, t_offs, rotate, scale):
self.name = script.getToken() self.name = name
norm = s_vec.cross(t_vec)
q = Quaternion(norm, rotate)
self.vecs = [None] * 2
self.vecs[0] = (q * s_vec / scale[0], s_offs)
self.vecs[1] = (q * t_vec / scale[1], t_offs)
def __cmp__(self, other):
return self.name == other.name and self.vecs == other.vecs
@classmethod
def unique(cls, script, plane):
name = script.getToken()
script.getToken() script.getToken()
if script.token == "[": if script.token == "[":
hldef = True hldef = True
self.s_vec = parse_vector(script) s_vec = Vector(parse_vector(script))
self.s_offs = float(script.getToken()) s_offs = float(script.getToken())
if script.getToken() != "]": if script.getToken() != "]":
map_error(script, "Missing ]") map_error(script, "Missing ]")
if script.getToken() != "[": if script.getToken() != "[":
map_error(script, "Missing [") map_error(script, "Missing [")
self.t_vec = parse_vector(script) t_vec = Vector(parse_vector(script))
self.t_offs = float(script.getToken()) t_offs = float(script.getToken())
if script.getToken() != "]": if script.getToken() != "]":
map_error(script, "Missing ]") map_error(script, "Missing ]")
else: else:
hldef = False hldef = False
self.s_vec, self.t_vec = texture_axis_from_plane(plane) s_vec, t_vec = texture_axis_from_plane(plane)
self.s_offs = float(script.token) s_offs = float(script.token)
self.t_offs = float(script.getToken()) t_offs = float(script.getToken())
self.rotate = float(script.getToken()) rotate = float(script.getToken())
self.scale = [0, 0] scale = [0, 0]
self.scale[0] = float(script.getToken()) scale[0] = float(script.getToken())
self.scale[1] = float(script.getToken()) scale[1] = float(script.getToken())
tx = cls(name, s_vec, t_vec, s_offs, t_offs, rotate, scale)
for t in texdefs:
if t == tx:
return t
return tx
baseaxis = ( baseaxis = (
(Vector((0,0, 1)), (Vector((1,0,0)), Vector((0,-1,0)))), #floor (Vector((0,0, 1)), (Vector((1,0,0)), Vector((0,-1,0)))), #floor
@ -167,7 +184,8 @@ def parse_brush(script, mapent):
norm.normalize() norm.normalize()
plane = (norm, planepts[1].dot(norm)) plane = (norm, planepts[1].dot(norm))
planes.append(plane) planes.append(plane)
tx = Texinfo(script, plane) tx = Texinfo.unique(script, plane)
texdefs.append(tx)
detail = False detail = False
while script.tokenAvailable(): while script.tokenAvailable():
script.getToken() script.getToken()
@ -177,7 +195,7 @@ def parse_brush(script, mapent):
map_error(script, "invalid flag") map_error(script, "invalid flag")
if not verts: if not verts:
verts, faces = convert_planes(planes) verts, faces = convert_planes(planes)
mapent.b.append((verts,faces)) mapent.b.append((verts,faces,texdefs))
def parse_epair(script, mapent): def parse_epair(script, mapent):
key = script.token key = script.token
@ -215,6 +233,8 @@ def parse_map(filename):
script = Script(filename, text) script = Script(filename, text)
script.error = map_error script.error = map_error
entities = [] entities = []
global texdefs
texdefs = []
while True: while True:
ent = parse_entity(script) ent = parse_entity(script)
if not ent: if not ent: