Просмотр исходного кода

flash fixes (still miss shader integration)

Nicolas Cannasse 11 лет назад
Родитель
Сommit
51eb998b36
6 измененных файлов с 70 добавлено и 24 удалено
  1. 9 2
      all.hxml
  2. 1 1
      h2d/Drawable.hx
  3. 52 16
      h3d/impl/Stage3dDriver.hx
  4. 2 2
      hxd/Stage.hx
  5. 1 1
      hxd/res/LoadedBitmap.hx
  6. 5 2
      hxsl/Globals.hx

+ 9 - 2
all.hxml

@@ -1,7 +1,14 @@
--js heaps.js
 -lib heaps
 --macro include('h3d')
 --macro include('h2d')
 --macro include('hxsl',true,['hxsl.Macros'])
 --macro include('hxd',true,['hxd.res.FileTree','hxd.Res','hxd.impl.BitsBuilder'])
---no-output
+--no-output
+--each
+
+-js heaps.js
+
+--next
+
+-swf heaps.swf
+-swf-version 11.2

+ 1 - 1
h2d/Drawable.hx

@@ -17,7 +17,7 @@ class Drawable extends Sprite {
 		shaders = [];
 	}
 	
-	function set_colorKey(v) {
+	function set_colorKey(v:Null<Int>) {
 		if( shaders != null ) {
 			var s = getShader(h3d.shader.ColorKey);
 			if( s == null ) {

+ 52 - 16
h3d/impl/Stage3dDriver.hx

@@ -1,5 +1,6 @@
 package h3d.impl;
 import h3d.impl.Driver;
+import h3d.mat.Pass;
 
 #if flash
 
@@ -40,7 +41,7 @@ class Stage3dDriver extends Driver {
 	var onCreateCallback : Bool -> Void;
 
 	var curMatBits : Int;
-	var curShader : hxsl.Shader.ShaderInstance;
+	var curShader : hxsl.RuntimeShader;
 	var curBuffer : VertexBuffer;
 	var curMultiBuffer : Array<Int>;
 	var curAttributes : Int;
@@ -99,7 +100,6 @@ class Stage3dDriver extends Driver {
 		if( old != null ) {
 			if( old.driverInfo != "Disposed" ) throw "Duplicate onCreate()";
 			old.dispose();
-			hxsl.Shader.ShaderGlobals.disposeAll();
 			ctx = s3d.context3D;
 			onCreateCallback(true);
 		} else {
@@ -266,22 +266,50 @@ class Stage3dDriver extends Driver {
 		i.uploadFromByteArray(buf.getData(), bufPos, startIndice, indiceCount );
 	}
 
-	override function selectMaterial( mbits : Int ) {
-		var diff = curMatBits ^ mbits;
-		if( diff != 0 ) {
-			if( curMatBits < 0 || diff&3 != 0 )
-				ctx.setCulling(FACE[mbits&3]);
-			if( curMatBits < 0 || diff & (0xFF << 6) != 0 )
-				ctx.setBlendFactors(BLEND[(mbits>>6)&15], BLEND[(mbits>>10)&15]);
-			if( curMatBits < 0 || diff & (15 << 2) != 0 )
-				ctx.setDepthTest((mbits >> 2) & 1 == 1, COMPARE[(mbits>>3)&7]);
-			if( curMatBits < 0 || diff & (15 << 14) != 0 )
-				ctx.setColorMask((mbits >> 14) & 1 != 0, (mbits >> 14) & 2 != 0, (mbits >> 14) & 4 != 0, (mbits >> 14) & 8 != 0);
-			curMatBits = mbits;
+	override function selectMaterial( pass : Pass ) {
+		selectMaterialBits(@:privateAccess pass.bits);
+	}
+	
+	function selectMaterialBits( bits : Int ) {
+		var diff = bits ^ curMatBits;
+		if( diff == 0 )
+			return;
+		if( diff & Pass.culling_mask != 0 )
+			ctx.setCulling(FACE[Pass.getCulling(bits)]);
+		if( diff & (Pass.blendSrc_mask | Pass.blendDst_mask | Pass.blendAlphaSrc_mask | Pass.blendAlphaDst_mask) != 0 ) {
+			var csrc = Pass.getBlendSrc(bits);
+			var cdst = Pass.getBlendDst(bits);
+			var asrc = Pass.getBlendAlphaSrc(bits);
+			var adst = Pass.getBlendAlphaDst(bits);
+			if( csrc == asrc && cdst == adst ) {
+				if( (csrc | cdst) > BLEND.length ) throw "Blend operation not supported on flash";
+				ctx.setBlendFactors(BLEND[csrc], BLEND[cdst]);
+			} else {
+				throw "Alpha blend functions not supported on flash";
+			}
+		}
+		if( diff & (Pass.blendOp_mask | Pass.blendAlphaOp_mask) != 0 ) {
+			var cop = Pass.getBlendOp(bits);
+			var aop = Pass.getBlendAlphaOp(bits);
+			if( cop != 0 || aop != 0 )
+				throw "Custom blend operation not supported on flash";
+		}
+		if( diff & (Pass.depthWrite_mask | Pass.depthTest_mask) != 0 ) {
+			var write = Pass.getDepthWrite(bits) != 0;
+			var cmp = Pass.getDepthTest(bits);
+			ctx.setDepthTest(write, COMPARE[cmp]);
+		}
+		if( diff & Pass.colorMask_mask != 0 ) {
+			var m = Pass.getColorMask(bits);
+			ctx.setColorMask(m & 1 != 0, m & 2 != 0, m & 4 != 0, m & 8 != 0);
 		}
+		curMatBits = bits;
 	}
 
-	override function selectShader( shader : Shader ) {
+	override function selectShader( shader : hxsl.RuntimeShader ) {
+		throw "TODO";
+		return true;
+		/*
 		var shaderChanged = false;
 		var s = shader.getInstance();
 		if( s.program == null ) {
@@ -339,12 +367,15 @@ class Stage3dDriver extends Driver {
 			}
 		}
 		return shaderChanged;
+		*/
 	}
 
 	override function selectBuffer( v : VertexBuffer ) {
 		if( v == curBuffer )
 			return;
 		curBuffer = v;
+		throw "TODO";
+		/*
 		curMultiBuffer[0] = -1;
 		if( v.b.stride < curShader.stride )
 			throw "Buffer stride (" + v.b.stride + ") and shader stride (" + curShader.stride + ") mismatch";
@@ -361,13 +392,17 @@ class Stage3dDriver extends Driver {
 		for( i in pos...curAttributes )
 			ctx.setVertexBufferAt(i, null);
 		curAttributes = pos;
+		*/
 	}
 
 	override function getShaderInputNames() {
-		return curShader.bufferNames;
+		throw "TODO";
+		return [];
 	}
 
 	override function selectMultiBuffers( buffers : Buffer.BufferOffset ) {
+		throw "TODO";
+		/*
 		// select the multiple buffers elements
 		var changed = false;
 		var b = buffers;
@@ -402,6 +437,7 @@ class Stage3dDriver extends Driver {
 			curAttributes = pos;
 			curBuffer = null;
 		}
+		*/
 	}
 
 	function debugDraw( ibuf : IndexBuffer, startIndex : Int, ntriangles : Int ) {

+ 2 - 2
hxd/Stage.hx

@@ -151,11 +151,11 @@ class Stage {
 #if (flash || openfl)
 
 	inline function get_mouseX() {
-		return stage.mouseX;
+		return Std.int(stage.mouseX);
 	}
 
 	inline function get_mouseY() {
-		return stage.mouseY;
+		return Std.int(stage.mouseY);
 	}
 
 	inline function get_width() {

+ 1 - 1
hxd/res/LoadedBitmap.hx

@@ -10,7 +10,7 @@ abstract LoadedBitmap(LoadedBitmapData) {
 	
 	public function toBitmap() : hxd.BitmapData {
 		#if flash
-		return this;
+		return hxd.BitmapData.fromNative(this);
 		#elseif js
 		var canvas = js.Browser.document.createCanvasElement();
 		canvas.width = this.width;

+ 5 - 2
hxsl/Globals.hx

@@ -4,11 +4,14 @@ abstract GlobalSlot<T>(Int) {
 	public inline function new(name:String) {
 		this = Globals.allocID(name);
 	}
+	public inline function toInt() {
+		return this;
+	}
 	public inline function set( globals : Globals, v : T ) {
-		globals.fastSet(this, v);
+		globals.fastSet(toInt(), v);
 	}
 	public inline function get( globals : Globals ) : T {
-		return globals.fastGet(this);
+		return globals.fastGet(toInt());
 	}
 }