svn merge https://svn.blender.org/svnroot/bf-blender/branches/render25 -r27867:27871
authorCampbell Barton <ideasman42@gmail.com>
Wed, 31 Mar 2010 07:28:23 +0000 (07:28 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 31 Mar 2010 07:28:23 +0000 (07:28 +0000)
release/scripts/ui/properties_data_modifier.py
source/blender/blenkernel/intern/modifier.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c

index b101315..3ab102a 100644 (file)
@@ -625,11 +625,13 @@ class DATA_PT_modifiers(DataButtonsPanel):
         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 @@ class DATA_PT_modifiers(DataButtonsPanel):
 
         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")
index acab22a..76e49c0 100644 (file)
@@ -5718,6 +5718,7 @@ static void solidifyModifier_copyData(ModifierData *md, ModifierData *target)
        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 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md,
 
        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);
@@ -5888,16 +5902,38 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md,
 
        if((smd->flag & MOD_SOLIDIFY_EVEN) == 0) {
                /* no even thickness, very simple */
-               float scalar_short = smd->offset / 32767.0f;
-
-               if(smd->offset < 0.0f)  mv= mvert+numVerts;
-               else                                    mv= mvert;
+               float scalar_short;
+               float scalar_short_vgroup;
+
+
+               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);
+                       }
+               }
 
-               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_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 */
@@ -5949,12 +5985,38 @@ static DerivedMesh *solidifyModifier_applyModifier(ModifierData *md,
                        }
                }
 
-               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);
+                               }
+                       }
+               }
+
+               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], smd->offset * (vert_angles[i] / vert_accum[i]));
+                       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]));
+                               }
                        }
                }
 
@@ -7943,10 +8005,11 @@ static void explodeModifier_createFacepa(ExplodeModifierData *emd,
                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;
                        }
                }
index f5b8026..a9178a3 100644 (file)
@@ -683,6 +683,7 @@ typedef struct SolidifyModifierData {
 
        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;
@@ -692,6 +693,7 @@ typedef struct SolidifyModifierData {
 #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;
index 4abf979..14be366 100644 (file)
@@ -2040,13 +2040,20 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
        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);
@@ -2089,6 +2096,10 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
        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)