Revision: 38300
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38300
Author:   blendix
Date:     2011-07-11 09:15:20 +0000 (Mon, 11 Jul 2011)
Log Message:
-----------
Fix #27930: many modifiers crashed when used on a lattice with a vertex group.

Modified Paths:
--------------
    trunk/blender/source/blender/modifiers/intern/MOD_cast.c
    trunk/blender/source/blender/modifiers/intern/MOD_displace.c
    trunk/blender/source/blender/modifiers/intern/MOD_hook.c
    trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
    trunk/blender/source/blender/modifiers/intern/MOD_simpledeform.c
    trunk/blender/source/blender/modifiers/intern/MOD_smooth.c
    trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
    trunk/blender/source/blender/modifiers/intern/MOD_util.c
    trunk/blender/source/blender/modifiers/intern/MOD_util.h
    trunk/blender/source/blender/modifiers/intern/MOD_warp.c
    trunk/blender/source/blender/modifiers/intern/MOD_wave.c

Modified: trunk/blender/source/blender/modifiers/intern/MOD_cast.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_cast.c    2011-07-11 
09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_cast.c    2011-07-11 
09:15:20 UTC (rev 38300)
@@ -177,11 +177,8 @@
 
        /* 3) if we were given a vertex group name,
        * only those vertices should be affected */
-       defgrp_index = defgroup_name_index(ob, cmd->defgrp_name);
+       modifier_get_vgroup(ob, dm, cmd->defgrp_name, &dvert, &defgrp_index);
 
-       if ((ob->type == OB_MESH) && dm && defgrp_index >= 0)
-               dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-
        if(flag & MOD_CAST_SIZE_FROM_RADIUS) {
                len = cmd->radius;
        }
@@ -335,11 +332,8 @@
 
        /* 3) if we were given a vertex group name,
        * only those vertices should be affected */
-       defgrp_index = defgroup_name_index(ob, cmd->defgrp_name);
+       modifier_get_vgroup(ob, dm, cmd->defgrp_name, &dvert, &defgrp_index);
 
-       if ((ob->type == OB_MESH) && dm && defgrp_index >= 0)
-               dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-
        if (ctrl_ob) {
                if(flag & MOD_CAST_USE_OB_TRANSFORM) {
                        invert_m4_m4(ctrl_ob->imat, ctrl_ob->obmat);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_displace.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_displace.c        
2011-07-11 09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_displace.c        
2011-07-11 09:15:20 UTC (rev 38300)
@@ -169,7 +169,7 @@
 {
        int i;
        MVert *mvert;
-       MDeformVert *dvert = NULL;
+       MDeformVert *dvert;
        int defgrp_index;
        float (*tex_co)[3];
        float weight= 1.0f; /* init value unused but some compilers may 
complain */
@@ -177,11 +177,8 @@
        if(!dmd->texture) return;
        if(dmd->strength == 0.0f) return;
 
-       defgrp_index = defgroup_name_index(ob, dmd->defgrp_name);
-
        mvert = CDDM_get_verts(dm);
-       if(defgrp_index >= 0)
-               dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+       modifier_get_vgroup(ob, dm, dmd->defgrp_name, &dvert, &defgrp_index);
 
        tex_co = MEM_callocN(sizeof(*tex_co) * numVerts,
                                 "displaceModifier_do tex_co");

Modified: trunk/blender/source/blender/modifiers/intern/MOD_hook.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_hook.c    2011-07-11 
09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_hook.c    2011-07-11 
09:15:20 UTC (rev 38300)
@@ -157,9 +157,8 @@
        int i, *index_pt;
        const float falloff_squared= hmd->falloff * hmd->falloff; /* for faster 
comparisons */
        
-       int max_dvert= 0;
-       MDeformVert *dvert= NULL;
-       int defgrp_index = -1;
+       MDeformVert *dvert;
+       int defgrp_index, max_dvert;
        
        /* get world-space matrix of target, corrected for the space the verts 
are in */
        if (hmd->subtarget[0] && pchan) {
@@ -174,21 +173,8 @@
        mul_serie_m4(mat, ob->imat, dmat, hmd->parentinv,
                         NULL, NULL, NULL, NULL, NULL);
 
-       if((defgrp_index= defgroup_name_index(ob, hmd->name)) != -1) {
-               Mesh *me = ob->data;
-               if(dm) {
-                       dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT);
-                       if(dvert) {
-                               max_dvert = numVerts;
-                       }
-               }
-               else if(me->dvert) {
-                       dvert= me->dvert;
-                       if(dvert) {
-                               max_dvert = me->totvert;
-                       }
-               }
-       }
+       modifier_get_vgroup(ob, dm, hmd->name, &dvert, &defgrp_index);
+       max_dvert = (dvert)? numVerts: 0;
 
        /* Regarding index range checking below.
         *

Modified: trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c      
2011-07-11 09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c      
2011-07-11 09:15:20 UTC (rev 38300)
@@ -284,11 +284,8 @@
                        copy_v3_v3(dco[a], co);
        }
 
-       defgrp_index = defgroup_name_index(ob, mmd->defgrp_name);
+       modifier_get_vgroup(ob, dm, mmd->defgrp_name, &dvert, &defgrp_index);
 
-       if(dm && defgrp_index >= 0)
-               dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT);
-
        /* do deformation */
        fac= 1.0f;
 

Modified: trunk/blender/source/blender/modifiers/intern/MOD_simpledeform.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_simpledeform.c    
2011-07-11 09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_simpledeform.c    
2011-07-11 09:15:20 UTC (rev 38300)
@@ -162,8 +162,8 @@
        float smd_limit[2], smd_factor;
        SpaceTransform *transf = NULL, tmp_transf;
        void (*simpleDeform_callback)(const float factor, const float dcut[3], 
float *co) = NULL;       //Mode callback
-       int vgroup = defgroup_name_index(ob, smd->vgroup_name);
-       MDeformVert *dvert = NULL;
+       int vgroup;
+       MDeformVert *dvert;
 
        //Safe-check
        if(smd->origin == ob) smd->origin = NULL;                               
        //No self references
@@ -216,18 +216,8 @@
                smd_factor   = smd->factor / MAX2(FLT_EPSILON, 
smd_limit[1]-smd_limit[0]);
        }
 
+       modifier_get_vgroup(ob, dm, smd->vgroup_name, &dvert, &vgroup);
 
-       if(dm)
-       {
-               dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-       }
-       else if(ob->type == OB_LATTICE)
-       {
-               dvert = lattice_get_deform_verts(ob);
-       }
-
-
-
        switch(smd->mode)
        {
                case MOD_SIMPLEDEFORM_MODE_TWIST:       simpleDeform_callback = 
simpleDeform_twist;             break;

Modified: trunk/blender/source/blender/modifiers/intern/MOD_smooth.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_smooth.c  2011-07-11 
09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_smooth.c  2011-07-11 
09:15:20 UTC (rev 38300)
@@ -123,11 +123,8 @@
        medges = dm->getEdgeArray(dm);
        numDMEdges = dm->getNumEdges(dm);
 
-       defgrp_index = defgroup_name_index(ob, smd->defgrp_name);
+       modifier_get_vgroup(ob, dm, smd->defgrp_name, &dvert, &defgrp_index);
 
-       if (defgrp_index >= 0)
-               dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
-
        /* NOTICE: this can be optimized a little bit by moving the
        * if (dvert) out of the loop, if needed */
        for (j = 0; j < smd->repeat; j++) {

Modified: trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_solidify.c        
2011-07-11 09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_solidify.c        
2011-07-11 09:15:20 UTC (rev 38300)
@@ -48,6 +48,7 @@
 
 
 #include "MOD_modifiertypes.h"
+#include "MOD_util.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -235,12 +236,11 @@
        float const ofs_new= smd->offset        - (((-smd->offset_fac + 1.0f) * 
0.5f) * smd->offset);
 
        /* weights */
-       MDeformVert *dvert= NULL, *dv= NULL;
+       MDeformVert *dvert, *dv= NULL;
        const int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0);
-       const int defgrp_index= defgroup_name_index(ob, smd->defgrp_name);
+       int defgrp_index;
 
-       if (defgrp_index >= 0)
-               dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+       modifier_get_vgroup(ob, dm, smd->defgrp_name, &dvert, &defgrp_index);
 
        orig_mface = dm->getFaceArray(dm);
        orig_medge = dm->getEdgeArray(dm);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_util.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_util.c    2011-07-11 
09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_util.c    2011-07-11 
09:15:20 UTC (rev 38300)
@@ -37,6 +37,7 @@
 
 #include <string.h>
 
+#include "DNA_lattice_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_curve_types.h"
@@ -47,6 +48,8 @@
 #include "BLI_math_matrix.h"
 
 #include "BKE_cdderivedmesh.h"
+#include "BKE_deform.h"
+#include "BKE_lattice.h"
 #include "BKE_mesh.h"
 #include "BKE_displist.h"
 
@@ -239,6 +242,19 @@
        return dm;
 }
 
+void modifier_get_vgroup(Object *ob, DerivedMesh *dm, const char *name, 
MDeformVert **dvert, int *defgrp_index)
+{
+       *defgrp_index = defgroup_name_index(ob, name);
+       *dvert = NULL;
+
+       if(*defgrp_index >= 0) {
+               if(ob->type == OB_LATTICE)
+                       *dvert = lattice_get_deform_verts(ob);
+               else if(dm)
+                       *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+       }
+}
+
 /* only called by BKE_modifier.h/modifier.c */
 void modifier_type_init(ModifierTypeInfo *types[])
 {

Modified: trunk/blender/source/blender/modifiers/intern/MOD_util.h
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_util.h    2011-07-11 
09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_util.h    2011-07-11 
09:15:20 UTC (rev 38300)
@@ -36,14 +36,15 @@
 /* so modifier types match their defines */
 #include "MOD_modifiertypes.h"
 
-struct Tex;
-struct TexResult;
 struct CustomData;
 struct DerivedMesh;
+struct EditMesh;
+struct MDeformVert;
+struct ModifierData;
 struct Object;
 struct Scene;
-struct EditMesh;
-struct ModifierData;
+struct Tex;
+struct TexResult;
 
 void get_texture_value(struct Tex *texture, float *tex_co, struct TexResult 
*texres);
 void get_texture_coords(struct MappingInfoModifierData *dmd, struct Object 
*ob, struct DerivedMesh *dm, float (*co)[3], float (*texco)[3], int numVerts);
@@ -51,5 +52,6 @@
 void validate_layer_name(const struct CustomData *data, int type, char *name, 
char *outname);
 struct DerivedMesh *get_cddm(struct Object *ob, struct EditMesh *em, struct 
DerivedMesh *dm, float (*vertexCos)[3]);
 struct DerivedMesh *get_dm(struct Object *ob, struct EditMesh *em, struct 
DerivedMesh *dm, float (*vertexCos)[3], int orco);
+void modifier_get_vgroup(struct Object *ob, DerivedMesh *dm, const char *name, 
struct MDeformVert **dvert, int *defgrp_index);
 
 #endif /* MOD_UTIL_H */

Modified: trunk/blender/source/blender/modifiers/intern/MOD_warp.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_warp.c    2011-07-11 
09:08:08 UTC (rev 38299)
+++ trunk/blender/source/blender/modifiers/intern/MOD_warp.c    2011-07-11 
09:15:20 UTC (rev 38300)
@@ -85,8 +85,8 @@
        CustomDataMask dataMask = 0;
 
        /* ask for vertexgroups if we need them */
-       if(wmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
-       dataMask |= (1 << CD_MDEFORMVERT);
+       if(wmd->defgrp_name[0]) dataMask |= (CD_MASK_MDEFORMVERT);
+       dataMask |= (CD_MASK_MDEFORMVERT);
 
        /* ask for UV coordinates if we need them */

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to