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		if not isinstance(val, Scalar):
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			print val
2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(val, Scalar)
2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x + val.x)
2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Scalar(self.x * val.x)
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec2):
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x * val.x, self.x * val.y)
2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec3):
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x * val.x, self.x * val.y, self.x * val.z)
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec4):
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x * val.x, self.x * val.y, self.x * val.z, self.x * val.w)
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Scalar(self.x / val.x)
3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec2):
3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x / val.x, self.x / val.y)
3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec3):
3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x / val.x, self.x / val.y, self.x / val.z)
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec4):
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x / val.x, self.x / val.y, self.x / val.z, self.x / val.w)
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Uint(Scalar):
3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x):
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert x >= 0
3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uint"
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.abs(self).toUint()
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.__neg__(self).toUint()
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.__add__(self, val).toUint()
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.__mul__(self, val).toUint()
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar.__div__(self, val).toUint()
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Vec(object):
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def fromScalarList(lst):
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert (len(lst) >= 1 and len(lst) <= 4)
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if (len(lst) == 1):		return Scalar(lst[0])
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif (len(lst) == 2):	return Vec2(lst[0], lst[1])
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif (len(lst) == 3):	return Vec3(lst[0], lst[1], lst[2])
3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:					return Vec4(lst[0], lst[1], lst[2], lst[3])
3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isEqual(self, other):
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(other, Vec);
3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self.getScalars() == other.getScalars())
3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def length(self):
3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(math.sqrt(self.dot(self).x))
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def normalize(self):
3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self * Scalar(1.0 / self.length().x)
3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def swizzle(self, indexList):
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		inScalars = self.getScalars()
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		outScalars = map(lambda ndx: inScalars[ndx], indexList)
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec.fromScalarList(outScalars)
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self):
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		pass
3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Vec2(Vec):
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y):
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert(x.__class__ == y.__class__)
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.y = y
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyUnary(self, func):			return Vec2(func(self.x), func(self.y))
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyBinary(self, func, other):	return Vec2(func(self.x, other.x), func(self.y, other.y))
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def expandVec(self, val):	return val.toVec2()
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toScalar(self):			return Scalar(self.x)
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec2(self):			return Vec2(self.x, self.y)
3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec3(self):			return Vec3(self.x, self.y, 0.0)
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec4(self):			return Vec4(self.x, self.y, 0.0, 0.0)
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec2(self):			return UVec2(self.x, self.y)
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec3(self):			return UVec3(self.x, self.y, 0.0)
3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec4(self):			return UVec4(self.x, self.y, 0.0, 0.0)
3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2(self):			return Mat2(float(self.x), 0.0, 0.0, float(self.y));
3873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toFloat(self):			return Vec2(float(self.x), float(self.y))
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toInt(self):			return Vec2(int(self.x), int(self.y))
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUint(self):			return UVec2(int(self.x), int(self.y))
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toBool(self):			return Vec2(bool(self.x), bool(self.y))
3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getNumScalars(self):	return 2
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getScalars(self):		return [self.x, self.y]
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec2"
3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec2"
4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec2"
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def vec4Swizzle(self):
4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ".xyxy"
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec2(%s, %s)" % (str(self.x).lower(), str(self.y).lower())
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec2(%i, %i)" % (self.x, self.y)
4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec2(%s, %s)" % (self.x, self.y)
4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def distance(self, v):
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec2)
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self - v).length()
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def dot(self, v):
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec2)
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x*v.x + self.y*v.y)
4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x, self.y)
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(abs(self.x), abs(self.y))
4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec2(-self.x, -self.y)
4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x + val, self.y + val)
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec2):
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x + val.x, self.y + val.y)
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
4433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			val = val.toVec2()
4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(val, Vec2)
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec2(self.x * val.x, self.y * val.y)
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x / val.x, self.y / val.x)
4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert isinstance(val, Vec2)
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec2(self.x / val.x, self.y / val.y)
4593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAny(self):	return Scalar(self.x or self.y)
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAll(self):	return Scalar(self.x and self.y)
4623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolNot(self):	return Vec2(not self.x, not self.y)
4633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass UVec2(Vec2):
4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y):
4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(x, int) and isinstance(y, int)
4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert x >= 0 and y >= 0
4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Vec2.__init__(self, x, y)
4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec2"
4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec2(%i, %i)" % (self.x, self.y)
4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec2.abs(self).toUint()
4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Vec3(Vec):
4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y, z):
4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert((x.__class__ == y.__class__) and (x.__class__ == z.__class__))
4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.y = y
4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.z = z
4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyUnary(self, func):			return Vec3(func(self.x), func(self.y), func(self.z))
4873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyBinary(self, func, other):	return Vec3(func(self.x, other.x), func(self.y, other.y), func(self.z, other.z))
4883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def expandVec(self, val):	return val.toVec3()
4903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toScalar(self):			return Scalar(self.x)
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec2(self):			return Vec2(self.x, self.y)
4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec3(self):			return Vec3(self.x, self.y, self.z)
4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec4(self):			return Vec4(self.x, self.y, self.z, 0.0)
4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec2(self):			return UVec2(self.x, self.y)
4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec3(self):			return UVec3(self.x, self.y, self.z)
4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec4(self):			return UVec4(self.x, self.y, self.z, 0.0)
4973c827367444ee418f129b2c238299f49d3264554Jarkko 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));
4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toFloat(self):			return Vec3(float(self.x), float(self.y), float(self.z))
5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toInt(self):			return Vec3(int(self.x), int(self.y), int(self.z))
5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUint(self):			return UVec3(int(self.x), int(self.y), int(self.z))
5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toBool(self):			return Vec3(bool(self.x), bool(self.y), bool(self.z))
5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getNumScalars(self):	return 3
5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getScalars(self):		return [self.x, self.y, self.z]
5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec3"
5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec3"
5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec3"
5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
5163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def vec4Swizzle(self):
5183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ".xyzx"
5193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec3(%s, %s, %s)" % (str(self.x).lower(), str(self.y).lower(), str(self.z).lower())
5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec3(%i, %i, %i)" % (self.x, self.y, self.z)
5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
5263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec3(%s, %s, %s)" % (self.x, self.y, self.z)
5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def distance(self, v):
5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec3)
5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self - v).length()
5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def dot(self, v):
5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec3)
5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x*v.x + self.y*v.y + self.z*v.z)
5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def cross(self, v):
5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec3)
5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec3(self.y*v.z - v.y*self.z,
5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					self.z*v.x - v.z*self.x,
5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry					self.x*v.y - v.x*self.y)
5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x, self.y, self.z)
5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(abs(self.x), abs(self.y), abs(self.z))
5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec3(-self.x, -self.y, -self.z)
5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x + val, self.y + val)
5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec3):
5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x + val.x, self.y + val.y, self.z + val.z)
5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			val = val.toVec3()
5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(val, Vec3)
5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec3(self.x * val.x, self.y * val.y, self.z * val.z)
5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x / val.x, self.y / val.x, self.z / val.x)
5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec3):
5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x / val.x, self.y / val.y, self.z / val.z)
5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAny(self):	return Scalar(self.x or self.y or self.z)
5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAll(self):	return Scalar(self.x and self.y and self.z)
5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolNot(self):	return Vec3(not self.x, not self.y, not self.z)
5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass UVec3(Vec3):
5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y, z):
5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(x, int) and isinstance(y, int) and isinstance(z, int)
5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert x >= 0 and y >= 0 and z >= 0
5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Vec3.__init__(self, x, y, z)
5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec3"
5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec3(%i, %i, %i)" % (self.x, self.y, self.z)
5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec3.abs(self).toUint()
5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Vec4(Vec):
5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y, z, w):
5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert((x.__class__ == y.__class__) and (x.__class__ == z.__class__) and (x.__class__ == w.__class__))
6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.x = x
6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.y = y
6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.z = z
6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.w = w
6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def applyUnary(self, func):			return Vec4(func(self.x), func(self.y), func(self.z), func(self.w))
6063c827367444ee418f129b2c238299f49d3264554Jarkko 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))
6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def expandVec(self, val):	return val.toVec4()
6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toScalar(self):			return Scalar(self.x)
6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec2(self):			return Vec2(self.x, self.y)
6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec3(self):			return Vec3(self.x, self.y, self.z)
6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toVec4(self):			return Vec4(self.x, self.y, self.z, self.w)
6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec2(self):			return UVec2(self.x, self.y)
6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec3(self):			return UVec3(self.x, self.y, self.z)
6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUVec4(self):			return UVec4(self.x, self.y, self.z, self.w)
6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2(self):			return Mat2(float(self.x), float(self.y), float(self.z), float(self.w))
6173c827367444ee418f129b2c238299f49d3264554Jarkko 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));
6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toFloat(self):			return Vec4(float(self.x), float(self.y), float(self.z), float(self.w))
6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toInt(self):			return Vec4(int(self.x), int(self.y), int(self.z), int(self.w))
6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toUint(self):			return UVec4(int(self.x), int(self.y), int(self.z), int(self.w))
6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toBool(self):			return Vec4(bool(self.x), bool(self.y), bool(self.z), bool(self.w))
6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getNumScalars(self):	return 4
6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getScalars(self):		return [self.x, self.y, self.z, self.w]
6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec4"
6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec4"
6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec4"
6343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def vec4Swizzle(self):
6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return ""
6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "bvec4(%s, %s, %s, %s)" % (str(self.x).lower(), str(self.y).lower(), str(self.z).lower(), str(self.w).lower())
6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, int):
6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "ivec4(%i, %i, %i, %i)" % (self.x, self.y, self.z, self.w)
6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(self.x, float):
6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "vec4(%s, %s, %s, %s)" % (self.x, self.y, self.z, self.w)
6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def distance(self, v):
6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec4)
6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self - v).length()
6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def dot(self, v):
6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(v, Vec4)
6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Scalar(self.x*v.x + self.y*v.y + self.z*v.z + self.w*v.w)
6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(self.x, bool):
6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x, self.y, self.z, self.w)
6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(abs(self.x), abs(self.y), abs(self.z), abs(self.w))
6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __neg__(self):
6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec4(-self.x, -self.y, -self.z, -self.w)
6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __add__(self, val):
6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec3(self.x + val, self.y + val)
6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec4):
6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x + val.x, self.y + val.y, self.z + val.z, self.w + val.w)
6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __sub__(self, val):
6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self + (-val)
6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __mul__(self, val):
6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			val = val.toVec4()
6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(val, Vec4)
6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec4(self.x * val.x, self.y * val.y, self.z * val.z, self.w * val.w)
6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __div__(self, val):
6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if isinstance(val, Scalar):
6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x / val.x, self.y / val.x, self.z / val.x, self.w / val.x)
6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif isinstance(val, Vec4):
6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return Vec4(self.x / val.x, self.y / val.y, self.z / val.z, self.w / val.w)
6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAny(self):	return Scalar(self.x or self.y or self.z or self.w)
6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolAll(self):	return Scalar(self.x and self.y and self.z and self.w)
6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def boolNot(self):	return Vec4(not self.x, not self.y, not self.z, not self.w)
6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
6963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass UVec4(Vec4):
6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, x, y, z, w):
6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert isinstance(x, int) and isinstance(y, int) and isinstance(z, int) and isinstance(w, int)
6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert x >= 0 and y >= 0 and z >= 0 and w >= 0
7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Vec4.__init__(self, x, y, z, w)
7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec4"
7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "uvec4(%i, %i, %i, %i)" % (self.x, self.y, self.z, self.w)
7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def abs(self):
7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Vec4.abs(self).toUint()
7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry# \note Column-major storage.
7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mat(object):
7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__ (self, numCols, numRows, scalars):
7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert len(scalars) == numRows*numCols
7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.numCols	= numCols
7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.numRows	= numRows
7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.scalars	= scalars
7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def fromScalar (numCols, numRows, scalar):
7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		scalars = []
7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for col in range(0, numCols):
7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for row in range(0, numRows):
7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				scalars.append(scalar if col == row else 0.0)
7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Mat(numCols, numRows, scalars)
7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	@staticmethod
7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def identity (numCols, numRows):
7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Mat.fromScalar(numCols, numRows, 1.0)
7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def get (self, colNdx, rowNdx):
7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert 0 <= colNdx and colNdx < self.numCols
7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert 0 <= rowNdx and rowNdx < self.numRows
7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.scalars[colNdx*self.numRows + rowNdx]
7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def set (self, colNdx, rowNdx, scalar):
7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert 0 <= colNdx and colNdx < self.numCols
7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert 0 <= rowNdx and rowNdx < self.numRows
7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.scalars[colNdx*self.numRows + rowNdx] = scalar
7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMatrix (self, numCols, numRows):
7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		res = Mat.identity(numCols, numRows)
7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for col in range(0, min(self.numCols, numCols)):
7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			for row in range(0, min(self.numRows, numRows)):
7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				res.set(col, row, self.get(col, row))
7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return res
7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2 (self):		return self.toMatrix(2, 2)
7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2x3 (self):	return self.toMatrix(2, 3)
7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat2x4 (self):	return self.toMatrix(2, 4)
7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3x2 (self):	return self.toMatrix(3, 2)
7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3 (self):		return self.toMatrix(3, 3)
7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat3x4 (self):	return self.toMatrix(3, 4)
7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4x2 (self):	return self.toMatrix(4, 2)
7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4x3 (self):	return self.toMatrix(4, 3)
7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def toMat4 (self):		return self.toMatrix(4, 4)
7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def typeString(self):
7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if self.numRows == self.numCols:
7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "mat%d" % self.numRows
7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return "mat%dx%d" % (self.numCols, self.numRows)
7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __str__(self):
7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return "%s(%s)" % (self.typeString(), ", ".join(["%s" % s for s in self.scalars]))
7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isTypeEqual (self, other):
7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return isinstance(other, Mat) and self.numRows == other.numRows and self.numCols == other.numCols
7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def isEqual(self, other):
7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert self.isTypeEqual(other)
7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return (self.scalars == other.scalars)
7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def compMul(self, val):
7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert self.isTypeEqual(val)
7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return Mat(self.numRows, self.numCols, [self.scalars(i) * val.scalars(i) for i in range(self.numRows*self.numCols)])
7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mat2(Mat):
7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, m00, m01, m10, m11):
7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Mat.__init__(self, 2, 2, [m00, m10, m01, m11])
7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mat3(Mat):
7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, m00, m01, m02, m10, m11, m12, m20, m21, m22):
7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Mat.__init__(self, 3, 3, [m00, m10, m20,
7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m01, m11, m21,
7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m02, m12, m22])
7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Mat4(Mat):
7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33):
7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		Mat.__init__(self, 4, 4, [m00, m10, m20, m30,
7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m01, m11, m21, m31,
7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m02, m12, m22, m32,
7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								  m03, m13, m23, m33])
794