KiCad PCB EDA Suite
Loading...
Searching...
No Matches
bbox_3d_ray.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2015-2016 Mario Luzeiro <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
25
26#include "bbox_3d.h"
27#include "../ray.h"
28#include <wx/debug.h>
29
30// This BBOX Ray intersection test have the following credits:
31
32// "This source code accompanies the Journal of Graphics Tools paper:
33//
34// "Fast Ray / Axis-Aligned Bounding Box Overlap Tests using Ray Slopes"
35// by Martin Eisemann, Thorsten Grosch, Stefan Müller and Marcus Magnor
36// Computer Graphics Lab, TU Braunschweig, Germany and
37// University of Koblenz-Landau, Germany
38//
39// This source code is public domain, but please mention us if you use it."
40
41
42bool BBOX_3D::Intersect( const RAY& aRay, float* t ) const
43{
44 switch( aRay.m_Classification )
45 {
47 {
48 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y < m_min.y )
49 || ( aRay.m_Origin.z < m_min.z )
50 || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0 )
51 || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0 )
52 || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0 )
53 || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0 )
54 || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0 )
55 || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0 ) )
56 return false;
57
58 // compute the intersection distance
59
60 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
61
62 float t1 = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
63
64 if( t1 > *t )
65 *t = t1;
66
67 float t2 = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
68
69 if( t2 > *t )
70 *t = t2;
71
72 return true;
73 }
74
76 {
77 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y < m_min.y )
78 || ( aRay.m_Origin.z > m_max.z )
79 || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0 )
80 || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0 )
81 || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0 )
82 || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0 )
83 || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0 )
84 || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0 ) )
85 return false;
86
87 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
88
89 float t1 = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
90
91 if( t1 > *t )
92 *t = t1;
93
94 float t2 = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
95
96 if( t2 > *t )
97 *t = t2;
98
99 return true;
100 }
101
103 {
104 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y > m_max.y )
105 || ( aRay.m_Origin.z < m_min.z )
106 || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0 )
107 || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0 )
108 || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0 )
109 || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0 )
110 || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0 )
111 || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0 ) )
112 return false;
113
114 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
115
116 float t1 = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
117
118 if( t1 > *t )
119 *t = t1;
120
121 float t2 = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
122
123 if( t2 > *t )
124 *t = t2;
125
126 return true;
127 }
128
130 {
131 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y > m_max.y )
132 || ( aRay.m_Origin.z > m_max.z )
133 || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0 )
134 || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0 )
135 || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0 )
136 || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0 )
137 || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0 )
138 || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0 ) )
139 return false;
140
141 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
142
143 float t1 = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
144
145 if( t1 > *t )
146 *t = t1;
147
148 float t2 = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
149
150 if( t2 > *t )
151 *t = t2;
152
153 return true;
154 }
155
157 {
158 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
159 || ( aRay.m_Origin.z < m_min.z )
160 || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0 )
161 || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0 )
162 || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0 )
163 || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0 )
164 || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0 )
165 || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0 ) )
166 return false;
167
168 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
169
170 float t1 = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
171
172 if( t1 > *t )
173 *t = t1;
174
175 float t2 = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
176
177 if( t2 > *t )
178 *t = t2;
179
180 return true;
181 }
182
184 {
185 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
186 || ( aRay.m_Origin.z > m_max.z )
187 || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0 )
188 || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0 )
189 || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0 )
190 || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0 )
191 || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0 )
192 || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0 ) )
193 return false;
194
195 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
196
197 float t1 = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
198
199 if( t1 > *t )
200 *t = t1;
201
202 float t2 = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
203
204 if( t2 > *t )
205 *t = t2;
206
207 return true;
208 }
209
211 {
212 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y > m_max.y )
213 || ( aRay.m_Origin.z < m_min.z )
214 || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0 )
215 || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0 )
216 || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0 )
217 || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0 )
218 || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0 )
219 || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0 ) )
220 return false;
221
222 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
223
224 float t1 = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
225
226 if( t1 > *t )
227 *t = t1;
228
229 float t2 = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
230
231 if( t2 > *t )
232 *t = t2;
233
234 return true;
235 }
236
238 {
239 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y > m_max.y )
240 || ( aRay.m_Origin.z > m_max.z )
241 || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0 )
242 || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0 )
243 || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0 )
244 || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0 )
245 || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0 )
246 || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0 ) )
247 return false;
248
249 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
250
251 float t1 = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
252
253 if( t1 > *t )
254 *t = t1;
255
256 float t2 = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
257
258 if( t2 > *t )
259 *t = t2;
260
261 return true;
262 }
263
265 {
266 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.x > m_max.x )
267 || ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.z < m_min.z )
268 || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0 )
269 || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0 ) )
270 return false;
271
272 *t = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
273
274 float t2 = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
275
276 if( t2 > *t )
277 *t = t2;
278
279 return true;
280 }
281
283 {
284 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.x > m_max.x )
285 || ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.z > m_max.z )
286 || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0 )
287 || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0 ) )
288 return false;
289
290 *t = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
291
292 float t2 = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
293
294 if( t2 > *t )
295 *t = t2;
296
297 return true;
298 }
299
301 {
302 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.x > m_max.x )
303 || ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.z < m_min.z )
304 || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0 )
305 || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0 ) )
306 return false;
307
308 *t = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
309
310 float t2 = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
311
312 if( t2 > *t )
313 *t = t2;
314
315 return true;
316 }
317
319 {
320 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.x > m_max.x )
321 || ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.z > m_max.z )
322 || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0 )
323 || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0 ) )
324 return false;
325
326 *t = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
327
328 float t2 = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
329
330 if( t2 > *t )
331 *t = t2;
332
333 return true;
334 }
335
337 {
338 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.y > m_max.y )
339 || ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.z < m_min.z )
340 || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0 )
341 || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0 ) )
342 return false;
343
344 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
345
346 float t2 = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
347
348 if( t2 > *t )
349 *t = t2;
350
351 return true;
352 }
353
355 {
356 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.y > m_max.y )
357 || ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.z > m_max.z )
358 || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0 )
359 || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0 ) )
360 return false;
361
362 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
363
364 float t2 = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
365
366 if( t2 > *t )
367 *t = t2;
368
369 return true;
370 }
371
373 {
374 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.y > m_max.y )
375 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.z < m_min.z )
376 || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0 )
377 || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0 ) )
378 return false;
379
380 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
381
382 float t2 = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
383
384 if( t2 > *t )
385 *t = t2;
386
387 return true;
388 }
389
391 {
392 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.y > m_max.y )
393 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.z > m_max.z )
394 || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0 )
395 || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0 ) )
396 return false;
397
398 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
399
400 float t2 = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
401
402 if( t2 > *t )
403 *t = t2;
404
405 return true;
406 }
407
409 {
410 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.z > m_max.z )
411 || ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y < m_min.y )
412 || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0 )
413 || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0 ) )
414 return false;
415
416 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
417
418 float t1 = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
419
420 if( t1 > *t )
421 *t = t1;
422
423 return true;
424 }
425
427 {
428 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.z > m_max.z )
429 || ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y > m_max.y )
430 || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0 )
431 || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0 ) )
432 return false;
433
434 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
435
436 float t1 = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
437
438 if( t1 > *t )
439 *t = t1;
440
441 return true;
442 }
443
445 {
446 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.z > m_max.z )
447 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
448 || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0 )
449 || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0 ) )
450 return false;
451
452 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
453
454 float t1 = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
455
456 if( t1 > *t )
457 *t = t1;
458
459 return true;
460 }
461
463 {
464 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.z > m_max.z )
465 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y > m_max.y )
466 || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0 )
467 || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0 ) )
468 return false;
469
470 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
471
472 float t1 = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
473
474 if( t1 > *t )
475 *t = t1;
476
477 return true;
478 }
479
481 {
482 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y < m_min.y )
483 || ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.z < m_min.z )
484 || ( aRay.m_Origin.z > m_max.z ) )
485 return false;
486
487 *t = ( m_max.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
488
489 return true;
490 }
491
493 {
494 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
495 || ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.z < m_min.z )
496 || ( aRay.m_Origin.z > m_max.z ) )
497 return false;
498
499 *t = ( m_min.x - aRay.m_Origin.x ) * aRay.m_InvDir.x;
500
501 return true;
502 }
503
505 {
506 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.x < m_min.x )
507 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.z < m_min.z )
508 || ( aRay.m_Origin.z > m_max.z ) )
509 return false;
510
511 *t = ( m_max.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
512
513 return true;
514 }
515
517 {
518 if( ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.x < m_min.x )
519 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.z < m_min.z )
520 || ( aRay.m_Origin.z > m_max.z ) )
521 return false;
522
523 *t = ( m_min.y - aRay.m_Origin.y ) * aRay.m_InvDir.y;
524
525 return true;
526 }
527
529 {
530 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.x < m_min.x )
531 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
532 || ( aRay.m_Origin.y > m_max.y ) )
533 return false;
534
535 *t = ( m_max.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
536
537 return true;
538 }
539
541 {
542 if( ( aRay.m_Origin.z > m_max.z ) || ( aRay.m_Origin.x < m_min.x )
543 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
544 || ( aRay.m_Origin.y > m_max.y ) )
545 return false;
546
547 *t = ( m_min.z - aRay.m_Origin.z ) * aRay.m_InvDir.z;
548
549 return true;
550 }
551 }
552
553 return false;
554}
555
556
557bool BBOX_3D::Intersect( const RAY& aRay ) const
558{
559 switch( aRay.m_Classification )
560 {
562 {
563 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y < m_min.y )
564 || ( aRay.m_Origin.z < m_min.z )
565 || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0 )
566 || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0 )
567 || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0 )
568 || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0 )
569 || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0 )
570 || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0 ) )
571 return false;
572
573 return true;
574 }
575
577 {
578 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y < m_min.y )
579 || ( aRay.m_Origin.z > m_max.z )
580 || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0 )
581 || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0 )
582 || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0 )
583 || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0 )
584 || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0 )
585 || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0 ) )
586 return false;
587
588 return true;
589 }
590
592 {
593 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y > m_max.y )
594 || ( aRay.m_Origin.z < m_min.z )
595 || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0 )
596 || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0 )
597 || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0 )
598 || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0 )
599 || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0 )
600 || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0 ) )
601 return false;
602
603 return true;
604 }
605
607 {
608 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y > m_max.y )
609 || ( aRay.m_Origin.z > m_max.z )
610 || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0 )
611 || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0 )
612 || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0 )
613 || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0 )
614 || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0 )
615 || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0 ) )
616 return false;
617
618 return true;
619 }
620
622 {
623 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
624 || ( aRay.m_Origin.z < m_min.z )
625 || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0 )
626 || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0 )
627 || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0 )
628 || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0 )
629 || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0 )
630 || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0 ) )
631 return false;
632
633 return true;
634 }
635
636
638 {
639 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
640 || ( aRay.m_Origin.z > m_max.z )
641 || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0 )
642 || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0 )
643 || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0 )
644 || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0 )
645 || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0 )
646 || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0 ) )
647 return false;
648
649 return true;
650 }
651
653 {
654 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y > m_max.y )
655 || ( aRay.m_Origin.z < m_min.z )
656 || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0 )
657 || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0 )
658 || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0 )
659 || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0 )
660 || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0 )
661 || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0 ) )
662 return false;
663
664 return true;
665 }
666
668 {
669 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y > m_max.y )
670 || ( aRay.m_Origin.z > m_max.z )
671 || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0 )
672 || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0 )
673 || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0 )
674 || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0 )
675 || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0 )
676 || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0 ) )
677 return false;
678
679 return true;
680 }
681
683 {
684 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.x > m_max.x )
685 || ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.z < m_min.z )
686 || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0 )
687 || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0 ) )
688 return false;
689
690 return true;
691 }
692
694 {
695 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.x > m_max.x )
696 || ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.z > m_max.z )
697 || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0 )
698 || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0 ) )
699 return false;
700
701 return true;
702 }
703
705 {
706 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.x > m_max.x )
707 || ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.z < m_min.z )
708 || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0 )
709 || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0 ) )
710 return false;
711
712 return true;
713 }
714
716 {
717 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.x > m_max.x )
718 || ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.z > m_max.z )
719 || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0 )
720 || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0 ) )
721 return false;
722
723 return true;
724 }
725
727 {
728 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.y > m_max.y )
729 || ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.z < m_min.z )
730 || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0 )
731 || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0 ) )
732 return false;
733
734 return true;
735 }
736
738 {
739 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.y > m_max.y )
740 || ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.z > m_max.z )
741 || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0 )
742 || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0 ) )
743 return false;
744
745 return true;
746 }
747
749 {
750 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.y > m_max.y )
751 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.z < m_min.z )
752 || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0 )
753 || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0 ) )
754 return false;
755
756 return true;
757 }
758
760 {
761 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.y > m_max.y )
762 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.z > m_max.z )
763 || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0 )
764 || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0 ) )
765 return false;
766
767 return true;
768 }
769
771 {
772 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.z > m_max.z )
773 || ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y < m_min.y )
774 || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0 )
775 || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0 ) )
776 return false;
777
778 return true;
779 }
780
782 {
783 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.z > m_max.z )
784 || ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y > m_max.y )
785 || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0 )
786 || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0 ) )
787 return false;
788
789 return true;
790 }
791
793 {
794 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.z > m_max.z )
795 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
796 || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0 )
797 || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0 ) )
798 return false;
799
800 return true;
801 }
802
804 {
805 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.z > m_max.z )
806 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y > m_max.y )
807 || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0 )
808 || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0 ) )
809 return false;
810
811 return true;
812 }
813
815 {
816 if( ( aRay.m_Origin.x < m_min.x ) || ( aRay.m_Origin.y < m_min.y )
817 || ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.z < m_min.z )
818 || ( aRay.m_Origin.z > m_max.z ) )
819 return false;
820
821 return true;
822 }
823
825 {
826 if( ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
827 || ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.z < m_min.z )
828 || ( aRay.m_Origin.z > m_max.z ) )
829 return false;
830
831 return true;
832 }
833
835 {
836 if( ( aRay.m_Origin.y < m_min.y ) || ( aRay.m_Origin.x < m_min.x )
837 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.z < m_min.z )
838 || ( aRay.m_Origin.z > m_max.z ) )
839 return false;
840
841 return true;
842 }
843
845 {
846 if( ( aRay.m_Origin.y > m_max.y ) || ( aRay.m_Origin.x < m_min.x )
847 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.z < m_min.z )
848 || ( aRay.m_Origin.z > m_max.z ) )
849 return false;
850
851 return true;
852 }
853
855 {
856 if( ( aRay.m_Origin.z < m_min.z ) || ( aRay.m_Origin.x < m_min.x )
857 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
858 || ( aRay.m_Origin.y > m_max.y ) )
859 return false;
860
861 return true;
862 }
863
865 {
866 if( ( aRay.m_Origin.z > m_max.z ) || ( aRay.m_Origin.x < m_min.x )
867 || ( aRay.m_Origin.x > m_max.x ) || ( aRay.m_Origin.y < m_min.y )
868 || ( aRay.m_Origin.y > m_max.y ) )
869 return false;
870
871 return true;
872 }
873 }
874
875 return false;
876}
Bounding Box class definition.
bool Intersect(const RAY &aRay, float *t) const
SFVEC3F m_min
(12) point of the lower position of the bounding box
Definition bbox_3d.h:233
SFVEC3F m_max
(12) point of the higher position of the bounding box
Definition bbox_3d.h:234
Definition ray.h:59
float ibyj
Definition ray.h:68
float c_zx
Definition ray.h:69
float jbyk
Definition ray.h:68
RAY_CLASSIFICATION m_Classification
Definition ray.h:64
float jbyi
Definition ray.h:68
float c_xz
Definition ray.h:69
float c_xy
Definition ray.h:69
float c_yz
Definition ray.h:69
float kbyi
Definition ray.h:68
SFVEC3F m_InvDir
Definition ray.h:66
SFVEC3F m_Origin
Definition ray.h:60
float ibyk
Definition ray.h:68
float c_yx
Definition ray.h:69
float c_zy
Definition ray.h:69
float kbyj
Definition ray.h:68