소스 검색

added new functions, fixed exp/log (was exp2/log2)

Nicolas Cannasse 11 년 전
부모
커밋
b0523edafb
2개의 변경된 파일49개의 추가작업 그리고 4개의 파일을 삭제
  1. 38 3
      hxsl/AgalOut.hx
  2. 11 1
      hxsl/Flatten.hx

+ 38 - 3
hxsl/AgalOut.hx

@@ -412,19 +412,54 @@ class AgalOut {
 			return binop(OPow);
 		case [Sqrt, _]:
 			return unop(OSqt);
+		case [Inversesqrt, _]:
+			return unop(ORsq);
 		case [Abs, _]:
 			return unop(OAbs);
-		case [Exp, _]:
-			return unop(OExp);
 		case [Sin, _]:
 			return unop(OSin);
 		case [Cos, _]:
 			return unop(OCos);
+		case [Tan | Asin | Acos | Atan | Sign, _]:
+			throw "TODO" + g;
+		case [Log2, _]:
+			return unop(OLog);
+		case [Exp2, _]:
+			return unop(OExp);
+		case [Log, _]:
+			var r = unop(OLog);
+			op(OMul(r, r, getConst(0.6931471805599453))); // log(2)/log(e)
+			return r;
+		case [Exp, [e]]:
+			var r = expr(e);
+			op(OMul(r, r, getConst(1.4426950408889634))); // log(e)/log(2)
+			op(OExp(r, r));
+			return r;
+		case [Radians, [e]]:
+			var r = expr(e);
+			op(OMul(r, r, getConst(Math.PI / 180)));
+			return r;
+		case [Degrees, [e]]:
+			var r = expr(e);
+			op(OMul(r, r, getConst(180 / Math.PI)));
+			return r;
+
+		case [Mix, [a, b, t]]:
+			var rb = expr(b);
+			var r = expr(t);
+			op(OMul(rb, rb, r));
+			op(OSub(r, getConst(1), r));
+			var ra = expr(a);
+			op(OMul(ra, ra, r));
+			op(OAdd(ra, ra, rb));
+			return ra;
+
 		case [Fract, _]:
 			return unop(OFrc);
 		case [Saturate, _]:
 			return unop(OSat);
-		case [ToInt, [a]]:
+		case [Floor | ToInt, [a]]:
+			// might not be good for negative values...
 			var r = expr(a);
 			var tmp = allocReg(a.t);
 			op(OFrc(tmp, r));

+ 11 - 1
hxsl/Flatten.hx

@@ -153,7 +153,17 @@ class Flatten {
 				allocConsts([1, 255, 255 * 255, 255 * 255 * 255], e.p);
 				allocConsts([1/255, 1/255, 1/255, 0], e.p);
 			case Unpack:
-				allocConsts([1, 1/255, 1/(255 * 255), 1/(255 * 255 * 255)], e.p);
+				allocConsts([1, 1 / 255, 1 / (255 * 255), 1 / (255 * 255 * 255)], e.p);
+			case Radians:
+				allocConst(Math.PI / 180, e.p);
+			case Degrees:
+				allocConst(180 / Math.PI, e.p);
+			case Log:
+				allocConst(0.6931471805599453, e.p);
+			case Exp:
+				allocConst(1.4426950408889634, e.p);
+			case Mix:
+				allocConst(1, e.p);
 			default:
 			}
 		case TCall( { e : TGlobal(Vec4) }, [ { e : TVar( { kind : Global | Param | Input | Var } ), t : TVec(3, VFloat) }, { e : TConst(CInt(1)) } ]):