Nebula
Loading...
Searching...
No Matches
plane.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
12//------------------------------------------------------------------------------
13#include "math/point.h"
14#include "math/vector.h"
15#include "math/line.h"
16#include "math/mat4.h"
17#include "scalar.h"
18#include "clipstatus.h"
19
20namespace Math
21{
22struct plane
23{
24
26 plane() = default;
30 plane(const point& p, const vector& n);
32 plane(const point& p0, const point& p1, const point& p2);
34 plane(const __m128 & rhs);
35
37 bool intersect(line const& line, point& outIntersectPoint);
39 vector get_normal() const;
40
42 void set(scalar a, scalar b, scalar c, scalar d);
43
44 union
45 {
46 __m128 vec;
47 struct
48 {
49 float a, b, c, d;
50 };
51 struct
52 {
54 float distance;
55 };
56 };
57};
58
59//------------------------------------------------------------------------------
62__forceinline
64{
65 this->vec = _mm_setr_ps(a, b, c, d);
66}
67
68//------------------------------------------------------------------------------
71__forceinline
72plane::plane(const point& p, const vector& n)
73{
74 float d = dot(p, n);
75 this->vec = _mm_setr_ps(n.x, n.y, n.z, d);
76}
77
78//------------------------------------------------------------------------------
81__forceinline
82plane::plane(const point& p0, const point& p1, const point& p2)
83{
84 vector v21 = p0 - p1;
85 vector v31 = p0 - p2;
86
87 vector cr = cross(v21, v31);
88 cr = normalize(cr);
89 float d = dot(cr, p0);
90
91 this->vec = _mm_setr_ps(cr.x, cr.y, cr.z, d);
92}
93
94//------------------------------------------------------------------------------
97__forceinline
98plane::plane(const __m128& rhs)
99{
100 this->vec = rhs;
101}
102
103//------------------------------------------------------------------------------
106__forceinline bool
107plane::intersect(line const& line, point& outIntersectPoint)
108{
109 Math::vector dv = line.m;
110 Math::vector n = this->get_normal();
111 float d = (this->d - Math::dot(n, line.b)) / Math::dot(n, dv);
112
113 if (d >= 0.0f && d <= 1.0f)
114 {
115 outIntersectPoint = line.b + d * dv;
116 return true;
117 }
118
119 return false;
120}
121
122//------------------------------------------------------------------------------
125__forceinline vector
127{
128 vector res;
129 res.vec = _mm_and_ps(this->vec, _mask_xyz);
130 return res;
131}
132
133//------------------------------------------------------------------------------
136__forceinline
138{
139 this->vec = _mm_setr_ps(a, b, c, d);
140}
141
142//------------------------------------------------------------------------------
145inline vector
147{
148 vector res;
149 res.vec = _mm_and_ps(plane.vec, _mask_xyz);
150 return res;
151}
152
153//------------------------------------------------------------------------------
156inline point
158{
159 return _mm_mul_ps(get_normal(plane).vec, _mm_set1_ps(plane.d));
160}
161
162//------------------------------------------------------------------------------
165inline bool
166intersectline(const plane& plane, const point& startPoint, const point& endPoint, point& outIntersectPoint)
167{
168 Math::vector dv = endPoint - startPoint;
170 float d = (plane.d - Math::dot(n, startPoint)) / Math::dot(n, dv);
171
172 if (d >= 0.0f && d <= 1.0f)
173 {
174 outIntersectPoint = startPoint + d * dv;
175 return true;
176 }
177
178 return false;
179}
180
181//------------------------------------------------------------------------------
185inline bool
186intersectplane(const plane& p1, const plane& p2, line& outLine)
187{
188 vector n0 = get_normal(p1);
189 vector n1 = get_normal(p2);
190 float n00 = dot(n0, n0);
191 float n01 = dot(n0, n1);
192 float n11 = dot(n1, n1);
193 float det = n00 * n11 - n01 * n01;
194 const float tol = N_TINY;
195 if (fabs(det) < tol)
196 {
197 return false;
198 }
199 else
200 {
201 float inv_det = 1.0f / det;
202 float c0 = (n11 * p1.d - n01 * p2.d) * inv_det;
203 float c1 = (n00 * p2.d - n01 * p1.d) * inv_det;
204 outLine.m = cross(n0, n1);
205 outLine.b = vec4(n0 * c0 + n1 * c1, 1);
206 return true;
207 }
208}
209
210//------------------------------------------------------------------------------
213inline ClipStatus::Type
214clip(const plane& plane, const line& l, line& outClippedLine)
215{
216 n_assert(&l != &outClippedLine);
217 float d0 = dot(get_normal(plane), l.start());
218 float d1 = dot(get_normal(plane), l.end());
219 if ((d0 >= N_TINY) && (d1 >= N_TINY))
220 {
221 // start and end point above plane
222 outClippedLine = l;
223 return ClipStatus::Inside;
224 }
225 else if ((d0 < N_TINY) && (d1 < N_TINY))
226 {
227 // start and end point below plane
228 return ClipStatus::Outside;
229 }
230 else
231 {
232 // line is clipped
233 point clipPoint;
234 intersectline(plane, l.start(), l.end(), clipPoint);
235 if (d0 >= N_TINY)
236 {
237 outClippedLine.set(l.start(), clipPoint);
238 }
239 else
240 {
241 outClippedLine.set(clipPoint, l.end());
242 }
243 return ClipStatus::Clipped;
244 }
245}
246
247
248//------------------------------------------------------------------------------
251__forceinline scalar
252dot(const plane& p, const vec4& v1)
253{
254 return _mm_cvtss_f32(_mm_dp_ps(p.vec, v1.vec, 0xF1));
255}
256
257//------------------------------------------------------------------------------
260__forceinline plane
262{
263 vec4 f(p.vec);
264 scalar len = length3(f);
265 if (len < N_TINY)
266 {
267 return p;
268 }
269 f *= 1.0f / len;
270 plane ret;
271 ret.vec = f.vec;
272 return ret;
273}
274
275
276//------------------------------------------------------------------------------
279__forceinline plane
280operator*(const mat4& m, const plane& p)
281{
282 __m128 x = _mm_shuffle_ps(p.vec, p.vec, _MM_SHUFFLE(0, 0, 0, 0));
283 __m128 y = _mm_shuffle_ps(p.vec, p.vec, _MM_SHUFFLE(1, 1, 1, 1));
284 __m128 z = _mm_shuffle_ps(p.vec, p.vec, _MM_SHUFFLE(2, 2, 2, 2));
285 __m128 w = _mm_shuffle_ps(p.vec, p.vec, _MM_SHUFFLE(3, 3, 3, 3));
286
287 return _mm_add_ps(
288 _mm_add_ps(_mm_mul_ps(x, m.r[0].vec), _mm_mul_ps(y, m.r[1].vec)),
289 _mm_add_ps(_mm_mul_ps(z, m.r[2].vec), _mm_mul_ps(w, m.r[3].vec))
290 );
291}
292
293} // namespace Math
Type
Definition clipstatus.h:22
@ Outside
Definition clipstatus.h:24
@ Inside
Definition clipstatus.h:23
@ Clipped
Definition clipstatus.h:25
A line in 3d space.
Definition line.h:22
point end() const
get end point
Definition line.h:123
void set(const point &startPoint, const point &endPoint)
set start and end point
Definition line.h:94
point b
Definition line.h:55
const point & start() const
get start point
Definition line.h:114
vector m
Definition line.h:56
#define n_assert(exp)
Definition debug.h:50
Different curves.
Definition angularpfeedbackloop.h:17
__forceinline vec3 cross(const vec3 &v0, const vec3 &v1)
Definition vec3.h:441
point get_point(const plane &plane)
Definition plane.h:157
__forceinline scalar length3(const vec4 &v)
Definition vec4.h:397
bool intersectline(const plane &plane, const point &startPoint, const point &endPoint, point &outIntersectPoint)
Definition plane.h:166
__forceinline scalar dot(const plane &p, const vec4 &v1)
Definition plane.h:252
__forceinline plane normalize(const plane &p)
Definition plane.h:261
ClipStatus::Type clip(const plane &plane, const line &l, line &outClippedLine)
Definition plane.h:214
float scalar
Definition scalar.h:45
half operator*(half one, half two)
Definition half.h:123
bool intersectplane(const plane &p1, const plane &p2, line &outLine)
TODO: Test and make sure it produces correct intersection line.
Definition plane.h:186
static const __m128 _mask_xyz
Definition vec3.h:37
vector get_normal(const plane &plane)
Definition plane.h:146
Nebula's scalar datatype.
#define N_TINY
Definition scalar.h:43
Definition scalar.h:67
A 4x4 single point precision float matrix.
Definition mat4.h:49
vec4 r[4]
as a two-dimensional array
Definition mat4.h:137
A mathematical plane represented by a normal and a distance from origin.
Definition plane.h:23
float a
Definition plane.h:49
plane()=default
default constructor, NOTE: does NOT setup components!
vector get_normal() const
get normal from plane
Definition plane.h:126
void set(scalar a, scalar b, scalar c, scalar d)
set content
Definition plane.h:137
float d
Definition plane.h:49
float c
Definition plane.h:49
__m128 vec
Definition plane.h:46
float b
Definition plane.h:49
float distance
Definition plane.h:54
bool intersect(line const &line, point &outIntersectPoint)
check intersection against line
Definition plane.h:107
Math::float3 normal
Definition plane.h:53
Represents a 3D point in space.
Definition point.h:22
A 4D vector.
Definition vec4.h:24
__m128 vec
Definition vec4.h:97
A vector is a 3D direction in space.
Definition vector.h:22
__m128 vec
Definition vector.h:82
float z
Definition vector.h:85
float x
Definition vector.h:85
float y
Definition vector.h:85