[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16735] branches/soc-2008-jaguarandi/ source/blender/blenkernel/intern: SimpleDeform now initializes limit values to the BB when its added to an object
André Pinto
andresusanopinto at gmail.com
Fri Sep 26 04:02:03 CEST 2008
Revision: 16735
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16735
Author: jaguarandi
Date: 2008-09-26 04:02:02 +0200 (Fri, 26 Sep 2008)
Log Message:
-----------
SimpleDeform now initializes limit values to the BB when its added to an object
Modified Paths:
--------------
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c
Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c 2008-09-26 01:54:31 UTC (rev 16734)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/modifier.c 2008-09-26 02:02:02 UTC (rev 16735)
@@ -7364,8 +7364,8 @@
smd->origin = NULL;
smd->factor = 0.35;
- smd->limit[0] = -1000.0f;
- smd->limit[1] = 1000.0f;
+ smd->limit[0] = FLT_MAX;
+ smd->limit[1] = -FLT_MAX;
}
static void simpledeformModifier_copyData(ModifierData *md, ModifierData *target)
Modified: branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c 2008-09-26 01:54:31 UTC (rev 16734)
+++ branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c 2008-09-26 02:02:02 UTC (rev 16735)
@@ -35,6 +35,7 @@
#include "BKE_deform.h"
#include "BKE_utildefines.h"
#include "BLI_arithb.h"
+#include "BKE_shrinkwrap.h"
#include <string.h>
#include <math.h>
@@ -140,89 +141,100 @@
/* simple deform modifier */
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_matrix[2][4][4];
static const float lock_axis[2] = {0.0f, 0.0f};
+ int i;
+ int limit_axis = 0;
+ SpaceTransform *transf = NULL, tmp_transf;
+ void (*simpleDeform_callback)(const float factor, const float dcut[3], float *co) = NULL; //Mode callback
int vgroup = get_named_vertexgroup_num(ob, smd->vgroup_name);
-
MDeformVert *dvert = NULL;
+ //Safe-check
+ if(smd->origin == ob) smd->origin = NULL; //No self references
+ smd->limit[0] = MIN2(smd->limit[0], smd->limit[1]); //Upper limit >= than lower limit
+
//Calculate matrixs do convert between coordinate spaces
if(smd->origin)
{
- //inverse is outdated
-
+ transf = &tmp_transf;
+
if(smd->originOpts & MOD_SIMPLEDEFORM_ORIGIN_LOCAL)
{
- Mat4Invert(smd->origin->imat, smd->origin->obmat);
- Mat4Invert(ob->imat, ob->obmat);
-
- ob2mod = tmp_matrix[0];
- mod2ob = tmp_matrix[1];
- Mat4MulSerie(ob2mod, smd->origin->imat, ob->obmat, 0, 0, 0, 0, 0, 0);
- Mat4Invert(mod2ob, ob2mod);
+ space_transform_from_matrixs(transf, ob->obmat, smd->origin->obmat);
}
else
{
- Mat4Invert(smd->origin->imat, smd->origin->obmat);
- ob2mod = smd->origin->obmat;
- mod2ob = smd->origin->imat;
+ Mat4CpyMat4(transf->local2target, smd->origin->obmat);
+ Mat4Invert(transf->target2local, transf->local2target);
}
+ }
+ //Setup vars
+ limit_axis = (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) ? 0 : 2; //Bend limits on X.. all other modes limit on Z
+
+ //Update limits if needed
+ if(smd->limit[1] == -FLT_MAX
+ || smd->limit[0] == FLT_MAX)
+ {
+ float lower = FLT_MAX;
+ float upper = -FLT_MAX;
+
+ for(i=0; i<numVerts; i++)
+ {
+ float tmp[3];
+ if(transf) space_transform_apply(transf, tmp);
+
+ VECCOPY(tmp, vertexCos[i]);
+
+ lower = MIN2(lower, tmp[limit_axis]);
+ upper = MAX2(upper, tmp[limit_axis]);
+ }
+
+ smd->limit[1] = upper;
+ smd->limit[0] = lower;
}
if(dm)
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+
+ switch(smd->mode)
+ {
+ case MOD_SIMPLEDEFORM_MODE_TWIST: simpleDeform_callback = simpleDeform_twist; break;
+ case MOD_SIMPLEDEFORM_MODE_BEND: simpleDeform_callback = simpleDeform_bend; break;
+ case MOD_SIMPLEDEFORM_MODE_TAPER: simpleDeform_callback = simpleDeform_taper; break;
+ case MOD_SIMPLEDEFORM_MODE_STRETCH: simpleDeform_callback = simpleDeform_stretch; break;
+ default:
+ return; //No simpledeform mode?
+ }
+
for(i=0; i<numVerts; i++)
{
- float co[3], dcut[3];
float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
- float factor = smd->factor;
- if(weight == 0) continue;
-
- if(ob2mod)
- Mat4MulVecfl(ob2mod, vertexCos[i]);
-
- VECCOPY(co, vertexCos[i]);
-
- dcut[0] = dcut[1] = dcut[2] = 0.0f;
- if(smd->axis & MOD_SIMPLEDEFORM_LOCK_AXIS_X) axis_limit(0, lock_axis, co, dcut);
- if(smd->axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Y) axis_limit(1, lock_axis, co, dcut);
-
- switch(smd->mode)
+ if(weight != 0.0f)
{
- case MOD_SIMPLEDEFORM_MODE_TWIST:
- axis_limit(2, smd->limit, co, dcut);
- simpleDeform_twist(factor, dcut, co);
- break;
+ float co[3], dcut[3] = {0.0f, 0.0f, 0.0f};
- case MOD_SIMPLEDEFORM_MODE_BEND:
- axis_limit(0, smd->limit, co, dcut);
- simpleDeform_bend(factor, dcut, co);
- break;
+ if(transf) space_transform_apply(transf, vertexCos[i]);
- case MOD_SIMPLEDEFORM_MODE_TAPER:
- axis_limit(2, smd->limit, co, dcut);
- simpleDeform_taper(factor, dcut, co);
- break;
+ VECCOPY(co, vertexCos[i]);
+ //Apply axis limits
+ if(smd->mode != MOD_SIMPLEDEFORM_MODE_BEND) //Bend mode shoulnt have any lock axis
+ {
+ if(smd->axis & MOD_SIMPLEDEFORM_LOCK_AXIS_X) axis_limit(0, lock_axis, co, dcut);
+ if(smd->axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Y) axis_limit(1, lock_axis, co, dcut);
+ }
+ axis_limit(limit_axis, smd->limit, co, dcut);
- case MOD_SIMPLEDEFORM_MODE_STRETCH:
- axis_limit(2, smd->limit, co, dcut);
- simpleDeform_stretch(factor, dcut, co);
- break;
+ simpleDeform_callback(smd->factor, dcut, co); //Apply deform
+ VecLerpf(vertexCos[i], vertexCos[i], co, weight); //Use vertex weight has coef of linear interpolation
+
+ if(transf) space_transform_invert(transf, vertexCos[i]);
}
-
- //linear interpolation
- VecLerpf(vertexCos[i], vertexCos[i], co, weight);
-
- if(mod2ob)
- Mat4MulVecfl(mod2ob, vertexCos[i]);
}
}
More information about the Bf-blender-cvs
mailing list