Fix T67315: Redo transform disables snap
[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   CustomData *ldata;
136
137   /* Grid Data */
138   CCGKey gridkey;
139   CCGElem **grids;
140   void **gridfaces;
141   const DMFlagMat *grid_flag_mats;
142   int totgrid;
143   BLI_bitmap **grid_hidden;
144
145   /* Only used during BVH build and update,
146    * don't need to remain valid after */
147   BLI_bitmap *vert_bitmap;
148
149 #ifdef PERFCNTRS
150   int perf_modified;
151 #endif
152
153   /* flag are verts/faces deformed */
154   bool deformed;
155
156   bool show_diffuse_color;
157   bool show_mask;
158
159   /* Dynamic topology */
160   BMesh *bm;
161   float bm_max_edge_len;
162   float bm_min_edge_len;
163   int cd_vert_node_offset;
164   int cd_face_node_offset;
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_quad(const float ray_start[3],
177                                 struct IsectRayPrecalc *isect_precalc,
178                                 const float *t0,
179                                 const float *t1,
180                                 const float *t2,
181                                 const float *t3,
182                                 float *depth);
183 bool ray_face_intersection_tri(const float ray_start[3],
184                                struct IsectRayPrecalc *isect_precalc,
185                                const float *t0,
186                                const float *t1,
187                                const float *t2,
188                                float *depth);
189
190 bool ray_face_nearest_quad(const float ray_start[3],
191                            const float ray_normal[3],
192                            const float *t0,
193                            const float *t1,
194                            const float *t2,
195                            const float *t3,
196                            float *r_depth,
197                            float *r_dist_sq);
198 bool ray_face_nearest_tri(const float ray_start[3],
199                           const float ray_normal[3],
200                           const float *t0,
201                           const float *t1,
202                           const float *t2,
203                           float *r_depth,
204                           float *r_dist_sq);
205
206 void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int totnode, int flag);
207
208 /* pbvh_bmesh.c */
209 bool pbvh_bmesh_node_raycast(PBVHNode *node,
210                              const float ray_start[3],
211                              struct IsectRayPrecalc *isect_precalc,
212                              float *dist,
213                              bool use_original);
214 bool pbvh_bmesh_node_nearest_to_ray(PBVHNode *node,
215                                     const float ray_start[3],
216                                     const float ray_normal[3],
217                                     float *depth,
218                                     float *dist_sq,
219                                     bool use_original);
220
221 void pbvh_bmesh_normals_update(PBVHNode **nodes, int totnode);
222
223 #endif