1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2016 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ciimport re
24e5c31af7Sopenharmony_ciimport math
25e5c31af7Sopenharmony_ciimport random
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_ciPREAMBLE = """
28e5c31af7Sopenharmony_ci# WARNING: This file is auto-generated. Do NOT modify it manually, but rather
29e5c31af7Sopenharmony_ci# modify the generating script file. Otherwise changes will be lost!
30e5c31af7Sopenharmony_ci"""[1:]
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_ciclass CaseGroup(object):
33e5c31af7Sopenharmony_ci	def __init__(self, name, description, children):
34e5c31af7Sopenharmony_ci		self.name			= name
35e5c31af7Sopenharmony_ci		self.description	= description
36e5c31af7Sopenharmony_ci		self.children		= children
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ciclass ShaderCase(object):
39e5c31af7Sopenharmony_ci	def __init__(self):
40e5c31af7Sopenharmony_ci		pass
41e5c31af7Sopenharmony_ci
42e5c31af7Sopenharmony_cig_processedCases = {}
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_cidef indentTextBlock(text, indent):
45e5c31af7Sopenharmony_ci	indentStr = indent * "\t"
46e5c31af7Sopenharmony_ci	lines = text.split("\n")
47e5c31af7Sopenharmony_ci	lines = [indentStr + line for line in lines]
48e5c31af7Sopenharmony_ci	lines = [ ["", line][line.strip() != ""] for line in lines]
49e5c31af7Sopenharmony_ci	return "\n".join(lines)
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_cidef writeCase(f, case, indent, prefix):
52e5c31af7Sopenharmony_ci	print("    %s" % (prefix + case.name))
53e5c31af7Sopenharmony_ci	if isinstance(case, CaseGroup):
54e5c31af7Sopenharmony_ci		f.write(indentTextBlock('group %s "%s"\n\n' % (case.name, case.description), indent))
55e5c31af7Sopenharmony_ci		for child in case.children:
56e5c31af7Sopenharmony_ci			writeCase(f, child, indent + 1, prefix + case.name + ".")
57e5c31af7Sopenharmony_ci		f.write(indentTextBlock("\nend # %s\n" % case.name, indent))
58e5c31af7Sopenharmony_ci	else:
59e5c31af7Sopenharmony_ci		# \todo [petri] Fix hack.
60e5c31af7Sopenharmony_ci		fullPath = prefix + case.name
61e5c31af7Sopenharmony_ci		assert (fullPath not in g_processedCases)
62e5c31af7Sopenharmony_ci		g_processedCases[fullPath] = None
63e5c31af7Sopenharmony_ci		f.write(indentTextBlock(str(case) + "\n", indent))
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_cidef writeAllCases(fileName, caseList):
66e5c31af7Sopenharmony_ci	# Write all cases to file.
67e5c31af7Sopenharmony_ci	print("  %s.." % fileName)
68e5c31af7Sopenharmony_ci	f = file(fileName, "wb")
69e5c31af7Sopenharmony_ci	f.write(PREAMBLE + "\n")
70e5c31af7Sopenharmony_ci	for case in caseList:
71e5c31af7Sopenharmony_ci		writeCase(f, case, 0, "")
72e5c31af7Sopenharmony_ci	f.close()
73e5c31af7Sopenharmony_ci
74e5c31af7Sopenharmony_ci	print("done! (%d cases written)" % len(g_processedCases))
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_ci# Template operations.
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_cidef genValues(inputs, outputs):
79e5c31af7Sopenharmony_ci	res = []
80e5c31af7Sopenharmony_ci	for (name, values) in inputs:
81e5c31af7Sopenharmony_ci		res.append("input %s = [ %s ];" % (name, " | ".join([str(v) for v in values]).lower()))
82e5c31af7Sopenharmony_ci	for (name, values) in outputs:
83e5c31af7Sopenharmony_ci		res.append("output %s = [ %s ];" % (name, " | ".join([str(v) for v in values]).lower()))
84e5c31af7Sopenharmony_ci	return ("\n".join(res))
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_cidef fillTemplate(template, params):
87e5c31af7Sopenharmony_ci	s = template
88e5c31af7Sopenharmony_ci
89e5c31af7Sopenharmony_ci	for (key, value) in params.items():
90e5c31af7Sopenharmony_ci		m = re.search(r"^(\s*)\$\{\{%s\}\}$" % key, s, re.M)
91e5c31af7Sopenharmony_ci		if m is not None:
92e5c31af7Sopenharmony_ci			start = m.start(0)
93e5c31af7Sopenharmony_ci			end = m.end(0)
94e5c31af7Sopenharmony_ci			ws = m.group(1)
95e5c31af7Sopenharmony_ci			if value is not None:
96e5c31af7Sopenharmony_ci				repl = "\n".join(["%s%s" % (ws, line) for line in value.split("\n")])
97e5c31af7Sopenharmony_ci				s = s[:start] + repl + s[end:]
98e5c31af7Sopenharmony_ci			else:
99e5c31af7Sopenharmony_ci				s = s[:start] + s[end+1:] # drop the whole line
100e5c31af7Sopenharmony_ci		else:
101e5c31af7Sopenharmony_ci			s = s.replace("${{%s}}" % key, value)
102e5c31af7Sopenharmony_ci	return s
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_ci# Return shuffled version of list
105e5c31af7Sopenharmony_cidef shuffled(lst):
106e5c31af7Sopenharmony_ci	tmp = lst[:]
107e5c31af7Sopenharmony_ci	random.shuffle(tmp)
108e5c31af7Sopenharmony_ci	return tmp
109e5c31af7Sopenharmony_ci
110e5c31af7Sopenharmony_cidef repeatToLength(lst, toLength):
111e5c31af7Sopenharmony_ci	return (toLength / len(lst)) * lst + lst[: toLength % len(lst)]
112e5c31af7Sopenharmony_ci
113e5c31af7Sopenharmony_ci# Helpers to convert a list of Scalar/Vec values into another type.
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_cidef toFloat(lst):	return [Scalar(float(v.x)) for v in lst]
116e5c31af7Sopenharmony_cidef toInt(lst):		return [Scalar(int(v.x)) for v in lst]
117e5c31af7Sopenharmony_cidef toUint(lst):	return [Uint(int(v.x)) for v in lst]
118e5c31af7Sopenharmony_cidef toBool(lst):	return [Scalar(bool(v.x)) for v in lst]
119e5c31af7Sopenharmony_cidef toVec4(lst):	return [v.toFloat().toVec4() for v in lst]
120e5c31af7Sopenharmony_cidef toVec3(lst):	return [v.toFloat().toVec3() for v in lst]
121e5c31af7Sopenharmony_cidef toVec2(lst):	return [v.toFloat().toVec2() for v in lst]
122e5c31af7Sopenharmony_cidef toIVec4(lst):	return [v.toInt().toVec4() for v in lst]
123e5c31af7Sopenharmony_cidef toIVec3(lst):	return [v.toInt().toVec3() for v in lst]
124e5c31af7Sopenharmony_cidef toIVec2(lst):	return [v.toInt().toVec2() for v in lst]
125e5c31af7Sopenharmony_cidef toBVec4(lst):	return [v.toBool().toVec4() for v in lst]
126e5c31af7Sopenharmony_cidef toBVec3(lst):	return [v.toBool().toVec3() for v in lst]
127e5c31af7Sopenharmony_cidef toBVec2(lst):	return [v.toBool().toVec2() for v in lst]
128e5c31af7Sopenharmony_cidef toUVec4(lst):	return [v.toUint().toUVec4() for v in lst]
129e5c31af7Sopenharmony_cidef toUVec3(lst):	return [v.toUint().toUVec3() for v in lst]
130e5c31af7Sopenharmony_cidef toUVec2(lst):	return [v.toUint().toUVec2() for v in lst]
131e5c31af7Sopenharmony_cidef toMat2(lst):	return [v.toMat2() for v in lst]
132e5c31af7Sopenharmony_cidef toMat2x3(lst):	return [v.toMat2x3() for v in lst]
133e5c31af7Sopenharmony_cidef toMat2x4(lst):	return [v.toMat2x4() for v in lst]
134e5c31af7Sopenharmony_cidef toMat3x2(lst):	return [v.toMat3x2() for v in lst]
135e5c31af7Sopenharmony_cidef toMat3(lst):	return [v.toMat3() for v in lst]
136e5c31af7Sopenharmony_cidef toMat3x4(lst):	return [v.toMat3x4() for v in lst]
137e5c31af7Sopenharmony_cidef toMat4x2(lst):	return [v.toMat4x2() for v in lst]
138e5c31af7Sopenharmony_cidef toMat4x3(lst):	return [v.toMat4x3() for v in lst]
139e5c31af7Sopenharmony_cidef toMat4(lst):	return [v.toMat4() for v in lst]
140e5c31af7Sopenharmony_ci
141e5c31af7Sopenharmony_ci# Random value generation.
142e5c31af7Sopenharmony_ci
143e5c31af7Sopenharmony_ciclass GenRandom(object):
144e5c31af7Sopenharmony_ci	def __init__(self):
145e5c31af7Sopenharmony_ci		pass
146e5c31af7Sopenharmony_ci
147e5c31af7Sopenharmony_ci	def uniformVec4(self, count, mn, mx):
148e5c31af7Sopenharmony_ci		ret = [Vec4(random.uniform(mn, mx), random.uniform(mn, mx), random.uniform(mn, mx), random.uniform(mn, mx)) for x in xrange(count)]
149e5c31af7Sopenharmony_ci		ret[0].x = mn
150e5c31af7Sopenharmony_ci		ret[1].x = mx
151e5c31af7Sopenharmony_ci		ret[2].x = (mn + mx) * 0.5
152e5c31af7Sopenharmony_ci		return ret
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_ci	def uniformBVec4(self, count):
155e5c31af7Sopenharmony_ci		ret = [Vec4(random.random() >= 0.5, random.random() >= 0.5, random.random() >= 0.5, random.random() >= 0.5) for x in xrange(count)]
156e5c31af7Sopenharmony_ci		ret[0].x = True
157e5c31af7Sopenharmony_ci		ret[1].x = False
158e5c31af7Sopenharmony_ci		return ret
159e5c31af7Sopenharmony_ci
160e5c31af7Sopenharmony_ci#	def uniform(self,
161e5c31af7Sopenharmony_ci
162e5c31af7Sopenharmony_ci# Math operating on Scalar/Vector types.
163e5c31af7Sopenharmony_ci
164e5c31af7Sopenharmony_cidef glslSign(a):			return 0.0 if (a == 0) else +1.0 if (a > 0.0) else -1.0
165e5c31af7Sopenharmony_cidef glslMod(x, y):			return x - y*math.floor(x/y)
166e5c31af7Sopenharmony_cidef glslClamp(x, mn, mx):	return mn if (x < mn) else mx if (x > mx) else x
167e5c31af7Sopenharmony_ci
168e5c31af7Sopenharmony_ciclass GenMath(object):
169e5c31af7Sopenharmony_ci	@staticmethod
170e5c31af7Sopenharmony_ci	def unary(func):	return lambda val: val.applyUnary(func)
171e5c31af7Sopenharmony_ci
172e5c31af7Sopenharmony_ci	@staticmethod
173e5c31af7Sopenharmony_ci	def binary(func):	return lambda a, b: (b.expandVec(a)).applyBinary(func, a.expandVec(b))
174e5c31af7Sopenharmony_ci
175e5c31af7Sopenharmony_ci	@staticmethod
176e5c31af7Sopenharmony_ci	def frac(val):		return val.applyUnary(lambda x: x - math.floor(x))
177e5c31af7Sopenharmony_ci
178e5c31af7Sopenharmony_ci	@staticmethod
179e5c31af7Sopenharmony_ci	def exp2(val):		return val.applyUnary(lambda x: math.pow(2.0, x))
180e5c31af7Sopenharmony_ci
181e5c31af7Sopenharmony_ci	@staticmethod
182e5c31af7Sopenharmony_ci	def log2(val):		return val.applyUnary(lambda x: math.log(x, 2.0))
183e5c31af7Sopenharmony_ci
184e5c31af7Sopenharmony_ci	@staticmethod
185e5c31af7Sopenharmony_ci	def rsq(val):		return val.applyUnary(lambda x: 1.0 / math.sqrt(x))
186e5c31af7Sopenharmony_ci
187e5c31af7Sopenharmony_ci	@staticmethod
188e5c31af7Sopenharmony_ci	def sign(val):		return val.applyUnary(glslSign)
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_ci	@staticmethod
191e5c31af7Sopenharmony_ci	def isEqual(a, b):	return Scalar(a.isEqual(b))
192e5c31af7Sopenharmony_ci
193e5c31af7Sopenharmony_ci	@staticmethod
194e5c31af7Sopenharmony_ci	def isNotEqual(a, b):	return Scalar(not a.isEqual(b))
195e5c31af7Sopenharmony_ci
196e5c31af7Sopenharmony_ci	@staticmethod
197e5c31af7Sopenharmony_ci	def step(a, b):		return (b.expandVec(a)).applyBinary(lambda edge, x: [1.0, 0.0][x < edge], a.expandVec(b))
198e5c31af7Sopenharmony_ci
199e5c31af7Sopenharmony_ci	@staticmethod
200e5c31af7Sopenharmony_ci	def length(a):		return a.length()
201e5c31af7Sopenharmony_ci
202e5c31af7Sopenharmony_ci	@staticmethod
203e5c31af7Sopenharmony_ci	def distance(a, b):	return a.distance(b)
204e5c31af7Sopenharmony_ci
205e5c31af7Sopenharmony_ci	@staticmethod
206e5c31af7Sopenharmony_ci	def dot(a, b):		return a.dot(b)
207e5c31af7Sopenharmony_ci
208e5c31af7Sopenharmony_ci	@staticmethod
209e5c31af7Sopenharmony_ci	def cross(a, b):	return a.cross(b)
210e5c31af7Sopenharmony_ci
211e5c31af7Sopenharmony_ci	@staticmethod
212e5c31af7Sopenharmony_ci	def normalize(a):	return a.normalize()
213e5c31af7Sopenharmony_ci
214e5c31af7Sopenharmony_ci	@staticmethod
215e5c31af7Sopenharmony_ci	def boolAny(a):		return a.boolAny()
216e5c31af7Sopenharmony_ci
217e5c31af7Sopenharmony_ci	@staticmethod
218e5c31af7Sopenharmony_ci	def boolAll(a):		return a.boolAll()
219e5c31af7Sopenharmony_ci
220e5c31af7Sopenharmony_ci	@staticmethod
221e5c31af7Sopenharmony_ci	def boolNot(a):		return a.boolNot()
222e5c31af7Sopenharmony_ci
223e5c31af7Sopenharmony_ci	@staticmethod
224e5c31af7Sopenharmony_ci	def abs(a):			return a.abs()
225e5c31af7Sopenharmony_ci
226e5c31af7Sopenharmony_ci# ..
227e5c31af7Sopenharmony_ci
228e5c31af7Sopenharmony_ciclass Scalar(object):
229e5c31af7Sopenharmony_ci	def __init__(self, x):
230e5c31af7Sopenharmony_ci		self.x = x
231e5c31af7Sopenharmony_ci
232e5c31af7Sopenharmony_ci	def applyUnary(self, func):			return Scalar(func(self.x))
233e5c31af7Sopenharmony_ci	def applyBinary(self, func, other):	return Scalar(func(self.x, other.x))
234e5c31af7Sopenharmony_ci
235e5c31af7Sopenharmony_ci	def isEqual(self, other):	assert isinstance(other, Scalar); return (self.x == other.x)
236e5c31af7Sopenharmony_ci
237e5c31af7Sopenharmony_ci	def expandVec(self, val):	return val
238e5c31af7Sopenharmony_ci	def toScalar(self):			return Scalar(self.x)
239e5c31af7Sopenharmony_ci	def toVec2(self):			return Vec2(self.x, self.x)
240e5c31af7Sopenharmony_ci	def toVec3(self):			return Vec3(self.x, self.x, self.x)
241e5c31af7Sopenharmony_ci	def toVec4(self):			return Vec4(self.x, self.x, self.x, self.x)
242e5c31af7Sopenharmony_ci	def toUVec2(self):			return UVec2(self.x, self.x)
243e5c31af7Sopenharmony_ci	def toUVec3(self):			return UVec3(self.x, self.x, self.x)
244e5c31af7Sopenharmony_ci	def toUVec4(self):			return UVec4(self.x, self.x, self.x, self.x)
245e5c31af7Sopenharmony_ci	def toMat2(self):			return Mat.fromScalar(2, 2, float(self.x))
246e5c31af7Sopenharmony_ci	def toMat2x3(self):			return Mat.fromScalar(2, 3, float(self.x))
247e5c31af7Sopenharmony_ci	def toMat2x4(self):			return Mat.fromScalar(2, 4, float(self.x))
248e5c31af7Sopenharmony_ci	def toMat3x2(self):			return Mat.fromScalar(3, 2, float(self.x))
249e5c31af7Sopenharmony_ci	def toMat3(self):			return Mat.fromScalar(3, 3, float(self.x))
250e5c31af7Sopenharmony_ci	def toMat3x4(self):			return Mat.fromScalar(3, 4, float(self.x))
251e5c31af7Sopenharmony_ci	def toMat4x2(self):			return Mat.fromScalar(4, 2, float(self.x))
252e5c31af7Sopenharmony_ci	def toMat4x3(self):			return Mat.fromScalar(4, 3, float(self.x))
253e5c31af7Sopenharmony_ci	def toMat4(self):			return Mat.fromScalar(4, 4, float(self.x))
254e5c31af7Sopenharmony_ci
255e5c31af7Sopenharmony_ci	def toFloat(self):			return Scalar(float(self.x))
256e5c31af7Sopenharmony_ci	def toInt(self):			return Scalar(int(self.x))
257e5c31af7Sopenharmony_ci	def toUint(self):			return Uint(int(self.x))
258e5c31af7Sopenharmony_ci	def toBool(self):			return Scalar(bool(self.x))
259e5c31af7Sopenharmony_ci
260e5c31af7Sopenharmony_ci	def getNumScalars(self):	return 1
261e5c31af7Sopenharmony_ci	def getScalars(self):		return [self.x]
262e5c31af7Sopenharmony_ci
263e5c31af7Sopenharmony_ci	def typeString(self):
264e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
265e5c31af7Sopenharmony_ci			return "bool"
266e5c31af7Sopenharmony_ci		elif isinstance(self.x, int):
267e5c31af7Sopenharmony_ci			return "int"
268e5c31af7Sopenharmony_ci		elif isinstance(self.x, float):
269e5c31af7Sopenharmony_ci			return "float"
270e5c31af7Sopenharmony_ci		else:
271e5c31af7Sopenharmony_ci			assert False
272e5c31af7Sopenharmony_ci
273e5c31af7Sopenharmony_ci	def vec4Swizzle(self):
274e5c31af7Sopenharmony_ci		return ""
275e5c31af7Sopenharmony_ci
276e5c31af7Sopenharmony_ci	def __str__(self):
277e5c31af7Sopenharmony_ci		return str(self.x).lower()
278e5c31af7Sopenharmony_ci
279e5c31af7Sopenharmony_ci	def __float__(self):
280e5c31af7Sopenharmony_ci		return float(self.x)
281e5c31af7Sopenharmony_ci
282e5c31af7Sopenharmony_ci	def length(self):
283e5c31af7Sopenharmony_ci		return Scalar(abs(self.x))
284e5c31af7Sopenharmony_ci
285e5c31af7Sopenharmony_ci	def distance(self, v):
286e5c31af7Sopenharmony_ci		assert isinstance(v, Scalar)
287e5c31af7Sopenharmony_ci		return Scalar(abs(self.x - v.x))
288e5c31af7Sopenharmony_ci
289e5c31af7Sopenharmony_ci	def dot(self, v):
290e5c31af7Sopenharmony_ci		assert isinstance(v, Scalar)
291e5c31af7Sopenharmony_ci		return Scalar(self.x * v.x)
292e5c31af7Sopenharmony_ci
293e5c31af7Sopenharmony_ci	def normalize(self):
294e5c31af7Sopenharmony_ci		return Scalar(glslSign(self.x))
295e5c31af7Sopenharmony_ci
296e5c31af7Sopenharmony_ci	def abs(self):
297e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
298e5c31af7Sopenharmony_ci			return Scalar(self.x)
299e5c31af7Sopenharmony_ci		else:
300e5c31af7Sopenharmony_ci			return Scalar(abs(self.x))
301e5c31af7Sopenharmony_ci
302e5c31af7Sopenharmony_ci	def __neg__(self):
303e5c31af7Sopenharmony_ci		return Scalar(-self.x)
304e5c31af7Sopenharmony_ci
305e5c31af7Sopenharmony_ci	def __add__(self, val):
306e5c31af7Sopenharmony_ci		if not isinstance(val, Scalar):
307e5c31af7Sopenharmony_ci			print(val)
308e5c31af7Sopenharmony_ci		assert isinstance(val, Scalar)
309e5c31af7Sopenharmony_ci		return Scalar(self.x + val.x)
310e5c31af7Sopenharmony_ci
311e5c31af7Sopenharmony_ci	def __sub__(self, val):
312e5c31af7Sopenharmony_ci		return self + (-val)
313e5c31af7Sopenharmony_ci
314e5c31af7Sopenharmony_ci	def __mul__(self, val):
315e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
316e5c31af7Sopenharmony_ci			return Scalar(self.x * val.x)
317e5c31af7Sopenharmony_ci		elif isinstance(val, Vec2):
318e5c31af7Sopenharmony_ci			return Vec2(self.x * val.x, self.x * val.y)
319e5c31af7Sopenharmony_ci		elif isinstance(val, Vec3):
320e5c31af7Sopenharmony_ci			return Vec3(self.x * val.x, self.x * val.y, self.x * val.z)
321e5c31af7Sopenharmony_ci		elif isinstance(val, Vec4):
322e5c31af7Sopenharmony_ci			return Vec4(self.x * val.x, self.x * val.y, self.x * val.z, self.x * val.w)
323e5c31af7Sopenharmony_ci		else:
324e5c31af7Sopenharmony_ci			assert False
325e5c31af7Sopenharmony_ci
326e5c31af7Sopenharmony_ci	def __div__(self, val):
327e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
328e5c31af7Sopenharmony_ci			return Scalar(self.x / val.x)
329e5c31af7Sopenharmony_ci		elif isinstance(val, Vec2):
330e5c31af7Sopenharmony_ci			return Vec2(self.x / val.x, self.x / val.y)
331e5c31af7Sopenharmony_ci		elif isinstance(val, Vec3):
332e5c31af7Sopenharmony_ci			return Vec3(self.x / val.x, self.x / val.y, self.x / val.z)
333e5c31af7Sopenharmony_ci		elif isinstance(val, Vec4):
334e5c31af7Sopenharmony_ci			return Vec4(self.x / val.x, self.x / val.y, self.x / val.z, self.x / val.w)
335e5c31af7Sopenharmony_ci		else:
336e5c31af7Sopenharmony_ci			assert False
337e5c31af7Sopenharmony_ci
338e5c31af7Sopenharmony_ciclass Uint(Scalar):
339e5c31af7Sopenharmony_ci	def __init__(self, x):
340e5c31af7Sopenharmony_ci		assert x >= 0
341e5c31af7Sopenharmony_ci		self.x = x
342e5c31af7Sopenharmony_ci
343e5c31af7Sopenharmony_ci	def typeString(self):
344e5c31af7Sopenharmony_ci		return "uint"
345e5c31af7Sopenharmony_ci
346e5c31af7Sopenharmony_ci	def abs(self):
347e5c31af7Sopenharmony_ci		return Scalar.abs(self).toUint()
348e5c31af7Sopenharmony_ci
349e5c31af7Sopenharmony_ci	def __neg__(self):
350e5c31af7Sopenharmony_ci		return Scalar.__neg__(self).toUint()
351e5c31af7Sopenharmony_ci
352e5c31af7Sopenharmony_ci	def __add__(self, val):
353e5c31af7Sopenharmony_ci		return Scalar.__add__(self, val).toUint()
354e5c31af7Sopenharmony_ci
355e5c31af7Sopenharmony_ci	def __sub__(self, val):
356e5c31af7Sopenharmony_ci		return self + (-val)
357e5c31af7Sopenharmony_ci
358e5c31af7Sopenharmony_ci	def __mul__(self, val):
359e5c31af7Sopenharmony_ci		return Scalar.__mul__(self, val).toUint()
360e5c31af7Sopenharmony_ci
361e5c31af7Sopenharmony_ci	def __div__(self, val):
362e5c31af7Sopenharmony_ci		return Scalar.__div__(self, val).toUint()
363e5c31af7Sopenharmony_ci
364e5c31af7Sopenharmony_ciclass Vec(object):
365e5c31af7Sopenharmony_ci	@staticmethod
366e5c31af7Sopenharmony_ci	def fromScalarList(lst):
367e5c31af7Sopenharmony_ci		assert (len(lst) >= 1 and len(lst) <= 4)
368e5c31af7Sopenharmony_ci		if (len(lst) == 1):		return Scalar(lst[0])
369e5c31af7Sopenharmony_ci		elif (len(lst) == 2):	return Vec2(lst[0], lst[1])
370e5c31af7Sopenharmony_ci		elif (len(lst) == 3):	return Vec3(lst[0], lst[1], lst[2])
371e5c31af7Sopenharmony_ci		else:					return Vec4(lst[0], lst[1], lst[2], lst[3])
372e5c31af7Sopenharmony_ci
373e5c31af7Sopenharmony_ci	def isEqual(self, other):
374e5c31af7Sopenharmony_ci		assert isinstance(other, Vec);
375e5c31af7Sopenharmony_ci		return (self.getScalars() == other.getScalars())
376e5c31af7Sopenharmony_ci
377e5c31af7Sopenharmony_ci	def length(self):
378e5c31af7Sopenharmony_ci		return Scalar(math.sqrt(self.dot(self).x))
379e5c31af7Sopenharmony_ci
380e5c31af7Sopenharmony_ci	def normalize(self):
381e5c31af7Sopenharmony_ci		return self * Scalar(1.0 / self.length().x)
382e5c31af7Sopenharmony_ci
383e5c31af7Sopenharmony_ci	def swizzle(self, indexList):
384e5c31af7Sopenharmony_ci		inScalars = self.getScalars()
385e5c31af7Sopenharmony_ci		outScalars = map(lambda ndx: inScalars[ndx], indexList)
386e5c31af7Sopenharmony_ci		return Vec.fromScalarList(outScalars)
387e5c31af7Sopenharmony_ci
388e5c31af7Sopenharmony_ci	def __init__(self):
389e5c31af7Sopenharmony_ci		pass
390e5c31af7Sopenharmony_ci
391e5c31af7Sopenharmony_ci	def __eq__(self, other):
392e5c31af7Sopenharmony_ci		return self.isEqual(other)
393e5c31af7Sopenharmony_ci
394e5c31af7Sopenharmony_ci	def __ne__(self, other):
395e5c31af7Sopenharmony_ci		return not self.isEqual(other)
396e5c31af7Sopenharmony_ci
397e5c31af7Sopenharmony_ciclass Vec2(Vec):
398e5c31af7Sopenharmony_ci	def __init__(self, x, y):
399e5c31af7Sopenharmony_ci		assert(x.__class__ == y.__class__)
400e5c31af7Sopenharmony_ci		self.x = x
401e5c31af7Sopenharmony_ci		self.y = y
402e5c31af7Sopenharmony_ci
403e5c31af7Sopenharmony_ci	def applyUnary(self, func):			return Vec2(func(self.x), func(self.y))
404e5c31af7Sopenharmony_ci	def applyBinary(self, func, other):	return Vec2(func(self.x, other.x), func(self.y, other.y))
405e5c31af7Sopenharmony_ci
406e5c31af7Sopenharmony_ci	def expandVec(self, val):	return val.toVec2()
407e5c31af7Sopenharmony_ci	def toScalar(self):			return Scalar(self.x)
408e5c31af7Sopenharmony_ci	def toVec2(self):			return Vec2(self.x, self.y)
409e5c31af7Sopenharmony_ci	def toVec3(self):			return Vec3(self.x, self.y, 0.0)
410e5c31af7Sopenharmony_ci	def toVec4(self):			return Vec4(self.x, self.y, 0.0, 0.0)
411e5c31af7Sopenharmony_ci	def toUVec2(self):			return UVec2(self.x, self.y)
412e5c31af7Sopenharmony_ci	def toUVec3(self):			return UVec3(self.x, self.y, 0.0)
413e5c31af7Sopenharmony_ci	def toUVec4(self):			return UVec4(self.x, self.y, 0.0, 0.0)
414e5c31af7Sopenharmony_ci	def toMat2(self):			return Mat2(float(self.x), 0.0, 0.0, float(self.y));
415e5c31af7Sopenharmony_ci
416e5c31af7Sopenharmony_ci	def toFloat(self):			return Vec2(float(self.x), float(self.y))
417e5c31af7Sopenharmony_ci	def toInt(self):			return Vec2(int(self.x), int(self.y))
418e5c31af7Sopenharmony_ci	def toUint(self):			return UVec2(int(self.x), int(self.y))
419e5c31af7Sopenharmony_ci	def toBool(self):			return Vec2(bool(self.x), bool(self.y))
420e5c31af7Sopenharmony_ci
421e5c31af7Sopenharmony_ci	def getNumScalars(self):	return 2
422e5c31af7Sopenharmony_ci	def getScalars(self):		return [self.x, self.y]
423e5c31af7Sopenharmony_ci
424e5c31af7Sopenharmony_ci	def typeString(self):
425e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
426e5c31af7Sopenharmony_ci			return "bvec2"
427e5c31af7Sopenharmony_ci		elif isinstance(self.x, int):
428e5c31af7Sopenharmony_ci			return "ivec2"
429e5c31af7Sopenharmony_ci		elif isinstance(self.x, float):
430e5c31af7Sopenharmony_ci			return "vec2"
431e5c31af7Sopenharmony_ci		else:
432e5c31af7Sopenharmony_ci			assert False
433e5c31af7Sopenharmony_ci
434e5c31af7Sopenharmony_ci	def vec4Swizzle(self):
435e5c31af7Sopenharmony_ci		return ".xyxy"
436e5c31af7Sopenharmony_ci
437e5c31af7Sopenharmony_ci	def __str__(self):
438e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
439e5c31af7Sopenharmony_ci			return "bvec2(%s, %s)" % (str(self.x).lower(), str(self.y).lower())
440e5c31af7Sopenharmony_ci		elif isinstance(self.x, int):
441e5c31af7Sopenharmony_ci			return "ivec2(%i, %i)" % (self.x, self.y)
442e5c31af7Sopenharmony_ci		elif isinstance(self.x, float):
443e5c31af7Sopenharmony_ci			return "vec2(%s, %s)" % (self.x, self.y)
444e5c31af7Sopenharmony_ci		else:
445e5c31af7Sopenharmony_ci			assert False
446e5c31af7Sopenharmony_ci
447e5c31af7Sopenharmony_ci	def distance(self, v):
448e5c31af7Sopenharmony_ci		assert isinstance(v, Vec2)
449e5c31af7Sopenharmony_ci		return (self - v).length()
450e5c31af7Sopenharmony_ci
451e5c31af7Sopenharmony_ci	def dot(self, v):
452e5c31af7Sopenharmony_ci		assert isinstance(v, Vec2)
453e5c31af7Sopenharmony_ci		return Scalar(self.x*v.x + self.y*v.y)
454e5c31af7Sopenharmony_ci
455e5c31af7Sopenharmony_ci	def abs(self):
456e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
457e5c31af7Sopenharmony_ci			return Vec2(self.x, self.y)
458e5c31af7Sopenharmony_ci		else:
459e5c31af7Sopenharmony_ci			return Vec2(abs(self.x), abs(self.y))
460e5c31af7Sopenharmony_ci
461e5c31af7Sopenharmony_ci	def __neg__(self):
462e5c31af7Sopenharmony_ci		return Vec2(-self.x, -self.y)
463e5c31af7Sopenharmony_ci
464e5c31af7Sopenharmony_ci	def __add__(self, val):
465e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
466e5c31af7Sopenharmony_ci			return Vec2(self.x + val, self.y + val)
467e5c31af7Sopenharmony_ci		elif isinstance(val, Vec2):
468e5c31af7Sopenharmony_ci			return Vec2(self.x + val.x, self.y + val.y)
469e5c31af7Sopenharmony_ci		else:
470e5c31af7Sopenharmony_ci			assert False
471e5c31af7Sopenharmony_ci
472e5c31af7Sopenharmony_ci	def __sub__(self, val):
473e5c31af7Sopenharmony_ci		return self + (-val)
474e5c31af7Sopenharmony_ci
475e5c31af7Sopenharmony_ci	def __mul__(self, val):
476e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
477e5c31af7Sopenharmony_ci			val = val.toVec2()
478e5c31af7Sopenharmony_ci		assert isinstance(val, Vec2)
479e5c31af7Sopenharmony_ci		return Vec2(self.x * val.x, self.y * val.y)
480e5c31af7Sopenharmony_ci
481e5c31af7Sopenharmony_ci	def __div__(self, val):
482e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
483e5c31af7Sopenharmony_ci			return Vec2(self.x / val.x, self.y / val.x)
484e5c31af7Sopenharmony_ci		else:
485e5c31af7Sopenharmony_ci			assert isinstance(val, Vec2)
486e5c31af7Sopenharmony_ci			return Vec2(self.x / val.x, self.y / val.y)
487e5c31af7Sopenharmony_ci
488e5c31af7Sopenharmony_ci	def boolAny(self):	return Scalar(self.x or self.y)
489e5c31af7Sopenharmony_ci	def boolAll(self):	return Scalar(self.x and self.y)
490e5c31af7Sopenharmony_ci	def boolNot(self):	return Vec2(not self.x, not self.y)
491e5c31af7Sopenharmony_ci
492e5c31af7Sopenharmony_ciclass UVec2(Vec2):
493e5c31af7Sopenharmony_ci	def __init__(self, x, y):
494e5c31af7Sopenharmony_ci		assert isinstance(x, int) and isinstance(y, int)
495e5c31af7Sopenharmony_ci		assert x >= 0 and y >= 0
496e5c31af7Sopenharmony_ci		Vec2.__init__(self, x, y)
497e5c31af7Sopenharmony_ci
498e5c31af7Sopenharmony_ci	def typeString(self):
499e5c31af7Sopenharmony_ci		return "uvec2"
500e5c31af7Sopenharmony_ci
501e5c31af7Sopenharmony_ci	def __str__(self):
502e5c31af7Sopenharmony_ci		return "uvec2(%i, %i)" % (self.x, self.y)
503e5c31af7Sopenharmony_ci
504e5c31af7Sopenharmony_ci	def abs(self):
505e5c31af7Sopenharmony_ci		return Vec2.abs(self).toUint()
506e5c31af7Sopenharmony_ci
507e5c31af7Sopenharmony_ciclass Vec3(Vec):
508e5c31af7Sopenharmony_ci	def __init__(self, x, y, z):
509e5c31af7Sopenharmony_ci		assert((x.__class__ == y.__class__) and (x.__class__ == z.__class__))
510e5c31af7Sopenharmony_ci		self.x = x
511e5c31af7Sopenharmony_ci		self.y = y
512e5c31af7Sopenharmony_ci		self.z = z
513e5c31af7Sopenharmony_ci
514e5c31af7Sopenharmony_ci	def applyUnary(self, func):			return Vec3(func(self.x), func(self.y), func(self.z))
515e5c31af7Sopenharmony_ci	def applyBinary(self, func, other):	return Vec3(func(self.x, other.x), func(self.y, other.y), func(self.z, other.z))
516e5c31af7Sopenharmony_ci
517e5c31af7Sopenharmony_ci	def expandVec(self, val):	return val.toVec3()
518e5c31af7Sopenharmony_ci	def toScalar(self):			return Scalar(self.x)
519e5c31af7Sopenharmony_ci	def toVec2(self):			return Vec2(self.x, self.y)
520e5c31af7Sopenharmony_ci	def toVec3(self):			return Vec3(self.x, self.y, self.z)
521e5c31af7Sopenharmony_ci	def toVec4(self):			return Vec4(self.x, self.y, self.z, 0.0)
522e5c31af7Sopenharmony_ci	def toUVec2(self):			return UVec2(self.x, self.y)
523e5c31af7Sopenharmony_ci	def toUVec3(self):			return UVec3(self.x, self.y, self.z)
524e5c31af7Sopenharmony_ci	def toUVec4(self):			return UVec4(self.x, self.y, self.z, 0.0)
525e5c31af7Sopenharmony_ci	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));
526e5c31af7Sopenharmony_ci
527e5c31af7Sopenharmony_ci	def toFloat(self):			return Vec3(float(self.x), float(self.y), float(self.z))
528e5c31af7Sopenharmony_ci	def toInt(self):			return Vec3(int(self.x), int(self.y), int(self.z))
529e5c31af7Sopenharmony_ci	def toUint(self):			return UVec3(int(self.x), int(self.y), int(self.z))
530e5c31af7Sopenharmony_ci	def toBool(self):			return Vec3(bool(self.x), bool(self.y), bool(self.z))
531e5c31af7Sopenharmony_ci
532e5c31af7Sopenharmony_ci	def getNumScalars(self):	return 3
533e5c31af7Sopenharmony_ci	def getScalars(self):		return [self.x, self.y, self.z]
534e5c31af7Sopenharmony_ci
535e5c31af7Sopenharmony_ci	def typeString(self):
536e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
537e5c31af7Sopenharmony_ci			return "bvec3"
538e5c31af7Sopenharmony_ci		elif isinstance(self.x, int):
539e5c31af7Sopenharmony_ci			return "ivec3"
540e5c31af7Sopenharmony_ci		elif isinstance(self.x, float):
541e5c31af7Sopenharmony_ci			return "vec3"
542e5c31af7Sopenharmony_ci		else:
543e5c31af7Sopenharmony_ci			assert False
544e5c31af7Sopenharmony_ci
545e5c31af7Sopenharmony_ci	def vec4Swizzle(self):
546e5c31af7Sopenharmony_ci		return ".xyzx"
547e5c31af7Sopenharmony_ci
548e5c31af7Sopenharmony_ci	def __str__(self):
549e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
550e5c31af7Sopenharmony_ci			return "bvec3(%s, %s, %s)" % (str(self.x).lower(), str(self.y).lower(), str(self.z).lower())
551e5c31af7Sopenharmony_ci		elif isinstance(self.x, int):
552e5c31af7Sopenharmony_ci			return "ivec3(%i, %i, %i)" % (self.x, self.y, self.z)
553e5c31af7Sopenharmony_ci		elif isinstance(self.x, float):
554e5c31af7Sopenharmony_ci			return "vec3(%s, %s, %s)" % (self.x, self.y, self.z)
555e5c31af7Sopenharmony_ci		else:
556e5c31af7Sopenharmony_ci			assert False
557e5c31af7Sopenharmony_ci
558e5c31af7Sopenharmony_ci	def distance(self, v):
559e5c31af7Sopenharmony_ci		assert isinstance(v, Vec3)
560e5c31af7Sopenharmony_ci		return (self - v).length()
561e5c31af7Sopenharmony_ci
562e5c31af7Sopenharmony_ci	def dot(self, v):
563e5c31af7Sopenharmony_ci		assert isinstance(v, Vec3)
564e5c31af7Sopenharmony_ci		return Scalar(self.x*v.x + self.y*v.y + self.z*v.z)
565e5c31af7Sopenharmony_ci
566e5c31af7Sopenharmony_ci	def cross(self, v):
567e5c31af7Sopenharmony_ci		assert isinstance(v, Vec3)
568e5c31af7Sopenharmony_ci		return Vec3(self.y*v.z - v.y*self.z,
569e5c31af7Sopenharmony_ci					self.z*v.x - v.z*self.x,
570e5c31af7Sopenharmony_ci					self.x*v.y - v.x*self.y)
571e5c31af7Sopenharmony_ci
572e5c31af7Sopenharmony_ci	def abs(self):
573e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
574e5c31af7Sopenharmony_ci			return Vec3(self.x, self.y, self.z)
575e5c31af7Sopenharmony_ci		else:
576e5c31af7Sopenharmony_ci			return Vec3(abs(self.x), abs(self.y), abs(self.z))
577e5c31af7Sopenharmony_ci
578e5c31af7Sopenharmony_ci	def __neg__(self):
579e5c31af7Sopenharmony_ci		return Vec3(-self.x, -self.y, -self.z)
580e5c31af7Sopenharmony_ci
581e5c31af7Sopenharmony_ci	def __add__(self, val):
582e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
583e5c31af7Sopenharmony_ci			return Vec3(self.x + val, self.y + val)
584e5c31af7Sopenharmony_ci		elif isinstance(val, Vec3):
585e5c31af7Sopenharmony_ci			return Vec3(self.x + val.x, self.y + val.y, self.z + val.z)
586e5c31af7Sopenharmony_ci		else:
587e5c31af7Sopenharmony_ci			assert False
588e5c31af7Sopenharmony_ci
589e5c31af7Sopenharmony_ci	def __sub__(self, val):
590e5c31af7Sopenharmony_ci		return self + (-val)
591e5c31af7Sopenharmony_ci
592e5c31af7Sopenharmony_ci	def __mul__(self, val):
593e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
594e5c31af7Sopenharmony_ci			val = val.toVec3()
595e5c31af7Sopenharmony_ci		assert isinstance(val, Vec3)
596e5c31af7Sopenharmony_ci		return Vec3(self.x * val.x, self.y * val.y, self.z * val.z)
597e5c31af7Sopenharmony_ci
598e5c31af7Sopenharmony_ci	def __div__(self, val):
599e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
600e5c31af7Sopenharmony_ci			return Vec3(self.x / val.x, self.y / val.x, self.z / val.x)
601e5c31af7Sopenharmony_ci		elif isinstance(val, Vec3):
602e5c31af7Sopenharmony_ci			return Vec3(self.x / val.x, self.y / val.y, self.z / val.z)
603e5c31af7Sopenharmony_ci		else:
604e5c31af7Sopenharmony_ci			assert False
605e5c31af7Sopenharmony_ci
606e5c31af7Sopenharmony_ci	def boolAny(self):	return Scalar(self.x or self.y or self.z)
607e5c31af7Sopenharmony_ci	def boolAll(self):	return Scalar(self.x and self.y and self.z)
608e5c31af7Sopenharmony_ci	def boolNot(self):	return Vec3(not self.x, not self.y, not self.z)
609e5c31af7Sopenharmony_ci
610e5c31af7Sopenharmony_ciclass UVec3(Vec3):
611e5c31af7Sopenharmony_ci	def __init__(self, x, y, z):
612e5c31af7Sopenharmony_ci		assert isinstance(x, int) and isinstance(y, int) and isinstance(z, int)
613e5c31af7Sopenharmony_ci		assert x >= 0 and y >= 0 and z >= 0
614e5c31af7Sopenharmony_ci		Vec3.__init__(self, x, y, z)
615e5c31af7Sopenharmony_ci
616e5c31af7Sopenharmony_ci	def typeString(self):
617e5c31af7Sopenharmony_ci		return "uvec3"
618e5c31af7Sopenharmony_ci
619e5c31af7Sopenharmony_ci	def __str__(self):
620e5c31af7Sopenharmony_ci		return "uvec3(%i, %i, %i)" % (self.x, self.y, self.z)
621e5c31af7Sopenharmony_ci
622e5c31af7Sopenharmony_ci	def abs(self):
623e5c31af7Sopenharmony_ci		return Vec3.abs(self).toUint()
624e5c31af7Sopenharmony_ci
625e5c31af7Sopenharmony_ciclass Vec4(Vec):
626e5c31af7Sopenharmony_ci	def __init__(self, x, y, z, w):
627e5c31af7Sopenharmony_ci		assert((x.__class__ == y.__class__) and (x.__class__ == z.__class__) and (x.__class__ == w.__class__))
628e5c31af7Sopenharmony_ci		self.x = x
629e5c31af7Sopenharmony_ci		self.y = y
630e5c31af7Sopenharmony_ci		self.z = z
631e5c31af7Sopenharmony_ci		self.w = w
632e5c31af7Sopenharmony_ci
633e5c31af7Sopenharmony_ci	def applyUnary(self, func):			return Vec4(func(self.x), func(self.y), func(self.z), func(self.w))
634e5c31af7Sopenharmony_ci	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))
635e5c31af7Sopenharmony_ci
636e5c31af7Sopenharmony_ci	def expandVec(self, val):	return val.toVec4()
637e5c31af7Sopenharmony_ci	def toScalar(self):			return Scalar(self.x)
638e5c31af7Sopenharmony_ci	def toVec2(self):			return Vec2(self.x, self.y)
639e5c31af7Sopenharmony_ci	def toVec3(self):			return Vec3(self.x, self.y, self.z)
640e5c31af7Sopenharmony_ci	def toVec4(self):			return Vec4(self.x, self.y, self.z, self.w)
641e5c31af7Sopenharmony_ci	def toUVec2(self):			return UVec2(self.x, self.y)
642e5c31af7Sopenharmony_ci	def toUVec3(self):			return UVec3(self.x, self.y, self.z)
643e5c31af7Sopenharmony_ci	def toUVec4(self):			return UVec4(self.x, self.y, self.z, self.w)
644e5c31af7Sopenharmony_ci	def toMat2(self):			return Mat2(float(self.x), float(self.y), float(self.z), float(self.w))
645e5c31af7Sopenharmony_ci	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));
646e5c31af7Sopenharmony_ci
647e5c31af7Sopenharmony_ci	def toFloat(self):			return Vec4(float(self.x), float(self.y), float(self.z), float(self.w))
648e5c31af7Sopenharmony_ci	def toInt(self):			return Vec4(int(self.x), int(self.y), int(self.z), int(self.w))
649e5c31af7Sopenharmony_ci	def toUint(self):			return UVec4(int(self.x), int(self.y), int(self.z), int(self.w))
650e5c31af7Sopenharmony_ci	def toBool(self):			return Vec4(bool(self.x), bool(self.y), bool(self.z), bool(self.w))
651e5c31af7Sopenharmony_ci
652e5c31af7Sopenharmony_ci	def getNumScalars(self):	return 4
653e5c31af7Sopenharmony_ci	def getScalars(self):		return [self.x, self.y, self.z, self.w]
654e5c31af7Sopenharmony_ci
655e5c31af7Sopenharmony_ci	def typeString(self):
656e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
657e5c31af7Sopenharmony_ci			return "bvec4"
658e5c31af7Sopenharmony_ci		elif isinstance(self.x, int):
659e5c31af7Sopenharmony_ci			return "ivec4"
660e5c31af7Sopenharmony_ci		elif isinstance(self.x, float):
661e5c31af7Sopenharmony_ci			return "vec4"
662e5c31af7Sopenharmony_ci		else:
663e5c31af7Sopenharmony_ci			assert False
664e5c31af7Sopenharmony_ci
665e5c31af7Sopenharmony_ci	def vec4Swizzle(self):
666e5c31af7Sopenharmony_ci		return ""
667e5c31af7Sopenharmony_ci
668e5c31af7Sopenharmony_ci	def __str__(self):
669e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
670e5c31af7Sopenharmony_ci			return "bvec4(%s, %s, %s, %s)" % (str(self.x).lower(), str(self.y).lower(), str(self.z).lower(), str(self.w).lower())
671e5c31af7Sopenharmony_ci		elif isinstance(self.x, int):
672e5c31af7Sopenharmony_ci			return "ivec4(%i, %i, %i, %i)" % (self.x, self.y, self.z, self.w)
673e5c31af7Sopenharmony_ci		elif isinstance(self.x, float):
674e5c31af7Sopenharmony_ci			return "vec4(%s, %s, %s, %s)" % (self.x, self.y, self.z, self.w)
675e5c31af7Sopenharmony_ci		else:
676e5c31af7Sopenharmony_ci			assert False
677e5c31af7Sopenharmony_ci
678e5c31af7Sopenharmony_ci	def distance(self, v):
679e5c31af7Sopenharmony_ci		assert isinstance(v, Vec4)
680e5c31af7Sopenharmony_ci		return (self - v).length()
681e5c31af7Sopenharmony_ci
682e5c31af7Sopenharmony_ci	def dot(self, v):
683e5c31af7Sopenharmony_ci		assert isinstance(v, Vec4)
684e5c31af7Sopenharmony_ci		return Scalar(self.x*v.x + self.y*v.y + self.z*v.z + self.w*v.w)
685e5c31af7Sopenharmony_ci
686e5c31af7Sopenharmony_ci	def abs(self):
687e5c31af7Sopenharmony_ci		if isinstance(self.x, bool):
688e5c31af7Sopenharmony_ci			return Vec4(self.x, self.y, self.z, self.w)
689e5c31af7Sopenharmony_ci		else:
690e5c31af7Sopenharmony_ci			return Vec4(abs(self.x), abs(self.y), abs(self.z), abs(self.w))
691e5c31af7Sopenharmony_ci
692e5c31af7Sopenharmony_ci	def __neg__(self):
693e5c31af7Sopenharmony_ci		return Vec4(-self.x, -self.y, -self.z, -self.w)
694e5c31af7Sopenharmony_ci
695e5c31af7Sopenharmony_ci	def __add__(self, val):
696e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
697e5c31af7Sopenharmony_ci			return Vec3(self.x + val, self.y + val)
698e5c31af7Sopenharmony_ci		elif isinstance(val, Vec4):
699e5c31af7Sopenharmony_ci			return Vec4(self.x + val.x, self.y + val.y, self.z + val.z, self.w + val.w)
700e5c31af7Sopenharmony_ci		else:
701e5c31af7Sopenharmony_ci			assert False
702e5c31af7Sopenharmony_ci
703e5c31af7Sopenharmony_ci	def __sub__(self, val):
704e5c31af7Sopenharmony_ci		return self + (-val)
705e5c31af7Sopenharmony_ci
706e5c31af7Sopenharmony_ci	def __mul__(self, val):
707e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
708e5c31af7Sopenharmony_ci			val = val.toVec4()
709e5c31af7Sopenharmony_ci		assert isinstance(val, Vec4)
710e5c31af7Sopenharmony_ci		return Vec4(self.x * val.x, self.y * val.y, self.z * val.z, self.w * val.w)
711e5c31af7Sopenharmony_ci
712e5c31af7Sopenharmony_ci	def __div__(self, val):
713e5c31af7Sopenharmony_ci		if isinstance(val, Scalar):
714e5c31af7Sopenharmony_ci			return Vec4(self.x / val.x, self.y / val.x, self.z / val.x, self.w / val.x)
715e5c31af7Sopenharmony_ci		elif isinstance(val, Vec4):
716e5c31af7Sopenharmony_ci			return Vec4(self.x / val.x, self.y / val.y, self.z / val.z, self.w / val.w)
717e5c31af7Sopenharmony_ci		else:
718e5c31af7Sopenharmony_ci			assert False
719e5c31af7Sopenharmony_ci
720e5c31af7Sopenharmony_ci	def boolAny(self):	return Scalar(self.x or self.y or self.z or self.w)
721e5c31af7Sopenharmony_ci	def boolAll(self):	return Scalar(self.x and self.y and self.z and self.w)
722e5c31af7Sopenharmony_ci	def boolNot(self):	return Vec4(not self.x, not self.y, not self.z, not self.w)
723e5c31af7Sopenharmony_ci
724e5c31af7Sopenharmony_ciclass UVec4(Vec4):
725e5c31af7Sopenharmony_ci	def __init__(self, x, y, z, w):
726e5c31af7Sopenharmony_ci		assert isinstance(x, int) and isinstance(y, int) and isinstance(z, int) and isinstance(w, int)
727e5c31af7Sopenharmony_ci		assert x >= 0 and y >= 0 and z >= 0 and w >= 0
728e5c31af7Sopenharmony_ci		Vec4.__init__(self, x, y, z, w)
729e5c31af7Sopenharmony_ci
730e5c31af7Sopenharmony_ci	def typeString(self):
731e5c31af7Sopenharmony_ci		return "uvec4"
732e5c31af7Sopenharmony_ci
733e5c31af7Sopenharmony_ci	def __str__(self):
734e5c31af7Sopenharmony_ci		return "uvec4(%i, %i, %i, %i)" % (self.x, self.y, self.z, self.w)
735e5c31af7Sopenharmony_ci
736e5c31af7Sopenharmony_ci	def abs(self):
737e5c31af7Sopenharmony_ci		return Vec4.abs(self).toUint()
738e5c31af7Sopenharmony_ci
739e5c31af7Sopenharmony_ci# \note Column-major storage.
740e5c31af7Sopenharmony_ciclass Mat(object):
741e5c31af7Sopenharmony_ci	def __init__ (self, numCols, numRows, scalars):
742e5c31af7Sopenharmony_ci		assert len(scalars) == numRows*numCols
743e5c31af7Sopenharmony_ci		self.numCols	= numCols
744e5c31af7Sopenharmony_ci		self.numRows	= numRows
745e5c31af7Sopenharmony_ci		self.scalars	= scalars
746e5c31af7Sopenharmony_ci
747e5c31af7Sopenharmony_ci	@staticmethod
748e5c31af7Sopenharmony_ci	def fromScalar (numCols, numRows, scalar):
749e5c31af7Sopenharmony_ci		scalars = []
750e5c31af7Sopenharmony_ci		for col in range(0, numCols):
751e5c31af7Sopenharmony_ci			for row in range(0, numRows):
752e5c31af7Sopenharmony_ci				scalars.append(scalar if col == row else 0.0)
753e5c31af7Sopenharmony_ci		return Mat(numCols, numRows, scalars)
754e5c31af7Sopenharmony_ci
755e5c31af7Sopenharmony_ci	@staticmethod
756e5c31af7Sopenharmony_ci	def identity (numCols, numRows):
757e5c31af7Sopenharmony_ci		return Mat.fromScalar(numCols, numRows, 1.0)
758e5c31af7Sopenharmony_ci
759e5c31af7Sopenharmony_ci	def get (self, colNdx, rowNdx):
760e5c31af7Sopenharmony_ci		assert 0 <= colNdx and colNdx < self.numCols
761e5c31af7Sopenharmony_ci		assert 0 <= rowNdx and rowNdx < self.numRows
762e5c31af7Sopenharmony_ci		return self.scalars[colNdx*self.numRows + rowNdx]
763e5c31af7Sopenharmony_ci
764e5c31af7Sopenharmony_ci	def set (self, colNdx, rowNdx, scalar):
765e5c31af7Sopenharmony_ci		assert 0 <= colNdx and colNdx < self.numCols
766e5c31af7Sopenharmony_ci		assert 0 <= rowNdx and rowNdx < self.numRows
767e5c31af7Sopenharmony_ci		self.scalars[colNdx*self.numRows + rowNdx] = scalar
768e5c31af7Sopenharmony_ci
769e5c31af7Sopenharmony_ci	def toMatrix (self, numCols, numRows):
770e5c31af7Sopenharmony_ci		res = Mat.identity(numCols, numRows)
771e5c31af7Sopenharmony_ci		for col in range(0, min(self.numCols, numCols)):
772e5c31af7Sopenharmony_ci			for row in range(0, min(self.numRows, numRows)):
773e5c31af7Sopenharmony_ci				res.set(col, row, self.get(col, row))
774e5c31af7Sopenharmony_ci		return res
775e5c31af7Sopenharmony_ci
776e5c31af7Sopenharmony_ci	def toMat2 (self):		return self.toMatrix(2, 2)
777e5c31af7Sopenharmony_ci	def toMat2x3 (self):	return self.toMatrix(2, 3)
778e5c31af7Sopenharmony_ci	def toMat2x4 (self):	return self.toMatrix(2, 4)
779e5c31af7Sopenharmony_ci	def toMat3x2 (self):	return self.toMatrix(3, 2)
780e5c31af7Sopenharmony_ci	def toMat3 (self):		return self.toMatrix(3, 3)
781e5c31af7Sopenharmony_ci	def toMat3x4 (self):	return self.toMatrix(3, 4)
782e5c31af7Sopenharmony_ci	def toMat4x2 (self):	return self.toMatrix(4, 2)
783e5c31af7Sopenharmony_ci	def toMat4x3 (self):	return self.toMatrix(4, 3)
784e5c31af7Sopenharmony_ci	def toMat4 (self):		return self.toMatrix(4, 4)
785e5c31af7Sopenharmony_ci
786e5c31af7Sopenharmony_ci	def typeString(self):
787e5c31af7Sopenharmony_ci		if self.numRows == self.numCols:
788e5c31af7Sopenharmony_ci			return "mat%d" % self.numRows
789e5c31af7Sopenharmony_ci		else:
790e5c31af7Sopenharmony_ci			return "mat%dx%d" % (self.numCols, self.numRows)
791e5c31af7Sopenharmony_ci
792e5c31af7Sopenharmony_ci	def __str__(self):
793e5c31af7Sopenharmony_ci		return "%s(%s)" % (self.typeString(), ", ".join(["%s" % s for s in self.scalars]))
794e5c31af7Sopenharmony_ci
795e5c31af7Sopenharmony_ci	def isTypeEqual (self, other):
796e5c31af7Sopenharmony_ci		return isinstance(other, Mat) and self.numRows == other.numRows and self.numCols == other.numCols
797e5c31af7Sopenharmony_ci
798e5c31af7Sopenharmony_ci	def isEqual(self, other):
799e5c31af7Sopenharmony_ci		assert self.isTypeEqual(other)
800e5c31af7Sopenharmony_ci		return (self.scalars == other.scalars)
801e5c31af7Sopenharmony_ci
802e5c31af7Sopenharmony_ci	def compMul(self, val):
803e5c31af7Sopenharmony_ci		assert self.isTypeEqual(val)
804e5c31af7Sopenharmony_ci		return Mat(self.numRows, self.numCols, [self.scalars(i) * val.scalars(i) for i in range(self.numRows*self.numCols)])
805e5c31af7Sopenharmony_ci
806e5c31af7Sopenharmony_ciclass Mat2(Mat):
807e5c31af7Sopenharmony_ci	def __init__(self, m00, m01, m10, m11):
808e5c31af7Sopenharmony_ci		Mat.__init__(self, 2, 2, [m00, m10, m01, m11])
809e5c31af7Sopenharmony_ci
810e5c31af7Sopenharmony_ciclass Mat3(Mat):
811e5c31af7Sopenharmony_ci	def __init__(self, m00, m01, m02, m10, m11, m12, m20, m21, m22):
812e5c31af7Sopenharmony_ci		Mat.__init__(self, 3, 3, [m00, m10, m20,
813e5c31af7Sopenharmony_ci								  m01, m11, m21,
814e5c31af7Sopenharmony_ci								  m02, m12, m22])
815e5c31af7Sopenharmony_ci
816e5c31af7Sopenharmony_ciclass Mat4(Mat):
817e5c31af7Sopenharmony_ci	def __init__(self, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33):
818e5c31af7Sopenharmony_ci		Mat.__init__(self, 4, 4, [m00, m10, m20, m30,
819e5c31af7Sopenharmony_ci								  m01, m11, m21, m31,
820e5c31af7Sopenharmony_ci								  m02, m12, m22, m32,
821e5c31af7Sopenharmony_ci								  m03, m13, m23, m33])
822