Sculpt: Multithreading & PBVH Changes
[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,
41         float bb_min[3], float bb_max[3], void *data);
42
43 typedef void (*BLI_pbvh_HitCallback)(PBVHNode *node, void *data);
44
45 /* Building */
46
47 PBVH *BLI_pbvh_new(void);
48 void BLI_pbvh_build(PBVH *bvh, struct MFace *faces, struct MVert *verts,
49                     int totface, int totvert);
50 void BLI_pbvh_free(PBVH *bvh);
51
52 void BLI_pbvh_set_source(PBVH *bvh, struct MVert *, struct MFace *mface);
53
54 /* Hierarchical Search in the BVH, two methods:
55    * for each hit calling a callback
56    * gather nodes in an array (easy to multithread) */
57
58 void BLI_pbvh_search_callback(PBVH *bvh,
59         BLI_pbvh_SearchCallback scb, void *search_data,
60         BLI_pbvh_HitCallback hcb, void *hit_data);
61
62 void BLI_pbvh_search_gather(PBVH *bvh,
63         BLI_pbvh_SearchCallback scb, void *search_data,
64         PBVHNode ***array, int *tot);
65
66 /* Raycast
67    the hit callback is called for all leaf nodes intersecting the ray;
68    it's up to the callback to find the primitive within the leaves that is
69    hit first */
70
71 void BLI_pbvh_raycast(PBVH *bvh, BLI_pbvh_HitCallback cb, void *data,
72                       float ray_start[3], float ray_normal[3]);
73
74 /* Node Access */
75
76 typedef enum {
77         PBVH_Leaf = 1,
78
79         PBVH_UpdateNormals = 2,
80         PBVH_UpdateBB = 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, int *totvert);
88 void BLI_pbvh_node_get_faces(PBVHNode *node, int **face_indices, int *totface);
89 void *BLI_pbvh_node_get_draw_buffers(PBVHNode *node);
90
91 /* Update Normals/Bounding Box/Draw Buffers/Redraw and clear flags */
92
93 void BLI_pbvh_update(PBVH *bvh, int flags,
94         float (*face_nors)[3], struct ListBase *fmap);
95 void BLI_pbvh_redraw_bounding_box(PBVH *bvh, float bb_min[3], float bb_max[3]);
96
97 #endif /* BLI_PBVH_H */
98