summaryrefslogtreecommitdiff
path: root/transform.cc
diff options
context:
space:
mode:
Diffstat (limited to 'transform.cc')
-rw-r--r--transform.cc80
1 files changed, 59 insertions, 21 deletions
diff --git a/transform.cc b/transform.cc
index 879a026..bc2e426 100644
--- a/transform.cc
+++ b/transform.cc
@@ -87,34 +87,72 @@ AbstractNode *TransformModule::evaluate(const Context *ctx, const ModuleInstanci
if (type == ROTATE)
{
Value val_a = c.lookup_variable("a");
- Value val_v = c.lookup_variable("v");
- double a = 0, x = 0, y = 0, z = 1;
+ if (val_a.type == Value::VECTOR)
+ {
+ for (int i = 0; i < 3; i++) {
+ double a;
+ val_a.vec[i]->getnum(a);
+ double c = cos(a*M_PI/180.0);
+ double s = sin(a*M_PI/180.0);
+ double x = i == 0, y = i == 1, z = i == 2;
+ double mr[16] = {
+ x*x*(1-c)+c,
+ y*x*(1-c)+z*s,
+ z*x*(1-c)-y*s,
+ 0,
+ x*y*(1-c)-z*s,
+ y*y*(1-c)+c,
+ z*y*(1-c)+x*s,
+ 0,
+ x*z*(1-c)+y*s,
+ y*z*(1-c)-x*s,
+ z*z*(1-c)+c,
+ 0,
+ 0, 0, 0, 1
+ };
+ double m[16];
+ for (int x = 0; x < 4; x++)
+ for (int y = 0; y < 4; y++)
+ {
+ m[x+y*4] = 0;
+ for (int i = 0; i < 4; i++)
+ m[x+y*4] += node->m[i+y*4] * mr[x+i*4];
+ }
+ for (int i = 0; i < 16; i++)
+ node->m[i] = m[i];
+ }
+ }
+ else
+ {
+ Value val_v = c.lookup_variable("v");
+ double a = 0, x = 0, y = 0, z = 1;
- val_a.getnum(a);
+ val_a.getnum(a);
- 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;
- } else {
- x = 0, y = 0, z = 1;
+ 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;
+ } else {
+ x = 0, y = 0, z = 1;
+ }
}
- }
- double c = cos(a*M_PI/180.0);
- double s = sin(a*M_PI/180.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[ 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[ 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;
+ 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 == TRANSLATE)
{
contact: Jan Huwald // Impressum