浏览代码

fixed swizzle write

Nicolas Cannasse 11 月之前
父节点
当前提交
294f50f7e6
共有 1 个文件被更改,包括 43 次插入8 次删除
  1. 43 8
      hxsl/WgslOut.hx

+ 43 - 8
hxsl/WgslOut.hx

@@ -246,15 +246,50 @@ class WgslOut {
 				addValue(e,tabs);
 			}
 			add("}");
-		case TBinop(op, e1, e2):
-			switch( [op, e1.t, e2.t] ) {
-			default:
-				addValue(e1, tabs);
-				add(" ");
-				add(Printer.opStr(op));
-				add(" ");
-				addValue(e2, tabs);
+		case TBinop(op = OpAssign|OpAssignOp(_), { e : TSwiz(e,regs) }, e2) if( regs.length > 1 ):
+			// WSGL does not support swizzle writing outside of a single component (wth) 
+			addValue(e, tabs);
+			add(" = ");
+			var size = switch(e.t) {
+			case TVec(size, _): size;
+			default: throw "assert";
 			}
+			add("vec"+size+"(");
+			for( i in 0...size ) {
+				if( i > 0 ) add(",");
+				var found = false;
+				for( j => r in regs ) {
+					if( r.getIndex() == i ) {
+						found = true;
+						addValue(e2,tabs);
+						add(".");
+						add("xyzw".charAt(j));
+						switch( op ) {
+						case OpAssignOp(op):
+							add(" ");
+							add(Printer.opStr(op));
+							add("  ");
+							addValue(e,tabs);
+							add(".");
+							add("xyzw".charAt(j));
+						default:
+						}
+						break;
+					}
+				}
+				if( !found ) {
+					addValue(e,tabs);
+					add(".");
+					add("xyzw".charAt(i));
+				}
+			}
+			add(")");
+		case TBinop(op, e1, e2):
+			addValue(e1, tabs);
+			add(" ");
+			add(Printer.opStr(op));
+			add(" ");
+			addValue(e2, tabs);
 		case TUnop(op, e1):
 			add(switch(op) {
 			case OpNot: "!";