瀏覽代碼

added support for array.length in shaders

Nicolas Cannasse 1 年之前
父節點
當前提交
eb6b7c4d21
共有 2 個文件被更改,包括 12 次插入0 次删除
  1. 5 0
      hxsl/Checker.hx
  2. 7 0
      hxsl/Eval.hx

+ 5 - 0
hxsl/Checker.hx

@@ -987,6 +987,11 @@ class Checker {
 					return FGlobal(g.g, e, sel);
 			default:
 			}
+			switch( [g.g, e.t] ) {
+			case [Length, TArray(_)]:
+				return FField({ e : TCall({ e : TGlobal(Length), t : TVoid, p : pos },[e]), t : TInt, p : pos });
+			default:
+			}
 		}
 		// swizzle ?
 		var stype;

+ 7 - 0
hxsl/Eval.hx

@@ -197,6 +197,13 @@ class Eval {
 			for( a in args )
 				haxe.Log.trace(Printer.toString(a), { fileName : #if macro haxe.macro.Context.getPosInfos(a.p).file #else a.p.file #end, lineNumber : 0, className : null, methodName : null });
 			TBlock([]);
+		case [Length, [{ e : TVar(v) }]]:
+			switch( v.type ) {
+			case TArray(_, SConst(v)):
+				TConst(CInt(v));
+			default:
+				Error.t("Length() on invalid type "+Printer.toString(args[0]), pos);
+			}
 		case [ChannelRead|ChannelReadLod, _]:
 			var i = switch( args[0].e ) { case TConst(CInt(i)): i; default: Error.t("Cannot eval complex channel " + Printer.toString(args[0],true)+" "+constantsToString(), pos); throw "assert"; };
 			var channel = oldArgs[0];