Browse Source

Merge branch 'master' of github.com:heapsio/heaps into webgpu

Nicolas Cannasse 2 years ago
parent
commit
4f53ef8f10
3 changed files with 79 additions and 6 deletions
  1. 26 0
      h3d/Quat.hx
  2. 45 6
      h3d/impl/DirectXDriver.hx
  3. 8 0
      h3d/mat/Pass.hx

+ 26 - 0
h3d/Quat.hx

@@ -246,6 +246,32 @@ class Quat {
 		z = -z;
 	}
 
+	/**
+		Makes a unit quaternion to the power of the value.
+	**/
+	public inline function pow( v : Float ) {
+		// ln()
+		var r = Math.sqrt(x*x+y*y+z*z);
+		var t = r > Math.EPSILON ? Math.atan2(r,w)/r : 0;
+		w = 0.5 * Math.log(w*w+x*x+y*y+z*z);
+		x *= t;
+		y *= t;
+		z *= t;
+		// scale
+		x *= v;
+		y *= v;
+		z *= v;
+		w *= v;
+		// exp
+		var r = Math.sqrt(x*x+y*y+z*z);
+		var et = Math.exp(w);
+		var s = r > Math.EPSILON ? et *Math.sin(r)/r : 0;
+		w = et * Math.cos(r);
+		x *= s;
+		y *= s;
+		z *= s;
+	}
+
 	/**
 		Negate the quaternion: this will not change the actual angle, use `conjugate` for that.
 	**/

+ 45 - 6
h3d/impl/DirectXDriver.hx

@@ -104,6 +104,9 @@ class DirectXDriver extends h3d.impl.Driver {
 	var currentStencilOpBits = -1;
 	var currentStencilRef = 0;
 	var currentColorMask = -1;
+	var currentColorMaskIndex = -1;
+	var colorMaskIndexes : Map<Int, Int>;
+	var colorMaskIndex = 1;
 	var targetsCount = 1;
 	var allowDraw = false;
 	var maxSamplers = 16;
@@ -170,6 +173,7 @@ class DirectXDriver extends h3d.impl.Driver {
 		samplerStates = new Map();
 		vertexShader = new PipelineState(Vertex);
 		pixelShader = new PipelineState(Pixel);
+		colorMaskIndexes = new Map();
 
 		try
 			driver = Driver.create(window, backBufferFormat, getDriverFlags())
@@ -654,7 +658,6 @@ class DirectXDriver extends h3d.impl.Driver {
 		currentMaterialBits = bits;
 		currentStencilOpBits = stOpBits;
 		currentStencilMaskBits = stMaskBits;
-		currentColorMask = mask;
 
 		var depthBits = bits & (Pass.depthWrite_mask | Pass.depthTest_mask);
 		var depths = depthStates.get(depthBits);
@@ -731,7 +734,19 @@ class DirectXDriver extends h3d.impl.Driver {
 			Driver.rsSetState(raster);
 		}
 
-		var blendBits = (bits & (Pass.blendSrc_mask | Pass.blendDst_mask | Pass.blendAlphaSrc_mask | Pass.blendAlphaDst_mask | Pass.blendOp_mask | Pass.blendAlphaOp_mask)) | mask;
+		var bitsMask = Pass.blendSrc_mask | Pass.blendDst_mask | Pass.blendAlphaSrc_mask | Pass.blendAlphaDst_mask | Pass.blendOp_mask | Pass.blendAlphaOp_mask;
+		if ( currentColorMask != mask ) {
+			currentColorMaskIndex = colorMaskIndexes.get(mask);
+			if ( currentColorMaskIndex == 0 ) {
+				if ( bitsMask & colorMaskIndex != 0 )
+					throw "Too many color mask configurations";
+				currentColorMaskIndex = colorMaskIndex++;
+				colorMaskIndexes.set(mask, currentColorMaskIndex);
+			}
+		}
+		currentColorMask = mask;
+
+		var blendBits = (bits & bitsMask) | currentColorMaskIndex;
 		var blend = blendStates.get(blendBits);
 		if( blend == null ) {
 			var desc = new RenderTargetBlendDesc();
@@ -741,11 +756,35 @@ class DirectXDriver extends h3d.impl.Driver {
 			desc.destBlendAlpha = BLEND_ALPHA[Pass.getBlendAlphaDst(bits)];
 			desc.blendOp = BLEND_OP[Pass.getBlendOp(bits)];
 			desc.blendOpAlpha = BLEND_OP[Pass.getBlendAlphaOp(bits)];
-			desc.renderTargetWriteMask = mask;
+			desc.renderTargetWriteMask = mask & 15;
 			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);
-			tmp[0] = desc;
-			blend = Driver.createBlendState(false, false, tmp, 1);
+			var maski = mask >> 4;
+			if ( maski > 0 ) {
+				var tmp = new hl.NativeArray(targetsCount);
+				tmp[0] = desc;
+				for ( i in 1...targetsCount ) {
+					if ( maski & 15 > 0 ) {
+						var desci = new RenderTargetBlendDesc();
+						desci.srcBlend = desc.srcBlend;
+						desci.destBlend = desc.destBlend;
+						desci.srcBlendAlpha = desc.srcBlendAlpha;
+						desci.destBlendAlpha = desc.destBlendAlpha;
+						desci.blendOp = desc.blendOp;
+						desci.blendOpAlpha = desc.blendOpAlpha;
+						desci.renderTargetWriteMask = maski & 15;
+						desci.blendEnable = desc.blendEnable;
+						tmp[i] = desci;
+					} else {
+						tmp[i] = desc;
+					}
+					maski = maski >> 4;
+				}
+				blend = Driver.createBlendState(false, true, tmp, targetsCount);
+			} else {
+				var tmp = new hl.NativeArray(1);
+				tmp[0] = desc;
+				blend = Driver.createBlendState(false, false, tmp, 1);
+			}
 			blendStates.set(blendBits, blend);
 		}
 		if( blend != currentBlendState ) {

+ 8 - 0
h3d/mat/Pass.hx

@@ -155,6 +155,14 @@ class Pass {
 		}
 	}
 
+	public function setColorMaski(r, g, b, a, i) {
+		if ( i > 8 )
+			throw "Color mask i supports 8 Render target";
+		var mask = (r?1:0) | (g?2:0) | (b?4:0) | (a?8:0);
+		mask = mask << (i * 4);
+		this.colorMask = this.colorMask | mask;
+	}
+
 	public function addShader<T:hxsl.Shader>(s:T) : T {
 		// throwing an exception will require NG GameServer review
 		if( s == null ) return null;