Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/mesh_fair.cc
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
| MeshFairingContext(Mesh *mesh, MutableSpan<float3> deform_positions) | MeshFairingContext(Mesh *mesh, MutableSpan<float3> deform_positions) | ||||
| { | { | ||||
| totvert_ = mesh->totvert; | totvert_ = mesh->totvert; | ||||
| totloop_ = mesh->totloop; | totloop_ = mesh->totloop; | ||||
| MutableSpan<float3> positions = mesh->vert_positions_for_write(); | MutableSpan<float3> positions = mesh->vert_positions_for_write(); | ||||
| medge_ = mesh->edges(); | medge_ = mesh->edges(); | ||||
| mpoly_ = mesh->polys(); | mpoly_ = mesh->polys(); | ||||
| mloop_ = mesh->loops(); | corner_verts_ = mesh->corner_verts(); | ||||
| corner_edges_ = mesh->corner_edges(); | |||||
| BKE_mesh_vert_loop_map_create(&vlmap_, | BKE_mesh_vert_loop_map_create(&vlmap_, | ||||
| &vlmap_mem_, | &vlmap_mem_, | ||||
| mpoly_.data(), | mpoly_.data(), | ||||
| mloop_.data(), | corner_verts_.data(), | ||||
| mesh->totvert, | mesh->totvert, | ||||
| mesh->totpoly, | mesh->totpoly, | ||||
| mesh->totloop); | mesh->totloop); | ||||
| /* Deformation coords. */ | /* Deformation coords. */ | ||||
| co_.reserve(mesh->totvert); | co_.reserve(mesh->totvert); | ||||
| if (!deform_positions.is_empty()) { | if (!deform_positions.is_empty()) { | ||||
| for (int i = 0; i < mesh->totvert; i++) { | for (int i = 0; i < mesh->totvert; i++) { | ||||
| co_[i] = deform_positions[i]; | co_[i] = deform_positions[i]; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| for (int i = 0; i < mesh->totvert; i++) { | for (int i = 0; i < mesh->totvert; i++) { | ||||
| co_[i] = positions[i]; | co_[i] = positions[i]; | ||||
| } | } | ||||
| } | } | ||||
| loop_to_poly_map_ = blender::bke::mesh_topology::build_loop_to_poly_map(mpoly_, mloop_.size()); | loop_to_poly_map_ = blender::bke::mesh_topology::build_loop_to_poly_map(mpoly_, | ||||
| corner_verts_.size()); | |||||
| } | } | ||||
| ~MeshFairingContext() override | ~MeshFairingContext() override | ||||
| { | { | ||||
| MEM_SAFE_FREE(vlmap_); | MEM_SAFE_FREE(vlmap_); | ||||
| MEM_SAFE_FREE(vlmap_mem_); | MEM_SAFE_FREE(vlmap_mem_); | ||||
| } | } | ||||
| void adjacents_coords_from_loop(const int loop, | void adjacents_coords_from_loop(const int loop, | ||||
| float r_adj_next[3], | float r_adj_next[3], | ||||
| float r_adj_prev[3]) override | float r_adj_prev[3]) override | ||||
| { | { | ||||
| const int vert = mloop_[loop].v; | const int vert = corner_verts_[loop]; | ||||
| const MPoly *p = &mpoly_[loop_to_poly_map_[loop]]; | const MPoly *p = &mpoly_[loop_to_poly_map_[loop]]; | ||||
| const int corner = poly_find_loop_from_vert(p, &mloop_[p->loopstart], vert); | const int corner = poly_find_loop_from_vert(p, &corner_verts_[p->loopstart], vert); | ||||
| copy_v3_v3(r_adj_next, co_[ME_POLY_LOOP_NEXT(mloop_, p, corner)->v]); | copy_v3_v3(r_adj_next, co_[corner_verts_[ME_POLY_LOOP_NEXT(p, corner)]]); | ||||
| copy_v3_v3(r_adj_prev, co_[ME_POLY_LOOP_PREV(mloop_, p, corner)->v]); | copy_v3_v3(r_adj_prev, co_[corner_verts_[ME_POLY_LOOP_PREV(p, corner)]]); | ||||
| } | } | ||||
| int other_vertex_index_from_loop(const int loop, const uint v) override | int other_vertex_index_from_loop(const int loop, const uint v) override | ||||
| { | { | ||||
| const MEdge *e = &medge_[mloop_[loop].e]; | const MEdge *e = &medge_[corner_edges_[loop]]; | ||||
| if (e->v1 == v) { | if (e->v1 == v) { | ||||
| return e->v2; | return e->v2; | ||||
| } | } | ||||
| return e->v1; | return e->v1; | ||||
| } | } | ||||
| protected: | protected: | ||||
| Mesh *mesh_; | Mesh *mesh_; | ||||
| Span<MLoop> mloop_; | Span<int> corner_verts_; | ||||
| Span<int> corner_edges_; | |||||
| Span<MPoly> mpoly_; | Span<MPoly> mpoly_; | ||||
| Span<MEdge> medge_; | Span<MEdge> medge_; | ||||
| Array<int> loop_to_poly_map_; | Array<int> loop_to_poly_map_; | ||||
| }; | }; | ||||
| class BMeshFairingContext : public FairingContext { | class BMeshFairingContext : public FairingContext { | ||||
| public: | public: | ||||
| BMeshFairingContext(BMesh *bm) | BMeshFairingContext(BMesh *bm) | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||