88
99namespace cuBQL {
1010
11- // =============================================================================
11+ // ========================================================================
1212 // *** INTERFACE ***
13- // =============================================================================
13+ // ========================================================================
1414
15- struct RayTriangleIntersection {
16- vec3f N;
17- float t,u,v;
15+ // struct RayTriangleIntersection {
16+ // vec3f N;
17+ // float t,u,v;
1818
19- inline __cubql_both bool compute (Ray ray, Triangle tri);
20- };
19+ // inline __cubql_both bool compute(Ray ray, Triangle tri);
20+ // };
2121
2222 template <typename T>
2323 struct RayTriangleIntersection_t {
2424 using vec3 = vec_t <T,3 >;
2525 T t=0 ,u=0 ,v=0 ;
26+ vec3 N;
2627
2728 inline __cubql_both bool compute (const ray_t <T> &ray,
28- const triangle_t <T> &tri);
29+ const triangle_t <T> &tri,
30+ bool dbg=false );
2931 };
3032
33+ using RayTriangleIntersection = RayTriangleIntersection_t<float >;
3134
32- // =============================================================================
35+ // ========================================================================
3336 // *** IMPLEMENTATION ***
34- // =============================================================================
37+ // ========================================================================
3538
3639 template <typename T>
3740 inline __cubql_both
3841 bool RayTriangleIntersection_t<T>::compute(const ray_t <T> &ray,
39- const triangle_t <T> &tri)
42+ const triangle_t <T> &tri,
43+ bool dbg)
4044 {
4145 using vec3 = vec_t <T,3 >;
4246 const vec3 v0 (tri.a );
4347 const vec3 v1 (tri.b );
4448 const vec3 v2 (tri.c );
45-
49+
4650 const vec3 e1 = v1-v0;
4751 const vec3 e2 = v2-v0;
4852
49- vec3 N = cross (e1 ,e2 );
53+ N = cross (e1 ,e2 );
5054 if (N == vec3 (T (0 )))
5155 return false ;
5256
@@ -59,7 +63,7 @@ namespace cuBQL {
5963 // t*dot(d,N) = -dot(o-v0,N)
6064 // t = -dot(o-v0,N)/dot(d,N)
6165 t = -dot (ray.origin -v0,N)/dot (ray.direction ,N);
62- if (t < ray.tMin || t > ray.tMax ) return false ;
66+ if (t <= ray.tMin || t >= ray.tMax ) return false ;
6367
6468 vec3 P = (ray.origin - v0) + t*ray.direction ;
6569
@@ -82,7 +86,7 @@ namespace cuBQL {
8286 // (P-v0) = [e1,e2]*(u,v,h)
8387 if (det (e1u,e1v,e2u,e2v) == T (0 )) return false ;
8488
85- #if 1
89+ #if 0
8690 T den = det(e1u,e2u,e1v,e2v);
8791 T sign = den < T(0) ? T(-1):T(1);
8892 den *= sign;
@@ -103,60 +107,50 @@ namespace cuBQL {
103107 return true ;
104108 }
105109
106- inline __cubql_both
107- bool RayTriangleIntersection::compute (Ray ray, Triangle tri)
108- {
109- const vec3f v0 = tri.a ;
110- const vec3f v1 = tri.b ;
111- const vec3f v2 = tri.c ;
110+ // inline __cubql_both
111+ // bool RayTriangleIntersection::compute(Ray ray, Triangle tri)
112+ // {
113+ // const vec3f v0 = tri.a;
114+ // const vec3f v1 = tri.b;
115+ // const vec3f v2 = tri.c;
112116
113- const vec3f e1 = v1-v0;
114- const vec3f e2 = v2-v0;
115-
116- N = cross (e1 ,e2 );
117- if (N == vec3f (0 .f )) return false ;
117+ // const vec3f e1 = v1-v0;
118+ // const vec3f e2 = v2-v0;
118119
119- // N = normalize(N );
120- if (fabsf (dot (ray.direction ,N)) < 1e-12f ) return false ;
120+ // vec3f N = cross(e1,e2 );
121+ // if (fabsf(dot(ray.direction,N)) < 1e-12f) return false;
121122
122- // P = o+td
123- // dot(P-v0,N) = 0
124- // dot(o+td-v0,N) = 0
125- // dot(td,N)+dot(o-v0,N)=0
126- // t*dot(d,N) = -dot(o-v0,N)
127- // t = -dot(o-v0,N)/dot(d,N)
128- t = -dot (ray.origin -v0,N)/dot (ray.direction ,N);
123+ // t = -dot(ray.origin-v0,N)/dot(ray.direction,N);
129124
130- if (t < ray. tMin || t > ray.tMax ) return false ;
125+ // if (t <= 0.f || t >= ray.tMax) return false;
131126
132- vec3f P = ( ray.origin - v0) + t*ray.direction ;
127+ // vec3f P = ray.origin - v0 + t*ray.direction;
133128
134- float e1u,e2u,Pu;
135- float e1v,e2v,Pv;
136- if (fabsf (N.x ) >= max (fabsf (N.y ),fabsf (N.z ))) {
137- e1u = e1 .y ; e2u = e2 .y ; Pu = P.y ;
138- e1v = e1 .z ; e2v = e2 .z ; Pv = P.z ;
139- } else if (fabsf (N.y ) > fabsf (N.z )) {
140- e1u = e1 .x ; e2u = e2 .x ; Pu = P.x ;
141- e1v = e1 .z ; e2v = e2 .z ; Pv = P.z ;
142- } else {
143- e1u = e1 .x ; e2u = e2 .x ; Pu = P.x ;
144- e1v = e1 .y ; e2v = e2 .y ; Pv = P.y ;
145- }
146- auto det = [](float a, float b, float c, float d) -> float
147- { return a*d - c*b; };
129+ // float e1u,e2u,Pu;
130+ // float e1v,e2v,Pv;
131+ // if (fabsf(N.x) >= max(fabsf(N.y),fabsf(N.z))) {
132+ // e1u = e1.y; e2u = e2.y; Pu = P.y;
133+ // e1v = e1.z; e2v = e2.z; Pv = P.z;
134+ // } else if (fabsf(N.y) > fabsf(N.z)) {
135+ // e1u = e1.x; e2u = e2.x; Pu = P.x;
136+ // e1v = e1.z; e2v = e2.z; Pv = P.z;
137+ // } else {
138+ // e1u = e1.x; e2u = e2.x; Pu = P.x;
139+ // e1v = e1.y; e2v = e2.y; Pv = P.y;
140+ // }
141+ // auto det = [](float a, float b, float c, float d) -> float
142+ // { return a*d - c*b; };
148143
149- // P = v0 + u * e1 + v * e2 + h * N
150- // (P-v0) = [e1,e2]*(u,v,h)
151- if (det (e1u,e1v,e2u,e2v) == 0 .f ) return false ;
144+ // // P = v0 + u * e1 + v * e2 + h * N
145+ // // (P-v0) = [e1,e2]*(u,v,h)
146+ // if (det(e1u,e1v,e2u,e2v) == 0.f) return false;
152147
153- u = det (Pu,e2u,Pv,e2v)/det (e1u,e2u,e1v,e2v);
154- v = det (e1u,Pu,e1v,Pv)/det (e1u,e2u,e1v,e2v);
155-
156- if ((u < 0 .f ) || (v < 0 .f ) || ((u+v) > 1 .f )) return false ;
148+ // u = det(Pu,e2u,Pv,e2v)/det(e1u,e2u,e1v,e2v);
149+ // v = det(e1u,Pu,e1v,Pv)/det(e1u,e2u,e1v,e2v);
150+ // if ((u < 0.f) || (v < 0.f) || ((u+v) >= 1.f)) return false;
157151
158- return true ;
159- }
152+ // return true;
153+ // }
160154
161155
162156
0 commit comments