13c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport re
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport math
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport random
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
53c827367444ee418f129b2c238299f49d3264554Jarkko PoyryPREAMBLE = """
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# WARNING: This file is auto-generated. Do NOT modify it manually, but rather
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# modify the generating script file. Otherwise changes will be lost!
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry"""[1:]
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CaseGroup(object):
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, name, description, children):
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.name			= name
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.description	= description
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.children		= children
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ShaderCase(object):
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self):
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		pass
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryg_processedCases = {}
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef indentTextBlock(text, indent):
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	indentStr = indent * "\t"
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	lines = text.split("\n")
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	lines = [indentStr + line for line in lines]
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	lines = [ ["", line][line.strip() != ""] for line in lines]
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return "\n".join(lines)
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef writeCase(f, case, indent, prefix):
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	print "    %s" % (prefix + case.name)
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if isinstance(case, CaseGroup):
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		f.write(indentTextBlock('group %s "%s"\n\n' % (case.name, case.description), indent))
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for child in case.children:
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			writeCase(f, child, indent + 1, prefix + case.name + ".")
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		f.write(indentTextBlock("\nend # %s\n" % case.name, indent))
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else:
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		# \todo [petri] Fix hack.
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		fullPath = prefix + case.name
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert (fullPath not in g_processedCases)
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		g_processedCases[fullPath] = None
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		f.write(indentTextBlock(str(case) + "\n", indent))
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef writeAllCases(fileName, caseList):
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	# Write all cases to file.
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	print "  %s.." % fileName
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	f = file(fileName, "wb")
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	f.write(PREAMBLE + "\n")
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for case in caseList:
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		writeCase(f, case, 0, "")
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	f.close()
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	print "done! (%d cases written)" % len(g_processedCases)
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Template operations.
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef genValues(inputs, outputs):
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	res = []
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (name, values) in inputs:
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res.append("input %s = [ %s ];" % (name, " | ".join([str(v) for v in values]).lower()))
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (name, values) in outputs:
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res.append("output %s = [ %s ];" % (name, " | ".join([str(v) for v in values]).lower()))
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return ("\n".join(res))
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef fillTemplate(template, params):
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	s = template
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (key, value) in params.items():
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		m = re.search(r"^(\s*)\$\{\{%s\}\}$" % key, s, re.M)
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if m is not None:
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			start = m.start(0)
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			end = m.end(0)
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			ws = m.group(1)
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if value is not None:
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				repl = "\n".join(["%s%s" % (ws, line) for line in value.split("\n")])
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				s = s[:start] + repl + s[end:]
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else:
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				s = s[:start] + s[end+1:] # drop the whole line
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			s = s.replace("${{%s}}" % key, value)
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return s
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Return shuffled version of list
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef shuffled(lst):
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	tmp = lst[:]
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	random.shuffle(tmp)
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return tmp
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef repeatToLength(lst, toLength):
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return (toLength / len(lst)) * lst + lst[: toLength % len(lst)]
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Helpers to convert a list of Scalar/Vec values into another type.
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toFloat(lst):	return [Scalar(float(v.x)) for v in lst]
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toInt(lst):		return [Scalar(int(v.x)) for v in lst]
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toUint(lst):	return [Uint(int(v.x)) for v in lst]
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toBool(lst):	return [Scalar(bool(v.x)) for v in lst]
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toVec4(lst):	return [v.toFloat().toVec4() for v in lst]
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toVec3(lst):	return [v.toFloat().toVec3() for v in lst]
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toVec2(lst):	return [v.toFloat().toVec2() for v in lst]
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toIVec4(lst):	return [v.toInt().toVec4() for v in lst]
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toIVec3(lst):	return [v.toInt().toVec3() for v in lst]
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toIVec2(lst):	return [v.toInt().toVec2() for v in lst]
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toBVec4(lst):	return [v.toBool().toVec4() for v in lst]
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toBVec3(lst):	return [v.toBool().toVec3() for v in lst]
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toBVec2(lst):	return [v.toBool().toVec2() for v in lst]
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toUVec4(lst):	return [v.toUint().toUVec4() for v in lst]
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toUVec3(lst):	return [v.toUint().toUVec3() for v in lst]
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toUVec2(lst):	return [v.toUint().toUVec2() for v in lst]
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat2(lst):	return [v.toMat2() for v in lst]
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat2x3(lst):	return [v.toMat2x3() for v in lst]
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat2x4(lst):	return [v.toMat2x4() for v in lst]
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat3x2(lst):	return [v.toMat3x2() for v in lst]
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat3(lst):	return [v.toMat3() for v in lst]
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat3x4(lst):	return [v.toMat3x4() for v in lst]
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat4x2(lst):	return [v.toMat4x2() for v in lst]
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat4x3(lst):	return [v.toMat4x3() for v in lst]
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef toMat4(lst):	return [v.toMat4() for v in lst]
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Random value generation.
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GenRandom(object):
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self):
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		pass
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def uniformVec4(self, count, mn, mx):
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ret = [Vec4(random.uniform(mn, mx), random.uniform(mn, mx), random.uniform(mn, mx), random.uniform(mn, mx)) for x in xrange(count)]
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ret[0].x = mn
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ret[1].x = mx
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ret[2].x = (mn + mx) * 0.5
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ret
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def uniformBVec4(self, count):
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ret = [Vec4(random.random() >= 0.5, random.random() >= 0.5, random.random() >= 0.5, random.random() >= 0.5) for x in xrange(count)]
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ret[0].x = True
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ret[1].x = False
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ret
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#	def uniform(self,
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# Math operating on Scalar/Vector types.
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef glslSign(a):			return 0.0 if (a == 0) else +1.0 if (a > 0.0) else -1.0
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef glslMod(x, y):			return x - y*math.floor(x/y)
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef glslClamp(x, mn, mx):	return mn if (x < mn) else mx if (x > mx) else x
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass GenMath(object):
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def unary(func):	return lambda val: val.applyUnary(func)
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def binary(func):	return lambda a, b: (b.expandVec(a)).applyBinary(func, a.expandVec(b))
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def frac(val):		return val.applyUnary(lambda x: x - math.floor(x))
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def exp2(val):		return val.applyUnary(lambda x: math.pow(2.0, x))
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def log2(val):		return val.applyUnary(lambda x: math.log(x, 2.0))
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def rsq(val):		return val.applyUnary(lambda x: 1.0 / math.sqrt(x))
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def sign(val):		return val.applyUnary(glslSign)
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isEqual(a, b):	return Scalar(a.isEqual(b))
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isNotEqual(a, b):	return Scalar(not a.isEqual(b))
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def step(a, b):		return (b.expandVec(a)).applyBinary(lambda edge, x: [1.0, 0.0][x < edge], a.expandVec(b))
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def length(a):		return a.length()
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def distance(a, b):	return a.distance(b)
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def dot(a, b):		return a.dot(b)
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def cross(a, b):	return a.cross(b)
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def normalize(a):	return a.normalize()
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAny(a):		return a.boolAny()
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAll(a):		return a.boolAll()
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolNot(a):		return a.boolNot()
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(a):			return a.abs()
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# ..
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Scalar(object):
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x):
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyUnary(self, func):			return Scalar(func(self.x))
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyBinary(self, func, other):	return Scalar(func(self.x, other.x))
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isEqual(self, other):	assert isinstance(other, Scalar); return (self.x == other.x)
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def expandVec(self, val):	return val
2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toScalar(self):			return Scalar(self.x)
2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec2(self):			return Vec2(self.x, self.x)
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec3(self):			return Vec3(self.x, self.x, self.x)
2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec4(self):			return Vec4(self.x, self.x, self.x, self.x)
2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec2(self):			return UVec2(self.x, self.x)
2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec3(self):			return UVec3(self.x, self.x, self.x)
2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec4(self):			return UVec4(self.x, self.x, self.x, self.x)
2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2(self):			return Mat.fromScalar(2, 2, float(self.x))
2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2x3(self):			return Mat.fromScalar(2, 3, float(self.x))
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2x4(self):			return Mat.fromScalar(2, 4, float(self.x))
2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3x2(self):			return Mat.fromScalar(3, 2, float(self.x))
2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3(self):			return Mat.fromScalar(3, 3, float(self.x))
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3x4(self):			return Mat.fromScalar(3, 4, float(self.x))
2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4x2(self):			return Mat.fromScalar(4, 2, float(self.x))
2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4x3(self):			return Mat.fromScalar(4, 3, float(self.x))
2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4(self):			return Mat.fromScalar(4, 4, float(self.x))
2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toFloat(self):			return Scalar(float(self.x))
2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toInt(self):			return Scalar(int(self.x))
2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUint(self):			return Uint(int(self.x))
2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toBool(self):			return Scalar(bool(self.x))
2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getNumScalars(self):	return 1
2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getScalars(self):		return [self.x]
2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bool"
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "int"
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "float"
2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def vec4Swizzle(self):
2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ""
2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return str(self.x).lower()
2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __float__(self):
2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return float(self.x)
2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def length(self):
2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(abs(self.x))
2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def distance(self, v):
2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Scalar)
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(abs(self.x - v.x))
2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def dot(self, v):
2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Scalar)
2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x * v.x)
2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def normalize(self):
2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(glslSign(self.x))
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Scalar(self.x)
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Scalar(abs(self.x))
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(-self.x)
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(val, Scalar)
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x + val.x)
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Scalar(self.x * val.x)
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec2):
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x * val.x, self.x * val.y)
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec3):
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x * val.x, self.x * val.y, self.x * val.z)
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec4):
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x * val.x, self.x * val.y, self.x * val.z, self.x * val.w)
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Scalar(self.x / val.x)
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec2):
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x / val.x, self.x / val.y)
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec3):
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x / val.x, self.x / val.y, self.x / val.z)
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec4):
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x / val.x, self.x / val.y, self.x / val.z, self.x / val.w)
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Uint(Scalar):
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x):
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert x >= 0
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uint"
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.abs(self).toUint()
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.__neg__(self).toUint()
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.__add__(self, val).toUint()
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.__mul__(self, val).toUint()
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.__div__(self, val).toUint()
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Vec(object):
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def fromScalarList(lst):
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert (len(lst) >= 1 and len(lst) <= 4)
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (len(lst) == 1):		return Scalar(lst[0])
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif (len(lst) == 2):	return Vec2(lst[0], lst[1])
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif (len(lst) == 3):	return Vec3(lst[0], lst[1], lst[2])
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:					return Vec4(lst[0], lst[1], lst[2], lst[3])
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isEqual(self, other):
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(other, Vec);
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self.getScalars() == other.getScalars())
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def length(self):
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(math.sqrt(self.dot(self).x))
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def normalize(self):
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self * Scalar(1.0 / self.length().x)
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def swizzle(self, indexList):
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inScalars = self.getScalars()
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		outScalars = map(lambda ndx: inScalars[ndx], indexList)
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec.fromScalarList(outScalars)
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self):
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		pass
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Vec2(Vec):
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y):
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert(x.__class__ == y.__class__)
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.y = y
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyUnary(self, func):			return Vec2(func(self.x), func(self.y))
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyBinary(self, func, other):	return Vec2(func(self.x, other.x), func(self.y, other.y))
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def expandVec(self, val):	return val.toVec2()
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toScalar(self):			return Scalar(self.x)
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec2(self):			return Vec2(self.x, self.y)
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec3(self):			return Vec3(self.x, self.y, 0.0)
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec4(self):			return Vec4(self.x, self.y, 0.0, 0.0)
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec2(self):			return UVec2(self.x, self.y)
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec3(self):			return UVec3(self.x, self.y, 0.0)
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec4(self):			return UVec4(self.x, self.y, 0.0, 0.0)
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2(self):			return Mat2(float(self.x), 0.0, 0.0, float(self.y));
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toFloat(self):			return Vec2(float(self.x), float(self.y))
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toInt(self):			return Vec2(int(self.x), int(self.y))
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUint(self):			return UVec2(int(self.x), int(self.y))
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toBool(self):			return Vec2(bool(self.x), bool(self.y))
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getNumScalars(self):	return 2
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getScalars(self):		return [self.x, self.y]
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec2"
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec2"
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec2"
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def vec4Swizzle(self):
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ".xyxy"
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec2(%s, %s)" % (str(self.x).lower(), str(self.y).lower())
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec2(%i, %i)" % (self.x, self.y)
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec2(%s, %s)" % (self.x, self.y)
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def distance(self, v):
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec2)
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self - v).length()
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def dot(self, v):
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec2)
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x*v.x + self.y*v.y)
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x, self.y)
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(abs(self.x), abs(self.y))
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec2(-self.x, -self.y)
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x + val, self.y + val)
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec2):
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x + val.x, self.y + val.y)
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			val = val.toVec2()
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(val, Vec2)
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec2(self.x * val.x, self.y * val.y)
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x / val.x, self.y / val.x)
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert isinstance(val, Vec2)
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x / val.x, self.y / val.y)
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAny(self):	return Scalar(self.x or self.y)
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAll(self):	return Scalar(self.x and self.y)
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolNot(self):	return Vec2(not self.x, not self.y)
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass UVec2(Vec2):
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y):
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(x, int) and isinstance(y, int)
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert x >= 0 and y >= 0
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Vec2.__init__(self, x, y)
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec2"
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec2(%i, %i)" % (self.x, self.y)
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec2.abs(self).toUint()
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Vec3(Vec):
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y, z):
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert((x.__class__ == y.__class__) and (x.__class__ == z.__class__))
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.y = y
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.z = z
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyUnary(self, func):			return Vec3(func(self.x), func(self.y), func(self.z))
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyBinary(self, func, other):	return Vec3(func(self.x, other.x), func(self.y, other.y), func(self.z, other.z))
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def expandVec(self, val):	return val.toVec3()
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toScalar(self):			return Scalar(self.x)
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec2(self):			return Vec2(self.x, self.y)
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec3(self):			return Vec3(self.x, self.y, self.z)
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec4(self):			return Vec4(self.x, self.y, self.z, 0.0)
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec2(self):			return UVec2(self.x, self.y)
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec3(self):			return UVec3(self.x, self.y, self.z)
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec4(self):			return UVec4(self.x, self.y, self.z, 0.0)
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3(self):			return Mat3(float(self.x), 0.0, 0.0,  0.0, float(self.y), 0.0,  0.0, 0.0, float(self.z));
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toFloat(self):			return Vec3(float(self.x), float(self.y), float(self.z))
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toInt(self):			return Vec3(int(self.x), int(self.y), int(self.z))
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUint(self):			return UVec3(int(self.x), int(self.y), int(self.z))
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toBool(self):			return Vec3(bool(self.x), bool(self.y), bool(self.z))
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getNumScalars(self):	return 3
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getScalars(self):		return [self.x, self.y, self.z]
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec3"
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec3"
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec3"
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def vec4Swizzle(self):
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ".xyzx"
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec3(%s, %s, %s)" % (str(self.x).lower(), str(self.y).lower(), str(self.z).lower())
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec3(%i, %i, %i)" % (self.x, self.y, self.z)
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec3(%s, %s, %s)" % (self.x, self.y, self.z)
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def distance(self, v):
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec3)
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self - v).length()
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def dot(self, v):
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec3)
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x*v.x + self.y*v.y + self.z*v.z)
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def cross(self, v):
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec3)
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec3(self.y*v.z - v.y*self.z,
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					self.z*v.x - v.z*self.x,
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					self.x*v.y - v.x*self.y)
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x, self.y, self.z)
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(abs(self.x), abs(self.y), abs(self.z))
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec3(-self.x, -self.y, -self.z)
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x + val, self.y + val)
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec3):
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x + val.x, self.y + val.y, self.z + val.z)
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			val = val.toVec3()
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(val, Vec3)
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec3(self.x * val.x, self.y * val.y, self.z * val.z)
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x / val.x, self.y / val.x, self.z / val.x)
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec3):
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x / val.x, self.y / val.y, self.z / val.z)
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAny(self):	return Scalar(self.x or self.y or self.z)
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAll(self):	return Scalar(self.x and self.y and self.z)
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolNot(self):	return Vec3(not self.x, not self.y, not self.z)
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass UVec3(Vec3):
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y, z):
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(x, int) and isinstance(y, int) and isinstance(z, int)
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert x >= 0 and y >= 0 and z >= 0
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Vec3.__init__(self, x, y, z)
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec3"
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec3(%i, %i, %i)" % (self.x, self.y, self.z)
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec3.abs(self).toUint()
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Vec4(Vec):
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y, z, w):
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert((x.__class__ == y.__class__) and (x.__class__ == z.__class__) and (x.__class__ == w.__class__))
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.y = y
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.z = z
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.w = w
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyUnary(self, func):			return Vec4(func(self.x), func(self.y), func(self.z), func(self.w))
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyBinary(self, func, other):	return Vec4(func(self.x, other.x), func(self.y, other.y), func(self.z, other.z), func(self.w, other.w))
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def expandVec(self, val):	return val.toVec4()
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toScalar(self):			return Scalar(self.x)
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec2(self):			return Vec2(self.x, self.y)
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec3(self):			return Vec3(self.x, self.y, self.z)
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec4(self):			return Vec4(self.x, self.y, self.z, self.w)
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec2(self):			return UVec2(self.x, self.y)
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec3(self):			return UVec3(self.x, self.y, self.z)
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec4(self):			return UVec4(self.x, self.y, self.z, self.w)
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2(self):			return Mat2(float(self.x), float(self.y), float(self.z), float(self.w))
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4(self):			return Mat4(float(self.x), 0.0, 0.0, 0.0,  0.0, float(self.y), 0.0, 0.0,  0.0, 0.0, float(self.z), 0.0,  0.0, 0.0, 0.0, float(self.w));
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toFloat(self):			return Vec4(float(self.x), float(self.y), float(self.z), float(self.w))
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toInt(self):			return Vec4(int(self.x), int(self.y), int(self.z), int(self.w))
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUint(self):			return UVec4(int(self.x), int(self.y), int(self.z), int(self.w))
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toBool(self):			return Vec4(bool(self.x), bool(self.y), bool(self.z), bool(self.w))
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getNumScalars(self):	return 4
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getScalars(self):		return [self.x, self.y, self.z, self.w]
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec4"
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec4"
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec4"
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def vec4Swizzle(self):
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ""
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec4(%s, %s, %s, %s)" % (str(self.x).lower(), str(self.y).lower(), str(self.z).lower(), str(self.w).lower())
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec4(%i, %i, %i, %i)" % (self.x, self.y, self.z, self.w)
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec4(%s, %s, %s, %s)" % (self.x, self.y, self.z, self.w)
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def distance(self, v):
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec4)
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self - v).length()
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def dot(self, v):
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec4)
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x*v.x + self.y*v.y + self.z*v.z + self.w*v.w)
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x, self.y, self.z, self.w)
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(abs(self.x), abs(self.y), abs(self.z), abs(self.w))
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec4(-self.x, -self.y, -self.z, -self.w)
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x + val, self.y + val)
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec4):
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x + val.x, self.y + val.y, self.z + val.z, self.w + val.w)
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			val = val.toVec4()
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(val, Vec4)
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec4(self.x * val.x, self.y * val.y, self.z * val.z, self.w * val.w)
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x / val.x, self.y / val.x, self.z / val.x, self.w / val.x)
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec4):
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x / val.x, self.y / val.y, self.z / val.z, self.w / val.w)
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAny(self):	return Scalar(self.x or self.y or self.z or self.w)
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAll(self):	return Scalar(self.x and self.y and self.z and self.w)
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolNot(self):	return Vec4(not self.x, not self.y, not self.z, not self.w)
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass UVec4(Vec4):
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y, z, w):
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(x, int) and isinstance(y, int) and isinstance(z, int) and isinstance(w, int)
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert x >= 0 and y >= 0 and z >= 0 and w >= 0
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Vec4.__init__(self, x, y, z, w)
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec4"
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec4(%i, %i, %i, %i)" % (self.x, self.y, self.z, self.w)
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec4.abs(self).toUint()
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# \note Column-major storage.
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mat(object):
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__ (self, numCols, numRows, scalars):
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert len(scalars) == numRows*numCols
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.numCols	= numCols
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.numRows	= numRows
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.scalars	= scalars
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def fromScalar (numCols, numRows, scalar):
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		scalars = []
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for col in range(0, numCols):
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for row in range(0, numRows):
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				scalars.append(scalar if col == row else 0.0)
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Mat(numCols, numRows, scalars)
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def identity (numCols, numRows):
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Mat.fromScalar(numCols, numRows, 1.0)
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def get (self, colNdx, rowNdx):
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert 0 <= colNdx and colNdx < self.numCols
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert 0 <= rowNdx and rowNdx < self.numRows
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.scalars[colNdx*self.numRows + rowNdx]
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def set (self, colNdx, rowNdx, scalar):
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert 0 <= colNdx and colNdx < self.numCols
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert 0 <= rowNdx and rowNdx < self.numRows
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.scalars[colNdx*self.numRows + rowNdx] = scalar
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMatrix (self, numCols, numRows):
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res = Mat.identity(numCols, numRows)
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for col in range(0, min(self.numCols, numCols)):
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for row in range(0, min(self.numRows, numRows)):
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				res.set(col, row, self.get(col, row))
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return res
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2 (self):		return self.toMatrix(2, 2)
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2x3 (self):	return self.toMatrix(2, 3)
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2x4 (self):	return self.toMatrix(2, 4)
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3x2 (self):	return self.toMatrix(3, 2)
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3 (self):		return self.toMatrix(3, 3)
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3x4 (self):	return self.toMatrix(3, 4)
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4x2 (self):	return self.toMatrix(4, 2)
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4x3 (self):	return self.toMatrix(4, 3)
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4 (self):		return self.toMatrix(4, 4)
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if self.numRows == self.numCols:
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "mat%d" % self.numRows
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "mat%dx%d" % (self.numCols, self.numRows)
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "%s(%s)" % (self.typeString(), ", ".join(["%s" % s for s in self.scalars]))
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isTypeEqual (self, other):
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return isinstance(other, Mat) and self.numRows == other.numRows and self.numCols == other.numCols
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isEqual(self, other):
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert self.isTypeEqual(other)
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self.scalars == other.scalars)
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def compMul(self, val):
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert self.isTypeEqual(val)
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Mat(self.numRows, self.numCols, [self.scalars(i) * val.scalars(i) for i in range(self.numRows*self.numCols)])
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mat2(Mat):
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, m00, m01, m10, m11):
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Mat.__init__(self, 2, 2, [m00, m10, m01, m11])
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mat3(Mat):
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, m00, m01, m02, m10, m11, m12, m20, m21, m22):
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Mat.__init__(self, 3, 3, [m00, m10, m20,
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m01, m11, m21,
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m02, m12, m22])
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mat4(Mat):
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33):
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Mat.__init__(self, 4, 4, [m00, m10, m20, m30,
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m01, m11, m21, m31,
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m02, m12, m22, m32,
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m03, m13, m23, m33])
792