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