mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-18 09:51:40 +00:00
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:
parent
446016e84e
commit
95e2a5b21a
1 changed files with 36 additions and 16 deletions
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue