Merge branch 'blender2.7'
[blender.git] / source / blender / blenkernel / intern / pbvh_intern.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 #ifndef __PBVH_INTERN_H__
18 #define __PBVH_INTERN_H__
19
20 /** \file \ingroup bli
21  */
22
23 /* Axis-aligned bounding box */
24 typedef struct {
25         float bmin[3], bmax[3];
26 } BB;
27
28 /* Axis-aligned bounding box with centroid */
29 typedef struct {
30         float bmin[3], bmax[3], bcentroid[3];
31 } BBC;
32
33 /* Note: this structure is getting large, might want to split it into
34  * union'd structs */
35 struct PBVHNode {
36         /* Opaque handle for drawing code */
37         struct GPU_PBVH_Buffers *draw_buffers;
38
39         /* Voxel bounds */
40         BB vb;
41         BB orig_vb;
42
43         /* For internal nodes, the offset of the children in the PBVH
44          * 'nodes' array. */
45         int children_offset;
46
47         /* Pointer into the PBVH prim_indices array and the number of
48          * primitives used by this leaf node.
49          *
50          * Used for leaf nodes in both mesh- and multires-based PBVHs.
51          */
52         int *prim_indices;
53         unsigned int totprim;
54
55         /* Array of indices into the mesh's MVert array. Contains the
56          * indices of all vertices used by faces that are within this
57          * node's bounding box.
58          *
59          * Note that a vertex might be used by a multiple faces, and
60          * these faces might be in different leaf nodes. Such a vertex
61          * will appear in the vert_indices array of each of those leaf
62          * nodes.
63          *
64          * In order to support cases where you want access to multiple
65          * nodes' vertices without duplication, the vert_indices array
66          * is ordered such that the first part of the array, up to
67          * index 'uniq_verts', contains "unique" vertex indices. These
68          * vertices might not be truly unique to this node, but if
69          * they appear in another node's vert_indices array, they will
70          * be above that node's 'uniq_verts' value.
71          *
72          * Used for leaf nodes in a mesh-based PBVH (not multires.)
73          */
74         const int *vert_indices;
75         unsigned int uniq_verts, face_verts;
76
77         /* An array mapping face corners into the vert_indices
78          * array. The array is sized to match 'totprim', and each of
79          * the face's corners gets an index into the vert_indices
80          * array, in the same order as the corners in the original
81          * MLoopTri.
82          *
83          * Used for leaf nodes in a mesh-based PBVH (not multires.)
84          */
85         const int (*face_vert_indices)[3];
86
87         /* Indicates whether this node is a leaf or not; also used for
88          * marking various updates that need to be applied. */
89         PBVHNodeFlags flag : 16;
90
91         /* Used for raycasting: how close bb is to the ray point. */
92         float tmin;
93
94         /* Scalar displacements for sculpt mode's layer brush. */
95         float *layer_disp;
96
97         int proxy_count;
98         PBVHProxyNode *proxies;
99
100         /* Dyntopo */
101         GSet *bm_faces;
102         GSet *bm_unique_verts;
103         GSet *bm_other_verts;
104         float (*bm_orco)[3];
105         int (*bm_ortri)[3];
106         int bm_tot_ortri;
107 };
108
109 typedef enum {
110         PBVH_DYNTOPO_SMOOTH_SHADING = 1,
111 } PBVHFlags;
112
113 typedef struct PBVHBMeshLog PBVHBMeshLog;
114
115 struct PBVH {
116         PBVHType type;
117         PBVHFlags flags;
118
119         PBVHNode *nodes;
120         int node_mem_count, totnode;
121
122         int *prim_indices;
123         int totprim;
124         int totvert;
125
126         int leaf_limit;
127
128         /* Mesh data */
129         MVert *verts;
130         const MPoly *mpoly;
131         const MLoop *mloop;
132         const MLoopTri *looptri;
133         CustomData *vdata;
134
135         /* Grid Data */
136         CCGKey gridkey;
137         CCGElem **grids;
138         void **gridfaces;
139         const DMFlagMat *grid_flag_mats;
140         int totgrid;
141         BLI_bitmap **grid_hidden;
142
143         /* Only used during BVH build and update,
144          * don't need to remain valid after */
145         BLI_bitmap *vert_bitmap;
146
147 #ifdef PERFCNTRS
148         int perf_modified;
149 #endif
150
151         /* flag are verts/faces deformed */
152         bool deformed;
153
154         bool show_diffuse_color;
155         bool show_mask;
156
157         /* Dynamic topology */
158         BMesh *bm;
159         float bm_max_edge_len;
160         float bm_min_edge_len;
161         int cd_vert_node_offset;
162         int cd_face_node_offset;
163
164         struct BMLog *bm_log;
165 };
166
167 /* pbvh.c */
168 void BB_reset(BB *bb);
169 void BB_expand(BB *bb, const float co[3]);
170 void BB_expand_with_bb(BB *bb, BB *bb2);
171 void BBC_update_centroid(BBC *bbc);
172 int BB_widest_axis(const BB *bb);
173 void pbvh_grow_nodes(PBVH *bvh, int totnode);
174 bool ray_face_intersection_quad(
175         const float ray_start[3], const float ray_normal[3],
176         const float *t0, const float *t1, const float *t2, const float *t3,
177         float *depth);
178 bool ray_face_intersection_tri(
179         const float ray_start[3], const float ray_normal[3],
180         const float *t0, const float *t1, const float *t2,
181         float *depth);
182
183 bool ray_face_nearest_quad(
184         const float ray_start[3], const float ray_normal[3],
185         const float *t0, const float *t1, const float *t2, const float *t3,
186         float *r_depth, float *r_dist_sq);
187 bool ray_face_nearest_tri(
188         const float ray_start[3], const float ray_normal[3],
189         const float *t0, const float *t1, const float *t2,
190         float *r_depth, float *r_dist_sq);
191
192 void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int totnode, int flag);
193
194 /* pbvh_bmesh.c */
195 bool pbvh_bmesh_node_raycast(
196         PBVHNode *node, const float ray_start[3],
197         const float ray_normal[3], float *dist,
198         bool use_original);
199 bool pbvh_bmesh_node_nearest_to_ray(
200         PBVHNode *node, const float ray_start[3],
201         const float ray_normal[3], float *depth, float *dist_sq,
202         bool use_original);
203
204 void pbvh_bmesh_normals_update(PBVHNode **nodes, int totnode);
205
206 #endif