fixed spacing in the headers to get rid of some warnings and some other
[blender.git] / intern / bsp / intern / BSP_MeshFragment.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 #ifndef NAN_INCLUDED_BSP_MeshFragment_h
33
34 #define NAN_INCLUDED_BSP_MeshFragment_h
35
36 #define BSP_SPLIT_EPSILON MT_Scalar(1e-5)
37
38 #include <vector>
39 #include "BSP_MeshPrimitives.h"
40
41
42 class BSP_CSGMesh;
43 class MT_Plane3;
44 /**
45  * This class encodes a collection of polygons from a mesh.
46  * This class only remains valid when mesh indices do not change
47  * internally and of course whilst the mesh is still around.
48  *
49  * Polygons in the mesh point back to the unique mesh fragment
50  * containing them. 
51  */
52
53
54 class BSP_MeshFragment  {
55 public:
56
57         BSP_MeshFragment(
58                 BSP_CSGMesh *mesh,
59                 BSP_Classification classification
60         );
61
62                 std::vector<BSP_FaceInd> &
63         FaceSet(
64         ) ;
65
66         const 
67                 std::vector<BSP_FaceInd> &
68         FaceSet(
69         ) const ;
70
71                 BSP_CSGMesh *
72         Mesh(
73         );
74
75                 BSP_CSGMesh *
76         Mesh(
77         ) const;
78
79         
80         // Classify this mesh fragment with respect
81         // to plane. The index sets of this fragment
82         // are consumed by this action. Vertices
83         // are tagged with a classification enum.
84
85                 void
86         Classify(
87                 const MT_Plane3 & plane,
88                 BSP_MeshFragment * in_frag,
89                 BSP_MeshFragment * out_frag,
90                 BSP_MeshFragment * on_frag,
91                 std::vector<BSP_FaceInd> & spanning_faces,
92                 std::vector<BSP_VertexInd> & visited_verts
93         );
94         
95         // Classify all the vertices and faces of mesh, generate
96         // in,out and on mesh fragments.
97
98         static
99                 void
100         Classify(
101                 BSP_CSGMesh & mesh,
102                 const MT_Plane3 & plane,
103                 BSP_MeshFragment * in_frag,
104                 BSP_MeshFragment * out_frag,
105                 BSP_MeshFragment * on_frag,
106                 std::vector<BSP_FaceInd> & spanning_faces,
107                 std::vector<BSP_VertexInd> & visited_verts
108         );
109
110         // Classify the on fragment into
111         // 2 sets, the +ve on frags those whose polygon
112         // normals point in the same direction as the plane,
113         // and the -ve frag whose normals point in the other direction.
114
115                 void
116         ClassifyOnFragments(
117                 const MT_Plane3 &plane,
118                 BSP_MeshFragment *pos_frag,
119                 BSP_MeshFragment *neg_frag
120         );
121
122
123         ~BSP_MeshFragment(
124         );
125
126         /**
127          * Sanity checkers.
128          */
129
130
131 private:
132
133         // Classify the polygon wrt to the plane
134         static
135                 BSP_Classification 
136         ClassifyPolygon(
137                 const MT_Plane3 &plane,
138                 const BSP_MFace & face,
139                 std::vector<BSP_MVertex>::const_iterator verts,
140                 std::vector<BSP_VertexInd> & visited_verts
141         );
142
143 private :
144
145
146         BSP_CSGMesh * m_mesh;
147         BSP_Classification m_classification;
148         std::vector<BSP_FaceInd> m_faces;
149 };
150
151
152 #endif
153