This commit fixes up a bunch of svn properties to hopefully make things a little...
[blender.git] / extern / solid / src / convex / DT_Triangle.cpp
1 /*
2  * SOLID - Software Library for Interference Detection
3  * 
4  * Copyright (C) 2001-2003  Dtecta.  All rights reserved.
5  *
6  * This library may be distributed under the terms of the Q Public License
7  * (QPL) as defined by Trolltech AS of Norway and appearing in the file
8  * LICENSE.QPL included in the packaging of this file.
9  *
10  * This library may be distributed and/or modified under the terms of the
11  * GNU General Public License (GPL) version 2 as published by the Free Software
12  * Foundation and appearing in the file LICENSE.GPL included in the
13  * packaging of this file.
14  *
15  * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17  *
18  * Commercial use or any other use of this library not covered by either 
19  * the QPL or the GPL requires an additional license from Dtecta. 
20  * Please contact info@dtecta.com for enquiries about the terms of commercial
21  * use of this library.
22  */
23
24 //#define BACKFACE_CULLING
25
26 #include "DT_Triangle.h"
27
28 MT_BBox DT_Triangle::bbox() const 
29 {
30         return MT_BBox((*this)[0]).hull((*this)[1]).hull((*this)[2]);
31 }
32
33 MT_Scalar DT_Triangle::supportH(const MT_Vector3& v) const
34 {
35     return GEN_max(GEN_max(v.dot((*this)[0]), v.dot((*this)[1])), v.dot((*this)[2]));
36 }
37
38 MT_Point3 DT_Triangle::support(const MT_Vector3& v) const
39 {
40     MT_Vector3 dots(v.dot((*this)[0]), v.dot((*this)[1]), v.dot((*this)[2]));
41
42         return (*this)[dots.maxAxis()];
43 }
44
45 bool DT_Triangle::ray_cast(const MT_Point3& source, const MT_Point3& target, 
46                                                    MT_Scalar& param, MT_Vector3& normal) const 
47 {
48         MT_Vector3 d1 = (*this)[1] - (*this)[0];
49         MT_Vector3 d2 = (*this)[2] - (*this)[0];
50         MT_Vector3 n = d1.cross(d2);
51         MT_Vector3 r = target - source;
52         MT_Scalar delta = -r.dot(n);
53
54    MT_Scalar rounding_error = GEN_max(GEN_max(MT_abs(n[0]), MT_abs(n[1])), MT_abs(n[2])) * MT_EPSILON; 
55
56 #ifdef BACKFACE_CULLING 
57    if (delta > rounding_error)
58 #else
59         if (MT_abs(delta) > rounding_error)
60 #endif      
61                 // The ray is not parallel to the triangle's plane. 
62                 // (Coplanar rays are ignored.)
63         {
64                 MT_Vector3 b = source - (*this)[0];
65                 MT_Scalar lambda = b.dot(n) / delta;
66
67                 if (MT_Scalar(0.0) <= lambda && lambda <= param)
68                         // The ray intersects the triangle's plane.
69                 {
70                         MT_Vector3 u = b.cross(r);
71                         MT_Scalar mu1 = d2.dot(u) / delta;
72
73                         if (MT_Scalar(0.0) <= mu1 && mu1 <= MT_Scalar(1.0)) 
74                         {
75                                 MT_Scalar mu2 = -d1.dot(u) / delta;
76
77                                 if (MT_Scalar(0.0) <= mu2 && mu1 + mu2 <= MT_Scalar(1.0)) 
78                                         // The ray intersects the triangle.
79                                 {
80                                         param = lambda;
81                                         // Return a normal that points at the source.
82 #ifdef BACKFACE_CULLING
83                normal = n;
84 #else
85                                         normal = delta > MT_Scalar(0.0) ? n : -n;
86 #endif
87                                         return true;
88                                 }
89                         }
90                 }
91         }
92
93         return false;
94 }
95
96