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