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

Reply via email to