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