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
18namespace 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
73namespace sw
74{
75 inline Point::Point()
76 {
77 }
78
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
88 inline Point::Point(const Point &P)
89 {
90 x = P.x;
91 y = P.y;
92 z = P.z;
93 }
94
95 inline Point::Point(const Vector &v)
96 {
97 x = v.x;
98 y = v.y;
99 z = v.z;
100 }
101
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
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
118 inline float &Point::operator()(int i)
119 {
120 return p[i];
121 }
122
123 inline float &Point::operator[](int i)
124 {
125 return p[i];
126 }
127
128 inline const float &Point::operator()(int i) const
129 {
130 return p[i];
131 }
132
133 inline const float &Point::operator[](int i) const
134 {
135 return p[i];
136 }
137}
138
139#endif // Point_hpp
140