// m * q
return addX((new Quaternion(m3)).mul(
new Quaternion((Point4f) x2.value)).getMatrix());
default:
f = ScriptVariable.fValue(x2);
AxisAngle4f aa = new AxisAngle4f();
aa.set(m3);
aa.angle *= f;
Matrix3f m2 = new Matrix3f();
m2.set(aa);
return addX(m2);
}
case Token.matrix4f:
Matrix4f m4 = (Matrix4f) x1.value;
if (pt != null) {
m4.transform(pt);
if (x2.tok == Token.varray)
return addX(ScriptVariable.getVariable(new float[] { pt.x, pt.y,
pt.z }));
return addX(pt);
}
if (pt4 != null) {
m4.transform(pt4);
if (x2.tok == Token.varray)
return addX(ScriptVariable.getVariable(new float[] { pt4.x, pt4.y,
pt4.z, pt4.w }));
return addX(pt4);
}
switch (x2.tok) {
case Token.matrix4f:
Matrix4f m4b = new Matrix4f((Matrix4f) x2.value);
m4b.mul(m4, m4b);
return addX(m4b);
default:
return addX("NaN");
}
case Token.point3f:
pt = new Point3f((Point3f) x1.value);
switch (x2.tok) {
case Token.point3f:
Point3f pt2 = ((Point3f) x2.value);
return addX(pt.x * pt2.x + pt.y * pt2.y + pt.z * pt2.z);
default:
f = ScriptVariable.fValue(x2);
return addX(new Point3f(pt.x * f, pt.y * f, pt.z * f));
}
case Token.point4f:
switch (x2.tok) {
case Token.point4f:
// quaternion multiplication
// note that Point4f is {x,y,z,w} so we use that for
// quaternion notation as well here.
return addX((new Quaternion((Point4f) x1.value)).mul(new Quaternion(
(Point4f) x2.value)));
}
return addX(new Quaternion((Point4f) x1.value).mul(
ScriptVariable.fValue(x2)).toPoint4f());
}
case Token.percent:
// more than just modulus
// float % n round to n digits; n = 0 does "nice" rounding
// String % -n trim to width n; left justify
// String % n trim to width n; right justify
// Point3f % n ah... sets to multiple of unit cell!
// bitset % n
// Point3f * Point3f does dot product
// Point3f / Point3f divides by magnitude
// float * Point3f gets m agnitude
// Point4f % n returns q0, q1, q2, q3, or theta
// Point4f % Point4f
s = null;
int n = ScriptVariable.iValue(x2);
switch (x1.tok) {
case Token.on:
case Token.off:
case Token.integer:
default:
if (n == 0)
return addX(0);
return addX(ScriptVariable.iValue(x1) % n);
case Token.decimal:
f = ScriptVariable.fValue(x1);
// neg is scientific notation
if (n == 0)
return addX((int) (f + 0.5f * (f < 0 ? -1 : 1)));
s = TextFormat.formatDecimal(f, n);
return addX(s);
case Token.string:
s = (String) x1.value;
if (n == 0)
return addX(TextFormat.trim(s, "\n\t "));
if (n == 9999)
return addX(s.toUpperCase());
if (n == -9999)
return addX(s.toLowerCase());
if (n > 0)
return addX(TextFormat.format(s, n, n, false, false));
return addX(TextFormat.format(s, -n, n - 1, true, false));
case Token.varray:
String[] list = ScriptVariable.listValue(x1);
for (int i = 0; i < list.length; i++) {
if (n == 0)
list[i] = list[i].trim();
else if (n > 0)
list[i] = TextFormat.format(list[i], n, n, true, false);
else
list[i] = TextFormat.format(s, -n, n, false, false);
}
return addX(list);
case Token.point3f:
pt = new Point3f((Point3f) x1.value);
viewer.toUnitCell(pt, new Point3f(n, n, n));
return addX(pt);
case Token.point4f:
pt4 = (Point4f) x1.value;
if (x2.tok == Token.point3f)
return addX((new Quaternion(pt4)).transform((Point3f) x2.value));
if (x2.tok == Token.point4f) {
Point4f v4 = new Point4f((Point4f) x2.value);
(new Quaternion(pt4)).getThetaDirected(v4);
return addX(v4);
}
switch (n) {
// q%0 w
// q%1 x
// q%2 y
// q%3 z
// q%4 normal
// q%-1 vector(1)
// q%-2 theta
// q%-3 Matrix column 0
// q%-4 Matrix column 1
// q%-5 Matrix column 2
// q%-6 AxisAngle format
// q%-9 Matrix format
case 0:
return addX(pt4.w);
case 1:
return addX(pt4.x);
case 2:
return addX(pt4.y);
case 3:
return addX(pt4.z);
case 4:
return addX((new Quaternion(pt4)).getNormal());
case -1:
return addX(new Quaternion(pt4).getVector(-1));
case -2:
return addX((new Quaternion(pt4)).getTheta());
case -3:
return addX((new Quaternion(pt4)).getVector(0));
case -4:
return addX((new Quaternion(pt4)).getVector(1));
case -5:
return addX((new Quaternion(pt4)).getVector(2));
case -6:
AxisAngle4f ax = (new Quaternion(pt4)).toAxisAngle4f();
return addX(new Point4f(ax.x, ax.y, ax.z,
(float) (ax.angle * 180 / Math.PI)));
case -9:
return addX((new Quaternion(pt4)).getMatrix());
default: