Revision: 15432
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15432
Author:   jaguarandi
Date:     2008-07-04 21:56:31 +0200 (Fri, 04 Jul 2008)

Log Message:
-----------

*Added vertex groups on simple deform
*Fixed a few UI things

*Make SimpleDeform and Shrinkwrap to use vertexgroup_get_vertex_weight, a 
similar function
 "static float vert_weight(MDeformVert *dvert, int group)"  existed on 
modifier.c, changed
it a bit and moved into BKE_deform.h

Modified Paths:
--------------
    branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_deform.h
    branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_simple_deform.h
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/deform.c
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
    branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
    
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c
    branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
    branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_deform.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_deform.h 
2008-07-04 19:00:56 UTC (rev 15431)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_deform.h 
2008-07-04 19:56:31 UTC (rev 15432)
@@ -46,5 +46,8 @@
 int get_named_vertexgroup_num (Object *ob, char *name);
 void unique_vertexgroup_name (struct bDeformGroup *dg, struct Object *ob);
 
+float deformvert_get_weight(struct MDeformVert *dvert, int group_num);
+float vertexgroup_get_vertex_weight(struct MDeformVert *dvert, int index, int 
group_num);
+
 #endif
 

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_simple_deform.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_simple_deform.h  
2008-07-04 19:00:56 UTC (rev 15431)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/BKE_simple_deform.h  
2008-07-04 19:56:31 UTC (rev 15432)
@@ -33,7 +33,7 @@
 struct DerivedMesh;
 struct SimpleDeformModifierData;
 
-void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, 
float (*vertexCos)[3], int numVerts);
+void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, 
struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
 
 #endif
 

Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/deform.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/deform.c      
2008-07-04 19:00:56 UTC (rev 15431)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/deform.c      
2008-07-04 19:56:31 UTC (rev 15432)
@@ -220,3 +220,31 @@
                }
        }       
 }
+
+float deformvert_get_weight(struct MDeformVert *dvert, int group_num)
+{
+       if(dvert)
+       {
+               MDeformWeight *dw = dvert->dw;
+               int i;
+
+               for(i=dvert->totweight; i>0; i--, dw++)
+                       if(dw->def_nr == group_num)
+                               return dw->weight;
+       }
+
+       /* Not found */
+       return 0.0;
+}
+
+float vertexgroup_get_vertex_weight(struct MDeformVert *dvert, int index, int 
group_num)
+{
+       if(group_num == -1)
+               return 1.0;
+
+       if(dvert == 0)
+               return 0.0;
+
+       return deformvert_get_weight(dvert+index, group_num);
+}
+

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c    
2008-07-04 19:00:56 UTC (rev 15431)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c    
2008-07-04 19:56:31 UTC (rev 15432)
@@ -3,7 +3,7 @@
 *
 * ***** BEGIN GPL LICENSE BLOCK *****
 *
-* This program is free software; you can redistribute it and/or
+* This program is free software; you can redistribute it and/orw
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
@@ -100,6 +100,7 @@
 #include "BKE_utildefines.h"
 #include "depsgraph_private.h"
 #include "BKE_bmesh.h"
+#include "BKE_deform.h"
 #include "BKE_shrinkwrap.h"
 #include "BKE_simple_deform.h"
 
@@ -6088,22 +6089,6 @@
        return dataMask;
 }
 
-/* this should really be put somewhere permanently */
-static float vert_weight(MDeformVert *dvert, int group)
-{
-       MDeformWeight *dw;
-       int i;
-       
-       if(dvert) {
-               dw= dvert->dw;
-               for(i= dvert->totweight; i>0; i--, dw++) {
-                       if(dw->def_nr == group) return dw->weight;
-                       if(i==1) break; /*otherwise dw will point to somewhere 
it shouldn't*/
-               }
-       }
-       return 0.0;
-}
-
 static void explodeModifier_createFacepa(ExplodeModifierData *emd,
                                         ParticleSystemModifierData *psmd,
       Object *ob, DerivedMesh *dm)
@@ -6147,7 +6132,7 @@
                        for(i=0; i<totvert; i++){
                                val = BLI_frand();
                                val = (1.0f-emd->protect)*val + 
emd->protect*0.5f;
-                               if(val < vert_weight(dvert+i,emd->vgroup-1))
+                               if(val < 
deformvert_get_weight(dvert+i,emd->vgroup-1))
                                        vertpa[i] = -1;
                        }
                }
@@ -7304,14 +7289,26 @@
 
 static void simpledeformModifier_deformVerts(ModifierData *md, Object *ob, 
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
 {
-       SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, vertexCos, 
numVerts);
+       SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, derivedData, 
vertexCos, numVerts);
 }
 
 static void simpledeformModifier_deformVertsEM(ModifierData *md, Object *ob, 
EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int 
numVerts)
 {
-       SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, vertexCos, 
numVerts);
+       SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, derivedData, 
vertexCos, numVerts);
 }
 
+static CustomDataMask simpledeformModifier_requiredDataMask(ModifierData *md)
+{
+       SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md;
+       CustomDataMask dataMask = 0;
+
+       /* ask for vertexgroups if we need them */
+       if(smd->vgroup_name[0])
+               dataMask |= (1 << CD_MDEFORMVERT);
+
+       return dataMask;
+}
+
 static void simpledeformModifier_foreachObjectLink(ModifierData *md, Object 
*ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
 {
        SimpleDeformModifierData *smd  = (SimpleDeformModifierData*)md;
@@ -7669,6 +7666,7 @@
                                | eModifierTypeFlag_EnableInEditmode;
                mti->initData = simpledeformModifier_initData;
                mti->copyData = simpledeformModifier_copyData;
+               mti->requiredDataMask = simpledeformModifier_requiredDataMask;
                mti->deformVerts = simpledeformModifier_deformVerts;
                mti->deformVertsEM = simpledeformModifier_deformVertsEM;
                mti->foreachObjectLink = simpledeformModifier_foreachObjectLink;

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c  
2008-07-04 19:00:56 UTC (rev 15431)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/shrinkwrap.c  
2008-07-04 19:56:31 UTC (rev 15432)
@@ -96,18 +96,6 @@
        nf[2] = ns[2] / 32767.0f;
 }
 
-static float vertexgroup_get_weight(MDeformVert *dvert, int index, int vgroup)
-{
-       if(dvert && vgroup >= 0)
-       {
-               int j;
-               for(j = 0; j < dvert[index].totweight; j++)
-                       if(dvert[index].dw[j].def_nr == vgroup)
-                               return dvert[index].dw[j].weight;
-       }
-       return 1.0;
-}
-
 /*
  * BVH tree from mesh vertices
  */
@@ -722,7 +710,7 @@
        //Shrink (calculate each vertex final position)
        for(i = 0; i<numVerts; i++)
        {
-               float weight = vertexgroup_get_weight(dvert, i, vgroup);
+               float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
 
                float orig[3], final[3]; //Coords relative to target
                float normal[3];
@@ -1093,7 +1081,7 @@
        for(i=0; i<numVerts; i++)
        {
                int index;
-               float weight = vertexgroup_get_weight(dvert, i, vgroup);
+               float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
                if(weight == 0.0f) continue;
 
                VecMat4MulVecfl(tmp_co, calc->local2target, vert[i].co);
@@ -1157,7 +1145,7 @@
        for(i=0; i<numVerts; i++)
        {
                float dist = FLT_MAX;
-               float weight = vertexgroup_get_weight(dvert, i, vgroup);
+               float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
                float face_normal[3];
                if(weight == 0.0f) continue;
 
@@ -1260,7 +1248,7 @@
        for(i=0; i<numVerts; i++)
        {
                int index;
-               float weight = vertexgroup_get_weight(dvert, i, vgroup);
+               float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
                if(weight == 0.0f) continue;
 
                VecMat4MulVecfl(tmp_co, calc->local2target, vert[i].co);

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c
===================================================================
--- 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c   
    2008-07-04 19:00:56 UTC (rev 15431)
+++ 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c   
    2008-07-04 19:56:31 UTC (rev 15432)
@@ -32,6 +32,8 @@
 
 #include "BKE_simple_deform.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_deform.h"
+#include "BKE_utildefines.h"
 #include "BLI_arithb.h"
 
 #include <string.h>
@@ -173,66 +175,84 @@
 
 
 /* simple deform modifier */
-void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, 
float (*vertexCos)[3], int numVerts)
+void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, 
struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
 {
+       int i;
        float (*ob2mod)[4] = NULL, (*mod2ob)[4] = NULL;
-       float tmp[2][4][4], dcut[3];
+       float tmp_matrix[2][4][4];
 
+       int vgroup = get_named_vertexgroup_num(ob, smd->vgroup_name);
+
+       MDeformVert *dvert = NULL;
+
+       //Calculate matrixs do convert between coordinate spaces
        if(smd->origin)
        {
                //inverse is outdated
                Mat4Invert(smd->origin->imat, smd->origin->obmat);
                Mat4Invert(ob->imat, ob->obmat);
 
-               ob2mod = tmp[0];
-               mod2ob = tmp[1];
+               ob2mod = tmp_matrix[0];
+               mod2ob = tmp_matrix[1];
                Mat4MulSerie(ob2mod, smd->origin->imat, ob->obmat, 0, 0, 0, 0, 
0, 0);
                Mat4Invert(mod2ob, ob2mod);
        }
 
 
-       for(; numVerts; numVerts--, vertexCos++)
+       if(dm)
+               dvert   = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+
+       for(i=0; i<numVerts; i++)
        {
+               float co[3], dcut[3];
+               float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
+
+               if(weight == 0) continue;
+
                if(ob2mod)
-                       Mat4MulVecfl(ob2mod, *vertexCos);
+                       Mat4MulVecfl(ob2mod, vertexCos[i]);
 
                dcut[0] = dcut[1] = dcut[2] = 0.0f;
+               VECCOPY(co, vertexCos[i]);
 
                switch(smd->mode)
                {
                        case MOD_SIMPLEDEFORM_MODE_TWIST:
-                               axis_limit(2, smd->factor+1, *vertexCos, dcut);
-                               simpleDeform_twist       (smd->factor[0], dcut, 
*vertexCos);
+                               axis_limit(2, smd->factor+1, co, dcut);
+                               simpleDeform_twist       (smd->factor[0], dcut, 
co);
                                break;
 
                        case MOD_SIMPLEDEFORM_MODE_BEND:
-                               axis_limit(0, smd->factor+1, *vertexCos, dcut);
-                               simpleDeform_bend        (smd->factor[0], dcut, 
*vertexCos);
+                               axis_limit(0, smd->factor+1, co, dcut);
+                               simpleDeform_bend        (smd->factor[0], dcut, 
co);
                                break;
 
                        case MOD_SIMPLEDEFORM_MODE_TAPER_X:
-                               axis_limit(2, smd->factor+1, *vertexCos, dcut);
-                               simpleDeform_tapperX (smd->factor[0], dcut, 
*vertexCos);
+                               axis_limit(2, smd->factor+1, co, dcut);
+                               simpleDeform_tapperX (smd->factor[0], dcut, co);
                                break;
 
                        case MOD_SIMPLEDEFORM_MODE_TAPER_XY:

@@ 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