瀏覽代碼

fixed not full scene cleanup when dispose() + fixed color/blendMode(erase) double apply on some filters

ncannasse 9 年之前
父節點
當前提交
a9fa4f7d06
共有 3 個文件被更改,包括 18 次插入7 次删除
  1. 15 5
      h2d/RenderContext.hx
  2. 1 0
      h2d/Scene.hx
  3. 2 2
      h2d/Sprite.hx

+ 15 - 5
h2d/RenderContext.hx

@@ -24,7 +24,7 @@ class RenderContext extends h3d.impl.RenderContext {
 	var stride : Int;
 	var targetsStack : Array<{ t : h3d.mat.Texture, x : Int, y : Int, w : Int, h : Int }>;
 	var hasUVPos : Bool;
-	var inFilter : Bool;
+	var inFilter : Sprite;
 
 	var curX : Int;
 	var curY : Int;
@@ -48,6 +48,11 @@ class RenderContext extends h3d.impl.RenderContext {
 		targetsStack = [];
 		textures = new h3d.impl.TextureCache();
 	}
+	
+	public function dispose() {
+		textures.dispose();	
+		if( fixedBuffer != null ) fixedBuffer.dispose();
+	}
 
 	public inline function hasBuffering() {
 		return BUFFERING;
@@ -60,7 +65,7 @@ class RenderContext extends h3d.impl.RenderContext {
 		stride = 0;
 		curX = 0;
 		curY = 0;
-		inFilter = false;
+		inFilter = null;
 		curWidth = scene.width;
 		curHeight = scene.height;
 		manager.globals.set("time", time);
@@ -155,7 +160,9 @@ class RenderContext extends h3d.impl.RenderContext {
 		baseShader.texture = texture;
 		texture.filter = currentObj.filter ? Linear : Nearest;
 		texture.wrap = currentObj.tileWrap ? Repeat : Clamp;
-		pass.setBlendMode(currentObj.blendMode);
+		var blend = currentObj.blendMode;
+		if( inFilter == currentObj  && blend == Erase ) blend = Add; // add THEN erase
+		pass.setBlendMode(blend);
 		manager.fillParams(buffers, compiledShader, currentShaders);
 		engine.selectMaterial(pass);
 		engine.uploadShaderBuffers(buffers, Params);
@@ -180,7 +187,7 @@ class RenderContext extends h3d.impl.RenderContext {
 	public function drawTile( obj : h2d.Drawable, tile : h2d.Tile ) {
 
 		var matA, matB, matC, matD, absX, absY;
-		if( inFilter ) {
+		if( inFilter != null ) {
 			var f1 = baseShader.filterMatrixA;
 			var f2 = baseShader.filterMatrixB;
 			matA = obj.matA * f1.x + obj.matB * f1.y;
@@ -229,7 +236,10 @@ class RenderContext extends h3d.impl.RenderContext {
 		}
 
 		beginDraw(obj, tile.getTexture(), true, true);
-		baseShader.color.set(obj.color.r, obj.color.g, obj.color.b, obj.color.a * globalAlpha);
+		if( inFilter == obj )
+			baseShader.color.set(1, 1, 1, 1);
+		else
+			baseShader.color.set(obj.color.r, obj.color.g, obj.color.b, obj.color.a * globalAlpha);
 		baseShader.absoluteMatrixA.set(tile.width * obj.matA, tile.height * obj.matC, obj.absX + tile.dx * obj.matA + tile.dy * obj.matC);
 		baseShader.absoluteMatrixB.set(tile.width * obj.matB, tile.height * obj.matD, obj.absY + tile.dx * obj.matB + tile.dy * obj.matD);
 		baseShader.uvPos.set(tile.u, tile.v, tile.u2 - tile.u, tile.v2 - tile.v);

+ 1 - 0
h2d/Scene.hx

@@ -331,6 +331,7 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
 	public function dispose() {
 		if( allocated )
 			onDelete();
+		ctx.dispose();
 	}
 
 	public function setElapsedTime( v : Float ) {

+ 2 - 2
h2d/Sprite.hx

@@ -535,7 +535,7 @@ class Sprite {
 		var invX = -(absX * invA + absY * invC);
 		var invY = -(absX * invB + absY * invD);
 
-		@:privateAccess ctx.inFilter = true;
+		@:privateAccess ctx.inFilter = this;
 		shader.filterMatrixA.set(invA, invC, invX);
 		shader.filterMatrixB.set(invB, invD, invY);
 		ctx.globalAlpha = 1;
@@ -562,7 +562,7 @@ class Sprite {
 		@:privateAccess ctx.inFilter = oldF;
 
 		ctx.popTarget();
-
+		
 		ctx.globalAlpha = oldAlpha * alpha;
 		emitTile(ctx, final);
 		ctx.globalAlpha = oldAlpha;