浏览代码

implement screenToUv / uvToScreen in Flash (still broken)

Nicolas Cannasse 7 年之前
父节点
当前提交
fadbe4c17a
共有 2 个文件被更改,包括 16 次插入0 次删除
  1. 10 0
      hxsl/AgalOut.hx
  2. 6 0
      hxsl/Flatten.hx

+ 10 - 0
hxsl/AgalOut.hx

@@ -695,6 +695,16 @@ class AgalOut {
 			op(OMul(o, swiz(tmp, sw == null ? [X, X, X, X] : [for( _ in sw ) X]), rb));
 			op(OMul(o, swiz(tmp, sw == null ? [X, X, X, X] : [for( _ in sw ) X]), rb));
 			op(OSub(o, ra, o));
 			op(OSub(o, ra, o));
 			return o;
 			return o;
+		case [ScreenToUv,[e]]:
+			var r = allocReg();
+			op(OMul(r,expr(e),getConsts([0.5,-0.5])));
+			op(OAdd(r,r,getConsts([0.5,0.5])));
+			return r;
+		case [UvToScreen,[e]]:
+			var r = allocReg();
+			op(OMul(r,expr(e),getConsts([2,-2])));
+			op(OAdd(r,r,getConsts([-1,1])));
+			return r;
 		case [Pack, [e]]:
 		case [Pack, [e]]:
 			var c = getConsts([1, 255, 255 * 255, 255 * 255 * 255]);
 			var c = getConsts([1, 255, 255 * 255, 255 * 255 * 255]);
 			var r = allocReg();
 			var r = allocReg();

+ 6 - 0
hxsl/Flatten.hx

@@ -178,6 +178,12 @@ class Flatten {
 			case PackNormal:
 			case PackNormal:
 				allocConst(1, e.p);
 				allocConst(1, e.p);
 				allocConst(0.5, e.p);
 				allocConst(0.5, e.p);
+			case ScreenToUv:
+				allocConsts([0.5,0.5], e.p);
+				allocConsts([0.5,-0.5], e.p);
+			case UvToScreen:
+				allocConsts([2,-2], e.p);
+				allocConsts([-1,1], e.p);
 			default:
 			default:
 			}
 			}
 		case TCall( { e : TGlobal(Vec4) }, [ { e : TVar( { kind : Global | Param | Input | Var } ), t : TVec(3, VFloat) }, { e : TConst(CInt(1)) } ]):
 		case TCall( { e : TGlobal(Vec4) }, [ { e : TVar( { kind : Global | Param | Input | Var } ), t : TVec(3, VFloat) }, { e : TConst(CInt(1)) } ]):