Cleanup: commas at the end of enums
[blender.git] / source / blender / blenkernel / intern / pbvh_intern.h
index b3f7bf6e3d16f58a90af71b28bcd430dfef0a69f..1f85b4b227bcca89dd52bf448e909219554bcbd4 100644 (file)
 #ifndef __PBVH_INTERN_H__
 #define __PBVH_INTERN_H__
 
+/** \file blender/blenkernel/intern/pbvh_intern.h
+ *  \ingroup bli
+ */
+
 /* Axis-aligned bounding box */
 typedef struct {
        float bmin[3], bmax[3];
@@ -35,7 +39,7 @@ typedef struct {
  * union'd structs */
 struct PBVHNode {
        /* Opaque handle for drawing code */
-       struct GPU_Buffers *draw_buffers;
+       struct GPU_PBVH_Buffers *draw_buffers;
 
        /* Voxel bounds */
        BB vb;
@@ -72,19 +76,18 @@ struct PBVHNode {
         *
         * Used for leaf nodes in a mesh-based PBVH (not multires.)
         */
-       int *vert_indices;
+       const int *vert_indices;
        unsigned int uniq_verts, face_verts;
 
        /* An array mapping face corners into the vert_indices
         * array. The array is sized to match 'totprim', and each of
         * the face's corners gets an index into the vert_indices
         * array, in the same order as the corners in the original
-        * MFace. The fourth value should not be used if the original
-        * face is a triangle.
+        * MLoopTri.
         *
         * Used for leaf nodes in a mesh-based PBVH (not multires.)
         */
-       int (*face_vert_indices)[4];
+       const int (*face_vert_indices)[3];
 
        /* Indicates whether this node is a leaf or not; also used for
         * marking various updates that need to be applied. */
@@ -100,16 +103,16 @@ struct PBVHNode {
        PBVHProxyNode *proxies;
 
        /* Dyntopo */
-       GHash *bm_faces;
-       GHash *bm_unique_verts;
-       GHash *bm_other_verts;
+       GSet *bm_faces;
+       GSet *bm_unique_verts;
+       GSet *bm_other_verts;
        float (*bm_orco)[3];
        int (*bm_ortri)[3];
        int bm_tot_ortri;
 };
 
 typedef enum {
-       PBVH_DYNTOPO_SMOOTH_SHADING = 1
+       PBVH_DYNTOPO_SMOOTH_SHADING = 1,
 } PBVHFlags;
 
 typedef struct PBVHBMeshLog PBVHBMeshLog;
@@ -129,37 +132,44 @@ struct PBVH {
 
        /* Mesh data */
        MVert *verts;
-       MFace *faces;
+       const MPoly *mpoly;
+       const MLoop *mloop;
+       const MLoopTri *looptri;
        CustomData *vdata;
 
        /* Grid Data */
        CCGKey gridkey;
        CCGElem **grids;
-       DMGridAdjacency *gridadj;
        void **gridfaces;
        const DMFlagMat *grid_flag_mats;
        int totgrid;
-       BLI_bitmap *grid_hidden;
+       BLI_bitmap **grid_hidden;
+       /* index_buf of GPU_PBVH_Buffers can be the same for all 'fully drawn' nodes (same size).
+        * Previously was stored in a static var in gpu_buffer.c, but this breaks in case we handle several different
+        * objects in sculpt mode with different sizes at the same time, so now storing that common gpu buffer
+        * in an opaque pointer per pbvh. See T47637. */
+       struct GridCommonGPUBuffer *grid_common_gpu_buffer;
 
        /* Only used during BVH build and update,
         * don't need to remain valid after */
-       BLI_bitmap vert_bitmap;
+       BLI_bitmap *vert_bitmap;
 
 #ifdef PERFCNTRS
        int perf_modified;
 #endif
 
        /* flag are verts/faces deformed */
-       int deformed;
+       bool deformed;
 
-       int show_diffuse_color;
+       bool show_diffuse_color;
+       bool show_mask;
 
        /* Dynamic topology */
        BMesh *bm;
-       GHash *bm_face_to_node;
-       GHash *bm_vert_to_node;
        float bm_max_edge_len;
        float bm_min_edge_len;
+       int cd_vert_node_offset;
+       int cd_face_node_offset;
 
        struct BMLog *bm_log;
 };
@@ -171,15 +181,35 @@ void BB_expand_with_bb(BB *bb, BB *bb2);
 void BBC_update_centroid(BBC *bbc);
 int BB_widest_axis(const BB *bb);
 void pbvh_grow_nodes(PBVH *bvh, int totnode);
-int ray_face_intersection(const float ray_start[3], const float ray_normal[3],
-                                                 const float *t0, const float *t1, const float *t2,
-                                                 const float *t3, float *fdist);
+bool ray_face_intersection_quad(
+        const float ray_start[3], const float ray_normal[3],
+        const float *t0, const float *t1, const float *t2, const float *t3,
+        float *depth);
+bool ray_face_intersection_tri(
+        const float ray_start[3], const float ray_normal[3],
+        const float *t0, const float *t1, const float *t2,
+        float *depth);
+
+bool ray_face_nearest_quad(
+        const float ray_start[3], const float ray_normal[3],
+        const float *t0, const float *t1, const float *t2, const float *t3,
+        float *r_depth, float *r_dist_sq);
+bool ray_face_nearest_tri(
+        const float ray_start[3], const float ray_normal[3],
+        const float *t0, const float *t1, const float *t2,
+        float *r_depth, float *r_dist_sq);
+
 void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int totnode, int flag);
 
 /* pbvh_bmesh.c */
-int pbvh_bmesh_node_raycast(PBVHNode *node, const float ray_start[3],
-                                                       const float ray_normal[3], float *dist,
-                                                       int use_original);
+bool pbvh_bmesh_node_raycast(
+        PBVHNode *node, const float ray_start[3],
+        const float ray_normal[3], float *dist,
+        bool use_original);
+bool pbvh_bmesh_node_nearest_to_ray(
+        PBVHNode *node, const float ray_start[3],
+        const float ray_normal[3], float *depth, float *dist_sq,
+        bool use_original);
 
 void pbvh_bmesh_normals_update(PBVHNode **nodes, int totnode);