Преглед на файлове

fixed material pass bits overflow: handle colorMask separately

ncannasse преди 7 години
родител
ревизия
17c034bfa3
променени са 4 файла, в които са добавени 18 реда и са изтрити 11 реда
  1. 7 4
      h3d/impl/DirectXDriver.hx
  2. 9 5
      h3d/impl/GlDriver.hx
  3. 1 1
      h3d/mat/Pass.hx
  4. 1 1
      h3d/pass/HardwarePick.hx

+ 7 - 4
h3d/impl/DirectXDriver.hx

@@ -95,6 +95,7 @@ class DirectXDriver extends h3d.impl.Driver {
 	var currentStencilMaskBits = -1;
 	var currentStencilMaskBits = -1;
 	var currentStencilOpBits = -1;
 	var currentStencilOpBits = -1;
 	var currentStencilRef = 0;
 	var currentStencilRef = 0;
+	var currentColorMask = -1;
 	var targetsCount = 1;
 	var targetsCount = 1;
 	var allowDraw = false;
 	var allowDraw = false;
 
 
@@ -548,22 +549,24 @@ class DirectXDriver extends h3d.impl.Driver {
 		updateResCount++;
 		updateResCount++;
 	}
 	}
 
 
-	static inline var SCISSOR_BIT = 1 << (Pass.colorMask_offset + 4);
+	static inline var SCISSOR_BIT = 1 << (Pass.blendAlphaOp_offset + 4);
 
 
 	override public function selectMaterial(pass:h3d.mat.Pass) {
 	override public function selectMaterial(pass:h3d.mat.Pass) {
 		var bits = @:privateAccess pass.bits;
 		var bits = @:privateAccess pass.bits;
+		var mask = pass.colorMask;
 
 
 		if( hasScissor ) bits |= SCISSOR_BIT;
 		if( hasScissor ) bits |= SCISSOR_BIT;
 
 
 		var stOpBits = pass.stencil != null ? @:privateAccess pass.stencil.opBits : -1;
 		var stOpBits = pass.stencil != null ? @:privateAccess pass.stencil.opBits : -1;
 		var stMaskBits = pass.stencil != null ? @:privateAccess pass.stencil.maskBits : -1;
 		var stMaskBits = pass.stencil != null ? @:privateAccess pass.stencil.maskBits : -1;
 
 
-		if( bits == currentMaterialBits && stOpBits == currentStencilOpBits && stMaskBits == currentStencilMaskBits )
+		if( bits == currentMaterialBits && stOpBits == currentStencilOpBits && stMaskBits == currentStencilMaskBits && mask == currentColorMask )
 			return;
 			return;
 
 
 		currentMaterialBits = bits;
 		currentMaterialBits = bits;
 		currentStencilOpBits = stOpBits;
 		currentStencilOpBits = stOpBits;
 		currentStencilMaskBits = stMaskBits;
 		currentStencilMaskBits = stMaskBits;
+		currentColorMask = mask;
 
 
 		var depthBits = bits & (Pass.depthWrite_mask | Pass.depthTest_mask);
 		var depthBits = bits & (Pass.depthWrite_mask | Pass.depthTest_mask);
 		var depths = depthStates.get(depthBits);
 		var depths = depthStates.get(depthBits);
@@ -640,7 +643,7 @@ class DirectXDriver extends h3d.impl.Driver {
 			Driver.rsSetState(raster);
 			Driver.rsSetState(raster);
 		}
 		}
 
 
-		var blendBits = bits & (Pass.blendSrc_mask | Pass.blendDst_mask | Pass.blendAlphaSrc_mask | Pass.blendAlphaDst_mask | Pass.blendOp_mask | Pass.blendAlphaOp_mask | Pass.colorMask_mask);
+		var blendBits = (bits & (Pass.blendSrc_mask | Pass.blendDst_mask | Pass.blendAlphaSrc_mask | Pass.blendAlphaDst_mask | Pass.blendOp_mask | Pass.blendAlphaOp_mask)) | mask;
 		var blend = blendStates.get(blendBits);
 		var blend = blendStates.get(blendBits);
 		if( blend == null ) {
 		if( blend == null ) {
 			var desc = new RenderTargetBlendDesc();
 			var desc = new RenderTargetBlendDesc();
@@ -650,7 +653,7 @@ class DirectXDriver extends h3d.impl.Driver {
 			desc.destBlendAlpha = BLEND_ALPHA[Pass.getBlendAlphaDst(bits)];
 			desc.destBlendAlpha = BLEND_ALPHA[Pass.getBlendAlphaDst(bits)];
 			desc.blendOp = BLEND_OP[Pass.getBlendOp(bits)];
 			desc.blendOp = BLEND_OP[Pass.getBlendOp(bits)];
 			desc.blendOpAlpha = BLEND_OP[Pass.getBlendAlphaOp(bits)];
 			desc.blendOpAlpha = BLEND_OP[Pass.getBlendAlphaOp(bits)];
-			desc.renderTargetWriteMask = Pass.getColorMask(bits);
+			desc.renderTargetWriteMask = mask;
 			desc.blendEnable = !(desc.srcBlend == One && desc.srcBlendAlpha == One && desc.destBlend == Zero && desc.destBlendAlpha == Zero && desc.blendOp == Add && desc.blendOpAlpha == Add);
 			desc.blendEnable = !(desc.srcBlend == One && desc.srcBlendAlpha == One && desc.destBlend == Zero && desc.destBlendAlpha == Zero && desc.blendOp == Add && desc.blendOpAlpha == Add);
 			var tmp = new hl.NativeArray(1);
 			var tmp = new hl.NativeArray(1);
 			tmp[0] = desc;
 			tmp[0] = desc;

+ 9 - 5
h3d/impl/GlDriver.hx

@@ -164,6 +164,7 @@ class GlDriver extends Driver {
 	var programs : Map<Int, CompiledProgram>;
 	var programs : Map<Int, CompiledProgram>;
 	var frame : Int;
 	var frame : Int;
 	var lastActiveIndex : Int = 0;
 	var lastActiveIndex : Int = 0;
+	var curColorMask = -1;
 
 
 	var bufferWidth : Int;
 	var bufferWidth : Int;
 	var bufferHeight : Int;
 	var bufferHeight : Int;
@@ -548,6 +549,13 @@ class GlDriver extends Driver {
 			}
 			}
 		}
 		}
 		selectMaterialBits(bits);
 		selectMaterialBits(bits);
+
+		if( curColorMask != pass.colorMask ) {
+			var m = pass.colorMask;
+			gl.colorMask(m & 1 != 0, m & 2 != 0, m & 4 != 0, m & 8 != 0);
+			curColorMask = m;
+		}
+
 		var s = defStencil;
 		var s = defStencil;
 		if( pass.stencil == null ) {
 		if( pass.stencil == null ) {
 			if( curStEnabled ) {
 			if( curStEnabled ) {
@@ -622,10 +630,6 @@ class GlDriver extends Driver {
 				gl.depthFunc(COMPARE[cmp]);
 				gl.depthFunc(COMPARE[cmp]);
 			}
 			}
 		}
 		}
-		if( diff & Pass.colorMask_mask != 0 ) {
-			var m = Pass.getColorMask(bits);
-			gl.colorMask(m & 1 != 0, m & 2 != 0, m & 4 != 0, m & 8 != 0);
-		}
 		curMatBits = bits;
 		curMatBits = bits;
 	}
 	}
 
 
@@ -681,7 +685,7 @@ class GlDriver extends Driver {
 		var bits = 0;
 		var bits = 0;
 		if( color != null ) {
 		if( color != null ) {
 			gl.colorMask(true, true, true, true);
 			gl.colorMask(true, true, true, true);
-			if( curMatBits >= 0 ) curMatBits |= Pass.colorMask_mask;
+			curColorMask = 15;
 			#if hlsdl
 			#if hlsdl
 			// clear does not take gamma correction into account in GL/Windows
 			// clear does not take gamma correction into account in GL/Windows
 			if( curTarget != null && curTarget.isSRGB() )
 			if( curTarget != null && curTarget.isSRGB() )

+ 1 - 1
h3d/mat/Pass.hx

@@ -35,7 +35,7 @@ class Pass implements hxd.impl.Serializable {
 	@:bits(bits) public var blendAlphaDst : Blend;
 	@:bits(bits) public var blendAlphaDst : Blend;
 	@:bits(bits) public var blendOp : Operation;
 	@:bits(bits) public var blendOp : Operation;
 	@:bits(bits) public var blendAlphaOp : Operation;
 	@:bits(bits) public var blendAlphaOp : Operation;
-	@:bits(bits, 4) public var colorMask : Int;
+	public var colorMask : Int;
 
 
 	@:s public var stencil : Stencil;
 	@:s public var stencil : Stencil;
 
 

+ 1 - 1
h3d/pass/HardwarePick.hx

@@ -69,7 +69,7 @@ class HardwarePick extends Default {
 		while( cur != null ) {
 		while( cur != null ) {
 			// force all materials to use opaque blend
 			// force all materials to use opaque blend
 			@:privateAccess {
 			@:privateAccess {
-				var mask = h3d.mat.Pass.blendSrc_mask | h3d.mat.Pass.blendDst_mask | h3d.mat.Pass.blendAlphaDst_mask | h3d.mat.Pass.blendAlphaSrc_mask | h3d.mat.Pass.blendOp_mask | h3d.mat.Pass.blendAlphaOp_mask | h3d.mat.Pass.colorMask_mask;
+				var mask = h3d.mat.Pass.blendSrc_mask | h3d.mat.Pass.blendDst_mask | h3d.mat.Pass.blendAlphaDst_mask | h3d.mat.Pass.blendAlphaSrc_mask | h3d.mat.Pass.blendOp_mask | h3d.mat.Pass.blendAlphaOp_mask;
 				cur.pass.bits &= ~mask;
 				cur.pass.bits &= ~mask;
 				cur.pass.bits |= material.bits & mask;
 				cur.pass.bits |= material.bits & mask;
 			}
 			}