Revision: 27871
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27871
Author:   campbellbarton
Date:     2010-03-30 16:58:16 +0200 (Tue, 30 Mar 2010)

Log Message:
-----------
Solidify
- offset option so the surface can be made solid from the middle
- vertex group, so solid distance can be multiplied by a vertex group (invert 
option also)

Modified Paths:
--------------
    branches/render25/release/scripts/ui/properties_data_modifier.py
    branches/render25/source/blender/blenkernel/intern/modifier.c
    branches/render25/source/blender/makesdna/DNA_modifier_types.h
    branches/render25/source/blender/makesrna/intern/rna_modifier.c

Modified: branches/render25/release/scripts/ui/properties_data_modifier.py
===================================================================
--- branches/render25/release/scripts/ui/properties_data_modifier.py    
2010-03-30 14:33:05 UTC (rev 27870)
+++ branches/render25/release/scripts/ui/properties_data_modifier.py    
2010-03-30 14:58:16 UTC (rev 27871)
@@ -625,11 +625,13 @@
         layout.label(text="See Soft Body panel.")
 
     def SOLIDIFY(self, layout, ob, md, wide_ui):
-        layout.prop(md, "offset")
 
         split = layout.split()
 
         col = split.column()
+        col.prop(md, "thickness")
+        col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
+
         col.label(text="Crease:")
         col.prop(md, "edge_crease_inner", text="Inner")
         col.prop(md, "edge_crease_outer", text="Outer")
@@ -637,7 +639,15 @@
 
         if wide_ui:
             col = split.column()
-            col.label()
+
+        col.prop(md, "offset")
+        colsub = col.column()
+        colsub.active = (md.vertex_group is not "")
+        colsub.prop(md, "invert", text="Invert")
+
+        if wide_ui:
+            col.label(text="")
+
         col.prop(md, "use_rim")
         col.prop(md, "use_even_offset")
         col.prop(md, "use_quality_normals")

Modified: branches/render25/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/render25/source/blender/blenkernel/intern/modifier.c       
2010-03-30 14:33:05 UTC (rev 27870)
+++ branches/render25/source/blender/blenkernel/intern/modifier.c       
2010-03-30 14:58:16 UTC (rev 27871)
@@ -5718,6 +5718,7 @@
        SolidifyModifierData *smd = (SolidifyModifierData*) md;
        SolidifyModifierData *tsmd = (SolidifyModifierData*) target;
        tsmd->offset = smd->offset;
+       tsmd->offset_fac = smd->offset_fac;
        tsmd->crease_inner = smd->crease_inner;
        tsmd->crease_outer = smd->crease_outer;
        tsmd->crease_rim = smd->crease_rim;
@@ -5755,6 +5756,19 @@
 
        float (*vert_nors)[3]= NULL;
 
+       float ofs_orig=                         - (((-smd->offset_fac + 1.0f) * 
0.5f) * smd->offset);
+       float ofs_new= smd->offset      - (((-smd->offset_fac + 1.0f) * 0.5f) * 
smd->offset);
+
+       /* weights */
+       MDeformVert *dvert= NULL, *dv= NULL;
+       int defgrp_index= -1;
+       int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0);
+
+       defgrp_index= defgroup_name_index(ob, smd->defgrp_name);
+
+       if (defgrp_index >= 0)
+               dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+
        orig_mface = dm->getFaceArray(dm);
        orig_medge = dm->getEdgeArray(dm);
        orig_mvert = dm->getVertArray(dm);
@@ -5887,16 +5901,38 @@
 
        if((smd->flag & MOD_SOLIDIFY_EVEN) == 0) {
                /* no even thickness, very simple */
-               float scalar_short = smd->offset / 32767.0f;
+               float scalar_short;
+               float scalar_short_vgroup;
 
-               if(smd->offset < 0.0f)  mv= mvert+numVerts;
-               else                                    mv= mvert;
 
-               for(i=0; i<numVerts; i++, mv++) {
-                       mv->co[0] += mv->no[0] * scalar_short;
-                       mv->co[1] += mv->no[1] * scalar_short;
-                       mv->co[2] += mv->no[2] * scalar_short;
+               if(ofs_new != 0.0f) {
+                       scalar_short= scalar_short_vgroup= ofs_new / 32767.0f;
+                       mv= mvert + ((ofs_new >= ofs_orig) ? 0 : numVerts);
+                       dv= dvert;
+                       for(i=0; i<numVerts; i++, mv++) {
+                               if(dv) {
+                                       if(defgrp_invert)       
scalar_short_vgroup = scalar_short * (1.0f - defvert_find_weight(dv, 
defgrp_index));
+                                       else                            
scalar_short_vgroup = scalar_short * defvert_find_weight(dv, defgrp_index);
+                                       dv++;
+                               }
+                               VECADDFAC(mv->co, mv->co, mv->no, 
scalar_short_vgroup);
+                       }
                }
+
+               if(ofs_orig != 0.0f) {
+                       scalar_short= scalar_short_vgroup= ofs_orig / 32767.0f;
+                       mv= mvert + ((ofs_new >= ofs_orig) ? numVerts : 0); /* 
same as above but swapped, intentional use of 'ofs_new' */
+                       dv= dvert;
+                       for(i=0; i<numVerts; i++, mv++) {
+                               if(dv) {
+                                       if(defgrp_invert)       
scalar_short_vgroup = scalar_short * (1.0f - defvert_find_weight(dv, 
defgrp_index));
+                                       else                            
scalar_short_vgroup = scalar_short * defvert_find_weight(dv, defgrp_index);
+                                       dv++;
+                               }
+                               VECADDFAC(mv->co, mv->co, mv->no, 
scalar_short_vgroup);
+                       }
+               }
+
        }
        else {
                /* make a face normal layer if not present */
@@ -5948,15 +5984,41 @@
                        }
                }
 
-               if(smd->offset < 0.0f)  mv= mvert+numVerts;
-               else                                    mv= mvert;
+               /* vertex group support */
+               if(dvert) {
+                       dv= dvert;
+                       if(defgrp_invert) {
+                               for(i=0; i<numVerts; i++, dv++) {
+                                       vert_angles[i] *= (1.0f - 
defvert_find_weight(dv, defgrp_index));
+                               }
+                       }
+                       else {
+                               for(i=0; i<numVerts; i++, dv++) {
+                                       vert_angles[i] *= 
defvert_find_weight(dv, defgrp_index);
+                               }
+                       }
+               }
 
-               for(i=0; i<numVerts; i++, mv++) {
-                       if(vert_accum[i]) { /* zero if unselected */
-                               madd_v3_v3fl(mv->co, vert_nors[i], smd->offset 
* (vert_angles[i] / vert_accum[i]));
+               if(ofs_new) {
+                       mv= mvert + ((ofs_new >= ofs_orig) ? 0 : numVerts);
+
+                       for(i=0; i<numVerts; i++, mv++) {
+                               if(vert_accum[i]) { /* zero if unselected */
+                                       madd_v3_v3fl(mv->co, vert_nors[i], 
ofs_new * (vert_angles[i] / vert_accum[i]));
+                               }
                        }
                }
 
+               if(ofs_orig) {
+                       mv= mvert + ((ofs_new >= ofs_orig) ? numVerts : 0); /* 
same as above but swapped, intentional use of 'ofs_new' */
+
+                       for(i=0; i<numVerts; i++, mv++) {
+                               if(vert_accum[i]) { /* zero if unselected */
+                                       madd_v3_v3fl(mv->co, vert_nors[i], 
ofs_orig * (vert_angles[i] / vert_accum[i]));
+                               }
+                       }
+               }
+
                MEM_freeN(vert_angles);
        }
 
@@ -7942,10 +8004,11 @@
                MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
                float val;
                if(dvert){
-                       for(i=0; i<totvert; i++){
+                       int defgrp_index= emd->vgroup-1;
+                       for(i=0; i<totvert; i++, dvert++){
                                val = BLI_frand();
                                val = (1.0f-emd->protect)*val + 
emd->protect*0.5f;
-                               if(val < 
defvert_find_weight(dvert+i,emd->vgroup-1))
+                               if(val < defvert_find_weight(dvert, 
defgrp_index))
                                        vertpa[i] = -1;
                        }
                }

Modified: branches/render25/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- branches/render25/source/blender/makesdna/DNA_modifier_types.h      
2010-03-30 14:33:05 UTC (rev 27870)
+++ branches/render25/source/blender/makesdna/DNA_modifier_types.h      
2010-03-30 14:58:16 UTC (rev 27871)
@@ -683,6 +683,7 @@
 
        char defgrp_name[32];           /* name of vertex group to use */
        float offset;                   /* new surface offset level*/
+       float offset_fac;               /* midpoint of the offset  */
        float crease_inner;
        float crease_outer;
        float crease_rim;
@@ -693,6 +694,7 @@
 #define MOD_SOLIDIFY_RIM                       (1<<0)
 #define MOD_SOLIDIFY_EVEN                      (1<<1)
 #define MOD_SOLIDIFY_NORMAL_CALC       (1<<2)
+#define MOD_SOLIDIFY_VGROUP_INV                (1<<3)
 
 typedef struct ScrewModifierData {
        ModifierData modifier;

Modified: branches/render25/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- branches/render25/source/blender/makesrna/intern/rna_modifier.c     
2010-03-30 14:33:05 UTC (rev 27870)
+++ branches/render25/source/blender/makesrna/intern/rna_modifier.c     
2010-03-30 14:58:16 UTC (rev 27871)
@@ -2041,13 +2041,20 @@
        RNA_def_struct_sdna(srna, "SolidifyModifierData");
        RNA_def_struct_ui_icon(srna, ICON_MOD_SOLIDIFY);
 
-       prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_DISTANCE);
+       prop= RNA_def_property(srna, "thickness", PROP_FLOAT, PROP_DISTANCE);
        RNA_def_property_float_sdna(prop, NULL, "offset");
        RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
        RNA_def_property_ui_range(prop, -10, 10, 0.1, 4);
        RNA_def_property_ui_text(prop, "Thickness", "Thickness of the shell");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+       prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_DISTANCE);
+       RNA_def_property_float_sdna(prop, NULL, "offset_fac");
+       RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+       RNA_def_property_ui_range(prop, -1, 1, 0.1, 4);
+       RNA_def_property_ui_text(prop, "Offset", "");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
        prop= RNA_def_property(srna, "edge_crease_inner", PROP_FLOAT, 
PROP_FACTOR);
        RNA_def_property_float_sdna(prop, NULL, "crease_inner");
        RNA_def_property_range(prop, 0, 1);
@@ -2090,6 +2097,10 @@
        RNA_def_property_ui_text(prop, "High Quality Normals", "Calculate 
normals which result in more even thickness (slow, disable when not needed)");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+       prop= RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", 
MOD_SOLIDIFY_VGROUP_INV);
+       RNA_def_property_ui_text(prop, "Vertex Group Invert", "Invert the 
vertex group influence");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_screw(BlenderRNA *brna)


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to