[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15432] branches/soc-2008-jaguarandi/ source/blender:
André Pinto
andresusanopinto at gmail.com
Fri Jul 4 21:57:30 CEST 2008
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. @@
More information about the Bf-blender-cvs
mailing list