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