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
18namespace 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
87namespace 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