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