Commit: ed15d0c1b9bfa004ad21942fda071663b99f7c4f Author: Joseph Eagar Date: Tue Apr 13 01:08:05 2021 -0700 Branches: temp_bmesh_multires https://developer.blender.org/rBed15d0c1b9bfa004ad21942fda071663b99f7c4f
Fix infinite loop bug =================================================================== M source/blender/blenkernel/BKE_pbvh.h M source/blender/blenkernel/intern/pbvh.c M source/blender/blenkernel/intern/pbvh_bmesh.c M source/blender/blenkernel/intern/pbvh_intern.h M source/blender/editors/sculpt_paint/sculpt.c M source/blender/editors/sculpt_paint/sculpt_detail.c M source/blender/editors/sculpt_paint/sculpt_intern.h =================================================================== diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h index 0e0ab799fe6..d804bd6e7bc 100644 --- a/source/blender/blenkernel/BKE_pbvh.h +++ b/source/blender/blenkernel/BKE_pbvh.h @@ -33,11 +33,13 @@ extern "C" { #endif -typedef struct { - int64_t i; +typedef struct SculptVertRef { + intptr_t i; } SculptVertRef; -typedef SculptVertRef SculptFaceRef; +typedef struct SculptFaceRef { + intptr_t i; +} SculptFaceRef; BLI_INLINE SculptVertRef BKE_pbvh_make_vref(intptr_t i) { @@ -51,6 +53,23 @@ BLI_INLINE SculptFaceRef BKE_pbvh_make_fref(intptr_t i) return ret; } +typedef struct PBVHTri { + int v[3]; // references into PBVHTriBuf->verts + + float no[3]; + SculptFaceRef f; +} PBVHTri; + +typedef struct PBVHTriBuf { + PBVHTri *tris; + SculptVertRef *verts; + int tottri, totvert; + + //private field + intptr_t *loops; + int totloop; +} PBVHTriBuf; + struct BMLog; struct BMesh; struct BMVert; @@ -175,7 +194,8 @@ typedef enum { PBVH_UpdateTopology = 1 << 13, PBVH_UpdateColor = 1 << 14, PBVH_Delete = 1 << 15, - PBVH_UpdateCurvatureDir = 1 << 16 + PBVH_UpdateCurvatureDir = 1 << 16, + PBVH_UpdateTris = 1 << 17 } PBVHNodeFlags; typedef struct PBVHFrustumPlanes { @@ -234,10 +254,17 @@ void BKE_pbvh_free(PBVH *pbvh); /** update original data, only data whose r_** parameters are passed in will be updated*/ void BKE_pbvh_bmesh_update_origvert( - PBVH *pbvh, struct BMVert *v, float **r_co, float **r_no, float **r_color); + PBVH *pbvh, struct BMVert *v, float **r_co, float **r_no, float **r_color, bool log_undo); void BKE_pbvh_update_origcolor_bmesh(PBVH *pbvh, PBVHNode *node); void BKE_pbvh_update_origco_bmesh(PBVH *pbvh, PBVHNode *node); +/** +checks if original data needs to be updated for v, and if so updates it. Stroke_id +is provided by the sculpt code and is used to detect updates. The reason we do it +inside the verts and not in the nodes is to allow splitting of the pbvh during the stroke. +*/ +bool BKE_pbvh_bmesh_check_origdata(PBVH *pbvh, struct BMVert *v, int stroke_id); + /* Hierarchical Search in the BVH, two methods: * - for each hit calling a callback * - gather nodes in an array (easy to multithread) */ @@ -261,7 +288,8 @@ void BKE_pbvh_raycast(PBVH *pbvh, void *data, const float ray_start[3], const float ray_normal[3], - bool original); + bool original, + int stroke_id); bool BKE_pbvh_node_raycast(PBVH *pbvh, PBVHNode *node, @@ -273,9 +301,11 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh, float *depth, SculptVertRef *active_vertex_index, SculptFaceRef *active_face_grid_index, - float *face_normal); + float *face_normal, + int stroke_id); -bool BKE_pbvh_bmesh_node_raycast_detail(PBVHNode *node, +bool BKE_pbvh_bmesh_node_raycast_detail(PBVH *pbvh, + PBVHNode *node, const float ray_start[3], struct IsectRayPrecalc *isect_precalc, float *depth, @@ -300,7 +330,8 @@ bool BKE_pbvh_node_find_nearest_to_ray(PBVH *pbvh, const float ray_start[3], const float ray_normal[3], float *depth, - float *dist_sq); + float *dist_sq, + int stroke_id); /* Drawing */ @@ -355,7 +386,7 @@ void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size, float detail_ typedef enum { PBVH_Subdivide = 1, PBVH_Collapse = 2, - PBVH_Cleanup = 4, //dissolve verts surrounded by either 3 or 4 triangles then triangulate + PBVH_Cleanup = 4, // dissolve verts surrounded by either 3 or 4 triangles then triangulate } PBVHTopologyUpdateMode; bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh, PBVHTopologyUpdateMode mode, @@ -422,7 +453,8 @@ bool BKE_pbvh_node_frustum_exclude_AABB(PBVHNode *node, void *frustum); struct TableGSet *BKE_pbvh_bmesh_node_unique_verts(PBVHNode *node); struct TableGSet *BKE_pbvh_bmesh_node_other_verts(PBVHNode *node); struct TableGSet *BKE_pbvh_bmesh_node_faces(PBVHNode *node); -void BKE_pbvh_bmesh_node_save_ortri(struct BMesh *bm, PBVHNode *node); + +// now generated PBVHTris void BKE_pbvh_bmesh_after_stroke(PBVH *pbvh); /* Update Bounding Box/Redraw and clear flags */ @@ -622,10 +654,6 @@ void BKE_pbvh_node_get_proxies(PBVHNode *node, PBVHProxyNode **proxies, int *pro void BKE_pbvh_node_free_proxies(PBVHNode *node); PBVHProxyNode *BKE_pbvh_node_add_proxy(PBVH *pbvh, PBVHNode *node); void BKE_pbvh_gather_proxies(PBVH *pbvh, PBVHNode ***r_array, int *r_tot); -void BKE_pbvh_node_get_bm_orco_data(PBVHNode *node, - int (**r_orco_tris)[3], - int *r_orco_tris_num, - float (**r_orco_coords)[3]); bool BKE_pbvh_node_vert_update_check_any(PBVH *pbvh, PBVHNode *node); @@ -661,6 +689,10 @@ bool BKE_pbvh_curvature_update_get(PBVHNode *node); int BKE_pbvh_get_totnodes(PBVH *pbvh); +void BKE_pbvh_bmesh_check_tris(PBVH *pbvh, PBVHNode *node); +PBVHTriBuf *BKE_pbvh_bmesh_get_tris(PBVH *pbvh, PBVHNode *node); +void BKE_pbvh_bmesh_free_tris(PBVH *pbvh, PBVHNode *node); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index 8d44655e59c..ef2b091630d 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -250,7 +250,7 @@ void pbvh_grow_nodes(PBVH *pbvh, int totnode) pbvh->totnode = totnode; - for (int i=0; i<pbvh->totnode; i++) { + for (int i = 0; i < pbvh->totnode; i++) { PBVHNode *node = pbvh->nodes + i; if (!node->id) { @@ -1866,19 +1866,23 @@ void BKE_pbvh_node_mark_normals_update(PBVHNode *node) node->flag |= PBVH_UpdateNormals | PBVH_UpdateCurvatureDir; } -void BKE_pbvh_node_mark_curvature_update(PBVHNode *node) { +void BKE_pbvh_node_mark_curvature_update(PBVHNode *node) +{ node->flag |= PBVH_UpdateCurvatureDir; } -void BKE_pbvh_curvature_update_set(PBVHNode *node, bool state) { +void BKE_pbvh_curvature_update_set(PBVHNode *node, bool state) +{ if (state) { node->flag |= PBVH_UpdateCurvatureDir; - } else { + } + else { node->flag &= ~PBVH_UpdateCurvatureDir; } } -bool BKE_pbvh_curvature_update_get(PBVHNode *node) { +bool BKE_pbvh_curvature_update_get(PBVHNode *node) +{ return node->flag & PBVH_UpdateCurvatureDir; } @@ -2073,16 +2077,6 @@ void BKE_pbvh_node_get_proxies(PBVHNode *node, PBVHProxyNode **proxies, int *pro } } -void BKE_pbvh_node_get_bm_orco_data(PBVHNode *node, - int (**r_orco_tris)[3], - int *r_orco_tris_num, - float (**r_orco_coords)[3]) -{ - *r_orco_tris = node->bm_ortri; - *r_orco_tris_num = node->bm_tot_ortri; - *r_orco_coords = node->bm_orco; -} - /** * \note doing a full search on all vertices here seems expensive, * however this is important to avoid having to recalculate bound-box & sync the buffers to the @@ -2111,6 +2105,7 @@ bool BKE_pbvh_node_vert_update_check_any(PBVH *pbvh, PBVHNode *node) typedef struct { struct IsectRayAABB_Precalc ray; bool original; + int stroke_id; } RaycastData; static bool ray_aabb_intersect(PBVHNode *node, void *data_v) @@ -2137,12 +2132,14 @@ void BKE_pbvh_raycast(PBVH *pbvh, void *data, const float ray_start[3], const float ray_normal[3], - bool original) + bool original, + int stroke_id) { RaycastData rcd; isect_ray_aabb_v3_precalc(&rcd.ray, ray_start, ray_normal); rcd.original = original; + rcd.stroke_id = stroke_id; BKE_pbvh_search_callback_occluded(pbvh, ray_aabb_intersect, &rcd, cb, data); } @@ -2431,7 +2428,8 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh, float *depth, SculptVertRef *active_vertex_index, SculptFaceRef *active_face_grid_index, - float *face_normal) + float *face_normal, + int stroke_id) { bool hit = false; @@ -2466,7 +2464,9 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh, break; case PBVH_BMESH: // BM_mesh_elem_index_ensure(pbvh->bm, BM_VERT); - hit = pbvh_bmesh_node_raycast(node, + + hit = pbvh_bmesh_node_raycast(pbvh, + node, ray_start, ray_normal, isect_precalc, @@ -2474,7 +2474,8 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh, use_origco, active_vertex_index, active_face_grid_index, - face_normal); + face_normal, + stroke_id); break; } @@ -2689,7 +2690,8 @@ bool BKE_pbvh_node_find_nearest_to_ray(PBVH *pbvh, const float ray_start[3], const float ray_normal[3], float *depth, - float *dist_sq) + float *dist_sq, + int stroke_id) { bool hit = false; @@ -2708,7 +2710,7 @@ bool BKE_pbvh_node_find_nearest_to_ray(PBVH *pbvh, break; case PBVH_BMESH: hit = pbvh_bmesh_node_nea @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs