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
path: root/source
diff options
context:
space:
mode:
authorAndre Susano Pinto <andresusanopinto@gmail.com>2008-07-02 04:17:08 +0400
committerAndre Susano Pinto <andresusanopinto@gmail.com>2008-07-02 04:17:08 +0400
commiteca709e4811f7ddbad49633865481fca53a5d588 (patch)
tree8fde3b7c3fe8c86aa5a9d093d20435374bbdc1f3 /source
parentc7dbc6548811f37bfeda4013ab70e342d50707b7 (diff)
Added lower and upper options on all modes of simple deform
Fixed existent offset after applying bend.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/simple_deform.c111
-rw-r--r--source/blender/src/buttons_editing.c11
2 files changed, 84 insertions, 38 deletions
diff --git a/source/blender/blenkernel/intern/simple_deform.c b/source/blender/blenkernel/intern/simple_deform.c
index 5cecb553a65..bdd0b0e206b 100644
--- a/source/blender/blenkernel/intern/simple_deform.c
+++ b/source/blender/blenkernel/intern/simple_deform.c
@@ -38,77 +38,111 @@
#include <math.h>
+static void axis_limit(int axis, const float limits[2], float *co, float *dcut)
+{
+ float val = co[axis];
+ if(limits[0] > val) val = limits[0];
+ if(limits[1] < val) val = limits[1];
+ dcut[axis] = co[axis] - val;
+ co[axis] = val;
+}
-static void simpleDeform_tapperXY(const float factor, float *co)
+static void simpleDeform_tapperXY(const float factor, const float *dcut, float *co)
{
float x = co[0], y = co[1], z = co[2];
- co[0] = x*(1.0f + z*factor);
- co[1] = y*(1.0f + z*factor);
+ float scale = z*factor;
+
+ co[0] = x + x*scale;
+ co[1] = y + y*scale;
co[2] = z;
+
+ if(dcut)
+ {
+ co[0] += dcut[0]*scale;
+ co[1] += dcut[1]*scale;
+ co[2] += dcut[2];
+ }
}
-static void simpleDeform_tapperX(const float factor, float *co)
+static void simpleDeform_tapperX(const float factor, const float *dcut, float *co)
{
float x = co[0], y = co[1], z = co[2];
- co[0] = x*(1.0f + z*factor);
+ float scale = z*factor;
+
+ co[0] = x+ x*scale;
co[1] = y;
co[2] = z;
+
+ if(dcut)
+ {
+ co[0] += dcut[0]*scale;
+ co[1] += dcut[1];
+ co[2] += dcut[2];
+ }
}
-static void simpleDeform_twist(const float factor, float *co)
+static void simpleDeform_twist(const float factor, const float *dcut, float *co)
{
float x = co[0], y = co[1], z = co[2];
+ float theta, sint, cost;
- float theta = z*factor;
- float sint = sin(theta);
- float cost = cos(theta);
+ theta = z*factor;
+ sint = sin(theta);
+ cost = cos(theta);
co[0] = x*cost - y*sint;
co[1] = x*sint + y*cost;
co[2] = z;
+ if(dcut)
+ {
+ co[0] += dcut[0];
+ co[1] += dcut[1];
+ co[2] += dcut[2];
+ }
}
-static void simpleDeform_bend(const float factor, const float axis_limit[2], float *co)
+static void simpleDeform_bend(const float factor, const float dcut[3], float *co)
{
float x = co[0], y = co[1], z = co[2];
+ float theta, sint, cost;
- float x0 = 0.0f;
- float theta = x*factor, sint, cost;
+ theta = x*factor;
+ sint = sin(theta);
+ cost = cos(theta);
- if(x > axis_limit[1])
+ if(fabs(factor) > 1e-7f)
{
- x0 = axis_limit[1] - x;
- x = axis_limit[1];
+ co[0] = -(y-1.0f/factor)*sint;
+ co[1] = (y-1.0f/factor)*cost + 1.0f/factor;
+ co[2] = z;
}
- else if(x < axis_limit[0])
+
+
+ if(dcut)
{
- x0 = axis_limit[0] - x;
- x = axis_limit[0];
+ co[0] += cost*dcut[0];
+ co[1] += sint*dcut[0];
+ co[2] += dcut[2];
}
- theta = x*factor;
- sint = sin(theta);
- cost = cos(theta);
-
- co[0] = -y*sint - cost*x0;
- co[1] = y*cost - sint*x0;
- co[2] = z;
}
+
/* simple deform modifier */
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];
+ float tmp[2][4][4], dcut[3];
if(smd->origin)
{
//inverse is outdated
Mat4Invert(smd->origin->imat, smd->origin->obmat);
+ Mat4Invert(ob->imat, ob->obmat);
ob2mod = tmp[0];
mod2ob = tmp[1];
@@ -122,12 +156,29 @@ void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, f
if(ob2mod)
Mat4MulVecfl(ob2mod, *vertexCos);
+ dcut[0] = dcut[1] = dcut[2] = 0.0f;
+
switch(smd->mode)
{
- 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;
+ case MOD_SIMPLEDEFORM_MODE_TWIST:
+ axis_limit(2, smd->factor+1, *vertexCos, dcut);
+ simpleDeform_twist (smd->factor[0], dcut, *vertexCos);
+ break;
+
+ case MOD_SIMPLEDEFORM_MODE_BEND:
+ axis_limit(0, smd->factor+1, *vertexCos, dcut);
+ simpleDeform_bend (smd->factor[0], dcut, *vertexCos);
+ break;
+
+ case MOD_SIMPLEDEFORM_MODE_TAPER_X:
+ axis_limit(2, smd->factor+1, *vertexCos, dcut);
+ simpleDeform_tapperX (smd->factor[0], dcut, *vertexCos);
+ break;
+
+ case MOD_SIMPLEDEFORM_MODE_TAPER_XY:
+ axis_limit(2, smd->factor+1, *vertexCos, dcut);
+ simpleDeform_tapperXY(smd->factor[0], dcut, *vertexCos);
+ break;
}
if(mod2ob)
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index 179a094a981..5654ef0bbad 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -1860,9 +1860,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
height += 19*5;
} else if (md->type==eModifierType_SimpleDeform) {
SimpleDeformModifierData *smd = (SimpleDeformModifierData*) md;
- height += 19*3;
- if(smd->mode == MOD_SIMPLEDEFORM_MODE_BEND)
- height += 19*2;
+ height += 19*5;
}
/* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
uiDefBut(block, ROUNDBOX, 0, "", x-10, y-height-2, width, height-2, NULL, 5.0, 0.0, 12, 40, "");
@@ -2532,11 +2530,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
}
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Factor:", lx,(cy-=19),buttonWidth,19, &smd->factor[0], -3000.0f, 3000.0f, 1.0f, 0, "Deform Factor");
- if(smd->mode == MOD_SIMPLEDEFORM_MODE_BEND)
- {
- uiDefButF(block, NUM, B_MODIFIER_RECALC, "Upper Limit:", lx,(cy-=19),buttonWidth,19, &smd->factor[2], -3000.0f, 3000.0f, 1.0f, 0, "Upper Limit Bend on X");
- uiDefButF(block, NUM, B_MODIFIER_RECALC, "Lower Limit:", lx,(cy-=19),buttonWidth,19, &smd->factor[1], -3000.0f, 3000.0f, 1.0f, 0, "Lower Limit Bend on X");
- }
+ uiDefButF(block, NUM, B_MODIFIER_RECALC, "Upper Limit:", lx,(cy-=19),buttonWidth,19, &smd->factor[2], -3000.0f, 3000.0f, 1.0f, 0, "Upper Limit Bend on X");
+ uiDefButF(block, NUM, B_MODIFIER_RECALC, "Lower Limit:", lx,(cy-=19),buttonWidth,19, &smd->factor[1], -3000.0f, 3000.0f, 1.0f, 0, "Lower Limit Bend on X");
}