ソースを参照

basic 3d working with agal

Nicolas Cannasse 11 年 前
コミット
145f89c41b

+ 6 - 6
h3d/impl/Stage3dDriver.hx

@@ -288,7 +288,7 @@ class Stage3dDriver extends Driver {
 	override function selectMaterial( pass : Pass ) {
 		selectMaterialBits(@:privateAccess pass.bits);
 	}
-	
+
 	function selectMaterialBits( bits : Int ) {
 		var diff = bits ^ curMatBits;
 		if( diff == 0 )
@@ -333,7 +333,7 @@ class Stage3dDriver extends Driver {
 		new format.agal.Writer(o).write(agal);
 		return o.getBytes();
 	}
-	
+
 	override function selectShader( shader : hxsl.RuntimeShader ) {
 		var shaderChanged = false;
 		var p = programs.get(shader.id);
@@ -344,7 +344,7 @@ class Stage3dDriver extends Driver {
 			var fdata = compileShader(shader.fragment).getData();
 			vdata.endian = flash.utils.Endian.LITTLE_ENDIAN;
 			fdata.endian = flash.utils.Endian.LITTLE_ENDIAN;
-			
+
 			var pos = 0;
 			for( v in shader.vertex.data.vars )
 				if( v.kind == Input ) {
@@ -384,7 +384,7 @@ class Stage3dDriver extends Driver {
 		}
 		return shaderChanged;
 	}
-	
+
 	override function uploadShaderBuffers( buffers : h3d.shader.Buffers, which : h3d.shader.Buffers.BufferKind ) {
 		switch( which ) {
 		case Textures:
@@ -414,8 +414,8 @@ class Stage3dDriver extends Driver {
 				}
 			}
 		case Params:
-			ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.VERTEX, curShader.s.vertex.globalsSize, buffers.vertex.params.toData());
-			ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.FRAGMENT, curShader.s.fragment.globalsSize, buffers.fragment.params.toData());
+			if( curShader.s.vertex.paramsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.VERTEX, curShader.s.vertex.globalsSize, buffers.vertex.params.toData());
+			if( curShader.s.fragment.paramsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.FRAGMENT, curShader.s.fragment.globalsSize, buffers.fragment.params.toData());
 		case Globals:
 			if( curShader.s.vertex.globalsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.VERTEX, 0, buffers.vertex.globals.toData());
 			if( curShader.s.fragment.globalsSize > 0 ) ctx.setProgramConstantsFromVector(flash.display3D.Context3DProgramType.FRAGMENT, 0, buffers.fragment.globals.toData());

+ 75 - 16
hxsl/AgalOut.hx

@@ -5,7 +5,7 @@ import hxsl.RuntimeShader;
 import format.agal.Data;
 
 class AgalOut {
-	
+
 	static var COMPS = [X, Y, Z, W];
 
 	var code : Array<Opcode>;
@@ -22,7 +22,7 @@ class AgalOut {
 	public dynamic function error( msg : String, p : Position ) {
 		throw msg;
 	}
-	
+
 	public function compile( s : RuntimeShaderData, version ) : Data {
 		vertex = s.vertex;
 		nullReg = { t : RTemp, index : -1, swiz : null, access : null };
@@ -30,7 +30,7 @@ class AgalOut {
 		opcodes = [];
 		tmpCount = 0;
 		varMap = new Map();
-		
+
 		var varying = [];
 		var paramCount = 0, varCount = 0, inputCount = 0, outCount = 0, texCount = 0;
 		for( v in s.data.vars ) {
@@ -62,10 +62,10 @@ class AgalOut {
 		}
 		if( paramCount != s.globalsSize + s.paramsSize )
 			throw "assert";
-		
+
 		if( s.data.funs.length != 1 ) throw "assert";
 		expr(s.data.funs[0].expr);
-		
+
 		// force write of all varying components
 		for( v in varying ) {
 			if( v.swiz == null ) continue;
@@ -87,15 +87,15 @@ class AgalOut {
 			code : opcodes,
 		};
 	}
-	
+
 	inline function mov(dst, src) {
 		op(OMov(dst, src));
 	}
-	
+
 	inline function op(o) {
 		opcodes.push(o);
 	}
-	
+
 	inline function swiz( r : Reg, sw : Array<C> ) : Reg {
 		if( r.access != null ) throw "assert";
 		var sw = sw;
@@ -108,7 +108,17 @@ class AgalOut {
 			access : null
 		};
 	}
-	
+
+	inline function offset( r : Reg, k : Int ) : Reg {
+		if( r.swiz != null || r.access != null ) throw "assert";
+		return {
+			t : r.t,
+			index : r.index + k,
+			swiz : null,
+			access : null,
+		};
+	}
+
 	function expr( e : TExpr ) : Reg {
 		switch( e.e ) {
 		case TVarDecl(v, init):
@@ -130,11 +140,34 @@ class AgalOut {
 				return r;
 			case OpAssignOp(op):
 				var r1 = expr(e1);
-				mov(r1, expr( { e : TBinop(op, e1, e2), t : e.t, p : e.p } ));
+				mov(r1, expr( { e : TBinop(op, e1, e2), t : e1.t, p : e.p } ));
 				return r1;
+			case OpAdd:
+				var r = allocReg(e.t);
+				op(OAdd(r, expr(e1), expr(e2)));
+				return r;
+			case OpSub:
+				var r = allocReg(e.t);
+				op(OSub(r, expr(e1), expr(e2)));
+				return r;
 			case OpMult:
 				var r = allocReg(e.t);
-				op(OMul(r, expr(e1), expr(e2)));
+				var r1 = expr(e1);
+				var r2 = expr(e2);
+				switch( [e1.t, e2.t] ) {
+				case [TFloat | TVec(_), TFloat | TVec(_)]:
+					op(OMul(r, r1, r2));
+				case [TVec(3, VFloat), TMat3x4]:
+					op(OM34(r, r1, r2));
+				case [TVec(4, VFloat), TMat4]:
+					op(OM44(r, r1, r2));
+				default:
+					throw "assert " + [e1.t, e2.t];
+				}
+				return r;
+			case OpDiv:
+				var r = allocReg(e.t);
+				op(ODiv(r, expr(e1), expr(e2)));
 				return r;
 			default:
 				throw "TODO " + bop;
@@ -197,6 +230,32 @@ class AgalOut {
 						throw "assert " + a.t;
 					}
 					return r;
+				case [Mat3x4, _]:
+					var regs = [for( a in args ) expr(a)];
+					var r0 = regs[0];
+					var align = true;
+					for( i in 0...regs.length ) {
+						var r = regs[i];
+						if( r.t == r0.t && r.index == r0.index + i && r.swiz == null && r.access == null ) continue;
+						align = false;
+						break;
+					}
+					if( align )
+						return r0;
+					throw "TODO";
+				case [Mat4, _]:
+					var regs = [for( a in args ) expr(a)];
+					var r0 = regs[0];
+					var align = true;
+					for( i in 0...regs.length ) {
+						var r = regs[i];
+						if( r.t == r0.t && r.index == r0.index + i && r.swiz == null && r.access == null ) continue;
+						align = false;
+						break;
+					}
+					if( align )
+						return r0;
+					throw "TODO";
 				default:
 					throw "TODO " + g + ":" + args.length;
 				}
@@ -230,7 +289,7 @@ class AgalOut {
 			throw "TODO " + e.e;
 		}
 	}
-	
+
 	function regSize( t : Type ) {
 		return switch( t ) {
 		case TInt, TFloat, TVec(_), TBytes(_): 1;
@@ -241,7 +300,7 @@ class AgalOut {
 		case TVoid, TString, TBool, TSampler2D, TSamplerCube, TFun(_), TArray(_): throw "assert "+t;
 		}
 	}
-	
+
 	function defSwiz( t : Type ) {
 		return switch( t ) {
 		case TInt, TFloat: [X];
@@ -250,7 +309,7 @@ class AgalOut {
 		default: null;
 		}
 	}
-	
+
 	function reg( v : TVar ) : Reg {
 		var r = varMap.get(v.id);
 		if( r != null ) return r;
@@ -259,13 +318,13 @@ class AgalOut {
 		varMap.set(v.id, r);
 		return r;
 	}
-	
+
 	function allocReg( ?t : Type ) : Reg {
 		var r = { t : RTemp, index : tmpCount, swiz : t == null ? null : defSwiz(t), access : null };
 		tmpCount += t == null ? 1 : regSize(t);
 		return r;
 	}
-	
+
 	public static function toAgal( shader, version ) {
 		var a = new AgalOut();
 		return a.compile(shader, version);

+ 9 - 0
samples/basic/basic_swf.hxml

@@ -0,0 +1,9 @@
+-swf main.swf
+-swf-header 1280:800:60:FFFFFF
+--flash-strict
+-swf-version 14
+-main Main
+-lib heaps
+-D resourcesPath=../res
+-dce full
+--macro include('h3d')

+ 60 - 0
samples/basic/basic_swf.hxproj

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project version="2">
+  <!-- Output SWF options -->
+  <output>
+    <movie outputType="Application" />
+    <movie input="" />
+    <movie path="main.swf" />
+    <movie fps="60" />
+    <movie width="1280" />
+    <movie height="800" />
+    <movie version="14" />
+    <movie minorVersion="0" />
+    <movie platform="Flash Player" />
+    <movie background="#FFFFFF" />
+  </output>
+  <!-- Other classes to be compiled into your SWF -->
+  <classpaths>
+    <!-- example: <class path="..." /> -->
+  </classpaths>
+  <!-- Build options -->
+  <build>
+    <option directives="" />
+    <option flashStrict="True" />
+    <option noInlineOnDebug="False" />
+    <option mainClass="Main" />
+    <option enabledebug="False" />
+    <option additional="-lib heaps&#xA;-D resourcesPath=../res&#xA;-dce full&#xA;--macro include('h3d')" />
+  </build>
+  <!-- haxelib libraries -->
+  <haxelib>
+    <!-- example: <library name="..." /> -->
+  </haxelib>
+  <!-- Class files to compile (other referenced classes will automatically be included) -->
+  <compileTargets>
+    <!-- example: <compile path="..." /> -->
+  </compileTargets>
+  <!-- Assets to embed into the output SWF -->
+  <library>
+    <!-- example: <asset path="..." id="..." update="..." glyphs="..." mode="..." place="..." sharepoint="..." /> -->
+  </library>
+  <!-- Paths to exclude from the Project Explorer tree -->
+  <hiddenPaths>
+    <hidden path="engine.hxml" />
+    <hidden path="obj" />
+    <hidden path="main.js" />
+    <hidden path="main.js.map" />
+  </hiddenPaths>
+  <!-- Executed before build -->
+  <preBuildCommand />
+  <!-- Executed after build -->
+  <postBuildCommand alwaysRun="False" />
+  <!-- Other project options -->
+  <options>
+    <option showHiddenPaths="False" />
+    <option testMovie="Default" />
+    <option testMovieCommand="index.html" />
+  </options>
+  <!-- Plugin storage -->
+  <storage />
+</project>

+ 0 - 0
samples/basic/basic.hxml → samples/basic/basic_wgl.hxml


+ 0 - 0
samples/basic/basic.hxproj → samples/basic/basic_wgl.hxproj


+ 11 - 11
samples/hxsl/Test.hx

@@ -1,6 +1,6 @@
 
 class Test {
-	
+
 	@:access(hxsl)
 	static function main() {
 		var shaders = [
@@ -14,18 +14,18 @@ class Test {
 		var s = cache.link(instances, cache.allocOutputVars(["output.position", "output.color"]));
 		trace("VERTEX=\n" + hxsl.Printer.shaderToString(s.vertex.data,true));
 		trace("FRAGMENT=\n" + hxsl.Printer.shaderToString(s.fragment.data,true));
-		
+
 		#if js
 		haxe.Log.trace("START");
 		try {
-		
+
 		var canvas = js.Browser.document.createCanvasElement();
 		var gl = canvas.getContextWebGL();
 		var GL = js.html.webgl.GL;
-		
+		var glout = new hxsl.GlslOut();
+
 		function compile(kind, shader) {
-			var code = hxsl.GlslOut.toGlsl(shader);
-			trace(code);
+			var code = glout.run(shader);
 			var s = gl.createShader(kind);
 			gl.shaderSource(s, code);
 			gl.compileShader(s);
@@ -37,10 +37,10 @@ class Test {
 			}
 			return s;
 		}
-			
+
 		var vs = compile(GL.VERTEX_SHADER, s.vertex.data);
 		var fs = compile(GL.FRAGMENT_SHADER, s.fragment.data);
-		
+
 		var p = gl.createProgram();
 		gl.attachShader(p, vs);
 		gl.attachShader(p, fs);
@@ -49,14 +49,14 @@ class Test {
 			var log = gl.getProgramInfoLog(p);
 			throw "Program linkage failure: "+log;
 		}
-		
+
 		trace("LINK SUCCESS");
-		
+
 		} catch( e : Dynamic ) {
 			trace(e);
 		}
 
 		#end
 	}
-		
+
 }