Commit: 9c95fd0a988fcd14f050098385e5461e2e51100d
Author: Bastien Montagne
Date:   Thu Sep 4 16:43:52 2014 +0200
Branches: master
https://developer.blender.org/rB9c95fd0a988fcd14f050098385e5461e2e51100d

Fix T41713: Lattice - Influence vertexgroup in curve modifier gets ignored

This was never implemented, actually... Was also the occasion to rework a bit
`curve_deform_verts()`, code there was sometimes needlessly complicated and 
slowish
(like getting weight from dm vertex per vertex, instead of whole array at 
once...).

===================================================================

M       source/blender/blenkernel/intern/lattice.c

===================================================================

diff --git a/source/blender/blenkernel/intern/lattice.c 
b/source/blender/blenkernel/intern/lattice.c
index 1f60985..3f12e3e 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -729,7 +729,8 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object 
*target, DerivedMesh
        Curve *cu;
        int a;
        CurveDeform cd;
-       int use_vgroups;
+       MDeformVert *dvert = NULL;
+       int defgrp_index = -1;
        const bool is_neg_axis = (defaxis > 2);
 
        if (cuOb->type != OB_CURVE)
@@ -750,75 +751,63 @@ void curve_deform_verts(Scene *scene, Object *cuOb, 
Object *target, DerivedMesh
                cd.dmax[0] = cd.dmax[1] = cd.dmax[2] =  0.0f;
        }
        
-       /* check whether to use vertex groups (only possible if target is a 
Mesh)
-        * we want either a Mesh with no derived data, or derived data with
-        * deformverts
+       /* Check whether to use vertex groups (only possible if target is a 
Mesh or Lattice).
+        * We want either a Mesh/Lattice with no derived data, or derived data 
with deformverts.
         */
-       if (target->type == OB_MESH) {
-               /* if there's derived data without deformverts, don't use 
vgroups */
-               if (dm) {
-                       use_vgroups = (dm->getVertData(dm, 0, CD_MDEFORMVERT) 
!= NULL);
-               }
-               else {
-                       Mesh *me = target->data;
-                       use_vgroups = (me->dvert != NULL);
+       if (vgroup && vgroup[0] && ELEM(target->type, OB_MESH, OB_LATTICE)) {
+               defgrp_index = defgroup_name_index(target, vgroup);
+
+               if (defgrp_index != -1) {
+                       /* if there's derived data without deformverts, don't 
use vgroups */
+                       if (dm) {
+                               dvert = dm->getVertDataArray(dm, 
CD_MDEFORMVERT);
+                       }
+                       else if (target->type == OB_LATTICE) {
+                               dvert = ((Lattice *)target->data)->dvert;
+                       }
+                       else {
+                               dvert = ((Mesh *)target->data)->dvert;
+                       }
                }
        }
-       else {
-               use_vgroups = false;
-       }
-       
-       if (vgroup && vgroup[0] && use_vgroups) {
-               Mesh *me = target->data;
-               const int defgrp_index = defgroup_name_index(target, vgroup);
 
-               if (defgrp_index != -1 && (me->dvert || dm)) {
-                       MDeformVert *dvert = me->dvert;
-                       float vec[3];
-                       float weight;
-       
+       if (dvert) {
+               MDeformVert *dvert_iter;
+               float vec[3];
 
-                       if (cu->flag & CU_DEFORM_BOUNDS_OFF) {
-                               dvert = me->dvert;
-                               for (a = 0; a < numVerts; a++, dvert++) {
-                                       if (dm) dvert = dm->getVertData(dm, a, 
CD_MDEFORMVERT);
-                                       weight = defvert_find_weight(dvert, 
defgrp_index);
-       
-                                       if (weight > 0.0f) {
-                                               mul_m4_v3(cd.curvespace, 
vertexCos[a]);
-                                               copy_v3_v3(vec, vertexCos[a]);
-                                               calc_curve_deform(scene, cuOb, 
vec, defaxis, &cd, NULL);
-                                               interp_v3_v3v3(vertexCos[a], 
vertexCos[a], vec, weight);
-                                               mul_m4_v3(cd.objectspace, 
vertexCos[a]);
-                                       }
+               if (cu->flag & CU_DEFORM_BOUNDS_OFF) {
+                       for (a = 0, dvert_iter = dvert; a < numVerts; a++, 
dvert_iter++) {
+                               const float weight = 
defvert_find_weight(dvert_iter, defgrp_index);
+
+                               if (weight > 0.0f) {
+                                       mul_m4_v3(cd.curvespace, vertexCos[a]);
+                                       copy_v3_v3(vec, vertexCos[a]);
+                                       calc_curve_deform(scene, cuOb, vec, 
defaxis, &cd, NULL);
+                                       interp_v3_v3v3(vertexCos[a], 
vertexCos[a], vec, weight);
+                                       mul_m4_v3(cd.objectspace, vertexCos[a]);
                                }
                        }
-                       else {
-                               /* set mesh min/max bounds */
-                               INIT_MINMAX(cd.dmin, cd.dmax);
-       
-                               for (a = 0; a < numVerts; a++, dvert++) {
-                                       if (dm) dvert = dm->getVertData(dm, a, 
CD_MDEFORMVERT);
-                                       
-                                       if (defvert_find_weight(dvert, 
defgrp_index) > 0.0f) {
-                                               mul_m4_v3(cd.curvespace, 
vertexCos[a]);
-                                               minmax_v3v3_v3(cd.dmin, 
cd.dmax, vertexCos[a]);
-                                       }
+               }
+               else {
+                       /* set mesh min/max bounds */
+                       INIT_MINMAX(cd.dmin, cd.dmax);
+
+                       for (a = 0, dvert_iter = dvert; a < numVerts; a++, 
dvert_iter++) {
+                               if (defvert_find_weight(dvert_iter, 
defgrp_index) > 0.0f) {
+                                       mul_m4_v3(cd.curvespace, vertexCos[a]);
+                                       minmax_v3v3_v3(cd.dmin, cd.dmax, 
vertexCos[a]);
                                }
-       
-                               dvert = me->dvert;
-                               for (a = 0; a < numVerts; a++, dvert++) {
-                                       if (dm) dvert = dm->getVertData(dm, a, 
CD_MDEFORMVERT);
-                                       
-                                       weight = defvert_find_weight(dvert, 
defgrp_index);
-       
-                                       if (weight > 0.0f) {
-                                               /* already in 'cd.curvespace', 
prev for loop */
-                                               copy_v3_v3(vec, vertexCos[a]);
-                                               calc_curve_deform(scene, cuOb, 
vec, defaxis, &cd, NULL);
-                                               interp_v3_v3v3(vertexCos[a], 
vertexCos[a], vec, weight);
-                                               mul_m4_v3(cd.objectspace, 
vertexCos[a]);
-                                       }
+                       }
+
+                       for (a = 0, dvert_iter = dvert; a < numVerts; a++, 
dvert_iter++) {
+                               const float weight = 
defvert_find_weight(dvert_iter, defgrp_index);
+
+                               if (weight > 0.0f) {
+                                       /* already in 'cd.curvespace', prev for 
loop */
+                                       copy_v3_v3(vec, vertexCos[a]);
+                                       calc_curve_deform(scene, cuOb, vec, 
defaxis, &cd, NULL);
+                                       interp_v3_v3v3(vertexCos[a], 
vertexCos[a], vec, weight);
+                                       mul_m4_v3(cd.objectspace, vertexCos[a]);
                                }
                        }
                }

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

Reply via email to