xref: /aosp_15_r20/external/deqp/modules/gles31/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(object):
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(object):
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("    %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 toUint(lst): return [Uint(int(v.x)) for v in lst]
118*35238bceSAndroid Build Coastguard Workerdef toBool(lst): return [Scalar(bool(v.x)) for v in lst]
119*35238bceSAndroid Build Coastguard Workerdef toVec4(lst): return [v.toFloat().toVec4() for v in lst]
120*35238bceSAndroid Build Coastguard Workerdef toVec3(lst): return [v.toFloat().toVec3() for v in lst]
121*35238bceSAndroid Build Coastguard Workerdef toVec2(lst): return [v.toFloat().toVec2() for v in lst]
122*35238bceSAndroid Build Coastguard Workerdef toIVec4(lst): return [v.toInt().toVec4() for v in lst]
123*35238bceSAndroid Build Coastguard Workerdef toIVec3(lst): return [v.toInt().toVec3() for v in lst]
124*35238bceSAndroid Build Coastguard Workerdef toIVec2(lst): return [v.toInt().toVec2() for v in lst]
125*35238bceSAndroid Build Coastguard Workerdef toBVec4(lst): return [v.toBool().toVec4() for v in lst]
126*35238bceSAndroid Build Coastguard Workerdef toBVec3(lst): return [v.toBool().toVec3() for v in lst]
127*35238bceSAndroid Build Coastguard Workerdef toBVec2(lst): return [v.toBool().toVec2() for v in lst]
128*35238bceSAndroid Build Coastguard Workerdef toUVec4(lst): return [v.toUint().toUVec4() for v in lst]
129*35238bceSAndroid Build Coastguard Workerdef toUVec3(lst): return [v.toUint().toUVec3() for v in lst]
130*35238bceSAndroid Build Coastguard Workerdef toUVec2(lst): return [v.toUint().toUVec2() for v in lst]
131*35238bceSAndroid Build Coastguard Workerdef toMat2(lst): return [v.toMat2() for v in lst]
132*35238bceSAndroid Build Coastguard Workerdef toMat2x3(lst): return [v.toMat2x3() for v in lst]
133*35238bceSAndroid Build Coastguard Workerdef toMat2x4(lst): return [v.toMat2x4() for v in lst]
134*35238bceSAndroid Build Coastguard Workerdef toMat3x2(lst): return [v.toMat3x2() for v in lst]
135*35238bceSAndroid Build Coastguard Workerdef toMat3(lst): return [v.toMat3() for v in lst]
136*35238bceSAndroid Build Coastguard Workerdef toMat3x4(lst): return [v.toMat3x4() for v in lst]
137*35238bceSAndroid Build Coastguard Workerdef toMat4x2(lst): return [v.toMat4x2() for v in lst]
138*35238bceSAndroid Build Coastguard Workerdef toMat4x3(lst): return [v.toMat4x3() for v in lst]
139*35238bceSAndroid Build Coastguard Workerdef toMat4(lst): return [v.toMat4() for v in lst]
140*35238bceSAndroid Build Coastguard Worker
141*35238bceSAndroid Build Coastguard Worker# Random value generation.
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Workerclass GenRandom(object):
144*35238bceSAndroid Build Coastguard Worker    def __init__(self):
145*35238bceSAndroid Build Coastguard Worker        pass
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker    def uniformVec4(self, count, mn, mx):
148*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)]
149*35238bceSAndroid Build Coastguard Worker        ret[0].x = mn
150*35238bceSAndroid Build Coastguard Worker        ret[1].x = mx
151*35238bceSAndroid Build Coastguard Worker        ret[2].x = (mn + mx) * 0.5
152*35238bceSAndroid Build Coastguard Worker        return ret
153*35238bceSAndroid Build Coastguard Worker
154*35238bceSAndroid Build Coastguard Worker    def uniformBVec4(self, count):
155*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)]
156*35238bceSAndroid Build Coastguard Worker        ret[0].x = True
157*35238bceSAndroid Build Coastguard Worker        ret[1].x = False
158*35238bceSAndroid Build Coastguard Worker        return ret
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker#    def uniform(self,
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker# Math operating on Scalar/Vector types.
163*35238bceSAndroid Build Coastguard Worker
164*35238bceSAndroid Build Coastguard Workerdef glslSign(a): return 0.0 if (a == 0) else +1.0 if (a > 0.0) else -1.0
165*35238bceSAndroid Build Coastguard Workerdef glslMod(x, y): return x - y*math.floor(x/y)
166*35238bceSAndroid Build Coastguard Workerdef glslClamp(x, mn, mx): return mn if (x < mn) else mx if (x > mx) else x
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Workerclass GenMath(object):
169*35238bceSAndroid Build Coastguard Worker    @staticmethod
170*35238bceSAndroid Build Coastguard Worker    def unary(func): return lambda val: val.applyUnary(func)
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker    @staticmethod
173*35238bceSAndroid Build Coastguard Worker    def binary(func): return lambda a, b: (b.expandVec(a)).applyBinary(func, a.expandVec(b))
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker    @staticmethod
176*35238bceSAndroid Build Coastguard Worker    def frac(val): return val.applyUnary(lambda x: x - math.floor(x))
177*35238bceSAndroid Build Coastguard Worker
178*35238bceSAndroid Build Coastguard Worker    @staticmethod
179*35238bceSAndroid Build Coastguard Worker    def exp2(val): return val.applyUnary(lambda x: math.pow(2.0, x))
180*35238bceSAndroid Build Coastguard Worker
181*35238bceSAndroid Build Coastguard Worker    @staticmethod
182*35238bceSAndroid Build Coastguard Worker    def log2(val): return val.applyUnary(lambda x: math.log(x, 2.0))
183*35238bceSAndroid Build Coastguard Worker
184*35238bceSAndroid Build Coastguard Worker    @staticmethod
185*35238bceSAndroid Build Coastguard Worker    def rsq(val): return val.applyUnary(lambda x: 1.0 / math.sqrt(x))
186*35238bceSAndroid Build Coastguard Worker
187*35238bceSAndroid Build Coastguard Worker    @staticmethod
188*35238bceSAndroid Build Coastguard Worker    def sign(val): return val.applyUnary(glslSign)
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker    @staticmethod
191*35238bceSAndroid Build Coastguard Worker    def isEqual(a, b): return Scalar(a.isEqual(b))
192*35238bceSAndroid Build Coastguard Worker
193*35238bceSAndroid Build Coastguard Worker    @staticmethod
194*35238bceSAndroid Build Coastguard Worker    def isNotEqual(a, b): return Scalar(not a.isEqual(b))
195*35238bceSAndroid Build Coastguard Worker
196*35238bceSAndroid Build Coastguard Worker    @staticmethod
197*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))
198*35238bceSAndroid Build Coastguard Worker
199*35238bceSAndroid Build Coastguard Worker    @staticmethod
200*35238bceSAndroid Build Coastguard Worker    def length(a): return a.length()
201*35238bceSAndroid Build Coastguard Worker
202*35238bceSAndroid Build Coastguard Worker    @staticmethod
203*35238bceSAndroid Build Coastguard Worker    def distance(a, b): return a.distance(b)
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker    @staticmethod
206*35238bceSAndroid Build Coastguard Worker    def dot(a, b): return a.dot(b)
207*35238bceSAndroid Build Coastguard Worker
208*35238bceSAndroid Build Coastguard Worker    @staticmethod
209*35238bceSAndroid Build Coastguard Worker    def cross(a, b): return a.cross(b)
210*35238bceSAndroid Build Coastguard Worker
211*35238bceSAndroid Build Coastguard Worker    @staticmethod
212*35238bceSAndroid Build Coastguard Worker    def normalize(a): return a.normalize()
213*35238bceSAndroid Build Coastguard Worker
214*35238bceSAndroid Build Coastguard Worker    @staticmethod
215*35238bceSAndroid Build Coastguard Worker    def boolAny(a): return a.boolAny()
216*35238bceSAndroid Build Coastguard Worker
217*35238bceSAndroid Build Coastguard Worker    @staticmethod
218*35238bceSAndroid Build Coastguard Worker    def boolAll(a): return a.boolAll()
219*35238bceSAndroid Build Coastguard Worker
220*35238bceSAndroid Build Coastguard Worker    @staticmethod
221*35238bceSAndroid Build Coastguard Worker    def boolNot(a): return a.boolNot()
222*35238bceSAndroid Build Coastguard Worker
223*35238bceSAndroid Build Coastguard Worker    @staticmethod
224*35238bceSAndroid Build Coastguard Worker    def abs(a): return a.abs()
225*35238bceSAndroid Build Coastguard Worker
226*35238bceSAndroid Build Coastguard Worker# ..
227*35238bceSAndroid Build Coastguard Worker
228*35238bceSAndroid Build Coastguard Workerclass Scalar(object):
229*35238bceSAndroid Build Coastguard Worker    def __init__(self, x):
230*35238bceSAndroid Build Coastguard Worker        self.x = x
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard Worker    def applyUnary(self, func): return Scalar(func(self.x))
233*35238bceSAndroid Build Coastguard Worker    def applyBinary(self, func, other): return Scalar(func(self.x, other.x))
234*35238bceSAndroid Build Coastguard Worker
235*35238bceSAndroid Build Coastguard Worker    def isEqual(self, other): assert isinstance(other, Scalar); return (self.x == other.x)
236*35238bceSAndroid Build Coastguard Worker
237*35238bceSAndroid Build Coastguard Worker    def expandVec(self, val): return val
238*35238bceSAndroid Build Coastguard Worker    def toScalar(self): return Scalar(self.x)
239*35238bceSAndroid Build Coastguard Worker    def toVec2(self): return Vec2(self.x, self.x)
240*35238bceSAndroid Build Coastguard Worker    def toVec3(self): return Vec3(self.x, self.x, self.x)
241*35238bceSAndroid Build Coastguard Worker    def toVec4(self): return Vec4(self.x, self.x, self.x, self.x)
242*35238bceSAndroid Build Coastguard Worker    def toUVec2(self): return UVec2(self.x, self.x)
243*35238bceSAndroid Build Coastguard Worker    def toUVec3(self): return UVec3(self.x, self.x, self.x)
244*35238bceSAndroid Build Coastguard Worker    def toUVec4(self): return UVec4(self.x, self.x, self.x, self.x)
245*35238bceSAndroid Build Coastguard Worker    def toMat2(self): return Mat.fromScalar(2, 2, float(self.x))
246*35238bceSAndroid Build Coastguard Worker    def toMat2x3(self): return Mat.fromScalar(2, 3, float(self.x))
247*35238bceSAndroid Build Coastguard Worker    def toMat2x4(self): return Mat.fromScalar(2, 4, float(self.x))
248*35238bceSAndroid Build Coastguard Worker    def toMat3x2(self): return Mat.fromScalar(3, 2, float(self.x))
249*35238bceSAndroid Build Coastguard Worker    def toMat3(self): return Mat.fromScalar(3, 3, float(self.x))
250*35238bceSAndroid Build Coastguard Worker    def toMat3x4(self): return Mat.fromScalar(3, 4, float(self.x))
251*35238bceSAndroid Build Coastguard Worker    def toMat4x2(self): return Mat.fromScalar(4, 2, float(self.x))
252*35238bceSAndroid Build Coastguard Worker    def toMat4x3(self): return Mat.fromScalar(4, 3, float(self.x))
253*35238bceSAndroid Build Coastguard Worker    def toMat4(self): return Mat.fromScalar(4, 4, float(self.x))
254*35238bceSAndroid Build Coastguard Worker
255*35238bceSAndroid Build Coastguard Worker    def toFloat(self): return Scalar(float(self.x))
256*35238bceSAndroid Build Coastguard Worker    def toInt(self): return Scalar(int(self.x))
257*35238bceSAndroid Build Coastguard Worker    def toUint(self): return Uint(int(self.x))
258*35238bceSAndroid Build Coastguard Worker    def toBool(self): return Scalar(bool(self.x))
259*35238bceSAndroid Build Coastguard Worker
260*35238bceSAndroid Build Coastguard Worker    def getNumScalars(self): return 1
261*35238bceSAndroid Build Coastguard Worker    def getScalars(self): return [self.x]
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker    def typeString(self):
264*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
265*35238bceSAndroid Build Coastguard Worker            return "bool"
266*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, int):
267*35238bceSAndroid Build Coastguard Worker            return "int"
268*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, float):
269*35238bceSAndroid Build Coastguard Worker            return "float"
270*35238bceSAndroid Build Coastguard Worker        else:
271*35238bceSAndroid Build Coastguard Worker            assert False
272*35238bceSAndroid Build Coastguard Worker
273*35238bceSAndroid Build Coastguard Worker    def vec4Swizzle(self):
274*35238bceSAndroid Build Coastguard Worker        return ""
275*35238bceSAndroid Build Coastguard Worker
276*35238bceSAndroid Build Coastguard Worker    def __str__(self):
277*35238bceSAndroid Build Coastguard Worker        return str(self.x).lower()
278*35238bceSAndroid Build Coastguard Worker
279*35238bceSAndroid Build Coastguard Worker    def __float__(self):
280*35238bceSAndroid Build Coastguard Worker        return float(self.x)
281*35238bceSAndroid Build Coastguard Worker
282*35238bceSAndroid Build Coastguard Worker    def length(self):
283*35238bceSAndroid Build Coastguard Worker        return Scalar(abs(self.x))
284*35238bceSAndroid Build Coastguard Worker
285*35238bceSAndroid Build Coastguard Worker    def distance(self, v):
286*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Scalar)
287*35238bceSAndroid Build Coastguard Worker        return Scalar(abs(self.x - v.x))
288*35238bceSAndroid Build Coastguard Worker
289*35238bceSAndroid Build Coastguard Worker    def dot(self, v):
290*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Scalar)
291*35238bceSAndroid Build Coastguard Worker        return Scalar(self.x * v.x)
292*35238bceSAndroid Build Coastguard Worker
293*35238bceSAndroid Build Coastguard Worker    def normalize(self):
294*35238bceSAndroid Build Coastguard Worker        return Scalar(glslSign(self.x))
295*35238bceSAndroid Build Coastguard Worker
296*35238bceSAndroid Build Coastguard Worker    def abs(self):
297*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
298*35238bceSAndroid Build Coastguard Worker            return Scalar(self.x)
299*35238bceSAndroid Build Coastguard Worker        else:
300*35238bceSAndroid Build Coastguard Worker            return Scalar(abs(self.x))
301*35238bceSAndroid Build Coastguard Worker
302*35238bceSAndroid Build Coastguard Worker    def __neg__(self):
303*35238bceSAndroid Build Coastguard Worker        return Scalar(-self.x)
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker    def __add__(self, val):
306*35238bceSAndroid Build Coastguard Worker        if not isinstance(val, Scalar):
307*35238bceSAndroid Build Coastguard Worker            print(val)
308*35238bceSAndroid Build Coastguard Worker        assert isinstance(val, Scalar)
309*35238bceSAndroid Build Coastguard Worker        return Scalar(self.x + val.x)
310*35238bceSAndroid Build Coastguard Worker
311*35238bceSAndroid Build Coastguard Worker    def __sub__(self, val):
312*35238bceSAndroid Build Coastguard Worker        return self + (-val)
313*35238bceSAndroid Build Coastguard Worker
314*35238bceSAndroid Build Coastguard Worker    def __mul__(self, val):
315*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
316*35238bceSAndroid Build Coastguard Worker            return Scalar(self.x * val.x)
317*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec2):
318*35238bceSAndroid Build Coastguard Worker            return Vec2(self.x * val.x, self.x * val.y)
319*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec3):
320*35238bceSAndroid Build Coastguard Worker            return Vec3(self.x * val.x, self.x * val.y, self.x * val.z)
321*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec4):
322*35238bceSAndroid Build Coastguard Worker            return Vec4(self.x * val.x, self.x * val.y, self.x * val.z, self.x * val.w)
323*35238bceSAndroid Build Coastguard Worker        else:
324*35238bceSAndroid Build Coastguard Worker            assert False
325*35238bceSAndroid Build Coastguard Worker
326*35238bceSAndroid Build Coastguard Worker    def __div__(self, val):
327*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
328*35238bceSAndroid Build Coastguard Worker            return Scalar(self.x / val.x)
329*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec2):
330*35238bceSAndroid Build Coastguard Worker            return Vec2(self.x / val.x, self.x / val.y)
331*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec3):
332*35238bceSAndroid Build Coastguard Worker            return Vec3(self.x / val.x, self.x / val.y, self.x / val.z)
333*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec4):
334*35238bceSAndroid Build Coastguard Worker            return Vec4(self.x / val.x, self.x / val.y, self.x / val.z, self.x / val.w)
335*35238bceSAndroid Build Coastguard Worker        else:
336*35238bceSAndroid Build Coastguard Worker            assert False
337*35238bceSAndroid Build Coastguard Worker
338*35238bceSAndroid Build Coastguard Workerclass Uint(Scalar):
339*35238bceSAndroid Build Coastguard Worker    def __init__(self, x):
340*35238bceSAndroid Build Coastguard Worker        assert x >= 0
341*35238bceSAndroid Build Coastguard Worker        self.x = x
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker    def typeString(self):
344*35238bceSAndroid Build Coastguard Worker        return "uint"
345*35238bceSAndroid Build Coastguard Worker
346*35238bceSAndroid Build Coastguard Worker    def abs(self):
347*35238bceSAndroid Build Coastguard Worker        return Scalar.abs(self).toUint()
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker    def __neg__(self):
350*35238bceSAndroid Build Coastguard Worker        return Scalar.__neg__(self).toUint()
351*35238bceSAndroid Build Coastguard Worker
352*35238bceSAndroid Build Coastguard Worker    def __add__(self, val):
353*35238bceSAndroid Build Coastguard Worker        return Scalar.__add__(self, val).toUint()
354*35238bceSAndroid Build Coastguard Worker
355*35238bceSAndroid Build Coastguard Worker    def __sub__(self, val):
356*35238bceSAndroid Build Coastguard Worker        return self + (-val)
357*35238bceSAndroid Build Coastguard Worker
358*35238bceSAndroid Build Coastguard Worker    def __mul__(self, val):
359*35238bceSAndroid Build Coastguard Worker        return Scalar.__mul__(self, val).toUint()
360*35238bceSAndroid Build Coastguard Worker
361*35238bceSAndroid Build Coastguard Worker    def __div__(self, val):
362*35238bceSAndroid Build Coastguard Worker        return Scalar.__div__(self, val).toUint()
363*35238bceSAndroid Build Coastguard Worker
364*35238bceSAndroid Build Coastguard Workerclass Vec(object):
365*35238bceSAndroid Build Coastguard Worker    @staticmethod
366*35238bceSAndroid Build Coastguard Worker    def fromScalarList(lst):
367*35238bceSAndroid Build Coastguard Worker        assert (len(lst) >= 1 and len(lst) <= 4)
368*35238bceSAndroid Build Coastguard Worker        if (len(lst) == 1): return Scalar(lst[0])
369*35238bceSAndroid Build Coastguard Worker        elif (len(lst) == 2): return Vec2(lst[0], lst[1])
370*35238bceSAndroid Build Coastguard Worker        elif (len(lst) == 3): return Vec3(lst[0], lst[1], lst[2])
371*35238bceSAndroid Build Coastguard Worker        else: return Vec4(lst[0], lst[1], lst[2], lst[3])
372*35238bceSAndroid Build Coastguard Worker
373*35238bceSAndroid Build Coastguard Worker    def isEqual(self, other):
374*35238bceSAndroid Build Coastguard Worker        assert isinstance(other, Vec);
375*35238bceSAndroid Build Coastguard Worker        return (self.getScalars() == other.getScalars())
376*35238bceSAndroid Build Coastguard Worker
377*35238bceSAndroid Build Coastguard Worker    def length(self):
378*35238bceSAndroid Build Coastguard Worker        return Scalar(math.sqrt(self.dot(self).x))
379*35238bceSAndroid Build Coastguard Worker
380*35238bceSAndroid Build Coastguard Worker    def normalize(self):
381*35238bceSAndroid Build Coastguard Worker        return self * Scalar(1.0 / self.length().x)
382*35238bceSAndroid Build Coastguard Worker
383*35238bceSAndroid Build Coastguard Worker    def swizzle(self, indexList):
384*35238bceSAndroid Build Coastguard Worker        inScalars = self.getScalars()
385*35238bceSAndroid Build Coastguard Worker        outScalars = map(lambda ndx: inScalars[ndx], indexList)
386*35238bceSAndroid Build Coastguard Worker        return Vec.fromScalarList(outScalars)
387*35238bceSAndroid Build Coastguard Worker
388*35238bceSAndroid Build Coastguard Worker    def __init__(self):
389*35238bceSAndroid Build Coastguard Worker        pass
390*35238bceSAndroid Build Coastguard Worker
391*35238bceSAndroid Build Coastguard Worker    def __eq__(self, other):
392*35238bceSAndroid Build Coastguard Worker        return self.isEqual(other)
393*35238bceSAndroid Build Coastguard Worker
394*35238bceSAndroid Build Coastguard Worker    def __ne__(self, other):
395*35238bceSAndroid Build Coastguard Worker        return not self.isEqual(other)
396*35238bceSAndroid Build Coastguard Worker
397*35238bceSAndroid Build Coastguard Workerclass Vec2(Vec):
398*35238bceSAndroid Build Coastguard Worker    def __init__(self, x, y):
399*35238bceSAndroid Build Coastguard Worker        assert(x.__class__ == y.__class__)
400*35238bceSAndroid Build Coastguard Worker        self.x = x
401*35238bceSAndroid Build Coastguard Worker        self.y = y
402*35238bceSAndroid Build Coastguard Worker
403*35238bceSAndroid Build Coastguard Worker    def applyUnary(self, func): return Vec2(func(self.x), func(self.y))
404*35238bceSAndroid Build Coastguard Worker    def applyBinary(self, func, other): return Vec2(func(self.x, other.x), func(self.y, other.y))
405*35238bceSAndroid Build Coastguard Worker
406*35238bceSAndroid Build Coastguard Worker    def expandVec(self, val): return val.toVec2()
407*35238bceSAndroid Build Coastguard Worker    def toScalar(self): return Scalar(self.x)
408*35238bceSAndroid Build Coastguard Worker    def toVec2(self): return Vec2(self.x, self.y)
409*35238bceSAndroid Build Coastguard Worker    def toVec3(self): return Vec3(self.x, self.y, 0.0)
410*35238bceSAndroid Build Coastguard Worker    def toVec4(self): return Vec4(self.x, self.y, 0.0, 0.0)
411*35238bceSAndroid Build Coastguard Worker    def toUVec2(self): return UVec2(self.x, self.y)
412*35238bceSAndroid Build Coastguard Worker    def toUVec3(self): return UVec3(self.x, self.y, 0.0)
413*35238bceSAndroid Build Coastguard Worker    def toUVec4(self): return UVec4(self.x, self.y, 0.0, 0.0)
414*35238bceSAndroid Build Coastguard Worker    def toMat2(self): return Mat2(float(self.x), 0.0, 0.0, float(self.y));
415*35238bceSAndroid Build Coastguard Worker
416*35238bceSAndroid Build Coastguard Worker    def toFloat(self): return Vec2(float(self.x), float(self.y))
417*35238bceSAndroid Build Coastguard Worker    def toInt(self): return Vec2(int(self.x), int(self.y))
418*35238bceSAndroid Build Coastguard Worker    def toUint(self): return UVec2(int(self.x), int(self.y))
419*35238bceSAndroid Build Coastguard Worker    def toBool(self): return Vec2(bool(self.x), bool(self.y))
420*35238bceSAndroid Build Coastguard Worker
421*35238bceSAndroid Build Coastguard Worker    def getNumScalars(self): return 2
422*35238bceSAndroid Build Coastguard Worker    def getScalars(self): return [self.x, self.y]
423*35238bceSAndroid Build Coastguard Worker
424*35238bceSAndroid Build Coastguard Worker    def typeString(self):
425*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
426*35238bceSAndroid Build Coastguard Worker            return "bvec2"
427*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, int):
428*35238bceSAndroid Build Coastguard Worker            return "ivec2"
429*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, float):
430*35238bceSAndroid Build Coastguard Worker            return "vec2"
431*35238bceSAndroid Build Coastguard Worker        else:
432*35238bceSAndroid Build Coastguard Worker            assert False
433*35238bceSAndroid Build Coastguard Worker
434*35238bceSAndroid Build Coastguard Worker    def vec4Swizzle(self):
435*35238bceSAndroid Build Coastguard Worker        return ".xyxy"
436*35238bceSAndroid Build Coastguard Worker
437*35238bceSAndroid Build Coastguard Worker    def __str__(self):
438*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
439*35238bceSAndroid Build Coastguard Worker            return "bvec2(%s, %s)" % (str(self.x).lower(), str(self.y).lower())
440*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, int):
441*35238bceSAndroid Build Coastguard Worker            return "ivec2(%i, %i)" % (self.x, self.y)
442*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, float):
443*35238bceSAndroid Build Coastguard Worker            return "vec2(%s, %s)" % (self.x, self.y)
444*35238bceSAndroid Build Coastguard Worker        else:
445*35238bceSAndroid Build Coastguard Worker            assert False
446*35238bceSAndroid Build Coastguard Worker
447*35238bceSAndroid Build Coastguard Worker    def distance(self, v):
448*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Vec2)
449*35238bceSAndroid Build Coastguard Worker        return (self - v).length()
450*35238bceSAndroid Build Coastguard Worker
451*35238bceSAndroid Build Coastguard Worker    def dot(self, v):
452*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Vec2)
453*35238bceSAndroid Build Coastguard Worker        return Scalar(self.x*v.x + self.y*v.y)
454*35238bceSAndroid Build Coastguard Worker
455*35238bceSAndroid Build Coastguard Worker    def abs(self):
456*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
457*35238bceSAndroid Build Coastguard Worker            return Vec2(self.x, self.y)
458*35238bceSAndroid Build Coastguard Worker        else:
459*35238bceSAndroid Build Coastguard Worker            return Vec2(abs(self.x), abs(self.y))
460*35238bceSAndroid Build Coastguard Worker
461*35238bceSAndroid Build Coastguard Worker    def __neg__(self):
462*35238bceSAndroid Build Coastguard Worker        return Vec2(-self.x, -self.y)
463*35238bceSAndroid Build Coastguard Worker
464*35238bceSAndroid Build Coastguard Worker    def __add__(self, val):
465*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
466*35238bceSAndroid Build Coastguard Worker            return Vec2(self.x + val, self.y + val)
467*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec2):
468*35238bceSAndroid Build Coastguard Worker            return Vec2(self.x + val.x, self.y + val.y)
469*35238bceSAndroid Build Coastguard Worker        else:
470*35238bceSAndroid Build Coastguard Worker            assert False
471*35238bceSAndroid Build Coastguard Worker
472*35238bceSAndroid Build Coastguard Worker    def __sub__(self, val):
473*35238bceSAndroid Build Coastguard Worker        return self + (-val)
474*35238bceSAndroid Build Coastguard Worker
475*35238bceSAndroid Build Coastguard Worker    def __mul__(self, val):
476*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
477*35238bceSAndroid Build Coastguard Worker            val = val.toVec2()
478*35238bceSAndroid Build Coastguard Worker        assert isinstance(val, Vec2)
479*35238bceSAndroid Build Coastguard Worker        return Vec2(self.x * val.x, self.y * val.y)
480*35238bceSAndroid Build Coastguard Worker
481*35238bceSAndroid Build Coastguard Worker    def __div__(self, val):
482*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
483*35238bceSAndroid Build Coastguard Worker            return Vec2(self.x / val.x, self.y / val.x)
484*35238bceSAndroid Build Coastguard Worker        else:
485*35238bceSAndroid Build Coastguard Worker            assert isinstance(val, Vec2)
486*35238bceSAndroid Build Coastguard Worker            return Vec2(self.x / val.x, self.y / val.y)
487*35238bceSAndroid Build Coastguard Worker
488*35238bceSAndroid Build Coastguard Worker    def boolAny(self): return Scalar(self.x or self.y)
489*35238bceSAndroid Build Coastguard Worker    def boolAll(self): return Scalar(self.x and self.y)
490*35238bceSAndroid Build Coastguard Worker    def boolNot(self): return Vec2(not self.x, not self.y)
491*35238bceSAndroid Build Coastguard Worker
492*35238bceSAndroid Build Coastguard Workerclass UVec2(Vec2):
493*35238bceSAndroid Build Coastguard Worker    def __init__(self, x, y):
494*35238bceSAndroid Build Coastguard Worker        assert isinstance(x, int) and isinstance(y, int)
495*35238bceSAndroid Build Coastguard Worker        assert x >= 0 and y >= 0
496*35238bceSAndroid Build Coastguard Worker        Vec2.__init__(self, x, y)
497*35238bceSAndroid Build Coastguard Worker
498*35238bceSAndroid Build Coastguard Worker    def typeString(self):
499*35238bceSAndroid Build Coastguard Worker        return "uvec2"
500*35238bceSAndroid Build Coastguard Worker
501*35238bceSAndroid Build Coastguard Worker    def __str__(self):
502*35238bceSAndroid Build Coastguard Worker        return "uvec2(%i, %i)" % (self.x, self.y)
503*35238bceSAndroid Build Coastguard Worker
504*35238bceSAndroid Build Coastguard Worker    def abs(self):
505*35238bceSAndroid Build Coastguard Worker        return Vec2.abs(self).toUint()
506*35238bceSAndroid Build Coastguard Worker
507*35238bceSAndroid Build Coastguard Workerclass Vec3(Vec):
508*35238bceSAndroid Build Coastguard Worker    def __init__(self, x, y, z):
509*35238bceSAndroid Build Coastguard Worker        assert((x.__class__ == y.__class__) and (x.__class__ == z.__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
514*35238bceSAndroid Build Coastguard Worker    def applyUnary(self, func): return Vec3(func(self.x), func(self.y), func(self.z))
515*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))
516*35238bceSAndroid Build Coastguard Worker
517*35238bceSAndroid Build Coastguard Worker    def expandVec(self, val): return val.toVec3()
518*35238bceSAndroid Build Coastguard Worker    def toScalar(self): return Scalar(self.x)
519*35238bceSAndroid Build Coastguard Worker    def toVec2(self): return Vec2(self.x, self.y)
520*35238bceSAndroid Build Coastguard Worker    def toVec3(self): return Vec3(self.x, self.y, self.z)
521*35238bceSAndroid Build Coastguard Worker    def toVec4(self): return Vec4(self.x, self.y, self.z, 0.0)
522*35238bceSAndroid Build Coastguard Worker    def toUVec2(self): return UVec2(self.x, self.y)
523*35238bceSAndroid Build Coastguard Worker    def toUVec3(self): return UVec3(self.x, self.y, self.z)
524*35238bceSAndroid Build Coastguard Worker    def toUVec4(self): return UVec4(self.x, self.y, self.z, 0.0)
525*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));
526*35238bceSAndroid Build Coastguard Worker
527*35238bceSAndroid Build Coastguard Worker    def toFloat(self): return Vec3(float(self.x), float(self.y), float(self.z))
528*35238bceSAndroid Build Coastguard Worker    def toInt(self): return Vec3(int(self.x), int(self.y), int(self.z))
529*35238bceSAndroid Build Coastguard Worker    def toUint(self): return UVec3(int(self.x), int(self.y), int(self.z))
530*35238bceSAndroid Build Coastguard Worker    def toBool(self): return Vec3(bool(self.x), bool(self.y), bool(self.z))
531*35238bceSAndroid Build Coastguard Worker
532*35238bceSAndroid Build Coastguard Worker    def getNumScalars(self): return 3
533*35238bceSAndroid Build Coastguard Worker    def getScalars(self): return [self.x, self.y, self.z]
534*35238bceSAndroid Build Coastguard Worker
535*35238bceSAndroid Build Coastguard Worker    def typeString(self):
536*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
537*35238bceSAndroid Build Coastguard Worker            return "bvec3"
538*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, int):
539*35238bceSAndroid Build Coastguard Worker            return "ivec3"
540*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, float):
541*35238bceSAndroid Build Coastguard Worker            return "vec3"
542*35238bceSAndroid Build Coastguard Worker        else:
543*35238bceSAndroid Build Coastguard Worker            assert False
544*35238bceSAndroid Build Coastguard Worker
545*35238bceSAndroid Build Coastguard Worker    def vec4Swizzle(self):
546*35238bceSAndroid Build Coastguard Worker        return ".xyzx"
547*35238bceSAndroid Build Coastguard Worker
548*35238bceSAndroid Build Coastguard Worker    def __str__(self):
549*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
550*35238bceSAndroid Build Coastguard Worker            return "bvec3(%s, %s, %s)" % (str(self.x).lower(), str(self.y).lower(), str(self.z).lower())
551*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, int):
552*35238bceSAndroid Build Coastguard Worker            return "ivec3(%i, %i, %i)" % (self.x, self.y, self.z)
553*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, float):
554*35238bceSAndroid Build Coastguard Worker            return "vec3(%s, %s, %s)" % (self.x, self.y, self.z)
555*35238bceSAndroid Build Coastguard Worker        else:
556*35238bceSAndroid Build Coastguard Worker            assert False
557*35238bceSAndroid Build Coastguard Worker
558*35238bceSAndroid Build Coastguard Worker    def distance(self, v):
559*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Vec3)
560*35238bceSAndroid Build Coastguard Worker        return (self - v).length()
561*35238bceSAndroid Build Coastguard Worker
562*35238bceSAndroid Build Coastguard Worker    def dot(self, v):
563*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Vec3)
564*35238bceSAndroid Build Coastguard Worker        return Scalar(self.x*v.x + self.y*v.y + self.z*v.z)
565*35238bceSAndroid Build Coastguard Worker
566*35238bceSAndroid Build Coastguard Worker    def cross(self, v):
567*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Vec3)
568*35238bceSAndroid Build Coastguard Worker        return Vec3(self.y*v.z - v.y*self.z,
569*35238bceSAndroid Build Coastguard Worker                    self.z*v.x - v.z*self.x,
570*35238bceSAndroid Build Coastguard Worker                    self.x*v.y - v.x*self.y)
571*35238bceSAndroid Build Coastguard Worker
572*35238bceSAndroid Build Coastguard Worker    def abs(self):
573*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
574*35238bceSAndroid Build Coastguard Worker            return Vec3(self.x, self.y, self.z)
575*35238bceSAndroid Build Coastguard Worker        else:
576*35238bceSAndroid Build Coastguard Worker            return Vec3(abs(self.x), abs(self.y), abs(self.z))
577*35238bceSAndroid Build Coastguard Worker
578*35238bceSAndroid Build Coastguard Worker    def __neg__(self):
579*35238bceSAndroid Build Coastguard Worker        return Vec3(-self.x, -self.y, -self.z)
580*35238bceSAndroid Build Coastguard Worker
581*35238bceSAndroid Build Coastguard Worker    def __add__(self, val):
582*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
583*35238bceSAndroid Build Coastguard Worker            return Vec3(self.x + val, self.y + val)
584*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec3):
585*35238bceSAndroid Build Coastguard Worker            return Vec3(self.x + val.x, self.y + val.y, self.z + val.z)
586*35238bceSAndroid Build Coastguard Worker        else:
587*35238bceSAndroid Build Coastguard Worker            assert False
588*35238bceSAndroid Build Coastguard Worker
589*35238bceSAndroid Build Coastguard Worker    def __sub__(self, val):
590*35238bceSAndroid Build Coastguard Worker        return self + (-val)
591*35238bceSAndroid Build Coastguard Worker
592*35238bceSAndroid Build Coastguard Worker    def __mul__(self, val):
593*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
594*35238bceSAndroid Build Coastguard Worker            val = val.toVec3()
595*35238bceSAndroid Build Coastguard Worker        assert isinstance(val, Vec3)
596*35238bceSAndroid Build Coastguard Worker        return Vec3(self.x * val.x, self.y * val.y, self.z * val.z)
597*35238bceSAndroid Build Coastguard Worker
598*35238bceSAndroid Build Coastguard Worker    def __div__(self, val):
599*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
600*35238bceSAndroid Build Coastguard Worker            return Vec3(self.x / val.x, self.y / val.x, self.z / val.x)
601*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec3):
602*35238bceSAndroid Build Coastguard Worker            return Vec3(self.x / val.x, self.y / val.y, self.z / val.z)
603*35238bceSAndroid Build Coastguard Worker        else:
604*35238bceSAndroid Build Coastguard Worker            assert False
605*35238bceSAndroid Build Coastguard Worker
606*35238bceSAndroid Build Coastguard Worker    def boolAny(self): return Scalar(self.x or self.y or self.z)
607*35238bceSAndroid Build Coastguard Worker    def boolAll(self): return Scalar(self.x and self.y and self.z)
608*35238bceSAndroid Build Coastguard Worker    def boolNot(self): return Vec3(not self.x, not self.y, not self.z)
609*35238bceSAndroid Build Coastguard Worker
610*35238bceSAndroid Build Coastguard Workerclass UVec3(Vec3):
611*35238bceSAndroid Build Coastguard Worker    def __init__(self, x, y, z):
612*35238bceSAndroid Build Coastguard Worker        assert isinstance(x, int) and isinstance(y, int) and isinstance(z, int)
613*35238bceSAndroid Build Coastguard Worker        assert x >= 0 and y >= 0 and z >= 0
614*35238bceSAndroid Build Coastguard Worker        Vec3.__init__(self, x, y, z)
615*35238bceSAndroid Build Coastguard Worker
616*35238bceSAndroid Build Coastguard Worker    def typeString(self):
617*35238bceSAndroid Build Coastguard Worker        return "uvec3"
618*35238bceSAndroid Build Coastguard Worker
619*35238bceSAndroid Build Coastguard Worker    def __str__(self):
620*35238bceSAndroid Build Coastguard Worker        return "uvec3(%i, %i, %i)" % (self.x, self.y, self.z)
621*35238bceSAndroid Build Coastguard Worker
622*35238bceSAndroid Build Coastguard Worker    def abs(self):
623*35238bceSAndroid Build Coastguard Worker        return Vec3.abs(self).toUint()
624*35238bceSAndroid Build Coastguard Worker
625*35238bceSAndroid Build Coastguard Workerclass Vec4(Vec):
626*35238bceSAndroid Build Coastguard Worker    def __init__(self, x, y, z, w):
627*35238bceSAndroid Build Coastguard Worker        assert((x.__class__ == y.__class__) and (x.__class__ == z.__class__) and (x.__class__ == w.__class__))
628*35238bceSAndroid Build Coastguard Worker        self.x = x
629*35238bceSAndroid Build Coastguard Worker        self.y = y
630*35238bceSAndroid Build Coastguard Worker        self.z = z
631*35238bceSAndroid Build Coastguard Worker        self.w = w
632*35238bceSAndroid Build Coastguard Worker
633*35238bceSAndroid Build Coastguard Worker    def applyUnary(self, func): return Vec4(func(self.x), func(self.y), func(self.z), func(self.w))
634*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))
635*35238bceSAndroid Build Coastguard Worker
636*35238bceSAndroid Build Coastguard Worker    def expandVec(self, val): return val.toVec4()
637*35238bceSAndroid Build Coastguard Worker    def toScalar(self): return Scalar(self.x)
638*35238bceSAndroid Build Coastguard Worker    def toVec2(self): return Vec2(self.x, self.y)
639*35238bceSAndroid Build Coastguard Worker    def toVec3(self): return Vec3(self.x, self.y, self.z)
640*35238bceSAndroid Build Coastguard Worker    def toVec4(self): return Vec4(self.x, self.y, self.z, self.w)
641*35238bceSAndroid Build Coastguard Worker    def toUVec2(self): return UVec2(self.x, self.y)
642*35238bceSAndroid Build Coastguard Worker    def toUVec3(self): return UVec3(self.x, self.y, self.z)
643*35238bceSAndroid Build Coastguard Worker    def toUVec4(self): return UVec4(self.x, self.y, self.z, self.w)
644*35238bceSAndroid Build Coastguard Worker    def toMat2(self): return Mat2(float(self.x), float(self.y), float(self.z), float(self.w))
645*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));
646*35238bceSAndroid Build Coastguard Worker
647*35238bceSAndroid Build Coastguard Worker    def toFloat(self): return Vec4(float(self.x), float(self.y), float(self.z), float(self.w))
648*35238bceSAndroid Build Coastguard Worker    def toInt(self): return Vec4(int(self.x), int(self.y), int(self.z), int(self.w))
649*35238bceSAndroid Build Coastguard Worker    def toUint(self): return UVec4(int(self.x), int(self.y), int(self.z), int(self.w))
650*35238bceSAndroid Build Coastguard Worker    def toBool(self): return Vec4(bool(self.x), bool(self.y), bool(self.z), bool(self.w))
651*35238bceSAndroid Build Coastguard Worker
652*35238bceSAndroid Build Coastguard Worker    def getNumScalars(self): return 4
653*35238bceSAndroid Build Coastguard Worker    def getScalars(self): return [self.x, self.y, self.z, self.w]
654*35238bceSAndroid Build Coastguard Worker
655*35238bceSAndroid Build Coastguard Worker    def typeString(self):
656*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
657*35238bceSAndroid Build Coastguard Worker            return "bvec4"
658*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, int):
659*35238bceSAndroid Build Coastguard Worker            return "ivec4"
660*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, float):
661*35238bceSAndroid Build Coastguard Worker            return "vec4"
662*35238bceSAndroid Build Coastguard Worker        else:
663*35238bceSAndroid Build Coastguard Worker            assert False
664*35238bceSAndroid Build Coastguard Worker
665*35238bceSAndroid Build Coastguard Worker    def vec4Swizzle(self):
666*35238bceSAndroid Build Coastguard Worker        return ""
667*35238bceSAndroid Build Coastguard Worker
668*35238bceSAndroid Build Coastguard Worker    def __str__(self):
669*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
670*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())
671*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, int):
672*35238bceSAndroid Build Coastguard Worker            return "ivec4(%i, %i, %i, %i)" % (self.x, self.y, self.z, self.w)
673*35238bceSAndroid Build Coastguard Worker        elif isinstance(self.x, float):
674*35238bceSAndroid Build Coastguard Worker            return "vec4(%s, %s, %s, %s)" % (self.x, self.y, self.z, self.w)
675*35238bceSAndroid Build Coastguard Worker        else:
676*35238bceSAndroid Build Coastguard Worker            assert False
677*35238bceSAndroid Build Coastguard Worker
678*35238bceSAndroid Build Coastguard Worker    def distance(self, v):
679*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Vec4)
680*35238bceSAndroid Build Coastguard Worker        return (self - v).length()
681*35238bceSAndroid Build Coastguard Worker
682*35238bceSAndroid Build Coastguard Worker    def dot(self, v):
683*35238bceSAndroid Build Coastguard Worker        assert isinstance(v, Vec4)
684*35238bceSAndroid Build Coastguard Worker        return Scalar(self.x*v.x + self.y*v.y + self.z*v.z + self.w*v.w)
685*35238bceSAndroid Build Coastguard Worker
686*35238bceSAndroid Build Coastguard Worker    def abs(self):
687*35238bceSAndroid Build Coastguard Worker        if isinstance(self.x, bool):
688*35238bceSAndroid Build Coastguard Worker            return Vec4(self.x, self.y, self.z, self.w)
689*35238bceSAndroid Build Coastguard Worker        else:
690*35238bceSAndroid Build Coastguard Worker            return Vec4(abs(self.x), abs(self.y), abs(self.z), abs(self.w))
691*35238bceSAndroid Build Coastguard Worker
692*35238bceSAndroid Build Coastguard Worker    def __neg__(self):
693*35238bceSAndroid Build Coastguard Worker        return Vec4(-self.x, -self.y, -self.z, -self.w)
694*35238bceSAndroid Build Coastguard Worker
695*35238bceSAndroid Build Coastguard Worker    def __add__(self, val):
696*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
697*35238bceSAndroid Build Coastguard Worker            return Vec3(self.x + val, self.y + val)
698*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec4):
699*35238bceSAndroid Build Coastguard Worker            return Vec4(self.x + val.x, self.y + val.y, self.z + val.z, self.w + val.w)
700*35238bceSAndroid Build Coastguard Worker        else:
701*35238bceSAndroid Build Coastguard Worker            assert False
702*35238bceSAndroid Build Coastguard Worker
703*35238bceSAndroid Build Coastguard Worker    def __sub__(self, val):
704*35238bceSAndroid Build Coastguard Worker        return self + (-val)
705*35238bceSAndroid Build Coastguard Worker
706*35238bceSAndroid Build Coastguard Worker    def __mul__(self, val):
707*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
708*35238bceSAndroid Build Coastguard Worker            val = val.toVec4()
709*35238bceSAndroid Build Coastguard Worker        assert isinstance(val, Vec4)
710*35238bceSAndroid Build Coastguard Worker        return Vec4(self.x * val.x, self.y * val.y, self.z * val.z, self.w * val.w)
711*35238bceSAndroid Build Coastguard Worker
712*35238bceSAndroid Build Coastguard Worker    def __div__(self, val):
713*35238bceSAndroid Build Coastguard Worker        if isinstance(val, Scalar):
714*35238bceSAndroid Build Coastguard Worker            return Vec4(self.x / val.x, self.y / val.x, self.z / val.x, self.w / val.x)
715*35238bceSAndroid Build Coastguard Worker        elif isinstance(val, Vec4):
716*35238bceSAndroid Build Coastguard Worker            return Vec4(self.x / val.x, self.y / val.y, self.z / val.z, self.w / val.w)
717*35238bceSAndroid Build Coastguard Worker        else:
718*35238bceSAndroid Build Coastguard Worker            assert False
719*35238bceSAndroid Build Coastguard Worker
720*35238bceSAndroid Build Coastguard Worker    def boolAny(self): return Scalar(self.x or self.y or self.z or self.w)
721*35238bceSAndroid Build Coastguard Worker    def boolAll(self): return Scalar(self.x and self.y and self.z and self.w)
722*35238bceSAndroid Build Coastguard Worker    def boolNot(self): return Vec4(not self.x, not self.y, not self.z, not self.w)
723*35238bceSAndroid Build Coastguard Worker
724*35238bceSAndroid Build Coastguard Workerclass UVec4(Vec4):
725*35238bceSAndroid Build Coastguard Worker    def __init__(self, x, y, z, w):
726*35238bceSAndroid Build Coastguard Worker        assert isinstance(x, int) and isinstance(y, int) and isinstance(z, int) and isinstance(w, int)
727*35238bceSAndroid Build Coastguard Worker        assert x >= 0 and y >= 0 and z >= 0 and w >= 0
728*35238bceSAndroid Build Coastguard Worker        Vec4.__init__(self, x, y, z, w)
729*35238bceSAndroid Build Coastguard Worker
730*35238bceSAndroid Build Coastguard Worker    def typeString(self):
731*35238bceSAndroid Build Coastguard Worker        return "uvec4"
732*35238bceSAndroid Build Coastguard Worker
733*35238bceSAndroid Build Coastguard Worker    def __str__(self):
734*35238bceSAndroid Build Coastguard Worker        return "uvec4(%i, %i, %i, %i)" % (self.x, self.y, self.z, self.w)
735*35238bceSAndroid Build Coastguard Worker
736*35238bceSAndroid Build Coastguard Worker    def abs(self):
737*35238bceSAndroid Build Coastguard Worker        return Vec4.abs(self).toUint()
738*35238bceSAndroid Build Coastguard Worker
739*35238bceSAndroid Build Coastguard Worker# \note Column-major storage.
740*35238bceSAndroid Build Coastguard Workerclass Mat(object):
741*35238bceSAndroid Build Coastguard Worker    def __init__ (self, numCols, numRows, scalars):
742*35238bceSAndroid Build Coastguard Worker        assert len(scalars) == numRows*numCols
743*35238bceSAndroid Build Coastguard Worker        self.numCols = numCols
744*35238bceSAndroid Build Coastguard Worker        self.numRows = numRows
745*35238bceSAndroid Build Coastguard Worker        self.scalars = scalars
746*35238bceSAndroid Build Coastguard Worker
747*35238bceSAndroid Build Coastguard Worker    @staticmethod
748*35238bceSAndroid Build Coastguard Worker    def fromScalar (numCols, numRows, scalar):
749*35238bceSAndroid Build Coastguard Worker        scalars = []
750*35238bceSAndroid Build Coastguard Worker        for col in range(0, numCols):
751*35238bceSAndroid Build Coastguard Worker            for row in range(0, numRows):
752*35238bceSAndroid Build Coastguard Worker                scalars.append(scalar if col == row else 0.0)
753*35238bceSAndroid Build Coastguard Worker        return Mat(numCols, numRows, scalars)
754*35238bceSAndroid Build Coastguard Worker
755*35238bceSAndroid Build Coastguard Worker    @staticmethod
756*35238bceSAndroid Build Coastguard Worker    def identity (numCols, numRows):
757*35238bceSAndroid Build Coastguard Worker        return Mat.fromScalar(numCols, numRows, 1.0)
758*35238bceSAndroid Build Coastguard Worker
759*35238bceSAndroid Build Coastguard Worker    def get (self, colNdx, rowNdx):
760*35238bceSAndroid Build Coastguard Worker        assert 0 <= colNdx and colNdx < self.numCols
761*35238bceSAndroid Build Coastguard Worker        assert 0 <= rowNdx and rowNdx < self.numRows
762*35238bceSAndroid Build Coastguard Worker        return self.scalars[colNdx*self.numRows + rowNdx]
763*35238bceSAndroid Build Coastguard Worker
764*35238bceSAndroid Build Coastguard Worker    def set (self, colNdx, rowNdx, scalar):
765*35238bceSAndroid Build Coastguard Worker        assert 0 <= colNdx and colNdx < self.numCols
766*35238bceSAndroid Build Coastguard Worker        assert 0 <= rowNdx and rowNdx < self.numRows
767*35238bceSAndroid Build Coastguard Worker        self.scalars[colNdx*self.numRows + rowNdx] = scalar
768*35238bceSAndroid Build Coastguard Worker
769*35238bceSAndroid Build Coastguard Worker    def toMatrix (self, numCols, numRows):
770*35238bceSAndroid Build Coastguard Worker        res = Mat.identity(numCols, numRows)
771*35238bceSAndroid Build Coastguard Worker        for col in range(0, min(self.numCols, numCols)):
772*35238bceSAndroid Build Coastguard Worker            for row in range(0, min(self.numRows, numRows)):
773*35238bceSAndroid Build Coastguard Worker                res.set(col, row, self.get(col, row))
774*35238bceSAndroid Build Coastguard Worker        return res
775*35238bceSAndroid Build Coastguard Worker
776*35238bceSAndroid Build Coastguard Worker    def toMat2 (self): return self.toMatrix(2, 2)
777*35238bceSAndroid Build Coastguard Worker    def toMat2x3 (self): return self.toMatrix(2, 3)
778*35238bceSAndroid Build Coastguard Worker    def toMat2x4 (self): return self.toMatrix(2, 4)
779*35238bceSAndroid Build Coastguard Worker    def toMat3x2 (self): return self.toMatrix(3, 2)
780*35238bceSAndroid Build Coastguard Worker    def toMat3 (self): return self.toMatrix(3, 3)
781*35238bceSAndroid Build Coastguard Worker    def toMat3x4 (self): return self.toMatrix(3, 4)
782*35238bceSAndroid Build Coastguard Worker    def toMat4x2 (self): return self.toMatrix(4, 2)
783*35238bceSAndroid Build Coastguard Worker    def toMat4x3 (self): return self.toMatrix(4, 3)
784*35238bceSAndroid Build Coastguard Worker    def toMat4 (self): return self.toMatrix(4, 4)
785*35238bceSAndroid Build Coastguard Worker
786*35238bceSAndroid Build Coastguard Worker    def typeString(self):
787*35238bceSAndroid Build Coastguard Worker        if self.numRows == self.numCols:
788*35238bceSAndroid Build Coastguard Worker            return "mat%d" % self.numRows
789*35238bceSAndroid Build Coastguard Worker        else:
790*35238bceSAndroid Build Coastguard Worker            return "mat%dx%d" % (self.numCols, self.numRows)
791*35238bceSAndroid Build Coastguard Worker
792*35238bceSAndroid Build Coastguard Worker    def __str__(self):
793*35238bceSAndroid Build Coastguard Worker        return "%s(%s)" % (self.typeString(), ", ".join(["%s" % s for s in self.scalars]))
794*35238bceSAndroid Build Coastguard Worker
795*35238bceSAndroid Build Coastguard Worker    def isTypeEqual (self, other):
796*35238bceSAndroid Build Coastguard Worker        return isinstance(other, Mat) and self.numRows == other.numRows and self.numCols == other.numCols
797*35238bceSAndroid Build Coastguard Worker
798*35238bceSAndroid Build Coastguard Worker    def isEqual(self, other):
799*35238bceSAndroid Build Coastguard Worker        assert self.isTypeEqual(other)
800*35238bceSAndroid Build Coastguard Worker        return (self.scalars == other.scalars)
801*35238bceSAndroid Build Coastguard Worker
802*35238bceSAndroid Build Coastguard Worker    def compMul(self, val):
803*35238bceSAndroid Build Coastguard Worker        assert self.isTypeEqual(val)
804*35238bceSAndroid Build Coastguard Worker        return Mat(self.numRows, self.numCols, [self.scalars(i) * val.scalars(i) for i in range(self.numRows*self.numCols)])
805*35238bceSAndroid Build Coastguard Worker
806*35238bceSAndroid Build Coastguard Workerclass Mat2(Mat):
807*35238bceSAndroid Build Coastguard Worker    def __init__(self, m00, m01, m10, m11):
808*35238bceSAndroid Build Coastguard Worker        Mat.__init__(self, 2, 2, [m00, m10, m01, m11])
809*35238bceSAndroid Build Coastguard Worker
810*35238bceSAndroid Build Coastguard Workerclass Mat3(Mat):
811*35238bceSAndroid Build Coastguard Worker    def __init__(self, m00, m01, m02, m10, m11, m12, m20, m21, m22):
812*35238bceSAndroid Build Coastguard Worker        Mat.__init__(self, 3, 3, [m00, m10, m20,
813*35238bceSAndroid Build Coastguard Worker                                  m01, m11, m21,
814*35238bceSAndroid Build Coastguard Worker                                  m02, m12, m22])
815*35238bceSAndroid Build Coastguard Worker
816*35238bceSAndroid Build Coastguard Workerclass Mat4(Mat):
817*35238bceSAndroid Build Coastguard Worker    def __init__(self, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33):
818*35238bceSAndroid Build Coastguard Worker        Mat.__init__(self, 4, 4, [m00, m10, m20, m30,
819*35238bceSAndroid Build Coastguard Worker                                  m01, m11, m21, m31,
820*35238bceSAndroid Build Coastguard Worker                                  m02, m12, m22, m32,
821*35238bceSAndroid Build Coastguard Worker                                  m03, m13, m23, m33])
822