Переглянути джерело

added support for literal arrays, restricted array accesses to int only, allowed vecN to ivecN explicit cast

Nicolas Cannasse 5 роки тому
батько
коміт
2ddd3af55e
3 змінених файлів з 63 додано та 20 видалено
  1. 30 10
      hxsl/Checker.hx
  2. 7 2
      hxsl/GlslOut.hx
  3. 26 8
      hxsl/HlslOut.hx

+ 30 - 10
hxsl/Checker.hx

@@ -180,6 +180,10 @@ class Checker {
 		globals.set("int", globals.get("toInt"));
 		globals.set("int", globals.get("toInt"));
 		globals.set("float", globals.get("toFloat"));
 		globals.set("float", globals.get("toFloat"));
 		globals.set("reflect", globals.get("lReflect"));
 		globals.set("reflect", globals.get("lReflect"));
+		for( i in 2...5 ) {
+			globals.set("ivec"+i, globals.get("iVec"+i));
+			globals.remove("iVec"+i);
+		}
 		globals.remove("lReflect");
 		globals.remove("lReflect");
 		globals.remove("toInt");
 		globals.remove("toInt");
 		globals.remove("toFloat");
 		globals.remove("toFloat");
@@ -275,6 +279,13 @@ class Checker {
 		switch( [t1, t2] ) {
 		switch( [t1, t2] ) {
 		case [TVec(s1, t1), TVec(s2, t2)] if( s1 == s2 && t1 == t2 ):
 		case [TVec(s1, t1), TVec(s2, t2)] if( s1 == s2 && t1 == t2 ):
 			return true;
 			return true;
+		case [TArray(t1, size1), TArray(t2, size2)]:
+			switch( [size1,size2] ) {
+			case [SConst(a),SConst(b)] if( a == b ):
+			case [SVar(v1),SVar(v2)] if( v1 == v2 ):
+			default: return false;
+			}
+			return tryUnify(t1,t2);
 		case [TChannel(n1), TChannel(n2)] if( n1 == n2 ):
 		case [TChannel(n1), TChannel(n2)] if( n1 == n2 ):
 			return true;
 			return true;
 		default:
 		default:
@@ -587,7 +598,7 @@ class Checker {
 			var e1 = typeExpr(e1, Value);
 			var e1 = typeExpr(e1, Value);
 			var e2 = typeExpr(e2, With(TInt));
 			var e2 = typeExpr(e2, With(TInt));
 			switch( e2.t ) {
 			switch( e2.t ) {
-			case TInt, TFloat:
+			case TInt:
 			default: unify(e2.t, TInt, e2.p);
 			default: unify(e2.t, TInt, e2.p);
 			}
 			}
 			switch( e1.t ) {
 			switch( e1.t ) {
@@ -957,15 +968,24 @@ class Checker {
 		case Vec4:
 		case Vec4:
 			checkLength(4,TFloat);
 			checkLength(4,TFloat);
 			type = TVec(4,VFloat);
 			type = TVec(4,VFloat);
-		case IVec2:
-			checkLength(2,TInt);
-			type = TVec(2,VInt);
-		case IVec3:
-			checkLength(3,TInt);
-			type = TVec(3,VInt);
-		case IVec4:
-			checkLength(4,TInt);
-			type = TVec(4,VInt);
+		case IVec2, IVec3, IVec4:
+			var k = switch(g) {
+			case IVec2: 2;
+			case IVec3: 3;
+			case IVec4: 4;
+			default: throw "assert";
+			}
+			if( args.length == 1 ) {
+				switch( args[0].t ) {
+				case TInt, TFloat:
+				case TVec(n,VFloat):
+					if( n != 3 ) error("Invalid input vector length: "+n+" should be "+k, pos);
+				default:
+					checkLength(k,TInt);
+				}
+			} else
+				checkLength(k,TInt);
+			type = TVec(k,VInt);
 		case BVec2:
 		case BVec2:
 			checkLength(2,TBool);
 			checkLength(2,TBool);
 			type = TVec(2,VBool);
 			type = TVec(2,VBool);

+ 7 - 2
hxsl/GlslOut.hx

@@ -494,13 +494,18 @@ class GlslOut {
 			addValue(index, tabs);
 			addValue(index, tabs);
 			add("]");
 			add("]");
 		case TArrayDecl(el):
 		case TArrayDecl(el):
-			add("[");
+			switch( e.t ) {
+			case TArray(t,_): addType(t);
+			default: throw "assert";
+			}
+			add("["+el.length+"]");
+			add("(");
 			var first = true;
 			var first = true;
 			for( e in el ) {
 			for( e in el ) {
 				if( first ) first = false else add(", ");
 				if( first ) first = false else add(", ");
 				addValue(e,tabs);
 				addValue(e,tabs);
 			}
 			}
-			add("]");
+			add(")");
 		case TMeta(_, _, e):
 		case TMeta(_, _, e):
 			addExpr(e, tabs);
 			addExpr(e, tabs);
 		}
 		}

+ 26 - 8
hxsl/HlslOut.hx

@@ -351,6 +351,32 @@ class HlslOut {
 			}
 			}
 			add(tabs);
 			add(tabs);
 			add("}");
 			add("}");
+		case TVarDecl(v, { e : TArrayDecl(el) }):
+			locals.set(v.id, v);
+			for( i in 0...el.length ) {
+				ident(v);
+				add("[");
+				add(i);
+				add("] = ");
+				addExpr(el[i], tabs);
+				newLine(el[i]);
+			}
+		case TBinop(OpAssign,evar = { e : TVar(_) },{ e : TArrayDecl(el) }):
+			for( i in 0...el.length ) {
+				addExpr(evar, tabs);
+				add("[");
+				add(i);
+				add("] = ");
+				addExpr(el[i], tabs);
+			}
+		case TArrayDecl(el):
+			add("{");
+			var first = true;
+			for( e in el ) {
+				if( first ) first = false else add(", ");
+				addValue(e,tabs);
+			}
+			add("}");
 		case TBinop(op, e1, e2):
 		case TBinop(op, e1, e2):
 			switch( [op, e1.t, e2.t] ) {
 			switch( [op, e1.t, e2.t] ) {
 			case [OpAssignOp(OpMod) | OpMod, _, _]:
 			case [OpAssignOp(OpMod) | OpMod, _, _]:
@@ -493,14 +519,6 @@ class HlslOut {
 			add("[");
 			add("[");
 			addValue(index, tabs);
 			addValue(index, tabs);
 			add("]");
 			add("]");
-		case TArrayDecl(el):
-			add("[");
-			var first = true;
-			for( e in el ) {
-				if( first ) first = false else add(", ");
-				addValue(e,tabs);
-			}
-			add("]");
 		case TMeta(_, _, e):
 		case TMeta(_, _, e):
 			addExpr(e, tabs);
 			addExpr(e, tabs);
 		}
 		}