7965a055c92f0e83882107331733f29164382b52
[blender.git] / intern / bsp / intern / BSP_FragTree.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 BSP_FragTree_h
33
34 #define BSP_FragTree_h
35
36 class BSP_FragNode;
37
38 #include "MEM_SmartPtr.h"
39 #include "MEM_NonCopyable.h"
40 #include "BSP_MeshPrimitives.h"
41
42 class BSP_CSGMesh;
43 class BSP_MeshFragment;
44 class BSP_CSGISplitter;
45
46 class BSP_FragTree : public MEM_NonCopyable
47 {
48 public :
49
50         /**
51          * Create a new BSP_FragTree allocated
52          * on the heap for mesh. Note mesh will 
53          * be divided up by this operation. If you
54          * want to retain the original mesh make a copy 
55          * of it first.
56          */
57         
58         static
59                 MEM_SmartPtr<BSP_FragTree>
60         New(
61                 BSP_CSGMesh *mesh,
62                 BSP_CSGISplitter & splitter
63         );
64         
65
66         /**
67          * Push a mesh fragment down the tree,
68          * splitting the mesh as it goes. 
69          * upon reaching leaves it puts polygons from fragments
70          * of type keep into the output fragment.
71          */
72
73                 void
74         Push(
75                 BSP_MeshFragment *in_frag,
76                 BSP_MeshFragment *output,
77                 const BSP_Classification keep,
78                 const BSP_Classification current,
79                 const bool dominant,
80                 BSP_CSGISplitter & splitter
81         ); 
82
83                 void
84         Classify(
85                 BSP_CSGMesh *mesh,
86                 BSP_MeshFragment *in_frag,
87                 BSP_MeshFragment *out_frag,
88                 BSP_MeshFragment *on_frag,
89                 BSP_CSGISplitter & splitter
90         );
91
92
93         ~BSP_FragTree(
94         );
95
96 private :
97
98         friend class BSP_FragNode;
99
100         BSP_FragTree(
101         );
102
103         BSP_FragTree(
104                 BSP_CSGMesh *mesh
105         );
106
107                 void
108         Build(
109                 BSP_MeshFragment * frag,
110                 BSP_CSGISplitter & splitter
111         );
112
113
114                 void
115         Classify(
116                 BSP_MeshFragment * frag,
117                 BSP_MeshFragment *in_frag,
118                 BSP_MeshFragment *out_frag,
119                 BSP_MeshFragment *on_frag,
120                 const BSP_Classification current,
121                 BSP_CSGISplitter & splitter
122         );
123
124 private :
125
126         /**
127          * pointer to the mesh for this tree.
128          * Tree is only valid whilst mesh is around.
129          */
130
131         BSP_CSGMesh *m_mesh;
132         
133         /**
134          * The node owned by this tree.
135          */
136
137         MEM_SmartPtr<BSP_FragNode> m_node;
138         
139 };
140
141
142 #endif
143
144
145
146