From b0cfb5a710d461304db7fc405ef0560fe0c4144f Mon Sep 17 00:00:00 2001 From: Adam Jensen Date: Mon, 18 Jul 2022 16:52:16 +0100 Subject: [PATCH] better implementation of buildStreamDecl038 --- rendering/PCDX11Material.cpp | 53 ++++++++++++++++++++++--- rendering/PCDX11Material.h | 1 + rendering/PCDX11RenderPassCallbacks.cpp | 9 +++-- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/rendering/PCDX11Material.cpp b/rendering/PCDX11Material.cpp index bccfbfb..eed2904 100644 --- a/rendering/PCDX11Material.cpp +++ b/rendering/PCDX11Material.cpp @@ -18,6 +18,7 @@ VertexAttributeLayoutA *PCDX11Material::mg_layoutA; PCDX11Material *PCDX11Material::mg_material; void *PCDX11Material::mg_cbdata; MaterialInstanceData *PCDX11Material::mg_matInstance; +bool PCDX11Material::mg_tesselate; void PCDX11Material::load(MaterialBlob *newBlob) { auto deviceContext = renderDevice->getD3DDeviceContext(); // HACK @@ -458,11 +459,46 @@ PCDX11StreamDecl *PCDX11Material::buildStreamDecl038( float floatX, float floatY) { + float opacity = matInstance->float10 * floatX; + uint32_t blendState = materialBlob->blendStateC; + bool x = true; + if ((materialBlob->dword18 & 1) == 0 || + renderDevice->scene78->byte25C || + (blendState & 1) || + opacity < 1.0 + ) + x = false; + + uint32_t subMaterialIndex; + if (flag) { + subMaterialIndex = 8; + setupSinglePassTranslucent(renderDevice, /*0,*/ matInstance, flags, floatX); + } else { + subMaterialIndex = 3; + setupSinglePassOpaque(renderDevice, /*0,*/ matInstance, flags); + } + + bool noPixelShader = flags & 1; + if (noPixelShader) + subMaterialIndex = 0; + auto *stateManager = deviceManager->getStateManager(); - const uint32_t subMaterialIndex = 3; MaterialBlobSub *subMaterial = materialBlob->subMat4C[subMaterialIndex]; - setupDepthBias(matInstance); + if (mg_material != this) { + setupPixelResources(subMaterialIndex, subMaterial, matInstance, (char*)drawableExtDword50, true); + setupVertexResources(subMaterialIndex, subMaterial, matInstance, (char*)drawableExtDword50, true); + setupDepthBias(matInstance); + + } else if (mg_matInstance != matInstance || mg_cbdata != drawableExtDword50) { + setupPixelResources(subMaterialIndex, subMaterial, matInstance, (char*)drawableExtDword50, false); + setupVertexResources(subMaterialIndex, subMaterial, matInstance, (char*)drawableExtDword50, false); + setupDepthBias(matInstance); + } + + bool tesselate = false; + uint32_t vsSelectAndFlags = (vsSelect << 8) | flags; + //setupStencil(matInstance, true, flags); stateManager->setDepthRange(matInstance->minDepth, matInstance->maxDepth); stateManager->setBlendStateAndBlendFactors(materialBlob->blendState24, 0, 0); @@ -480,9 +516,6 @@ PCDX11StreamDecl *PCDX11Material::buildStreamDecl038( auto vertexShader = (*vertexTable)[vertexIndex]; stateManager->setVertexShader(vertexShader); - setupPixelResources(subMaterialIndex, subMaterial, matInstance, (char*)drawableExtDword50, true); - setupVertexResources(subMaterialIndex, subMaterial, matInstance, (char*)drawableExtDword50, true); - auto *streamDecl = static_cast(matInstance->streamDecls24[subMaterialIndex]); if (!streamDecl) { VertexAttributeLayoutB *layoutB = subMaterial->vsLayout[vsSelect]; @@ -494,7 +527,15 @@ PCDX11StreamDecl *PCDX11Material::buildStreamDecl038( &vertexShader->m_sub); } - return streamDecl; + mg_streamDecl = streamDecl; + + mg_matInstance = matInstance; + mg_material = this; + mg_cbdata = drawableExtDword50; + mg_vsSelectAndFlags = vsSelectAndFlags; + mg_tesselate = tesselate; + + return mg_streamDecl; } PCDX11StreamDecl *PCDX11Material::buildStreamDecl7( diff --git a/rendering/PCDX11Material.h b/rendering/PCDX11Material.h index fc6b2d3..305f221 100644 --- a/rendering/PCDX11Material.h +++ b/rendering/PCDX11Material.h @@ -34,6 +34,7 @@ class PCDX11Material : static PCDX11Material *mg_material; // 00EAAD20 static void *mg_cbdata; // 00EAAD24 static MaterialInstanceData *mg_matInstance; // 00EAAD28 + static bool mg_tesselate; // 00EAAD2C public: PCDX11Material(PCDX11RenderDevice *renderDevice) : diff --git a/rendering/PCDX11RenderPassCallbacks.cpp b/rendering/PCDX11RenderPassCallbacks.cpp index 825c4ec..5c12674 100644 --- a/rendering/PCDX11RenderPassCallbacks.cpp +++ b/rendering/PCDX11RenderPassCallbacks.cpp @@ -173,9 +173,12 @@ bool PCDX11CompositePassCallbacks::pre( uint32_t priorPassesBitfield) { // TODO - auto *stateManager = deviceManager->getStateManager(); - PCDX11BaseTexture *shadowBuffer = nullptr; - stateManager->setTextureAndSampler(10, shadowBuffer, 0, 0.0f); + if (drawableCount) { + PCDX11Material::invalidate(); + auto *stateManager = deviceManager->getStateManager(); + PCDX11BaseTexture *shadowBuffer = nullptr; + stateManager->setTextureAndSampler(10, shadowBuffer, 0, 0.0f); + } // TODO return true; }