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