Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Susano Pinto <andresusanopinto@gmail.com>2008-06-27 20:45:37 +0400
committerAndre Susano Pinto <andresusanopinto@gmail.com>2008-06-27 20:45:37 +0400
commit09c898bd65069ec75a38f6ad28ced45454d87720 (patch)
tree96ed2f8719761ac2f99a6e781f5853979769a351 /source/blender/blenkernel/intern/simple_deform.c
parent9629f7ca119fe1ea0c9549be126466e4c6880bb1 (diff)
Modifications on simple modifier
+Added limits on bend +button to create an empty and make child of object +empty is now relative to object
Diffstat (limited to 'source/blender/blenkernel/intern/simple_deform.c')
-rw-r--r--source/blender/blenkernel/intern/simple_deform.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/source/blender/blenkernel/intern/simple_deform.c b/source/blender/blenkernel/intern/simple_deform.c
index e78e73afadb..5cecb553a65 100644
--- a/source/blender/blenkernel/intern/simple_deform.c
+++ b/source/blender/blenkernel/intern/simple_deform.c
@@ -38,15 +38,25 @@
#include <math.h>
-static void simpleDeform_tapper(const float factor, float *co)
+
+
+static void simpleDeform_tapperXY(const float factor, float *co)
{
float x = co[0], y = co[1], z = co[2];
co[0] = x*(1.0f + z*factor);
- co[1] = y;
+ co[1] = y*(1.0f + z*factor);
co[2] = z;
}
+static void simpleDeform_tapperX(const float factor, float *co)
+{
+ float x = co[0], y = co[1], z = co[2];
+
+ co[0] = x*(1.0f + z*factor);
+ co[1] = y;
+ co[2] = z;
+}
static void simpleDeform_twist(const float factor, float *co)
{
@@ -59,41 +69,51 @@ static void simpleDeform_twist(const float factor, float *co)
co[0] = x*cost - y*sint;
co[1] = x*sint + y*cost;
co[2] = z;
+
}
-static void simpleDeform_bend(const float factor, float *co)
+static void simpleDeform_bend(const float factor, const float axis_limit[2], float *co)
{
float x = co[0], y = co[1], z = co[2];
float x0 = 0.0f;
- float theta = (x - x0)*factor;
- float sint = sin(theta);
- float cost = cos(theta);
+ float theta = x*factor, sint, cost;
- co[0] = -sint*(y-1.0f/factor) + x0;
- co[1] = cost*(y-1.0f/factor) + 1.0f/factor;
- co[2] = z;
-}
+ if(x > axis_limit[1])
+ {
+ x0 = axis_limit[1] - x;
+ x = axis_limit[1];
+ }
+ else if(x < axis_limit[0])
+ {
+ x0 = axis_limit[0] - x;
+ x = axis_limit[0];
+ }
-static void simpleDeform_shear(const float factor, float *co)
-{
- float x = co[0], y = co[1], z = co[2];
+ theta = x*factor;
+ sint = sin(theta);
+ cost = cos(theta);
- co[0] = x + factor;
- co[1] = y;
- co[2] = z;
+ co[0] = -y*sint - cost*x0;
+ co[1] = y*cost - sint*x0;
+ co[2] = z;
}
/* simple deform modifier */
-void SimpleDeformModifier_do(SimpleDeformModifierData *smd, float (*vertexCos)[3], int numVerts)
+void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, float (*vertexCos)[3], int numVerts)
{
float (*ob2mod)[4] = NULL, (*mod2ob)[4] = NULL;
+ float tmp[2][4][4];
+
if(smd->origin)
{
- Mat4Invert(smd->origin->imat, smd->origin->obmat); //inverse is outdated
+ //inverse is outdated
+ Mat4Invert(smd->origin->imat, smd->origin->obmat);
- ob2mod = smd->origin->imat;
- mod2ob = smd->origin->obmat;
+ ob2mod = tmp[0];
+ mod2ob = tmp[1];
+ Mat4MulSerie(ob2mod, smd->origin->imat, ob->obmat, 0, 0, 0, 0, 0, 0);
+ Mat4Invert(mod2ob, ob2mod);
}
@@ -104,10 +124,10 @@ void SimpleDeformModifier_do(SimpleDeformModifierData *smd, float (*vertexCos)[3
switch(smd->mode)
{
- case 0: simpleDeform_tapper (smd->factor[0], *vertexCos); break;
- case 1: simpleDeform_twist (smd->factor[0], *vertexCos); break;
- case 2: simpleDeform_bend (smd->factor[0], *vertexCos); break;
- case 3: simpleDeform_shear (smd->factor[0], *vertexCos); break;
+ case MOD_SIMPLEDEFORM_MODE_TWIST: simpleDeform_twist(smd->factor[0], *vertexCos); break;
+ case MOD_SIMPLEDEFORM_MODE_BEND: simpleDeform_bend(smd->factor[0], smd->factor+1, *vertexCos); break;
+ case MOD_SIMPLEDEFORM_MODE_TAPER_X: simpleDeform_tapperX (smd->factor[0], *vertexCos); break;
+ case MOD_SIMPLEDEFORM_MODE_TAPER_XY: simpleDeform_tapperXY(smd->factor[0], *vertexCos); break;
}
if(mod2ob)