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