Commit: d88f0b1052a707eab3d0cb077d9ca9c11c0c3663 Author: Joseph Eagar Date: Tue Sep 29 19:34:12 2020 -0700 Branches: temp-trimesh-sculpt https://developer.blender.org/rBd88f0b1052a707eab3d0cb077d9ca9c11c0c3663
More trimesh stuff =================================================================== M source/blender/blenkernel/BKE_paint.h M source/blender/blenkernel/BKE_pbvh.h M source/blender/blenkernel/intern/paint.c M source/blender/blenkernel/intern/pbvh_bmesh.c M source/blender/blenkernel/intern/pbvh_intern.h M source/blender/blenkernel/intern/pbvh_trimesh.c M source/blender/blenlib/BLI_trimesh.h M source/blender/blenlib/intern/BLI_trimesh.c M source/blender/editors/sculpt_paint/sculpt.c =================================================================== diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index 881f3356a86..7fc94ba9b26 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -298,6 +298,9 @@ typedef struct SculptSession { /* Mesh Face Sets */ int *face_sets; + struct BLI_TriMesh *tm; + struct TriMeshLog *tm_log; + /* BMesh for dynamic topology sculpting */ struct BMesh *bm; int cd_vert_node_offset; diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h index a9ff2a3b46a..2f238dd45a3 100644 --- a/source/blender/blenkernel/BKE_pbvh.h +++ b/source/blender/blenkernel/BKE_pbvh.h @@ -118,6 +118,13 @@ void BKE_pbvh_build_bmesh(PBVH *bvh, struct BMLog *log, const int cd_vert_node_offset, const int cd_face_node_offset); +void BKE_pbvh_build_trimesh(PBVH *bvh, + struct BLI_TriMesh *bm, + bool smooth_shading, + struct TriMeshLog *log, + const int cd_vert_node_offset, + const int cd_face_node_offset); + void BKE_pbvh_free(PBVH *bvh); void BKE_pbvh_free_layer_disp(PBVH *bvh); @@ -162,6 +169,11 @@ bool BKE_pbvh_bmesh_node_raycast_detail(PBVHNode *node, struct IsectRayPrecalc *isect_precalc, float *depth, float *r_edge_length); +bool BKE_pbvh_trimesh_node_raycast_detail(PBVHNode *node, + const float ray_start[3], + struct IsectRayPrecalc *isect_precalc, + float *depth, + float *r_edge_length); /* for orthographic cameras, project the far away ray segment points to the root node so * we can have better precision. */ @@ -228,7 +240,8 @@ int BKE_pbvh_get_grid_num_vertices(const PBVH *pbvh); /* Only valid for type == PBVH_BMESH */ struct BMesh *BKE_pbvh_get_bmesh(PBVH *pbvh); -void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size); +struct BLI_TriMesh *BKE_pbvh_get_trimesh(PBVH *pbvh); +void BKE_pbvh_topology_detail_size_set(PBVH *pbvh, float detail_size); typedef enum { PBVH_Subdivide = 1, @@ -242,6 +255,13 @@ bool BKE_pbvh_bmesh_update_topology(PBVH *bvh, const bool use_frontface, const bool use_projected); +bool BKE_pbvh_trimesh_update_topology(PBVH *bvh, + PBVHTopologyUpdateMode mode, + const float center[3], + const float view_normal[3], + float radius, + const bool use_frontface, + const bool use_projected); /* Node Access */ void BKE_pbvh_node_mark_update(PBVHNode *node); @@ -286,6 +306,12 @@ struct GSet *BKE_pbvh_bmesh_node_faces(PBVHNode *node); void BKE_pbvh_bmesh_node_save_orig(struct BMesh *bm, PBVHNode *node); void BKE_pbvh_bmesh_after_stroke(PBVH *bvh); +struct GSet *BKE_pbvh_trimesh_node_unique_verts(PBVHNode *node); +struct GSet *BKE_pbvh_trimesh_node_other_verts(PBVHNode *node); +struct GSet *BKE_pbvh_trimesh_node_faces(PBVHNode *node); +void BKE_pbvh_trimesh_node_save_orig(struct BLI_TriMesh *tm, PBVHNode *node); +void BKE_pbvh_trimesh_after_stroke(PBVH *bvh); + /* Update Bounding Box/Redraw and clear flags */ void BKE_pbvh_update_bounds(PBVH *bvh, int flags); diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c index 719336f7351..d44dc9bd7f5 100644 --- a/source/blender/blenkernel/intern/paint.c +++ b/source/blender/blenkernel/intern/paint.c @@ -74,6 +74,7 @@ #include "RNA_enum_types.h" #include "bmesh.h" +#include "BLI_trimesh.h" static void palette_init_data(ID *id) { @@ -1158,6 +1159,17 @@ bool paint_is_bmesh_face_hidden(BMFace *f) return false; } + +/* Return true if all vertices in the face are visible, false otherwise */ +bool paint_is_trimesh_face_hidden(TMFace *f) +{ + bool ret = f->v1->flag & TRIMESH_HIDE; + ret = ret || (f->v2->flag & TRIMESH_HIDE); + ret = ret || (f->v3->flag & TRIMESH_HIDE); + + return ret; +} + float paint_grid_paint_mask(const GridPaintMask *gpm, uint level, uint x, uint y) { int factor = BKE_ccg_factor(level, gpm->level); @@ -1257,6 +1269,34 @@ void BKE_sculptsession_free_vwpaint_data(struct SculptSession *ss) MEM_SAFE_FREE(gmap->poly_map_mem); } +/* Write out the sculpt dynamic-topology BMesh to the Mesh */ +static void sculptsession_tm_to_me_update_data_only(Object *ob, bool reorder) +{ + SculptSession *ss = ob->sculpt; + + if (ss->bm) { + if (ob->data) { + BLI_TriMeshIter iter; + TMFace *f; + + BLI_trimesh_tri_iternew(ss->tm, &iter); + f = BLI_trimesh_iterstep(&iter); + for (; f; f = BLI_trimesh_iterstep(&iter)) { + TRIMESH_elem_flag_set(f, TRIMESH_SMOOTH, ss->bm_smooth_shading); + } + //if (reorder) { + // BM_log_mesh_elems_reorder(ss->bm, ss->bm_log); + //} + BLI_trimesh_mesh_bm_to_me(NULL, + ss->tm, + ob->data, + (&(struct TMeshToMeshParams){ + .calc_object_remap = false, + })); + } + } +} + /* Write out the sculpt dynamic-topology BMesh to the Mesh */ static void sculptsession_bm_to_me_update_data_only(Object *ob, bool reorder) { @@ -1796,10 +1836,10 @@ static bool check_sculpt_object_deformed(Object *object, const bool for_construc static PBVH *build_pbvh_for_dynamic_topology(Object *ob) { PBVH *pbvh = BKE_pbvh_new(); - BKE_pbvh_build_bmesh(pbvh, - ob->sculpt->bm, + BKE_pbvh_build_trimesh(pbvh, + ob->sculpt->tm, ob->sculpt->bm_smooth_shading, - ob->sculpt->bm_log, + ob->sculpt->tm_log, ob->sculpt->cd_vert_node_offset, ob->sculpt->cd_face_node_offset); pbvh_show_mask_set(pbvh, ob->sculpt->show_mask); diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c index 73042222436..39d13f84810 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.c +++ b/source/blender/blenkernel/intern/pbvh_bmesh.c @@ -1887,7 +1887,7 @@ void BKE_pbvh_build_bmesh(PBVH *bvh, bvh->cd_face_node_offset = cd_face_node_offset; bvh->bm = bm; - BKE_pbvh_bmesh_detail_size_set(bvh, 0.75); + BKE_pbvh_topology_detail_size_set(bvh, 0.75); bvh->type = PBVH_BMESH; bvh->bm_log = log; @@ -2107,7 +2107,7 @@ void BKE_pbvh_bmesh_after_stroke(PBVH *bvh) } } -void BKE_pbvh_bmesh_detail_size_set(PBVH *bvh, float detail_size) +void BKE_pbvh_topology_detail_size_set(PBVH *bvh, float detail_size) { bvh->bm_max_edge_len = detail_size; bvh->bm_min_edge_len = bvh->bm_max_edge_len * 0.4f; diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h index cabe96dc158..493e0905f0d 100644 --- a/source/blender/blenkernel/intern/pbvh_intern.h +++ b/source/blender/blenkernel/intern/pbvh_intern.h @@ -242,4 +242,22 @@ bool pbvh_bmesh_node_nearest_to_ray(PBVHNode *node, void pbvh_bmesh_normals_update(PBVHNode **nodes, int totnode); +/* pbvh_bmesh.c */ +bool pbvh_trimesh_node_raycast(PBVHNode *node, + const float ray_start[3], + const float ray_normal[3], + struct IsectRayPrecalc *isect_precalc, + float *dist, + bool use_original, + int *r_active_vertex_index, + float *r_face_normal); +bool pbvh_trimesh_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_trimesh_normals_update(PBVHNode **nodes, int totnode); + #endif diff --git a/source/blender/blenkernel/intern/pbvh_trimesh.c b/source/blender/blenkernel/intern/pbvh_trimesh.c index 35accad9133..ba9d3bcdc31 100644 --- a/source/blender/blenkernel/intern/pbvh_trimesh.c +++ b/source/blender/blenkernel/intern/pbvh_trimesh.c @@ -333,7 +333,7 @@ static bool pbvh_trimesh_node_limit_ensure(PBVH *bvh, int node_index) f->index = i; /* set_dirty! */ } /* Likely this is already dirty. */ - bvh->bm->elem_index_dirty |= BM_FACE; + //bvh->tm->elem_index_dirty |= BM_FACE; pbvh_trimesh_node_split(bvh, bbc_array, node_index); @@ -1271,7 +1271,7 @@ static void pbvh_trimesh_collapse_edge(PBVH *bvh, BLI_assert(BLI_trimesh_edge_is_wire(e)); //XXX check threadnr argument! - BLI_trimesh_kill_edge(bvh->bm, e, 0, false); + BLI_trimesh_kill_edge(bvh->tm, e, 0, false); /* For all remaining faces of v_del, create a new face that is the * same except it uses v_conn instead of v_del */ @@ -1294,7 +1294,7 @@ static void pbvh_trimesh_collapse_edge(PBVH *bvh, PBVHNode *n = pbvh_trimesh_node_from_face(bvh, tri); int ni = n - bvh->nodes; - tm_edges_from_tri(bvh->bm, v_tri, e_tri, 0, true); + tm_edges_from_tri(bvh->tm, v_tri, e_tri, 0, true); pbvh_trimesh_face_create(bvh, ni, v_tri, e_tri, tri); /* Ensure that v_conn is in the new face's node */ @@ -1344,7 +1344,7 @@ static void pbvh_trimesh_collapse_edge(PBVH *bvh, v_conn = NULL; } BLI_ghash_insert(deleted_verts, v_tri[j], NULL); - BLI_trimesh_vert_kill(bvh->bm, v_tri[j]); + BLI_trimesh_kill_vert(bvh->tm, v_tri[j], 0); //XXX check threadnr } } } @@ -1809,7 +1809,7 @@ void BKE_pbvh_build_trimesh(PBVH *bvh, bvh->cd_face_node_offset = cd_face_node_offset; bvh->tm = tm; - BKE_pbvh_trimesh_detail_size_set(bvh, 0.75); + BKE_pbvh_topology_detail_size_set(bvh, 0.75); bvh->type = PBVH_TRIMESH; bvh->tm_log = log; diff --git a/source/blender/blenlib/BLI_trimesh.h b/source/blender/blenlib/BLI_trimesh.h index c9c613fe148..af14f5137f7 100644 --- a/source/blender/blenlib/BLI_trimesh.h +++ b/source/blender/blenlib/BLI_trimesh.h @@ -3,6 +3,7 @@ #include "BLI_threads.h" #include "BLI_threadsafe_mempool.h" #include "DNA_customdata_types.h" +#include "DNA_meshdata_types.h" #include <stdint.h> @@ -10,9 +11,51 @@ struct OptTriVert; struct OptTriEdge; struct OptTri; -#define TRIMESH_SELECT (1<<1) -#define TRIMESH_HIDE (1<<2) -#define TRIMESH_VT_ITERFLAG (1<<7) +enum { + TRIMESH_SELECT = 1<<1, + TRIMESH_HIDE = 1<<1, + TRIMESH_SMOOTH = 1<<3, + TRIMESH_VT_ITERFLAG = 1<<9 +}; + +static uint8_t BLI_trimesh_vert_flag_to_mflag(int16_t @@ 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