Revision: 19883
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19883
Author:   blendix
Date:     2009-04-23 00:38:23 +0200 (Thu, 23 Apr 2009)

Log Message:
-----------
Fix for bug #18509: mesh deform modifier not working on load,
with cage on hidden layer.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/modifier.c

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c   2009-04-22 
22:12:36 UTC (rev 19882)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c   2009-04-22 
22:38:23 UTC (rev 19883)
@@ -6054,8 +6054,6 @@
        float (*vertexCos)[3], int numVerts)
 {
        SurfaceModifierData *surmd = (SurfaceModifierData*) md;
-       DerivedMesh *dm = NULL;
-       float current_time = 0;
        unsigned int numverts = 0, i = 0;
        
        if(surmd->dm)
@@ -6258,6 +6256,48 @@
 
        return 0;
 }
+
+static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int 
orco)
+{
+       DerivedMesh *dm= NULL;
+
+       if(ob->type==OB_MESH) {
+               dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
+
+               if(vertexCos) {
+                       CDDM_apply_vert_coords(dm, vertexCos);
+                       //CDDM_calc_normals(dm);
+               }
+               
+               if(orco)
+                       DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, 
get_mesh_orco_verts(ob));
+       }
+       else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
+               Object *tmpobj;
+               Curve *tmpcu;
+
+               if(is_last_displist(ob)) {
+                       /* copies object and modifiers (but not the data) */
+                       tmpobj= copy_object(ob);
+                       tmpcu = (Curve *)tmpobj->data;
+                       tmpcu->id.us--;
+
+                       /* copies the data */
+                       tmpobj->data = copy_curve((Curve *) ob->data);
+
+                       makeDispListCurveTypes(tmpobj, 1);
+                       nurbs_to_mesh(tmpobj);
+
+                       dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
+                       //CDDM_calc_normals(dm);
+
+                       free_libblock_us(&G.main->object, tmpobj);
+               }
+       }
+
+       return dm;
+}
+
 /* saves the current emitter state for a particle system and calculates 
particles */
 static void particleSystemModifier_deformVerts(
                                               ModifierData *md, Object *ob, 
DerivedMesh *derivedData,
@@ -6285,43 +6325,13 @@
        if(!psys_check_enabled(ob, psys))
                return;
 
-       if(dm==0){
-               if(ob->type==OB_MESH){
-                       dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
+       if(dm==0) {
+               dm= get_original_dm(ob, vertexCos, 1);
 
-                       CDDM_apply_vert_coords(dm, vertexCos);
-                       //CDDM_calc_normals(dm);
-                       
-                       DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, 
get_mesh_orco_verts(ob));
+               if(!dm)
+                       return;
 
-                       needsFree=1;
-               }
-               else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)){
-                       Object *tmpobj;
-                       Curve *tmpcu;
-
-                       if(is_last_displist(ob)){
-                               /* copies object and modifiers (but not the 
data) */
-                               tmpobj= copy_object( ob );
-                               tmpcu = (Curve *)tmpobj->data;
-                               tmpcu->id.us--;
-
-                               /* copies the data */
-                               tmpobj->data = copy_curve( (Curve *) ob->data );
-
-                               makeDispListCurveTypes( tmpobj, 1 );
-                               nurbs_to_mesh( tmpobj );
-
-                               dm = CDDM_from_mesh((Mesh*)(tmpobj->data), 
tmpobj);
-                               //CDDM_calc_normals(dm);
-
-                               free_libblock_us( &G.main->object, tmpobj );
-
-                               needsFree=1;
-                       }
-                       else return;
-               }
-               else return;
+               needsFree= 1;
        }
 
        /* clear old dm */
@@ -7658,6 +7668,14 @@
        }
        else
                cagedm= mmd->object->derivedFinal;
+
+       /* if we don't have one computed, use derivedmesh from data
+        * without any modifiers */
+       if(!cagedm) {
+               cagedm= get_original_dm(mmd->object, NULL, 0);
+               if(cagedm)
+                       cagedm->needsFree= 1;
+       }
        
        if(!cagedm)
                return;


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

Reply via email to