|
@@ -482,6 +482,32 @@ class AgalOut {
|
|
|
var r = allocReg(e.t);
|
|
|
op(OMul(r, expr(e), getConst(180 / Math.PI)));
|
|
|
return r;
|
|
|
+ case [Cross, [a, b]]:
|
|
|
+ var r = allocReg(a.t);
|
|
|
+ op(OCrs(r, expr(a), expr(b)));
|
|
|
+ return r;
|
|
|
+ case [Length, [e]]:
|
|
|
+ var r = allocReg(TFloat);
|
|
|
+ switch( e.t ) {
|
|
|
+ case TFloat:
|
|
|
+ op(OAbs(r, expr(e)));
|
|
|
+ return r;
|
|
|
+ case TVec(2, VFloat):
|
|
|
+ var e = expr(e);
|
|
|
+ var tmp = allocReg(TVec(3,VFloat));
|
|
|
+ op(OMul(swiz(tmp, [X, Y]), e, e));
|
|
|
+ op(OAdd(r, swiz(tmp, [X]), swiz(tmp, [Y])));
|
|
|
+ case TVec(3, VFloat):
|
|
|
+ var e = expr(e);
|
|
|
+ op(ODp3(r, e, e));
|
|
|
+ case TVec(4, VFloat):
|
|
|
+ var e = expr(e);
|
|
|
+ op(ODp4(r, e, e));
|
|
|
+ default:
|
|
|
+ throw "TODO length(" + e.t + ")";
|
|
|
+ }
|
|
|
+ op(OSqt(r, r));
|
|
|
+ return r;
|
|
|
|
|
|
case [Mix, [a, b, t]]:
|
|
|
var ra = allocReg(a.t);
|