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 Point_hpp
16 #define Point_hpp
17 
18 namespace sw
19 {
20 	struct Vector;
21 	struct Matrix;
22 
23 	struct Point
24 	{
25 		Point();
26 		Point(const int i);
27 		Point(const Point &P);
28 		Point(const Vector &v);
29 		Point(float Px, float Py, float Pz);
30 
31 		Point &operator=(const Point &P);
32 
33 		union
34 		{
35 			float p[3];
36 
37 			struct
38 			{
39 				float x;
40 				float y;
41 				float z;
42 			};
43 		};
44 
45 		float &operator[](int i);
46 		float &operator()(int i);
47 
48 		const float &operator[](int i) const;
49 		const float &operator()(int i) const;
50 
51 		Point &operator+=(const Vector &v);
52 		Point &operator-=(const Vector &v);
53 
54 		friend Point operator+(const Point &P, const Vector &v);
55 		friend Point operator-(const Point &P, const Vector &v);
56 
57 		friend Vector operator-(const Point &P, const Point &Q);
58 
59 		friend Point operator*(const Matrix &M, const Point& P);
60 		friend Point operator*(const Point &P, const Matrix &M);
61 		friend Point &operator*=(Point &P, const Matrix &M);
62 
63 		float d(const Point &P) const;   // Distance between two points
64 		float d2(const Point &P) const;   // Squared distance between two points
65 
66 		static float d(const Point &P, const Point &Q);   // Distance between two points
67 		static float d2(const Point &P, const Point &Q);   // Squared distance between two points
68 	};
69 }
70 
71 #include "Vector.hpp"
72 
73 namespace sw
74 {
Point()75 	inline Point::Point()
76 	{
77 	}
78 
Point(const int i)79 	inline Point::Point(const int i)
80 	{
81 		const float s = (float)i;
82 
83 		x = s;
84 		y = s;
85 		z = s;
86 	}
87 
Point(const Point & P)88 	inline Point::Point(const Point &P)
89 	{
90 		x = P.x;
91 		y = P.y;
92 		z = P.z;
93 	}
94 
Point(const Vector & v)95 	inline Point::Point(const Vector &v)
96 	{
97 		x = v.x;
98 		y = v.y;
99 		z = v.z;
100 	}
101 
Point(float P_x,float P_y,float P_z)102 	inline Point::Point(float P_x, float P_y, float P_z)
103 	{
104 		x = P_x;
105 		y = P_y;
106 		z = P_z;
107 	}
108 
operator =(const Point & P)109 	inline Point &Point::operator=(const Point &P)
110 	{
111 		x = P.x;
112 		y = P.y;
113 		z = P.z;
114 
115 		return *this;
116 	}
117 
operator ()(int i)118 	inline float &Point::operator()(int i)
119 	{
120 		return p[i];
121 	}
122 
operator [](int i)123 	inline float &Point::operator[](int i)
124 	{
125 		return p[i];
126 	}
127 
operator ()(int i) const128 	inline const float &Point::operator()(int i) const
129 	{
130 		return p[i];
131 	}
132 
operator [](int i) const133 	inline const float &Point::operator[](int i) const
134 	{
135 		return p[i];
136 	}
137 }
138 
139 #endif   // Point_hpp
140