New option for multires modifier: Subdivide UVs
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 28 Jul 2011 11:16:10 +0000 (11:16 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 28 Jul 2011 11:16:10 +0000 (11:16 +0000)
Enabled by default and also enabled for older filesm so
there should be no regressions.

In some cases it's useful to not use subdivided uvs for multires.

release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/blenkernel/intern/multires.c
source/blender/makesdna/DNA_modifier_types.h
source/blender/makesrna/intern/rna_modifier.c

index ce6d0990f05293a8dc713e3db01cf2b7fb3039b2..0a4d0b605140fb0f84a97641d709bb7b5cb20dd4 100644 (file)
@@ -394,6 +394,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
         col.operator("object.multires_higher_levels_delete", text="Delete Higher")
         col.operator("object.multires_reshape", text="Reshape")
         col.operator("object.multires_base_apply", text="Apply Base")
+        col.prop(md, "use_subsurf_uv")
         col.prop(md, "show_only_control_edges")
 
         layout.separator()
index d833c1842747b97c6c48f20af269eea8d2be2e12..88a670ecb220d4e9ff701cb13d148d7de7b04498 100644 (file)
@@ -465,12 +465,13 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv
        return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0);
 }
 
-static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal)
+static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal, int plain_uv)
 {
        SubsurfModifierData smd= {{NULL}};
 
        smd.levels = smd.renderLevels = lvl;
-       smd.flags |= eSubsurfModifierFlag_SubsurfUv;
+       if(!plain_uv)
+               smd.flags |= eSubsurfModifierFlag_SubsurfUv;
        if(simple)
                smd.subdivType = ME_SIMPLE_SUBSURF;
        if(optimal)
@@ -591,7 +592,7 @@ void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
        /* subdivide the mesh to highest level without displacements */
        cddm = CDDM_from_mesh(me, NULL);
        DM_set_only_copy(cddm, CD_MASK_BAREMESH);
-       origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0);
+       origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
        cddm->release(cddm);
 
        /* calc disps */
@@ -626,7 +627,7 @@ static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl
                /* create subsurf DM from original mesh at high level */
                cddm = CDDM_from_mesh(me, NULL);
                DM_set_only_copy(cddm, CD_MASK_BAREMESH);
-               highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0);
+               highdm = subsurf_dm_create_local(ob, cddm, totlvl, simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
 
                /* create multires DM from original mesh at low level */
                lowdm = multires_dm_create_local(ob, cddm, lvl, lvl, simple);
@@ -830,7 +831,7 @@ static void multiresModifier_update(DerivedMesh *dm)
                        else cddm = CDDM_from_mesh(me, NULL);
                        DM_set_only_copy(cddm, CD_MASK_BAREMESH);
 
-                       highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0);
+                       highdm = subsurf_dm_create_local(ob, cddm, totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
 
                        /* create multires DM from original mesh and displacements */
                        lowdm = multires_dm_create_local(ob, cddm, lvl, totlvl, mmd->simple);
@@ -884,7 +885,7 @@ static void multiresModifier_update(DerivedMesh *dm)
                        else cddm = CDDM_from_mesh(me, NULL);
                        DM_set_only_copy(cddm, CD_MASK_BAREMESH);
 
-                       subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0);
+                       subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
                        cddm->release(cddm);
 
                        multiresModifier_disp_run(dm, me, 1, 0, subdm->getGridData(subdm), mmd->totlvl);
@@ -927,7 +928,8 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca
                return dm;
 
        result = subsurf_dm_create_local(ob, dm, lvl,
-               mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges);
+               mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges,
+               mmd->flags & eMultiresModifierFlag_PlainUv);
 
        if(!local_mmd) {
                ccgdm = (CCGDerivedMesh*)result;
@@ -1633,7 +1635,7 @@ static void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
        MEM_freeN(vertCos);
 
        /* scaled ccgDM for tangent space of object with applied scale */
-       dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0);
+       dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0, mmd->flags & eMultiresModifierFlag_PlainUv);
        cddm->release(cddm);
 
        /*numGrids= dm->getNumGrids(dm);*/ /*UNUSED*/
index d2d8e014015f84c4140add653450d8ff4ba001a4..3787675f339da4766981bf723ced730abf5164b8 100644 (file)
@@ -624,6 +624,7 @@ typedef struct MultiresModifierData {
 
 typedef enum {
        eMultiresModifierFlag_ControlEdges = (1<<0),
+       eMultiresModifierFlag_PlainUv = (1<<1),
 } MultiresModifierFlag;
 
 typedef struct FluidsimModifierData {
index d2c1b862fee48783571f112f9b8da0a1ec1514aa..ba655915fb62a961c43bf94264d47655bafc7d25 100644 (file)
@@ -805,6 +805,11 @@ static void rna_def_modifier_multires(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flags", eMultiresModifierFlag_ControlEdges);
        RNA_def_property_ui_text(prop, "Optimal Display", "Skip drawing/rendering of interior subdivided edges");
        RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+       prop= RNA_def_property(srna, "use_subsurf_uv", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "flags", eMultiresModifierFlag_PlainUv);
+       RNA_def_property_ui_text(prop, "Subdivide UVs", "Use subsurf to subdivide UVs");
+       RNA_def_property_update(prop, 0, "rna_Modifier_update");
 }
 
 static void rna_def_modifier_lattice(BlenderRNA *brna)