diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2010-01-09 17:15:56 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2010-01-09 17:15:56 (GMT) |
commit | dd817ad903b1c32f594482b8b2ae16ca30f86ef9 (patch) | |
tree | 59fe5bf96f276aec9d7b425fbe5d36b3a72ca0a9 /transform.cc | |
parent | 3b7ba5c69c1a42c3e23de2180b7ec3726daa040b (diff) |
Clifford Wolf:
Added mirror statement
git-svn-id: http://svn.clifford.at/openscad/trunk@250 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'transform.cc')
-rw-r--r-- | transform.cc | 59 |
1 files changed, 46 insertions, 13 deletions
diff --git a/transform.cc b/transform.cc index a920dd5..3c09c14 100644 --- a/transform.cc +++ b/transform.cc @@ -26,6 +26,7 @@ enum transform_type_e { SCALE, ROTATE, + MIRROR, TRANSLATE, MULTMATRIX, COLOR @@ -69,6 +70,9 @@ AbstractNode *TransformModule::evaluate(const Context *ctx, const ModuleInstanti if (type == ROTATE) { argnames = QVector<QString>() << "a" << "v"; } + if (type == MIRROR) { + argnames = QVector<QString>() << "v"; + } if (type == TRANSLATE) { argnames = QVector<QString>() << "v"; } @@ -141,25 +145,53 @@ AbstractNode *TransformModule::evaluate(const Context *ctx, const ModuleInstanti if (x != 0.0 || y != 0.0 || z != 0.0) { double sn = 1.0 / sqrt(x*x + y*y + z*z); x *= sn, y *= sn, z *= sn; - } else { - x = 0, y = 0, z = 1; } } - double c = cos(a*M_PI/180.0); - double s = sin(a*M_PI/180.0); + if (x != 0.0 || y != 0.0 || z != 0.0) + { + double c = cos(a*M_PI/180.0); + double s = sin(a*M_PI/180.0); + + node->m[ 0] = x*x*(1-c)+c; + node->m[ 1] = y*x*(1-c)+z*s; + node->m[ 2] = z*x*(1-c)-y*s; + + node->m[ 4] = x*y*(1-c)-z*s; + node->m[ 5] = y*y*(1-c)+c; + node->m[ 6] = z*y*(1-c)+x*s; + + node->m[ 8] = x*z*(1-c)+y*s; + node->m[ 9] = y*z*(1-c)-x*s; + node->m[10] = z*z*(1-c)+c; + } + } + } + if (type == MIRROR) + { + Value val_v = c.lookup_variable("v"); + double x = 1, y = 0, z = 0; + + if (val_v.getv3(x, y, z)) { + if (x != 0.0 || y != 0.0 || z != 0.0) { + double sn = 1.0 / sqrt(x*x + y*y + z*z); + x *= sn, y *= sn, z *= sn; + } + } - node->m[ 0] = x*x*(1-c)+c; - node->m[ 1] = y*x*(1-c)+z*s; - node->m[ 2] = z*x*(1-c)-y*s; + if (x != 0.0 || y != 0.0 || z != 0.0) + { + node->m[ 0] = 1-2*x*x; + node->m[ 1] = -2*y*x; + node->m[ 2] = -2*z*x; - node->m[ 4] = x*y*(1-c)-z*s; - node->m[ 5] = y*y*(1-c)+c; - node->m[ 6] = z*y*(1-c)+x*s; + node->m[ 4] = -2*x*y; + node->m[ 5] = 1-2*y*y; + node->m[ 6] = -2*z*y; - node->m[ 8] = x*z*(1-c)+y*s; - node->m[ 9] = y*z*(1-c)-x*s; - node->m[10] = z*z*(1-c)+c; + node->m[ 8] = -2*x*z; + node->m[ 9] = -2*y*z; + node->m[10] = 1-2*z*z; } } if (type == TRANSLATE) @@ -329,6 +361,7 @@ void register_builtin_transform() { builtin_modules["scale"] = new TransformModule(SCALE); builtin_modules["rotate"] = new TransformModule(ROTATE); + builtin_modules["mirror"] = new TransformModule(MIRROR); builtin_modules["translate"] = new TransformModule(TRANSLATE); builtin_modules["multmatrix"] = new TransformModule(MULTMATRIX); builtin_modules["color"] = new TransformModule(COLOR); |