KiCad PCB EDA Suite
cbbox_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 <mrluzeiro@ua.pt>
5  * Copyright (C) 1992-2016 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, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
30 #include "cbbox.h"
31 #include <fctsys.h>
32 #include <wx/debug.h>
33 
34 // This BBOX Ray intersection test have the following credits:
35 
36 // "This source code accompanies the Journal of Graphics Tools paper:
37 //
38 // "Fast Ray / Axis-Aligned Bounding Box Overlap Tests using Ray Slopes"
39 // by Martin Eisemann, Thorsten Grosch, Stefan Müller and Marcus Magnor
40 // Computer Graphics Lab, TU Braunschweig, Germany and
41 // University of Koblenz-Landau, Germany
42 //
43 // This source code is public domain, but please mention us if you use it."
44 
45 
46 bool CBBOX::Intersect( const RAY& aRay, float* t ) const
47 {
48  switch( aRay.m_Classification )
49  {
50  case MMM:
51  {
52  if( ( aRay.m_Origin.x < m_min.x )
53  || ( aRay.m_Origin.y < m_min.y )
54  || ( aRay.m_Origin.z < m_min.z )
55  || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0)
56  || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0)
57  || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0)
58  || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0)
59  || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0)
60  || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0)
61  )
62  return false;
63 
64  // compute the intersection distance
65 
66  *t = (m_max.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
67 
68  float t1 = (m_max.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
69 
70  if( t1 > *t )
71  *t = t1;
72 
73  float t2 = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
74 
75  if( t2 > *t )
76  *t = t2;
77 
78  return true;
79  }
80 
81 
82  case MMP:
83  {
84  if( ( aRay.m_Origin.x < m_min.x )
85  || ( aRay.m_Origin.y < m_min.y )
86  || ( aRay.m_Origin.z > m_max.z )
87  || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0)
88  || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0)
89  || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0)
90  || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0)
91  || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0)
92  || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0)
93  )
94  return false;
95 
96  *t = (m_max.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
97 
98  float t1 = (m_max.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
99 
100  if( t1 > *t )
101  *t = t1;
102 
103  float t2 = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
104 
105  if( t2 > *t )
106  *t = t2;
107 
108  return true;
109  }
110 
111  case MPM:
112  {
113  if( ( aRay.m_Origin.x < m_min.x )
114  || ( aRay.m_Origin.y > m_max.y )
115  || ( aRay.m_Origin.z < m_min.z )
116  || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0)
117  || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0)
118  || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0)
119  || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0)
120  || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0)
121  || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0)
122  )
123  return false;
124 
125  *t = (m_max.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
126 
127  float t1 = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
128 
129  if( t1 > *t )
130  *t = t1;
131 
132  float t2 = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
133 
134  if( t2 > *t )
135  *t = t2;
136 
137  return true;
138  }
139 
140  case MPP:
141  {
142  if( ( aRay.m_Origin.x < m_min.x )
143  || ( aRay.m_Origin.y > m_max.y )
144  || ( aRay.m_Origin.z > m_max.z )
145  || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0)
146  || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0)
147  || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0)
148  || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0)
149  || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0)
150  || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0)
151  )
152  return false;
153 
154  *t = (m_max.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
155 
156  float t1 = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
157 
158  if( t1 > *t )
159  *t = t1;
160 
161  float t2 = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
162 
163  if( t2 > *t )
164  *t = t2;
165 
166  return true;
167  }
168 
169  case PMM:
170  {
171  if( ( aRay.m_Origin.x > m_max.x )
172  || ( aRay.m_Origin.y < m_min.y )
173  || ( aRay.m_Origin.z < m_min.z )
174  || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0)
175  || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0)
176  || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0)
177  || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0)
178  || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0)
179  || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0)
180  )
181  return false;
182 
183  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
184 
185  float t1 = (m_max.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
186 
187  if( t1 > *t )
188  *t = t1;
189 
190  float t2 = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
191 
192  if( t2 > *t )
193  *t = t2;
194 
195  return true;
196  }
197 
198 
199  case PMP:
200  {
201  if( ( aRay.m_Origin.x > m_max.x )
202  || ( aRay.m_Origin.y < m_min.y )
203  || ( aRay.m_Origin.z > m_max.z )
204  || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0)
205  || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0)
206  || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0)
207  || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0)
208  || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0)
209  || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0)
210  )
211  return false;
212 
213  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
214 
215  float t1 = (m_max.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
216 
217  if( t1 > *t )
218  *t = t1;
219 
220  float t2 = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
221 
222  if( t2 > *t )
223  *t = t2;
224 
225  return true;
226  }
227 
228  case PPM:
229  {
230  if( ( aRay.m_Origin.x > m_max.x )
231  || ( aRay.m_Origin.y > m_max.y )
232  || ( aRay.m_Origin.z < m_min.z )
233  || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0)
234  || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0)
235  || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0)
236  || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0)
237  || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0)
238  || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0)
239  )
240  return false;
241 
242  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
243 
244  float t1 = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
245 
246  if( t1 > *t )
247  *t = t1;
248 
249  float t2 = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
250 
251  if( t2 > *t )
252  *t = t2;
253 
254  return true;
255  }
256 
257  case PPP:
258  {
259  if( ( aRay.m_Origin.x > m_max.x )
260  || ( aRay.m_Origin.y > m_max.y )
261  || ( aRay.m_Origin.z > m_max.z )
262  || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0)
263  || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0)
264  || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0)
265  || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0)
266  || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0)
267  || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0)
268  )
269  return false;
270 
271  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
272 
273  float t1 = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
274 
275  if( t1 > *t )
276  *t = t1;
277 
278  float t2 = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
279 
280  if( t2 > *t )
281  *t = t2;
282 
283  return true;
284  }
285 
286  case OMM:
287  {
288  if( ( aRay.m_Origin.x < m_min.x )
289  || ( aRay.m_Origin.x > m_max.x )
290  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.z < m_min.z)
291  || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0)
292  || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0)
293  )
294  return false;
295 
296  *t = (m_max.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
297 
298  float t2 = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
299 
300  if( t2 > *t )
301  *t = t2;
302 
303  return true;
304  }
305 
306  case OMP:
307  {
308  if( ( aRay.m_Origin.x < m_min.x )
309  || ( aRay.m_Origin.x > m_max.x )
310  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.z > m_max.z)
311  || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0)
312  || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0)
313  )
314  return false;
315 
316  *t = (m_max.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
317 
318  float t2 = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
319 
320  if( t2 > *t )
321  *t = t2;
322 
323  return true;
324  }
325 
326  case OPM:
327  {
328  if( ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
329  || ( aRay.m_Origin.y > m_max.y) || ( aRay.m_Origin.z < m_min.z)
330  || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0)
331  || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0)
332  )
333  return false;
334 
335  *t = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
336 
337  float t2 = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
338 
339  if( t2 > *t )
340  *t = t2;
341 
342  return true;
343  }
344 
345  case OPP:
346  {
347  if( ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
348  || ( aRay.m_Origin.y > m_max.y) || ( aRay.m_Origin.z > m_max.z)
349  || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0)
350  || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0)
351  )
352  return false;
353 
354  *t = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
355 
356  float t2 = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
357 
358  if( t2 > *t )
359  *t = t2;
360 
361  return true;
362  }
363 
364 
365  case MOM:
366  {
367  if( ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
368  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.z < m_min.z)
369  || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0)
370  || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0)
371  )
372  return false;
373 
374  *t = (m_max.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
375 
376  float t2 = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
377 
378  if( t2 > *t )
379  *t = t2;
380 
381  return true;
382  }
383 
384 
385  case MOP:
386  {
387  if( ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
388  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.z > m_max.z)
389  || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0)
390  || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0)
391  )
392  return false;
393 
394  *t = (m_max.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
395 
396  float t2 = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
397 
398  if( t2 > *t )
399  *t = t2;
400 
401  return true;
402  }
403 
404  case POM:
405  {
406  if( ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
407  || ( aRay.m_Origin.x > m_max.x) || ( aRay.m_Origin.z < m_min.z)
408  || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0)
409  || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0)
410  )
411  return false;
412 
413  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
414 
415  float t2 = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
416 
417  if( t2 > *t )
418  *t = t2;
419 
420  return true;
421  }
422 
423 
424  case POP:
425  {
426  if( ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
427  || ( aRay.m_Origin.x > m_max.x) || ( aRay.m_Origin.z > m_max.z)
428  || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0)
429  || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0)
430  )
431  return false;
432 
433  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
434 
435  float t2 = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
436 
437  if( t2 > *t )
438  *t = t2;
439 
440  return true;
441  }
442 
443  case MMO:
444  {
445  if( ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
446  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.y < m_min.y)
447  || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0)
448  || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0)
449  )
450  return false;
451 
452  *t = (m_max.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 
462  case MPO:
463  {
464  if( ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
465  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.y > m_max.y)
466  || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0)
467  || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0)
468  )
469  return false;
470 
471  *t = (m_max.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
472 
473  float t1 = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
474 
475  if( t1 > *t )
476  *t = t1;
477 
478  return true;
479  }
480 
481 
482  case PMO:
483  {
484  if( ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
485  || ( aRay.m_Origin.x > m_max.x) || ( aRay.m_Origin.y < m_min.y)
486  || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0)
487  || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0)
488  )
489  return false;
490 
491  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
492 
493  float t1 = (m_max.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
494 
495  if( t1 > *t )
496  *t = t1;
497 
498  return true;
499  }
500 
501  case PPO:
502  {
503  if( ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
504  || ( aRay.m_Origin.x > m_max.x) || ( aRay.m_Origin.y > m_max.y)
505  || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0)
506  || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0)
507  )
508  return false;
509 
510  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
511 
512  float t1 = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
513 
514  if( t1 > *t )
515  *t = t1;
516 
517  return true;
518  }
519 
520 
521  case MOO:
522  {
523  if( ( aRay.m_Origin.x < m_min.x)
524  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
525  || ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
526  )
527  return false;
528 
529  *t = (m_max.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
530 
531  return true;
532  }
533 
534  case POO:
535  {
536  if( ( aRay.m_Origin.x > m_max.x)
537  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
538  || ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
539  )
540  return false;
541 
542  *t = (m_min.x - aRay.m_Origin.x) * aRay.m_InvDir.x;
543 
544  return true;
545  }
546 
547  case OMO:
548  {
549  if( ( aRay.m_Origin.y < m_min.y)
550  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
551  || ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
552  )
553  return false;
554 
555  *t = (m_max.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
556 
557  return true;
558  }
559 
560  case OPO:
561  {
562  if( ( aRay.m_Origin.y > m_max.y)
563  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
564  || ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
565  )
566  return false;
567 
568  *t = (m_min.y - aRay.m_Origin.y) * aRay.m_InvDir.y;
569 
570  return true;
571  }
572 
573 
574  case OOM:
575  {
576  if( ( aRay.m_Origin.z < m_min.z)
577  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
578  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
579  )
580  return false;
581 
582  *t = (m_max.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
583 
584  return true;
585  }
586 
587  case OOP:
588  {
589  if( ( aRay.m_Origin.z > m_max.z)
590  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
591  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
592  )
593  return false;
594 
595  *t = (m_min.z - aRay.m_Origin.z) * aRay.m_InvDir.z;
596 
597  return true;
598  }
599  }
600 
601  return false;
602 }
603 
604 
605 bool CBBOX::Intersect( const RAY& aRay ) const
606 {
607  switch( aRay.m_Classification )
608  {
609  case MMM:
610  {
611  if( ( aRay.m_Origin.x < m_min.x )
612  || ( aRay.m_Origin.y < m_min.y )
613  || ( aRay.m_Origin.z < m_min.z )
614  || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0)
615  || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0)
616  || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0)
617  || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0)
618  || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0)
619  || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0)
620  )
621  return false;
622 
623  return true;
624  }
625 
626 
627  case MMP:
628  {
629  if( ( aRay.m_Origin.x < m_min.x )
630  || ( aRay.m_Origin.y < m_min.y )
631  || ( aRay.m_Origin.z > m_max.z )
632  || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0)
633  || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0)
634  || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0)
635  || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0)
636  || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0)
637  || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0)
638  )
639  return false;
640 
641  return true;
642  }
643 
644  case MPM:
645  {
646  if( ( aRay.m_Origin.x < m_min.x )
647  || ( aRay.m_Origin.y > m_max.y )
648  || ( aRay.m_Origin.z < m_min.z )
649  || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0)
650  || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0)
651  || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0)
652  || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0)
653  || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0)
654  || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0)
655  )
656  return false;
657 
658  return true;
659  }
660 
661  case MPP:
662  {
663  if( ( aRay.m_Origin.x < m_min.x )
664  || ( aRay.m_Origin.y > m_max.y )
665  || ( aRay.m_Origin.z > m_max.z )
666  || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0)
667  || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0)
668  || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0)
669  || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0)
670  || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0)
671  || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0)
672  )
673  return false;
674 
675  return true;
676  }
677 
678  case PMM:
679  {
680  if( ( aRay.m_Origin.x > m_max.x )
681  || ( aRay.m_Origin.y < m_min.y )
682  || ( aRay.m_Origin.z < m_min.z )
683  || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0)
684  || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0)
685  || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0)
686  || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0)
687  || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0)
688  || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0)
689  )
690  return false;
691 
692  return true;
693  }
694 
695 
696  case PMP:
697  {
698  if( ( aRay.m_Origin.x > m_max.x )
699  || ( aRay.m_Origin.y < m_min.y )
700  || ( aRay.m_Origin.z > m_max.z )
701  || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0)
702  || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0)
703  || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0)
704  || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0)
705  || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0)
706  || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0)
707  )
708  return false;
709 
710  return true;
711  }
712 
713  case PPM:
714  {
715  if( ( aRay.m_Origin.x > m_max.x )
716  || ( aRay.m_Origin.y > m_max.y )
717  || ( aRay.m_Origin.z < m_min.z )
718  || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0)
719  || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0)
720  || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0)
721  || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0)
722  || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0)
723  || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0)
724  )
725  return false;
726 
727  return true;
728  }
729 
730  case PPP:
731  {
732  if( ( aRay.m_Origin.x > m_max.x )
733  || ( aRay.m_Origin.y > m_max.y )
734  || ( aRay.m_Origin.z > m_max.z )
735  || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0)
736  || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0)
737  || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0)
738  || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0)
739  || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0)
740  || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0)
741  )
742  return false;
743 
744  return true;
745  }
746 
747  case OMM:
748  {
749  if( ( aRay.m_Origin.x < m_min.x )
750  || ( aRay.m_Origin.x > m_max.x )
751  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.z < m_min.z)
752  || ( aRay.jbyk * m_min.z - m_max.y + aRay.c_zy > 0)
753  || ( aRay.kbyj * m_min.y - m_max.z + aRay.c_yz > 0) )
754  return false;
755 
756  return true;
757  }
758 
759  case OMP:
760  {
761  if( ( aRay.m_Origin.x < m_min.x )
762  || ( aRay.m_Origin.x > m_max.x )
763  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.z > m_max.z)
764  || ( aRay.jbyk * m_max.z - m_max.y + aRay.c_zy > 0)
765  || ( aRay.kbyj * m_min.y - m_min.z + aRay.c_yz < 0)
766  )
767  return false;
768 
769  return true;
770  }
771 
772  case OPM:
773  {
774  if( ( aRay.m_Origin.x < m_min.x )
775  || ( aRay.m_Origin.x > m_max.x )
776  || ( aRay.m_Origin.y > m_max.y) || ( aRay.m_Origin.z < m_min.z)
777  || ( aRay.jbyk * m_min.z - m_min.y + aRay.c_zy < 0)
778  || ( aRay.kbyj * m_max.y - m_max.z + aRay.c_yz > 0)
779  )
780  return false;
781 
782  return true;
783  }
784 
785  case OPP:
786  {
787  if( ( aRay.m_Origin.x < m_min.x )
788  || ( aRay.m_Origin.x > m_max.x )
789  || ( aRay.m_Origin.y > m_max.y) || ( aRay.m_Origin.z > m_max.z)
790  || ( aRay.jbyk * m_max.z - m_min.y + aRay.c_zy < 0)
791  || ( aRay.kbyj * m_max.y - m_min.z + aRay.c_yz < 0)
792  )
793  return false;
794 
795  return true;
796  }
797 
798 
799  case MOM:
800  {
801  if( ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
802  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.z < m_min.z)
803  || ( aRay.kbyi * m_min.x - m_max.z + aRay.c_xz > 0)
804  || ( aRay.ibyk * m_min.z - m_max.x + aRay.c_zx > 0)
805  )
806  return false;
807 
808  return true;
809  }
810 
811 
812  case MOP:
813  {
814  if( ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
815  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.z > m_max.z)
816  || ( aRay.kbyi * m_min.x - m_min.z + aRay.c_xz < 0)
817  || ( aRay.ibyk * m_max.z - m_max.x + aRay.c_zx > 0)
818  )
819  return false;
820 
821  return true;
822  }
823 
824  case POM:
825  {
826  if( ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
827  || ( aRay.m_Origin.x > m_max.x) || ( aRay.m_Origin.z < m_min.z)
828  || ( aRay.kbyi * m_max.x - m_max.z + aRay.c_xz > 0)
829  || ( aRay.ibyk * m_min.z - m_min.x + aRay.c_zx < 0)
830  )
831  return false;
832 
833  return true;
834  }
835 
836 
837  case POP:
838  {
839  if( ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
840  || ( aRay.m_Origin.x > m_max.x) || ( aRay.m_Origin.z > m_max.z)
841  || ( aRay.kbyi * m_max.x - m_min.z + aRay.c_xz < 0)
842  || ( aRay.ibyk * m_max.z - m_min.x + aRay.c_zx < 0)
843  )
844  return false;
845 
846  return true;
847  }
848 
849  case MMO:
850  {
851  if( ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
852  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.y < m_min.y)
853  || ( aRay.jbyi * m_min.x - m_max.y + aRay.c_xy > 0)
854  || ( aRay.ibyj * m_min.y - m_max.x + aRay.c_yx > 0)
855  )
856  return false;
857 
858  return true;
859  }
860 
861  case MPO:
862  {
863  if( ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
864  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.y > m_max.y)
865  || ( aRay.jbyi * m_min.x - m_min.y + aRay.c_xy < 0)
866  || ( aRay.ibyj * m_max.y - m_max.x + aRay.c_yx > 0)
867  )
868  return false;
869 
870  return true;
871  }
872 
873 
874  case PMO:
875  {
876  if( ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
877  || ( aRay.m_Origin.x > m_max.x) || ( aRay.m_Origin.y < m_min.y)
878  || ( aRay.jbyi * m_max.x - m_max.y + aRay.c_xy > 0)
879  || ( aRay.ibyj * m_min.y - m_min.x + aRay.c_yx < 0)
880  )
881  return false;
882 
883  return true;
884  }
885 
886  case PPO:
887  {
888  if( ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
889  || ( aRay.m_Origin.x > m_max.x) || ( aRay.m_Origin.y > m_max.y)
890  || ( aRay.jbyi * m_max.x - m_min.y + aRay.c_xy < 0)
891  || ( aRay.ibyj * m_max.y - m_min.x + aRay.c_yx < 0)
892  )
893  return false;
894 
895  return true;
896  }
897 
898 
899  case MOO:
900  {
901  if( ( aRay.m_Origin.x < m_min.x)
902  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
903  || ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
904  )
905  return false;
906 
907  return true;
908  }
909 
910  case POO:
911  {
912  if( ( aRay.m_Origin.x > m_max.x)
913  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
914  || ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
915  )
916  return false;
917 
918  return true;
919  }
920 
921  case OMO:
922  {
923  if( ( aRay.m_Origin.y < m_min.y)
924  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
925  || ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
926  )
927  return false;
928 
929  return true;
930  }
931 
932  case OPO:
933  {
934  if( ( aRay.m_Origin.y > m_max.y)
935  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
936  || ( aRay.m_Origin.z < m_min.z) || ( aRay.m_Origin.z > m_max.z)
937  )
938  return false;
939 
940  return true;
941  }
942 
943 
944  case OOM:
945  {
946  if( ( aRay.m_Origin.z < m_min.z)
947  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
948  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
949  )
950  return false;
951 
952  return true;
953  }
954 
955  case OOP:
956  {
957  if( ( aRay.m_Origin.z > m_max.z)
958  || ( aRay.m_Origin.x < m_min.x) || ( aRay.m_Origin.x > m_max.x)
959  || ( aRay.m_Origin.y < m_min.y) || ( aRay.m_Origin.y > m_max.y)
960  )
961  return false;
962 
963  return true;
964  }
965  }
966 
967  return false;
968 }
Definition: ray.h:38
Definition: ray.h:38
Definition: ray.h:38
float c_xy
Definition: ray.h:54
Definition: ray.h:39
Definition: ray.h:38
Definition: ray.h:38
Definition: ray.h:39
SFVEC3F m_min
(12) point of the lower position of the bounding box
Definition: cbbox.h:255
Definition: ray.h:39
float c_zy
Definition: ray.h:54
Definition: ray.h:43
Definition: ray.h:39
float jbyk
Definition: ray.h:53
Definition: ray.h:39
float kbyi
Definition: ray.h:53
float c_yx
Definition: ray.h:54
Definition: ray.h:38
Definition: ray.h:38
SFVEC3F m_InvDir
Definition: ray.h:51
Definition: ray.h:39
Definition: ray.h:38
Definition: ray.h:39
float kbyj
Definition: ray.h:53
Definition: ray.h:38
Definition: ray.h:39
RAY_CLASSIFICATION m_Classification
Definition: ray.h:49
Definition: ray.h:38
SFVEC3F m_max
(12) point of the higher position of the bounding box
Definition: cbbox.h:256
bool Intersect(const RAY &aRay, float *t) const
Function Intersect.
Definition: cbbox_ray.cpp:46
Definition: ray.h:39
Definition: ray.h:39
float ibyj
Definition: ray.h:53
float jbyi
Definition: ray.h:53
float c_yz
Definition: ray.h:54
SFVEC3F m_Origin
Definition: ray.h:45
Definition: ray.h:38
Definition: ray.h:38
float c_zx
Definition: ray.h:54
Definition: ray.h:38
Definition: ray.h:38
float c_xz
Definition: ray.h:54
Definition: ray.h:39
Definition: ray.h:38
Bounding Box class definition.
float ibyk
Definition: ray.h:53