Home | History | Annotate | Download | only in Renderer
      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 #ifndef Vector_hpp
     16 #define Vector_hpp
     17 
     18 namespace sw
     19 {
     20 	struct Point;
     21 	struct Matrix;
     22 	struct Plane;
     23 
     24 	struct Vector
     25 	{
     26 		Vector();
     27 		Vector(const int i);
     28 		Vector(const Vector &v);
     29 		Vector(const Point &p);
     30 		Vector(float v_x, float v_y, float v_z);
     31 
     32 		Vector &operator=(const Vector &v);
     33 
     34 		union
     35 		{
     36 			float v[3];
     37 
     38 			struct
     39 			{
     40 				float x;
     41 				float y;
     42 				float z;
     43 			};
     44 		};
     45 
     46 		float &operator[](int i);
     47 		float &operator()(int i);
     48 
     49 		const float &operator[](int i) const;
     50 		const float &operator()(int i) const;
     51 
     52 		Vector operator+() const;
     53 		Vector operator-() const;
     54 
     55 		Vector &operator+=(const Vector &v);
     56 		Vector &operator-=(const Vector &v);
     57 		Vector &operator*=(float s);
     58 		Vector &operator/=(float s);
     59 
     60 		friend bool operator==(const Vector &u, const Vector &v);
     61 		friend bool operator!=(const Vector &u, const Vector &v);
     62 
     63 		friend Vector operator+(const Vector &u, const Vector &v);
     64 		friend Vector operator-(const Vector &u, const Vector &v);
     65 		friend float operator*(const Vector &u, const Vector &v);   // Dot product
     66 		friend Vector operator*(float s, const Vector &v);
     67 		friend Vector operator*(const Vector &v, float s);
     68 		friend Vector operator/(const Vector &v, float s);
     69 		friend float operator^(const Vector &u, const Vector &v);   // Angle between vectors
     70 		friend Vector operator%(const Vector &u, const Vector &v);   // Cross product
     71 
     72 		friend Vector operator*(const Matrix &M, const Vector& v);
     73 		friend Vector operator*(const Vector &v, const Matrix &M);
     74 		friend Vector &operator*=(Vector &v, const Matrix &M);
     75 
     76 		static float N(const Vector &v);   // Norm
     77 		static float N2(const Vector &v);   // Squared norm
     78 
     79 		static Vector mirror(const Vector &v, const Plane &p);
     80 		static Vector reflect(const Vector &v, const Plane &p);
     81 		static Vector lerp(const Vector &u, const Vector &v, float t);
     82 	};
     83 }
     84 
     85 #include "Point.hpp"
     86 
     87 namespace sw
     88 {
     89 	inline Vector::Vector()
     90 	{
     91 	}
     92 
     93 	inline Vector::Vector(const int i)
     94 	{
     95 		const float s = (float)i;
     96 
     97 		x = s;
     98 		y = s;
     99 		z = s;
    100 	}
    101 
    102 	inline Vector::Vector(const Vector &v)
    103 	{
    104 		x = v.x;
    105 		y = v.y;
    106 		z = v.z;
    107 	}
    108 
    109 	inline Vector::Vector(const Point &P)
    110 	{
    111 		x = P.x;
    112 		y = P.y;
    113 		z = P.z;
    114 	}
    115 
    116 	inline Vector::Vector(float v_x, float v_y, float v_z)
    117 	{
    118 		x = v_x;
    119 		y = v_y;
    120 		z = v_z;
    121 	}
    122 
    123 	inline Vector &Vector::operator=(const Vector &v)
    124 	{
    125 		x = v.x;
    126 		y = v.y;
    127 		z = v.z;
    128 
    129 		return *this;
    130 	}
    131 
    132 	inline float &Vector::operator()(int i)
    133 	{
    134 		return v[i];
    135 	}
    136 
    137 	inline float &Vector::operator[](int i)
    138 	{
    139 		return v[i];
    140 	}
    141 
    142 	inline const float &Vector::operator()(int i) const
    143 	{
    144 		return v[i];
    145 	}
    146 
    147 	inline const float &Vector::operator[](int i) const
    148 	{
    149 		return v[i];
    150 	}
    151 }
    152 
    153 #endif   // Vector_hpp
    154