Revision: 48814
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48814
Author: apinzonf
Date: 2012-07-10 18:12:29 +0000 (Tue, 10 Jul 2012)
Log Message:
-----------
Add internal constraint for reduce spikes, based in length of edge.
Modified Paths:
--------------
branches/soc-2012-sushi/release/scripts/startup/bl_ui/properties_data_modifier.py
branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c
branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c
branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c
branches/soc-2012-sushi/source/blender/makesdna/DNA_modifier_types.h
branches/soc-2012-sushi/source/blender/makesrna/intern/rna_modifier.c
branches/soc-2012-sushi/source/blender/modifiers/intern/MOD_laplaciansmooth.c
Modified:
branches/soc-2012-sushi/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
---
branches/soc-2012-sushi/release/scripts/startup/bl_ui/properties_data_modifier.py
2012-07-10 15:47:39 UTC (rev 48813)
+++
branches/soc-2012-sushi/release/scripts/startup/bl_ui/properties_data_modifier.py
2012-07-10 18:12:29 UTC (rev 48814)
@@ -316,7 +316,6 @@
layout.prop(md, "iterations")
layout.prop(md, "lamb")
layout.prop(md, "lambdaborder")
- layout.prop(md, "minarea")
row = layout.row()
row.label(text="Axis: ")
row.prop(md, "use_x")
Modified: branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c
2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/bmesh/intern/bmesh_opdefines.c
2012-07-10 18:12:29 UTC (rev 48814)
@@ -120,11 +120,9 @@
{{BMO_OP_SLOT_ELEMENT_BUF, "verts"}, //input vertices
{BMO_OP_SLOT_FLT, "lambda"}, //lambda param
{BMO_OP_SLOT_FLT, "lambda_border"}, //lambda param in border
- {BMO_OP_SLOT_FLT, "min_area"}, //Minimun area permited
{BMO_OP_SLOT_BOOL, "use_x"}, //Smooth object along X axis
{BMO_OP_SLOT_BOOL, "use_y"}, //Smooth object along Y axis
{BMO_OP_SLOT_BOOL, "use_z"}, //Smooth object along Z axis
- {BMO_OP_SLOT_MAPPING, "vertex_group"}, // Vertex group with weights
for every vertice.
{BMO_OP_SLOT_BOOL, "volume_preservation"}, //Apply volume preservation
after smooth
{0} /* null-terminating sentinel */,
},
Modified:
branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c
===================================================================
---
branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c
2012-07-10 15:47:39 UTC (rev 48813)
+++
branches/soc-2012-sushi/source/blender/bmesh/operators/bmo_smooth_laplacian.c
2012-07-10 18:12:29 UTC (rev 48814)
@@ -46,6 +46,8 @@
#define SMOOTH_LAPLACIAN_AREA_FACTOR 4.0f
#define SMOOTH_LAPLACIAN_EDGE_FACTOR 2.0f
+#define SMOOTH_LAPLACIAN_MAX_EDGE_PERCENTAGE 1.8
+#define SMOOTH_LAPLACIAN_MIN_EDGE_PERCENTAGE 0.15
struct BLaplacianSystem {
float *eweights; /* Length weights per Edge */
@@ -77,6 +79,7 @@
static void delete_void_pointer(void * data);
static void fill_laplacian_matrix(LaplacianSystem * sys);
static void memset_laplacian_system(LaplacianSystem *sys, int val);
+static void validate_solution(LaplacianSystem * sys, int usex, int usey, int
usez, float lambda, float lambda_border, int volumepreservation);
static void volume_preservation(BMesh *bm, BMOperator *op, float vini, float
vend, int usex, int usey, int usez);
static void delete_void_pointer(void * data)
@@ -472,13 +475,67 @@
}
}
+static void validate_solution(LaplacianSystem * sys, int usex, int usey, int
usez, float lambda, float lambda_border, int volumepreservation)
+{
+ int m_vertex_id;
+ float leni, lene;
+ float vini, vend;
+ float *vi1, *vi2, ve1[3], ve2[3];
+ unsigned int idv1, idv2;
+ BMOIter siter;
+ BMVert *v;
+ BMEdge *e;
+ BMIter eiter;
+
+ BM_ITER_MESH (e, &eiter, sys->bm, BM_EDGES_OF_MESH) {
+ idv1 = BM_elem_index_get(e->v1);
+ idv2 = BM_elem_index_get(e->v2);
+ vi1 = e->v1->co;
+ vi2 = e->v2->co;
+ ve1[0] = nlGetVariable(0, idv1);
+ ve1[1] = nlGetVariable(1, idv1);
+ ve1[2] = nlGetVariable(2, idv1);
+ ve2[0] = nlGetVariable(0, idv2);
+ ve2[1] = nlGetVariable(1, idv2);
+ ve2[2] = nlGetVariable(2, idv2);
+ leni = len_v3v3(vi1, vi2);
+ lene = len_v3v3(ve1, ve2);
+ if ( lene > leni* SMOOTH_LAPLACIAN_MAX_EDGE_PERCENTAGE || lene
< leni*SMOOTH_LAPLACIAN_MIN_EDGE_PERCENTAGE) {
+ sys->zerola[idv1] = 1;
+ sys->zerola[idv2] = 1;
+ }
+ }
+
+ if (volumepreservation) {
+ vini = compute_volume(sys->bm, sys->op);
+ }
+ BMO_ITER (v, &siter, sys->bm, sys->op, "verts", BM_VERT) {
+ m_vertex_id = BM_elem_index_get(v);
+ if (sys->zerola[m_vertex_id] == 0) {
+ if (usex) {
+ v->co[0] = nlGetVariable(0, m_vertex_id);
+ }
+ if (usey) {
+ v->co[1] = nlGetVariable(1, m_vertex_id);
+ }
+ if (usez) {
+ v->co[2] = nlGetVariable(2, m_vertex_id);
+ }
+ }
+ }
+ if (volumepreservation) {
+ vend = compute_volume(sys->bm, sys->op);
+ volume_preservation(sys->bm, sys->op, vini, vend, usex, usey,
usez);
+ }
+
+}
+
void bmo_smooth_laplacian_vert_exec(BMesh *bm, BMOperator *op)
{
int i;
int m_vertex_id;
int usex, usey, usez, volumepreservation;
float lambda, lambda_border;
- float vini, vend;
float w;
BMOIter siter;
BMVert *v;
@@ -494,7 +551,7 @@
BM_mesh_elem_index_ensure(bm, BM_VERT);
lambda = BMO_slot_float_get(op, "lambda");
lambda_border = BMO_slot_float_get(op, "lambda_border");
- sys->min_area = BMO_slot_float_get(op, "min_area");
+ sys->min_area = 0.00001f;
usex = BMO_slot_bool_get(op, "use_x");
usey = BMO_slot_bool_get(op, "use_y");
usez = BMO_slot_bool_get(op, "use_z");
@@ -550,25 +607,7 @@
nlEnd(NL_SYSTEM);
if (nlSolveAdvanced(NULL, NL_TRUE) ) {
- if(volumepreservation){
- vini = compute_volume(bm, op);
- }
- BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
- m_vertex_id = BM_elem_index_get(v);
- if (usex) {
- v->co[0] = nlGetVariable(0, m_vertex_id);
- }
- if (usey) {
- v->co[1] = nlGetVariable(1, m_vertex_id);
- }
- if (usez) {
- v->co[2] = nlGetVariable(2, m_vertex_id);
- }
- }
- if(volumepreservation){
- vend = compute_volume(bm, op);
- volume_preservation(bm, op, vini, vend, usex, usey,
usez);
- }
+ validate_solution(sys, usex, usey, usez, lambda, lambda_border,
volumepreservation);
}
delete_laplacian_system(sys);
Modified: branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c
2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/editors/mesh/editmesh_tools.c
2012-07-10 18:12:29 UTC (rev 48814)
@@ -1604,7 +1604,6 @@
int i, repeat;
float lambda = 0.1f;
float lambda_border = 0.1f;
- float min_area = 0.00001f;
BMIter fiter;
BMFace *f;
@@ -1626,7 +1625,6 @@
repeat = RNA_int_get(op->ptr, "repeat");
lambda = RNA_float_get(op->ptr, "lambda");
lambda_border = RNA_float_get(op->ptr, "lambda_border");
- min_area = RNA_float_get(op->ptr, "min_area");
usex = RNA_boolean_get(op->ptr, "use_x");
usey = RNA_boolean_get(op->ptr, "use_y");
usez = RNA_boolean_get(op->ptr, "use_z");
@@ -1636,8 +1634,8 @@
for (i = 0; i < repeat; i++) {
if (!EDBM_op_callf(em, op,
- "smooth_laplacian_vert verts=%hv lambda=%f
lambda_border=%f min_area=%f use_x=%b use_y=%b use_z=%b volume_preservation=%b",
- BM_ELEM_SELECT, lambda, lambda_border,
min_area, usex, usey, usez, volume_preservation))
+ "smooth_laplacian_vert verts=%hv lambda=%f
lambda_border=%f use_x=%b use_y=%b use_z=%b volume_preservation=%b",
+ BM_ELEM_SELECT, lambda, lambda_border, usex,
usey, usez, volume_preservation))
{
return OPERATOR_CANCELLED;
}
@@ -1674,8 +1672,6 @@
"Lambda factor", "", 0.0000001f,
1000.0f);
RNA_def_float(ot->srna, "lambda_border", 0.00005f, 0.0000001f, 1000.0f,
"Lambda factor in border", "",
0.0000001f, 1000.0f);
- RNA_def_float(ot->srna, "min_area", 0.00001f, 0.0000000000000001f,
1000.0f,
- "Minimum area permitted", "",
0.0000000000000001f, 1000.0f);
RNA_def_boolean(ot->srna, "use_x", 1, "Smooth X Axis", "Smooth object
along X axis");
RNA_def_boolean(ot->srna, "use_y", 1, "Smooth Y Axis", "Smooth object
along Y axis");
RNA_def_boolean(ot->srna, "use_z", 1, "Smooth Z Axis", "Smooth object
along Z axis");
Modified: branches/soc-2012-sushi/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- branches/soc-2012-sushi/source/blender/makesdna/DNA_modifier_types.h
2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/makesdna/DNA_modifier_types.h
2012-07-10 18:12:29 UTC (rev 48814)
@@ -1102,7 +1102,7 @@
typedef struct LaplacianSmoothModifierData {
ModifierData modifier;
- float lambda, lambda_border, min_area;
+ float lambda, lambda_border;
char defgrp_name[64]; /* MAX_VGROUP_NAME */
short flag, repeat;
Modified: branches/soc-2012-sushi/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- branches/soc-2012-sushi/source/blender/makesrna/intern/rna_modifier.c
2012-07-10 15:47:39 UTC (rev 48813)
+++ branches/soc-2012-sushi/source/blender/makesrna/intern/rna_modifier.c
2012-07-10 18:12:29 UTC (rev 48814)
@@ -1795,13 +1795,6 @@
RNA_def_property_ui_text(prop, "Lambda border", "Lambda factor in
border");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop = RNA_def_property(srna, "minarea", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "min_area");
- RNA_def_property_range(prop, 0.0000000000000001, FLT_MAX);
- RNA_def_property_ui_range(prop, 0.0000000000000001, 1000.0, 0.0000001,
18);
- RNA_def_property_ui_text(prop, "Minimum area", "Minimum area
permitted");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
prop = RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "repeat");
RNA_def_property_ui_range(prop, 0, 200, 1, 0);
Modified:
branches/soc-2012-sushi/source/blender/modifiers/intern/MOD_laplaciansmooth.c
===================================================================
---
branches/soc-2012-sushi/source/blender/modifiers/intern/MOD_laplaciansmooth.c
2012-07-10 15:47:39 UTC (rev 48813)
+++
branches/soc-2012-sushi/source/blender/modifiers/intern/MOD_laplaciansmooth.c
2012-07-10 18:12:29 UTC (rev 48814)
@@ -57,6 +57,9 @@
#include "ONL_opennl.h"
+#define MOD_LAPLACIANSMOOTH_MAX_EDGE_PERCENTAGE 1.8
+#define MOD_LAPLACIANSMOOTH_MIN_EDGE_PERCENTAGE 0.15
+
struct BLaplacianSystem {
float *eweights; /* Length weights per Edge */
float (*fweights)[3]; /* Cotangent weights per face */
@@ -94,6 +97,7 @@
static void init_laplacian_matrix(LaplacianSystem * sys);
static void memset_laplacian_system(LaplacianSystem *sys, int val);
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs