solidify material offsets for 2nd surface and rim faces.
authorCampbell Barton <ideasman42@gmail.com>
Thu, 3 Mar 2011 05:09:07 +0000 (05:09 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 3 Mar 2011 05:09:07 +0000 (05:09 +0000)
run do_versions() on use_rim_material option so Sintel's jacket loads ok.
(request from Bassam)

release/scripts/ui/properties_data_modifier.py
source/blender/blenloader/intern/readfile.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c
source/blender/modifiers/intern/MOD_solidify.c

index 1aa28a76d1ab4d7d7702c797f4f81ea34c80204e..d038fb5ab2f3a3b6f812150f75341534107487e2 100644 (file)
@@ -573,6 +573,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
         col.prop(md, "edge_crease_inner", text="Inner")
         col.prop(md, "edge_crease_outer", text="Outer")
         col.prop(md, "edge_crease_rim", text="Rim")
+        col.label(text="Material Index Offset:")
 
         col = split.column()
 
@@ -586,8 +587,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
 
         col.prop(md, "use_rim")
         colsub = col.column()
+
+        colsub.label()
+        rowsub = colsub.split(align=True, percentage=0.4)
+        rowsub.prop(md, "material_offset", text="")
+        colsub = rowsub.row()
         colsub.active = md.use_rim
-        colsub.prop(md, "use_rim_material")
+        colsub.prop(md, "material_offset_rim", text="Rim")
 
     def SUBSURF(self, layout, ob, md):
         layout.row().prop(md, "subdivision_type", expand=True)
index 4e00b888c9083d88653417eb4b0c0b510b3ea538..8d1a77d1a2bb316296d092ded76632ed4e49c500 100644 (file)
@@ -11484,6 +11484,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
        {
                bScreen *sc;
                Brush *brush;
+               Object *ob;
                
                /* redraws flag in SpaceTime has been moved to Screen level */
                for (sc = main->screen.first; sc; sc= sc->id.next) {
@@ -11498,6 +11499,20 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                        if(brush->height == 0)
                                brush->height= 0.4;
                }
+
+               /* replace 'rim material' option for in offset*/
+               for(ob = main->object.first; ob; ob = ob->id.next) {
+                       ModifierData *md;
+                       for(md= ob->modifiers.first; md; md= md->next) {
+                               if (md->type == eModifierType_Solidify) {
+                                       SolidifyModifierData *smd = (SolidifyModifierData *)md;
+                                       if(smd->flag & MOD_SOLIDIFY_RIM_MATERIAL) {
+                                               smd->mat_ofs_rim= 1;
+                                               smd->flag &= ~MOD_SOLIDIFY_RIM_MATERIAL;
+                                       }
+                               }
+                       }
+               }
        }
        
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! */
index 28840d55efc29340cd3aa839134d2e7da81df944..5496c460b6f9a781a4a1db2a264030e2e763ffc1 100644 (file)
@@ -705,13 +705,16 @@ typedef struct SolidifyModifierData {
        float crease_outer;
        float crease_rim;
        int flag;
+       short mat_ofs;
+       short mat_ofs_rim;
+       int pad;
 } 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)
-#define MOD_SOLIDIFY_RIM_MATERIAL      (1<<4)
+#define MOD_SOLIDIFY_RIM_MATERIAL      (1<<4) /* deprecated, used in do_versions */
 
 typedef struct ScrewModifierData {
        ModifierData modifier;
index 375d9214e0858a881e3c70667d6339718e23ff11..140a4b435befa8ab34186e3848db48b73caa9228 100644 (file)
@@ -2162,6 +2162,18 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Rim Crease", "Assign a crease to the edges making up the rim");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+       prop= RNA_def_property(srna, "material_offset", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "mat_ofs");
+       RNA_def_property_range(prop, SHRT_MIN, SHRT_MAX);
+       RNA_def_property_ui_text(prop, "Material Offset", "Offset material index of generated faces");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop= RNA_def_property(srna, "material_offset_rim", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "mat_ofs_rim");
+       RNA_def_property_range(prop, SHRT_MIN, SHRT_MAX);
+       RNA_def_property_ui_text(prop, "Rim Material Offset", "Offset material index of generated rim faces");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
        prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
        RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
@@ -2172,11 +2184,6 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_RIM);
        RNA_def_property_ui_text(prop, "Fill Rim", "Create edge loops between the inner and outer surfaces on face edges (slow, disable when not needed)");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
-       
-       prop= RNA_def_property(srna, "use_rim_material", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_RIM_MATERIAL);
-       RNA_def_property_ui_text(prop, "Rim Material", "Use in the next material for rim faces");
-       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
        prop= RNA_def_property(srna, "use_even_offset", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_EVEN);
index 14a07b62a91e829ad28e66e65b1d9fe812ce49b9..8e44cd1ec3711b3ac25fa462756d141c4d4ea78d 100644 (file)
@@ -214,6 +214,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
        const int numEdges = dm->getNumEdges(dm);
        const int numFaces = dm->getNumFaces(dm);
 
+       /* only use material offsets if we have 2 or more materials  */
+       const short mat_nr_max= ob->totcol > 1 ? ob->totcol - 1 : 0;
+       const short mat_ofs= mat_nr_max ? smd->mat_ofs : 0;
+       const short mat_ofs_rim= mat_nr_max ? smd->mat_ofs_rim : 0;
+
        /* use for edges */
        int *new_vert_arr= NULL;
        int newFaces = 0;
@@ -360,6 +365,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                                DM_swap_face_data(result, i+numFaces, corner_indices);
                                test_index_face(mf, &result->faceData, numFaces, is_quad ? 4:3);
                        }
+
+                       if(mat_ofs) {
+                               mf->mat_nr += mat_ofs;
+                               CLAMP(mf->mat_nr, 0, mat_nr_max);
+                       }
                }
        }
 
@@ -520,9 +530,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                float (*edge_vert_nos)[3]= MEM_callocN(sizeof(float) * numVerts * 3, "solidify_edge_nos");
                float nor[3];
 #endif
-               /* maximum value -1, so we have room to increase */
-               const short mat_nr_shift= (smd->flag & MOD_SOLIDIFY_RIM_MATERIAL) ? ob->totcol-1 : -1;
-
                const unsigned char crease_rim= smd->crease_rim * 255.0f;
                const unsigned char crease_outer= smd->crease_outer * 255.0f;
                const unsigned char crease_inner= smd->crease_inner * 255.0f;
@@ -582,9 +589,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
                        }
                        
                        /* use the next material index if option enabled */
-                       if(mf->mat_nr < mat_nr_shift)
-                               mf->mat_nr++;
-
+                       if(mat_ofs_rim) {
+                               mf->mat_nr += mat_ofs_rim;
+                               CLAMP(mf->mat_nr, 0, mat_nr_max);
+                       }
                        if(crease_outer)
                                ed->crease= crease_outer;