[Bf-blender-cvs] [ac8c589b7c9] sculpt-dev: Preparte curvature fairing and Fairing edit mode operator
Pablo Dobarro
noreply at git.blender.org
Thu Dec 24 16:30:40 CET 2020
Commit: ac8c589b7c98aa06ff2f1de8fb050724e38e50d5
Author: Pablo Dobarro
Date: Thu Dec 24 16:30:12 2020 +0100
Branches: sculpt-dev
https://developer.blender.org/rBac8c589b7c98aa06ff2f1de8fb050724e38e50d5
Preparte curvature fairing and Fairing edit mode operator
===================================================================
M release/scripts/startup/bl_ui/space_view3d.py
M source/blender/blenkernel/BKE_mesh_fair.h
M source/blender/blenkernel/intern/mesh_fair.cc
M source/blender/editors/mesh/CMakeLists.txt
A source/blender/editors/mesh/editmesh_fair.c
M source/blender/editors/mesh/mesh_intern.h
M source/blender/editors/mesh/mesh_ops.c
M source/blender/editors/sculpt_paint/sculpt_face_set.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 8b5183faf62..d8d24f4ff81 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3624,6 +3624,8 @@ class VIEW3D_MT_edit_mesh(Menu):
if with_bullet:
layout.operator("mesh.convex_hull")
+ layout.operator("mesh.fair_vertices", text="Fair")
+
layout.separator()
layout.operator("mesh.symmetrize")
diff --git a/source/blender/blenkernel/BKE_mesh_fair.h b/source/blender/blenkernel/BKE_mesh_fair.h
index 2d5c85d4129..b7037abcfe1 100644
--- a/source/blender/blenkernel/BKE_mesh_fair.h
+++ b/source/blender/blenkernel/BKE_mesh_fair.h
@@ -36,6 +36,7 @@ extern "C" {
typedef enum eMeshFairingDepth {
MESH_FAIRING_DEPTH_POSITION = 1,
MESH_FAIRING_DEPTH_TANGENCY = 2,
+ MESH_FAIRING_DEPTH_CURVATURE = 3,
} eMeshFairingDepth;
/* affect_vertices is used to define the fairing area. Indexed by vertex index, set to true when
diff --git a/source/blender/blenkernel/intern/mesh_fair.cc b/source/blender/blenkernel/intern/mesh_fair.cc
index ccd1434b60b..0538875c07f 100644
--- a/source/blender/blenkernel/intern/mesh_fair.cc
+++ b/source/blender/blenkernel/intern/mesh_fair.cc
@@ -67,6 +67,9 @@ class FairingContext {
/* Get the other vertex index for a loop. */
virtual int other_vertex_index_from_loop(const int loop, const unsigned int v) = 0;
+ virtual int vertex_index_from_loop(const int loop) = 0;
+ virtual float cotangent_loop_weight_get(const int loop) = 0;
+
int vertex_count_get()
{
return totvert_;
@@ -74,7 +77,7 @@ class FairingContext {
int loop_count_get()
{
- return totvert_;
+ return totloop_;
}
MeshElemMap *vertex_loop_map_get(const int v)
@@ -219,6 +222,15 @@ class MeshFairingContext : public FairingContext {
mesh->totpoly,
mesh->totloop);
+ BKE_mesh_edge_loop_map_create(&elmap_,
+ &elmap_mem_,
+ mesh->medge,
+ mesh->totedge,
+ mesh->mpoly,
+ mesh->totpoly,
+ mesh->mloop,
+ mesh->totloop);
+
/* Deformation coords. */
co_.reserve(mesh->totvert);
if (deform_mverts) {
@@ -244,6 +256,8 @@ class MeshFairingContext : public FairingContext {
{
MEM_SAFE_FREE(vlmap_);
MEM_SAFE_FREE(vlmap_mem_);
+ MEM_SAFE_FREE(elmap_);
+ MEM_SAFE_FREE(elmap_mem_);
}
void adjacents_coords_from_loop(const int loop,
@@ -266,12 +280,26 @@ class MeshFairingContext : public FairingContext {
return e->v1;
}
+ int vertex_index_from_loop(const int loop) override
+ {
+ return mloop_[loop].v;
+ }
+
+ float cotangent_loop_weight_get(const int UNUSED(loop)) override
+ {
+ /* TODO: Implement cotangent loop weights for meshes. */
+ return 1.0f;
+ }
+
protected:
Mesh *mesh_;
MLoop *mloop_;
MPoly *mpoly_;
MEdge *medge_;
Vector<int> loop_to_poly_map_;
+
+ MeshElemMap *elmap_;
+ int *elmap_mem_;
};
class BMeshFairingContext : public FairingContext {
@@ -307,6 +335,7 @@ class BMeshFairingContext : public FairingContext {
int loop_count = 0;
const int vert_index = BM_elem_index_get(v);
vlmap_[vert_index].indices = &vlmap_mem_[index_iter];
+
BM_ITER_ELEM (l, &loop_iter, v, BM_LOOPS_OF_VERT) {
const int loop_index = BM_elem_index_get(l);
bmloop_[loop_index] = l;
@@ -340,6 +369,47 @@ class BMeshFairingContext : public FairingContext {
return BM_elem_index_get(bm_other_vert);
}
+ int vertex_index_from_loop(const int loop) override
+ {
+ return BM_elem_index_get(bmloop_[loop]->v);
+ }
+
+ float cotangent_loop_weight_get(const int loop) override
+ {
+ return 1.0f;
+
+ /* TODO: enable this when it works. */
+ BMLoop *l = bmloop_[loop];
+ float *co_c[2];
+ int co_c_count = 1;
+
+ float *co_a = l->v->co;
+ float *co_b = l->next->v->co;
+ co_c[0] = l->prev->v->co;
+ if (!BM_edge_is_boundary(l->e)) {
+ co_c_count = 2;
+ co_c[1] = l->radial_next->next->next->v->co;
+ }
+
+ float weight = 0.0f;
+ for (int c = 0; c < co_c_count; c++) {
+ float v1[3];
+ float v2[3];
+ sub_v3_v3v3(v1, co_a, co_c[c]);
+ sub_v3_v3v3(v2, co_b, co_c[c]);
+ const float angle = angle_v3v3(v1, v2);
+ const float tangent = tan(angle);
+ if (tangent != 0) {
+ weight += 1.0f / tangent;
+ }
+ else {
+ weight += 1e-4;
+ }
+ }
+ weight *= 0.5f;
+ return weight;
+ }
+
protected:
BMesh *bm;
Vector<BMLoop *> bmloop_;
@@ -464,6 +534,27 @@ class UniformLoopWeight : public LoopWeight {
}
};
+class CotangentLoopWeight : public LoopWeight {
+ public:
+ CotangentLoopWeight(FairingContext *fairing_context)
+ {
+ const int totloop = fairing_context->loop_count_get();
+ loop_weights_.reserve(totloop);
+ for (int i = 0; i < totloop; i++) {
+ loop_weights_[i] = fairing_context->cotangent_loop_weight_get(i);
+ }
+ }
+ ~CotangentLoopWeight() = default;
+
+ float weight_at_index(const int index) override
+ {
+ return loop_weights_[index];
+ }
+
+ private:
+ Vector<float> loop_weights_;
+};
+
static void prefair_and_fair_vertices(FairingContext *fairing_context,
bool *affected_vertices,
const eMeshFairingDepth depth)
@@ -471,18 +562,22 @@ static void prefair_and_fair_vertices(FairingContext *fairing_context,
/* Prefair. */
UniformVertexWeight *uniform_vertex_weights = new UniformVertexWeight(fairing_context);
UniformLoopWeight *uniform_loop_weights = new UniformLoopWeight();
- fairing_context->fair_vertices(
- affected_vertices, depth, uniform_vertex_weights, uniform_loop_weights);
+ fairing_context->fair_vertices(affected_vertices,
+ MESH_FAIRING_DEPTH_POSITION,
+ uniform_vertex_weights,
+ uniform_loop_weights);
+
delete uniform_vertex_weights;
+ delete uniform_loop_weights;
/* Fair. */
VoronoiVertexWeight *voronoi_vertex_weights = new VoronoiVertexWeight(fairing_context);
- /* TODO: Implemente cotangent loop weights. */
+ CotangentLoopWeight *cotangent_loop_weights = new CotangentLoopWeight(fairing_context);
fairing_context->fair_vertices(
- affected_vertices, depth, voronoi_vertex_weights, uniform_loop_weights);
+ affected_vertices, depth, voronoi_vertex_weights, cotangent_loop_weights);
- delete uniform_loop_weights;
delete voronoi_vertex_weights;
+ delete cotangent_loop_weights;
}
void BKE_mesh_prefair_and_fair_vertices(struct Mesh *mesh,
diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt
index 35bf295a678..7ca120fa95a 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -46,6 +46,7 @@ set(SRC
editmesh_extrude_screw.c
editmesh_extrude_spin.c
editmesh_extrude_spin_gizmo.c
+ editmesh_fair.c
editmesh_inset.c
editmesh_intersect.c
editmesh_knife.c
diff --git a/source/blender/editors/mesh/editmesh_fair.c b/source/blender/editors/mesh/editmesh_fair.c
new file mode 100644
index 00000000000..321369d864b
--- /dev/null
+++ b/source/blender/editors/mesh/editmesh_fair.c
@@ -0,0 +1,162 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup edmesh
+ *
+ * Interactive editmesh knife tool.
+ */
+
+#ifdef _MSC_VER
+# define _USE_MATH_DEFINES
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_object_types.h"
+
+#include "BLI_alloca.h"
+#include "BLI_array.h"
+#include "BLI_linklist.h"
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_memarena.h"
+#include "BLI_smallhash.h"
+#include "BLI_string.h"
+
+#include "BLT_translation.h"
+
+#include "BKE_bvhutils.h"
+#include "BKE_mesh_fair.h"
+#include "BKE_context.h"
+#include "BKE_editmesh.h"
+#include "BKE_layer.h"
+#include "BKE_editmesh_bvh.h"
+#include "BKE_report.h"
+
+#include "ED_mesh.h"
+#include "ED_screen.h"
+#include "ED_space_api.h"
+#include "ED_view3d.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "DNA_object_types.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
+
+#include "mesh_intern.h" /* own include */
+
+static EnumPropertyItem prop_edit_mesh_fair_selection_mode_items[] = {
+ {
+ MESH_FAIRING_DEPTH_POSITION,
+ "POSITION",
+ 0,
+ "Position",
+ "Fair positions",
+ },
+ {
+ MESH_FAIRING_DEPTH_TANGENCY,
+ "TANGENCY",
+ 0,
+ "Tangency",
+ "Fair tangency",
+ },
+ /*
+ {
+ MESH_FAIRING_DEPTH_CURVATURE,
+ "CURVATURE",
+ 0,
+ "Curvature",
+ "Fair curvature",
+ },
+ */
+ {0, NULL, 0, NULL, NULL},
+};
+
+static int edbm_fair_vertices_exec(bContext *C, wmOperator *op)
+{
+ const int mode = RNA_enum_get(op->ptr, "mode");
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+ uint objects_len = 0;
+ Object **objects = BKE_view
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list