Sculpt: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r24330...
[blender.git] / source / blender / blenlib / BLI_pbvh.h
1 /**
2  * A BVH for high poly meshes.
3  * 
4  * $Id$
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
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  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #ifndef BLI_PBVH_H
26 #define BLI_PBVH_H
27
28 struct MFace;
29 struct MVert;
30 struct PBVH;
31 struct PBVHNode;
32 struct ListBase;
33
34 typedef struct PBVH PBVH;
35 typedef struct PBVHNode PBVHNode;
36
37 /* Callbacks */
38
39 /* returns 1 if the search should continue from this node, 0 otherwise */
40 typedef int (*BLI_pbvh_SearchCallback)(PBVHNode *node, void *data);
41
42 typedef void (*BLI_pbvh_HitCallback)(PBVHNode *node, void *data);
43
44 /* Building */
45
46 PBVH *BLI_pbvh_new(void);
47 void BLI_pbvh_build(PBVH *bvh, struct MFace *faces, struct MVert *verts,
48                     int totface, int totvert);
49 void BLI_pbvh_free(PBVH *bvh);
50
51 void BLI_pbvh_set_source(PBVH *bvh, struct MVert *, struct MFace *mface);
52
53 /* Hierarchical Search in the BVH, two methods:
54    * for each hit calling a callback
55    * gather nodes in an array (easy to multithread) */
56
57 void BLI_pbvh_search_callback(PBVH *bvh,
58         BLI_pbvh_SearchCallback scb, void *search_data,
59         BLI_pbvh_HitCallback hcb, void *hit_data);
60
61 void BLI_pbvh_search_gather(PBVH *bvh,
62         BLI_pbvh_SearchCallback scb, void *search_data,
63         PBVHNode ***array, int *tot);
64
65 /* Raycast
66    the hit callback is called for all leaf nodes intersecting the ray;
67    it's up to the callback to find the primitive within the leaves that is
68    hit first */
69
70 void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitCallback cb, void *data,
71                       float ray_start[3], float ray_normal[3], int original);
72
73 /* Node Access */
74
75 typedef enum {
76         PBVH_Leaf = 1,
77
78         PBVH_UpdateNormals = 2,
79         PBVH_UpdateBB = 4,
80         PBVH_UpdateOriginalBB = 4,
81         PBVH_UpdateDrawBuffers = 8,
82         PBVH_UpdateRedraw = 16
83 } PBVHNodeFlags;
84
85 void BLI_pbvh_node_mark_update(PBVHNode *node);
86
87 void BLI_pbvh_node_get_verts(PBVHNode *node, int **vert_indices,
88         int *totvert, int *allverts);
89 void BLI_pbvh_node_get_faces(PBVHNode *node, int **face_indices,
90         int **face_vert_indices, int *totface);
91 void *BLI_pbvh_node_get_draw_buffers(PBVHNode *node);
92 void BLI_pbvh_node_get_BB(PBVHNode *node, float bb_min[3], float bb_max[3]);
93 void BLI_pbvh_node_get_original_BB(PBVHNode *node, float bb_min[3], float bb_max[3]);
94
95 /* Update Normals/Bounding Box/Draw Buffers/Redraw and clear flags */
96
97 void BLI_pbvh_update(PBVH *bvh, int flags, float (*face_nors)[3]);
98 void BLI_pbvh_redraw_BB(PBVH *bvh, float bb_min[3], float bb_max[3]);
99
100 #endif /* BLI_PBVH_H */
101