Sculpt: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r24095...
[blender.git] / source / blender / blenlib / BLI_pbvh.h
1 struct MFace;
2 struct MVert;
3 struct PBVH;
4
5 /* Returns 1 if the search should continue from this node, 0 otherwise */
6 typedef int (*BLI_pbvh_SearchCallback)(float bb_min[3], float bb_max[3],
7                                        void *data);
8
9 typedef void (*BLI_pbvh_HitCallback)(const int *face_indices,
10                                      const int *vert_indices,
11                                      int totface, int totvert, void *data);
12 int BLI_pbvh_search_range(float bb_min[3], float bb_max[3], void *data_v);
13
14 typedef enum {
15         PBVH_SEARCH_NORMAL,
16
17         /* When the callback returns a 1 for a leaf node, that node will be
18            marked as modified */
19         PBVH_SEARCH_MARK_MODIFIED,
20         
21         /* Update gpu data for modified nodes. Also clears the Modified flag. */
22         PBVH_SEARCH_MODIFIED,
23
24         
25         PBVH_SEARCH_UPDATE
26 } PBVH_SearchMode;
27
28 /* Pass the node as data to the callback */
29 #define PBVH_NodeData (void*)0xa
30 /* Pass the draw buffers as data to the callback */
31 #define PBVH_DrawData (void*)0xb
32
33 void BLI_pbvh_search(struct PBVH *bvh, BLI_pbvh_SearchCallback scb,
34                      void *search_data, BLI_pbvh_HitCallback hcb,
35                      void *hit_data, PBVH_SearchMode mode);
36
37 /* The hit callback is called for all leaf nodes intersecting the ray;
38    it's up to the callback to find the primitive within the leaves that is
39    hit first */
40 void BLI_pbvh_raycast(struct PBVH *bvh, BLI_pbvh_HitCallback cb, void *data,
41                       float ray_start[3], float ray_normal[3]);
42
43
44 int BLI_pbvh_update_search_cb(float bb_min[3], float bb_max[3], void *data_v);
45
46 /* Get the bounding box around all nodes that have been marked as modified. */
47 void BLI_pbvh_modified_bounding_box(struct PBVH *bvh,
48                                     float bb_min[3], float bb_max[3]);
49 void BLI_pbvh_reset_modified_bounding_box(struct PBVH *bvh);
50
51 /* Lock is off by default, turn on to stop redraw from clearing the modified
52    flag from nodes */
53 void BLI_pbvh_toggle_modified_lock(struct PBVH *bvh);
54
55
56
57 struct PBVH *BLI_pbvh_new(BLI_pbvh_HitCallback update_cb, void *update_cb_data);
58 void BLI_pbvh_build(struct PBVH *bvh, struct MFace *faces, struct MVert *verts,
59                     int totface, int totvert);
60 void BLI_pbvh_free(struct PBVH *bvh);
61
62 void BLI_pbvh_set_source(struct PBVH *bvh, struct MVert *, struct MFace *mface);