Revision: 28156
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28156
Author:   nazgul
Date:     2010-04-13 08:06:49 +0200 (Tue, 13 Apr 2010)

Log Message:
-----------
Todo #21831: Deform modifier is applied to base mesh instead of
             multires modifier if both are in the stack (patch #21965)

This patch also removes limitation of multires reshaping when
destination object has got modifiers after multires modifier.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_multires.h
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/editors/object/object_modifier.c

Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h      2010-04-13 
00:55:37 UTC (rev 28155)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h      2010-04-13 
06:06:49 UTC (rev 28156)
@@ -35,6 +35,7 @@
 struct MFace;
 struct Multires;
 struct MultiresModifierData;
+struct ModifierData;
 struct Object;
 
 void multires_mark_as_modified(struct Object *ob);
@@ -46,11 +47,14 @@
        int local_mmd, struct DerivedMesh*, struct Object *, int, int);
 
 struct MultiresModifierData *find_multires_modifier(struct Object *ob);
+struct DerivedMesh *get_multires_dm(struct Object *ob);
 void multiresModifier_join(struct Object *);
 void multiresModifier_del_levels(struct MultiresModifierData *, struct Object 
*, int direction);
 void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct 
Object *ob,
                                int updateblock, int simple);
 int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object 
*dst, struct Object *src);
+int multiresModifier_reshapeFromDM(struct MultiresModifierData *mmd, struct 
Object *ob, struct DerivedMesh *srcdm);
+int multiresModifier_reshapeFromDeformMod(struct MultiresModifierData *mmd, 
struct Object *ob, struct ModifierData *md);
 
 void multires_stitch_grids(struct Object *);
 

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c   2010-04-13 
00:55:37 UTC (rev 28155)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c   2010-04-13 
06:06:49 UTC (rev 28156)
@@ -60,6 +60,22 @@
 static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
 static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, 
int add, DMGridData **oldGridData, int totlvl);
 
+DerivedMesh *get_multires_dm(Object *ob)
+{
+       Mesh *me= ob->data;
+       ModifierData *md= (ModifierData *)find_multires_modifier(ob);
+       ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+       DerivedMesh *tdm = CDDM_from_mesh(me, ob);
+       DerivedMesh *dm;
+
+       CDDM_calc_normals(tdm);
+       dm = mti->applyModifier(md, ob, tdm, 0, 1);
+
+       if(tdm != dm) tdm->release(tdm);
+
+       return dm;
+}
+
 MultiresModifierData *find_multires_modifier(Object *ob)
 {
        ModifierData *md;
@@ -191,24 +207,64 @@
 }
 #endif
 
-/* Returns 1 on success, 0 if the src's totvert doesn't match */
-int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object 
*src)
+int multiresModifier_reshapeFromDM(MultiresModifierData *mmd, Object *ob, 
DerivedMesh *srcdm)
 {
-       DerivedMesh *srcdm = src->derivedFinal;
-       DerivedMesh *mrdm = dst->derivedFinal;
+       DerivedMesh *mrdm = get_multires_dm (ob);
 
        if(mrdm && srcdm && mrdm->getNumVerts(mrdm) == 
srcdm->getNumVerts(srcdm)) {
                multires_mvert_to_ss(mrdm, srcdm->getVertArray(srcdm));
 
                multires_dm_mark_as_modified(mrdm);
-               multires_force_update(dst);
+               multires_force_update(ob);
 
+               mrdm->release(mrdm);
+
                return 1;
        }
 
+       mrdm->release(mrdm);
+
        return 0;
 }
 
+/* Returns 1 on success, 0 if the src's totvert doesn't match */
+int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object 
*src)
+{
+       DerivedMesh *srcdm = src->derivedFinal;
+       return multiresModifier_reshapeFromDM(mmd, dst, srcdm);
+}
+
+int multiresModifier_reshapeFromDeformMod(MultiresModifierData *mmd, Object 
*ob, ModifierData *md)
+{
+       ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+       DerivedMesh *dm, *ndm;
+       int numVerts, result;
+       float (*deformedVerts)[3];
+
+       /* Create DerivedMesh for deformation modifier */
+       dm = get_multires_dm(ob);
+       numVerts= dm->getNumVerts(dm);
+       deformedVerts= MEM_callocN(sizeof(float)*numVerts*3, 
"multiresReshape_deformVerts");
+
+       dm->getVertCos(dm, deformedVerts);
+       mti->deformVerts(md, ob, dm, deformedVerts, numVerts, 0, 0);
+
+       ndm= CDDM_copy(dm);
+       CDDM_apply_vert_coords(ndm, deformedVerts);
+
+       MEM_freeN(deformedVerts);
+       dm->release(dm);
+
+       /* Reshaping */
+       result= multiresModifier_reshapeFromDM(mmd, ob, ndm);
+
+       /* Cleanup */
+       ndm->release(ndm);
+
+       return result;
+}
+
+
 static void column_vectors_to_mat3(float mat[][3], float v1[3], float v2[3], 
float v3[3])
 {
        copy_v3_v3(mat[0], v1);

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c       
2010-04-13 00:55:37 UTC (rev 28155)
+++ trunk/blender/source/blender/editors/object/object_modifier.c       
2010-04-13 06:06:49 UTC (rev 28156)
@@ -389,32 +389,44 @@
 
 static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object 
*ob, ModifierData *md)
 {
+       ModifierTypeInfo *mti= modifierType_getInfo(md->type);
+
+       if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && 
mti->isDisabled(md, 0))) {
+               BKE_report(reports, RPT_ERROR, "Modifier is disabled, skipping 
apply");
+               return 0;
+       }
+
        if (ob->type==OB_MESH) {
                DerivedMesh *dm;
                Mesh *me = ob->data;
+               MultiresModifierData *mmd= find_multires_modifier(ob);
+
                if( me->key) {
                        BKE_report(reports, RPT_ERROR, "Modifier cannot be 
applied to Mesh with Shape Keys");
                        return 0;
                }
-               
+
                mesh_pmv_off(ob, me);
-               
+
                /* Multires: ensure that recent sculpting is applied */
                if(md->type == eModifierType_Multires)
                        multires_force_update(ob);
-               
-               dm = mesh_create_derived_for_modifier(scene, ob, md);
-               if (!dm) {
-                       BKE_report(reports, RPT_ERROR, "Modifier is disabled or 
returned error, skipping apply");
-                       return 0;
+
+               if (mmd && mti->type==eModifierTypeType_OnlyDeform) {
+                       multiresModifier_reshapeFromDeformMod (mmd, ob, md);
+               } else {
+                       dm = mesh_create_derived_for_modifier(scene, ob, md);
+                       if (!dm) {
+                               BKE_report(reports, RPT_ERROR, "Modifier is 
returned error, skipping apply");
+                               return 0;
+                       }
+
+                       DM_to_mesh(dm, me);
+
+                       dm->release(dm);
                }
-               
-               DM_to_mesh(dm, me);
-               
-               dm->release(dm);
        } 
        else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
-               ModifierTypeInfo *mti = modifierType_getInfo(md->type);
                Curve *cu;
                int numVerts;
                float (*vertexCos)[3];
@@ -427,11 +439,6 @@
                cu = ob->data;
                BKE_report(reports, RPT_INFO, "Applied modifier only changed CV 
points, not tesselated/bevel vertices");
 
-               if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && 
mti->isDisabled(md, 0))) {
-                       BKE_report(reports, RPT_ERROR, "Modifier is disabled, 
skipping apply");
-                       return 0;
-               }
-
                vertexCos = curve_getVertexCos(cu, &cu->nurb, &numVerts);
                mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0, 0);
                curve_applyVertexCos(cu, &cu->nurb, vertexCos);
@@ -829,11 +836,6 @@
        Object *ob= ptr.id.data, *secondob= NULL;
        MultiresModifierData *mmd= ptr.data;
 
-       if(ob->derivedFinal == NULL || ob->derivedFinal->type != DM_TYPE_CCGDM) 
{
-               BKE_report(op->reports, RPT_ERROR, "Active objects multires is 
disabled, can't reshape multires data.");
-               return OPERATOR_CANCELLED;
-       }
-
        CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) {
                if(selob->type == OB_MESH && selob != ob) {
                        secondob= selob;


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

Reply via email to