فهرست منبع

correctly restore multiple render targets in stack

Nicolas Cannasse 5 سال پیش
والد
کامیت
f4e8cfdaf2
1فایلهای تغییر یافته به همراه11 افزوده شده و 7 حذف شده
  1. 11 7
      h3d/Engine.hx

+ 11 - 7
h3d/Engine.hx

@@ -3,6 +3,7 @@ import h3d.mat.Data;
 
 private class TargetTmp {
 	public var t : h3d.mat.Texture;
+	public var textures : Array<h3d.mat.Texture>;
 	public var next : TargetTmp;
 	public var layer : Int;
 	public var mipLevel : Int;
@@ -51,7 +52,7 @@ class Engine {
 	var textureColorCache = new Map<Int,h3d.mat.Texture>();
 	public var ready(default,null) = false;
 	@:allow(hxd.res) var resCache = new Map<{},Dynamic>();
-	
+
 	public static var SOFTWARE_DRIVER = false;
 	public static var ANTIALIASING = 0;
 
@@ -233,6 +234,7 @@ class Engine {
 		} else {
 			mem = new h3d.impl.MemoryManager(driver);
 			mem.init();
+			nullTexture = new h3d.mat.Texture(0, 0, [NoAlloc]);
 		}
 		hardware = driver.hasFeature(HardwareAccelerated);
 		set_debug(debug);
@@ -329,15 +331,13 @@ class Engine {
 		if( t == null )
 			needFlushTarget = currentTargetTex != null;
 		else
-			needFlushTarget = currentTargetTex != t.t || currentTargetLayer != t.layer || currentTargetMip != t.mipLevel;
+			needFlushTarget = currentTargetTex != t.t || currentTargetLayer != t.layer || currentTargetMip != t.mipLevel || t.textures != null;
 	}
 
 	public function pushTargets( textures : Array<h3d.mat.Texture> ) {
-		if( nullTexture == null ) nullTexture = new h3d.mat.Texture(0, 0, [NoAlloc]);
 		pushTarget(nullTexture);
-		driver.setRenderTargets(textures);
-		currentTargetTex = nullTexture;
-		needFlushTarget = false;
+		targetStack.textures = textures;
+		needFlushTarget = true;
 	}
 
 	public function popTarget() {
@@ -348,6 +348,7 @@ class Engine {
 		updateNeedFlush();
 		// recycle
 		c.t = null;
+		c.textures = null;
 		c.next = targetTmp;
 		targetTmp = c;
 	}
@@ -362,7 +363,10 @@ class Engine {
 			driver.setRenderTarget(null);
 			currentTargetTex = null;
 		} else {
-			driver.setRenderTarget(t.t, t.layer, t.mipLevel);
+			if( t.textures != null )
+				driver.setRenderTargets(t.textures);
+			else
+				driver.setRenderTarget(t.t, t.layer, t.mipLevel);
 			currentTargetTex = t.t;
 			currentTargetLayer = t.layer;
 			currentTargetMip = t.mipLevel;