Voxel
 All Classes Namespaces Files Functions Typedefs Enumerations Enumerator Macros Pages
renderer_detail_trace.cpp
1 #include "renderer_detail_trace.h"
2 
3 
4 
5 
6 namespace Renderer {
7 
8 
9 namespace detail {
10 
11 
12 
13 
14 /*==============================================================================
15  Project function
16 ==============================================================================*/
17 
18 
19 double Project( Vector< double, 3 >& position, Vector< double, 3 > const& ray ) {
20 
21  if (
22  ( position[ 0 ] >= 0 ) && ( position[ 0 ] <= 1 ) &&
23  ( position[ 1 ] >= 0 ) && ( position[ 1 ] <= 1 ) &&
24  ( position[ 2 ] >= 0 ) && ( position[ 2 ] <= 1 )
25  )
26  {
27  return 0; // **NOTE: return
28  }
29  else {
30 
31  if ( position[ 0 ] < 0 ) {
32 
33  if ( ray[ 0 ] > 0 ) {
34 
35  double const lambda = -position[ 0 ] / ray[ 0 ];
36  Vector< double, 3 > projected = { { 0, position[ 1 ] + lambda * ray[ 1 ], position[ 2 ] + lambda * ray[ 2 ] } };
37  if (
38  ( projected[ 1 ] >= 0 ) && ( projected[ 1 ] <= 1 ) &&
39  ( projected[ 2 ] >= 0 ) && ( projected[ 2 ] <= 1 )
40  )
41  {
42  position = projected;
43  return lambda; // **NOTE: return
44  }
45  }
46  }
47  else if ( position[ 0 ] > 1 ) {
48 
49  if ( ray[ 0 ] < 0 ) {
50 
51  double const lambda = ( 1 - position[ 0 ] ) / ray[ 0 ];
52  Vector< double, 3 > projected = { { 1, position[ 1 ] + lambda * ray[ 1 ], position[ 2 ] + lambda * ray[ 2 ] } };
53  if (
54  ( projected[ 1 ] >= 0 ) && ( projected[ 1 ] <= 1 ) &&
55  ( projected[ 2 ] >= 0 ) && ( projected[ 2 ] <= 1 )
56  )
57  {
58  position = projected;
59  return lambda; // **NOTE: return
60  }
61  }
62  }
63 
64  if ( position[ 1 ] < 0 ) {
65 
66  if ( ray[ 1 ] > 0 ) {
67 
68  double const lambda = -position[ 1 ] / ray[ 1 ];
69  Vector< double, 3 > projected = { { position[ 0 ] + lambda * ray[ 0 ], 0, position[ 2 ] + lambda * ray[ 2 ] } };
70  if (
71  ( projected[ 0 ] >= 0 ) && ( projected[ 0 ] <= 1 ) &&
72  ( projected[ 2 ] >= 0 ) && ( projected[ 2 ] <= 1 )
73  )
74  {
75  position = projected;
76  return lambda; // **NOTE: return
77  }
78  }
79  }
80  else if ( position[ 1 ] > 1 ) {
81 
82  if ( ray[ 1 ] < 0 ) {
83 
84  double const lambda = ( 1 - position[ 1 ] ) / ray[ 1 ];
85  Vector< double, 3 > projected = { { position[ 0 ] + lambda * ray[ 0 ], 1, position[ 2 ] + lambda * ray[ 2 ] } };
86  if (
87  ( projected[ 0 ] >= 0 ) && ( projected[ 0 ] <= 1 ) &&
88  ( projected[ 2 ] >= 0 ) && ( projected[ 2 ] <= 1 )
89  )
90  {
91  position = projected;
92  return lambda; // **NOTE: return
93  }
94  }
95  }
96 
97  if ( position[ 2 ] < 0 ) {
98 
99  if ( ray[ 2 ] > 0 ) {
100 
101  double const lambda = -position[ 2 ] / ray[ 2 ];
102  Vector< double, 3 > projected = { { position[ 0 ] + lambda * ray[ 0 ], position[ 1 ] + lambda * ray[ 1 ], 0 } };
103  if (
104  ( projected[ 0 ] >= 0 ) && ( projected[ 0 ] <= 1 ) &&
105  ( projected[ 1 ] >= 0 ) && ( projected[ 1 ] <= 1 )
106  )
107  {
108  position = projected;
109  return lambda; // **NOTE: return
110  }
111  }
112  }
113  else if ( position[ 2 ] > 1 ) {
114 
115  if ( ray[ 2 ] < 0 ) {
116 
117  double const lambda = ( 1 - position[ 2 ] ) / ray[ 2 ];
118  Vector< double, 3 > projected = { { position[ 0 ] + lambda * ray[ 0 ], position[ 1 ] + lambda * ray[ 1 ], 1 } };
119  if (
120  ( projected[ 0 ] >= 0 ) && ( projected[ 0 ] <= 1 ) &&
121  ( projected[ 1 ] >= 0 ) && ( projected[ 1 ] <= 1 )
122  )
123  {
124  position = projected;
125  return lambda; // **NOTE: return
126  }
127  }
128  }
129  }
130 
131  return std::numeric_limits< double >::infinity();
132 }
133 
134 
135 
136 
137 } // namespace detail
138 
139 
140 } // namespace Renderer