1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "Vector.hpp" 16 17 #include "Matrix.hpp" 18 #include "Common/Math.hpp" 19 20 namespace sw 21 { operator +() const22 Vector Vector::operator+() const 23 { 24 return *this; 25 } 26 operator -() const27 Vector Vector::operator-() const 28 { 29 return Vector(-x, -y, -z); 30 } 31 operator +=(const Vector & v)32 Vector &Vector::operator+=(const Vector &v) 33 { 34 x += v.x; 35 y += v.y; 36 z += v.z; 37 38 return *this; 39 } 40 operator -=(const Vector & v)41 Vector &Vector::operator-=(const Vector &v) 42 { 43 x -= v.x; 44 y -= v.y; 45 z -= v.z; 46 47 return *this; 48 } 49 operator *=(float s)50 Vector &Vector::operator*=(float s) 51 { 52 x *= s; 53 y *= s; 54 z *= s; 55 56 return *this; 57 } 58 operator /=(float s)59 Vector &Vector::operator/=(float s) 60 { 61 float r = 1.0f / s; 62 63 return *this *= r; 64 } 65 operator ==(const Vector & U,const Vector & v)66 bool operator==(const Vector &U, const Vector &v) 67 { 68 if(U.x == v.x && U.y == v.y && U.z == v.z) 69 return true; 70 else 71 return false; 72 } 73 operator !=(const Vector & U,const Vector & v)74 bool operator!=(const Vector &U, const Vector &v) 75 { 76 if(U.x != v.x || U.y != v.y || U.z != v.z) 77 return true; 78 else 79 return false; 80 } 81 operator >(const Vector & u,const Vector & v)82 bool operator>(const Vector &u, const Vector &v) 83 { 84 if((u^2) > (v^2)) 85 return true; 86 else 87 return false; 88 } 89 operator <(const Vector & u,const Vector & v)90 bool operator<(const Vector &u, const Vector &v) 91 { 92 if((u^2) < (v^2)) 93 return true; 94 else 95 return false; 96 } 97 operator +(const Vector & u,const Vector & v)98 Vector operator+(const Vector &u, const Vector &v) 99 { 100 return Vector(u.x + v.x, u.y + v.y, u.z + v.z); 101 } 102 operator -(const Vector & u,const Vector & v)103 Vector operator-(const Vector &u, const Vector &v) 104 { 105 return Vector(u.x - v.x, u.y - v.y, u.z - v.z); 106 } 107 operator *(const Vector & u,const Vector & v)108 float operator*(const Vector &u, const Vector &v) 109 { 110 return u.x * v.x + u.y * v.y + u.z * v.z; 111 } 112 operator *(float s,const Vector & v)113 Vector operator*(float s, const Vector &v) 114 { 115 return Vector(s * v.x, s * v.y, s * v.z); 116 } 117 operator *(const Vector & v,float s)118 Vector operator*(const Vector &v, float s) 119 { 120 return Vector(v.x * s, v.y * s, v.z * s); 121 } 122 operator /(const Vector & v,float s)123 Vector operator/(const Vector &v, float s) 124 { 125 float r = 1.0f / s; 126 127 return Vector(v.x * r, v.y * r, v.z * r); 128 } 129 operator ^(const Vector & u,const Vector & v)130 float operator^(const Vector &u, const Vector &v) 131 { 132 return acos(u / Vector::N(u) * v / Vector::N(v)); 133 } 134 operator %(const Vector & u,const Vector & v)135 Vector operator%(const Vector &u, const Vector &v) 136 { 137 return Vector(u.y * v.z - u.z * v.y, u.z * v.x - u.x * v.z, u.x * v.y - u.y * v.x); 138 } 139 operator *(const Matrix & M,const Vector & v)140 Vector operator*(const Matrix &M, const Vector &v) 141 { 142 return Vector(M(1, 1) * v.x + M(1, 2) * v.y + M(1, 3) * v.z, 143 M(2, 1) * v.x + M(2, 2) * v.y + M(2, 3) * v.z, 144 M(3, 1) * v.x + M(3, 2) * v.y + M(3, 3) * v.z); 145 } 146 operator *(const Vector & v,const Matrix & M)147 Vector operator*(const Vector &v, const Matrix &M) 148 { 149 return Vector(v.x * M(1, 1) + v.y * M(2, 1) + v.z * M(3, 1) + M(4, 1), 150 v.x * M(1, 2) + v.y * M(2, 2) + v.z * M(3, 2) + M(4, 2), 151 v.x * M(1, 3) + v.y * M(2, 3) + v.z * M(3, 3) + M(4, 3)); 152 } 153 operator *=(Vector & v,const Matrix & M)154 Vector &operator*=(Vector &v, const Matrix &M) 155 { 156 return v = v * M; 157 } 158 N(const Vector & v)159 float Vector::N(const Vector &v) 160 { 161 return sqrt(v.x*v.x + v.y*v.y + v.z*v.z); 162 } 163 N2(const Vector & v)164 float Vector::N2(const Vector &v) 165 { 166 return v.x*v.x + v.y*v.y + v.z*v.z; 167 } 168 lerp(const Vector & u,const Vector & v,float t)169 Vector lerp(const Vector &u, const Vector &v, float t) 170 { 171 return Vector(u.x + t * (v.x - u.x), 172 u.y + t * (v.y - u.y), 173 u.z + t * (v.z - u.z)); 174 } 175 } 176