Reverted incorrect merge (missing files)
[blender.git] / extern / solid / src / convex / DT_Facet.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 #include "DT_Facet.h"
25
26 bool DT_Facet::link(int edge0, DT_Facet *facet, int edge1) 
27 {
28     m_adjFacets[edge0] = facet;
29     m_adjEdges[edge0] = edge1;
30     facet->m_adjFacets[edge1] = this;
31     facet->m_adjEdges[edge1] = edge0;
32
33     bool b = m_indices[edge0] == facet->m_indices[incMod3(edge1)] &&
34         m_indices[incMod3(edge0)] == facet->m_indices[edge1];
35     return b;
36 }
37
38 bool DT_Facet::computeClosest(const MT_Vector3 *verts)
39 {
40     const MT_Vector3& p0 = verts[m_indices[0]]; 
41
42     MT_Vector3 v1 = verts[m_indices[1]] - p0;
43     MT_Vector3 v2 = verts[m_indices[2]] - p0;
44     MT_Scalar v1dv1 = v1.length2();
45     MT_Scalar v1dv2 = v1.dot(v2);
46     MT_Scalar v2dv2 = v2.length2();
47     MT_Scalar p0dv1 = p0.dot(v1); 
48     MT_Scalar p0dv2 = p0.dot(v2);
49     
50     m_det = v1dv1 * v2dv2 - v1dv2 * v1dv2; // non-negative
51     m_lambda1 = p0dv2 * v1dv2 - p0dv1 * v2dv2;
52     m_lambda2 = p0dv1 * v1dv2 - p0dv2 * v1dv1; 
53     
54     if (m_det > MT_Scalar(0.0)) {       
55         m_closest = p0 + (m_lambda1 * v1 + m_lambda2 * v2) / m_det;
56         m_dist2 = m_closest.length2();
57         return true;
58     }
59     
60     return false;
61
62
63 void DT_Facet::silhouette(int index, const MT_Vector3& w, 
64                           DT_EdgeBuffer& edgeBuffer) 
65 {
66     if (!m_obsolete) {
67                 if (m_closest.dot(w) < m_dist2) {
68                         edgeBuffer.push_back(DT_Edge(this, index));
69                 }       
70         else {
71             m_obsolete = true; // Facet is visible 
72             int next = incMod3(index);
73             m_adjFacets[next]->silhouette(m_adjEdges[next], w, edgeBuffer);
74             next = incMod3(next);
75             m_adjFacets[next]->silhouette(m_adjEdges[next], w, edgeBuffer);
76         }
77     }
78 }
79
80