diff options
author | Andre Susano Pinto <andresusanopinto@gmail.com> | 2008-07-02 04:17:08 +0400 |
---|---|---|
committer | Andre Susano Pinto <andresusanopinto@gmail.com> | 2008-07-02 04:17:08 +0400 |
commit | eca709e4811f7ddbad49633865481fca53a5d588 (patch) | |
tree | 8fde3b7c3fe8c86aa5a9d093d20435374bbdc1f3 /source | |
parent | c7dbc6548811f37bfeda4013ab70e342d50707b7 (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.c | 111 | ||||
-rw-r--r-- | source/blender/src/buttons_editing.c | 11 |
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"); } |