summaryrefslogtreecommitdiff
path: root/transform.cc
diff options
context:
space:
mode:
authorclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2010-01-09 17:15:56 (GMT)
committerclifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c>2010-01-09 17:15:56 (GMT)
commitdd817ad903b1c32f594482b8b2ae16ca30f86ef9 (patch)
tree59fe5bf96f276aec9d7b425fbe5d36b3a72ca0a9 /transform.cc
parent3b7ba5c69c1a42c3e23de2180b7ec3726daa040b (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.cc59
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);
contact: Jan Huwald // Impressum