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 | |