diff --git a/build/engine/shaders/terrax/geom2d.ps b/build/engine/shaders/terrax/geom2d.ps new file mode 100644 index 0000000000000000000000000000000000000000..56cb608a6a9507794a1075cf248d83c51b777ac7 --- /dev/null +++ b/build/engine/shaders/terrax/geom2d.ps @@ -0,0 +1,16 @@ + +/* +gbuffer.ps + +*/ + +// #include <struct.h> +// #include <mtrl.h> +// #include <const.h> + +//########################################################################## + +float4 main(): SV_TARGET +{ + return(float4(0.5f, 0.0f, 0.0f, 1.0f)); +} diff --git a/build/engine/shaders/terrax/terrax_colored.ps b/build/engine/shaders/terrax/terrax_colored.ps index 6b321dbb0c64e059512267ffd2e7886f0470bacc..c127169ff924cb3e9bc973c2a6ca4cb5212d529f 100644 --- a/build/engine/shaders/terrax/terrax_colored.ps +++ b/build/engine/shaders/terrax/terrax_colored.ps @@ -3,7 +3,7 @@ terrax_colored.ps */ -#include <../struct.h> +#include <struct.h> //########################################################################## diff --git a/build/engine/shaders/terrax/terrax_textured.ps b/build/engine/shaders/terrax/terrax_textured.ps index ce2ac9c26c5623bee843932b7d52523beb524fa1..e4473967ccb2456fec800b568583b8c02af449ee 100644 --- a/build/engine/shaders/terrax/terrax_textured.ps +++ b/build/engine/shaders/terrax/terrax_textured.ps @@ -3,7 +3,7 @@ terrax_textured.ps */ -#include <../struct.h> +#include <struct.h> //########################################################################## diff --git a/source/anim/Renderable.cpp b/source/anim/Renderable.cpp index 0529e4c3b8eb9bd1770e4f1772236fe115268b7e..37eb7b005c925e4d33692d0965ab8266bf65bea4 100644 --- a/source/anim/Renderable.cpp +++ b/source/anim/Renderable.cpp @@ -52,6 +52,7 @@ void XMETHODCALLTYPE CRenderable::renderStage(X_RENDER_STAGE stage, IXRenderable case XRS_EDITOR_2D: m_pAnimatedModelProvider->render(pVis); m_pDynamicModelProvider->render(false, pVis); + m_pDynamicModelProvider->render(true, pVis); break; } } diff --git a/source/mtrl/MaterialSystem.cpp b/source/mtrl/MaterialSystem.cpp index c16d6ffd15930f83ccceef4d30098e5f89a93da6..88a866c9eea247ecc0f21070e699d72f3f17cfb1 100644 --- a/source/mtrl/MaterialSystem.cpp +++ b/source/mtrl/MaterialSystem.cpp @@ -340,7 +340,7 @@ void XMETHODCALLTYPE CMaterialSystem::bindMaterial(IXMaterial *pMaterial) return; } - MaterialVariantVS *pVS = &m_pCurrentRP->aPassVariants[m_uCurrentRPvariant].aVertexShaders[m_pCurrentVS->uID]; + MaterialVariantVS *pVS = &m_pCurrentRP->aPassFormats[m_pCurrentVS->pVertexFormat->uID].aPassVariants[m_uCurrentRPvariant].aVertexShaders[m_pCurrentVS->uID]; ID idShaderSet = -1; if(m_pCurrentGS) { @@ -584,6 +584,7 @@ XVertexFormatHandler* XMETHODCALLTYPE CMaterialSystem::registerVertexFormat(cons } VertexFormatData &format = m_mVertexFormats[szName]; + format.uID = m_mVertexFormats.Size() - 1; XVertexOutputElement *pTmp = pDecl; int iCount = 0; @@ -603,6 +604,8 @@ XVertexFormatHandler* XMETHODCALLTYPE CMaterialSystem::registerVertexFormat(cons ++pTmp; } + m_isMateriallesRenderPassDirty = true; + updateReferences(); return(&format); @@ -647,6 +650,8 @@ XVertexShaderHandler* XMETHODCALLTYPE CMaterialSystem::registerVertexShader(XVer vsData->uID = pVertexFormatData->aVS.size(); pVertexFormatData->aVS.push_back(vsData); + m_isMateriallesRenderPassDirty = true; + updateReferences(); return(vsData); @@ -682,6 +687,8 @@ XGeometryShaderHandler* XMETHODCALLTYPE CMaterialSystem::registerGeometryShader( gsData->uID = m_aGeometryShaders.size(); m_aGeometryShaders.push_back(gsData); + m_isMateriallesRenderPassDirty = true; + updateReferences(); return(gsData); @@ -704,7 +711,12 @@ XRenderPassHandler* XMETHODCALLTYPE CMaterialSystem::registerRenderPass(const ch pass.szName = strdup(szName); pass.szShaderFile = strdup(szShaderFile); pass.bSkipMaterialShader = bSkipMaterialShader; - assert(!bSkipMaterialShader && "bSkipMaterialShader is not currently supported!"); + //assert(!bSkipMaterialShader && "bSkipMaterialShader is not currently supported!"); + + if(bSkipMaterialShader) + { + m_isMateriallesRenderPassDirty = true; + } while(pTextures && pTextures->szName) { @@ -892,6 +904,8 @@ XMaterialShaderHandler* XMETHODCALLTYPE CMaterialSystem::registerMaterialShader( pPass->pRenderPass = (RenderPass*)pPasses->pRenderPass; pPass->isDirty = true; + assert(!pPass->pRenderPass->bSkipMaterialShader && "Cannot use renderpass which is set to ignore material shaders!"); + pPass->szShaderFile = strdups(pPasses->szShaderFile); pPass->szEntryPoint = strdups(pPasses->szEntryPoint); @@ -1385,66 +1399,59 @@ void CMaterialSystem::updateReferences() } } -#if 0 - for(AssotiativeArray<String, RenderPass>::Iterator i = m_mRenderPasses.begin(); i; i++) +#if 1 + if(m_isMateriallesRenderPassDirty) { - RenderPass *pRP = i.second; - if(!pRP->bSkipMaterialShader) - { - continue; - } - - - String sVSOstruct; - for(UINT k = 0, kl = pShader->pVertexFormat->aDecl.size(); k < kl; ++k) + for(AssotiativeArray<String, RenderPass>::Iterator i = m_mRenderPasses.begin(); i; i++) { - XVertexOutputElement *el = &pShader->pVertexFormat->aDecl[k]; - if(k != 0) + RenderPass *pRP = i.second; + if(!pRP->bSkipMaterialShader) { - sVSOstruct += "; "; + continue; } - sVSOstruct += String(getHLSLType(el->type)) + " " + el->szName + ": " + getHLSLSemantic(el->usage); - } - Array<GXMacro> aVariantDefines = pRP->aDefines; - aVariantDefines.push_back({"XMAT_PS_STRUCT()", sVSOstruct.c_str()}); - aVariantDefines.push_back({"XMAT_MS_TEXTURES()", ""}); - aVariantDefines.push_back({"XMAT_MS_SAMPLERS()", ""}); - aVariantDefines.push_back({"XMATERIAL_OUTPUT_STRUCT()", ""}); - + Array<GXMacro> aVariantDefines = pRP->aDefines; - UINT uOldSize = aVariantDefines.size(); + UINT uOldSize = aVariantDefines.size(); - pRP->aPassVariants.clearFast(); - for(UINT uPassVariant = 0, uPassVariantl = pRP->aVariants.size(); uPassVariant < uPassVariantl; ++uPassVariant) - { - aVariantDefines.resizeFast(uOldSize); - - auto &aPassVariants = pPass->pRenderPass->aVariants[uPassVariant]; - for(UINT m = 0, ml = aPassVariants.size(); m < ml; ++m) + for(AssotiativeArray<String, VertexFormatData>::Iterator i = m_mVertexFormats.begin(); i; i++) { - aVariantDefines.push_back(aPassVariants[m]); - } + VertexFormatData *pFormat = i.second; + pRP->aPassFormats[pFormat->uID].aPassVariants.clearFast(); + for(UINT uPassVariant = 0, uPassVariantl = pRP->aVariants.size(); uPassVariant < uPassVariantl; ++uPassVariant) + { + aVariantDefines.resizeFast(uOldSize); - aVariantDefines.push_back({NULL, NULL}); + auto &aPassVariants = pRP->aVariants[uPassVariant]; + for(UINT m = 0, ml = aPassVariants.size(); m < ml; ++m) + { + aVariantDefines.push_back(aPassVariants[m]); + } - ID idShader = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, pMetaPass->szShaderFile, NULL, &aVariantDefines[0]); - pVariant->aPassVariants[uPassVariant].idShader = idShader; + aVariantDefines.push_back({NULL, NULL}); + ID idShader = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, pRP->szShaderFile, NULL, &aVariantDefines[0]); + pRP->aPassFormats[pFormat->uID].aPassVariants[uPassVariant].idShader = idShader; - pVariant->aPassVariants[uPassVariant].aVertexShaders.clearFast(); - for(UINT j = 0, jl = pShader->pVertexFormat->aVS.size(); j < jl; ++j) - { - VertexShaderData *pVS = pShader->pVertexFormat->aVS[j]; - MaterialVariantVS &vs = pVariant->aPassVariants[uPassVariant].aVertexShaders[j]; - vs.idSet = SGCore_ShaderCreateKit(pVS->idShader, idShader); - for(UINT k = 0, kl = pShader->pVertexFormat->aGS.size(); k < kl; ++k) - { - GeometryShaderData *pGS = pShader->pVertexFormat->aGS[k]; - vs.aGeometryShaders[k] = SGCore_ShaderCreateKit(pVS->idShader, idShader, pGS->idShader); + pRP->aPassFormats[pFormat->uID].aPassVariants[uPassVariant].aVertexShaders.clearFast(); + + + for(UINT j = 0, jl = pFormat->aVS.size(); j < jl; ++j) + { + VertexShaderData *pVS = pFormat->aVS[j]; + MaterialVariantVS &vs = pRP->aPassFormats[pFormat->uID].aPassVariants[uPassVariant].aVertexShaders[j]; + vs.idSet = SGCore_ShaderCreateKit(pVS->idShader, idShader); + + for(UINT k = 0, kl = pFormat->aGS.size(); k < kl; ++k) + { + GeometryShaderData *pGS = pFormat->aGS[k]; + vs.aGeometryShaders[k] = SGCore_ShaderCreateKit(pVS->idShader, idShader, pGS->idShader); + } + } } + } } } diff --git a/source/mtrl/MaterialSystem.h b/source/mtrl/MaterialSystem.h index b315a3c2b8ac01403790be26fa8294cf8eb31c1a..0eedd93413ec96eec4077dc6971d9ccca3acbf9a 100644 --- a/source/mtrl/MaterialSystem.h +++ b/source/mtrl/MaterialSystem.h @@ -390,6 +390,7 @@ protected: struct VertexFormatData: public XVertexFormatHandler { + UINT uID; Array<XVertexOutputElement> aDecl; Array<VertexShaderData*> aVS; Array<GeometryShaderData*> aGS; @@ -408,6 +409,11 @@ protected: Array<MaterialVariantVS> aVertexShaders; }; + struct RenderPassVertexFormat + { + Array<MaterialVariantPass> aPassVariants; + }; + struct RenderPass: public XRenderPassHandler { const char *szName; @@ -418,7 +424,7 @@ protected: Array<GXMacro> aDefines; bool bSkipMaterialShader; - Array<MaterialVariantPass> aPassVariants; + Array<RenderPassVertexFormat> aPassFormats; // used only if bSkipMaterialShader Array<Array<GXMacro>> aVariants; }; @@ -508,7 +514,7 @@ protected: Array<GeometryShader*> m_aGeometryShaders; MemAlloc<GeometryShaderData> m_aGeometryShadersData; - + bool m_isMateriallesRenderPassDirty = false; AssotiativeArray<String, RenderPass> m_mRenderPasses; AssotiativeArray<String, MaterialShader> m_mMaterialShaders; diff --git a/source/terrax/terrax.cpp b/source/terrax/terrax.cpp index 18f840b59f737aec06f4c141c8084517e515b5db..a73832effd4129bf0cce73bbcf45588ed7091ddf 100644 --- a/source/terrax/terrax.cpp +++ b/source/terrax/terrax.cpp @@ -220,8 +220,8 @@ public: m_pMaterialSystem = (IXMaterialSystem*)pPluginManager->getInterface(IXMATERIALSYSTEM_GUID); { - m_pRenderPassGeometry2D = m_pMaterialSystem->getRenderPass("xGBuffer"); - // m_pRenderPassGeometry2D = m_pMaterialSystem->registerRenderPass("xEditor2D", "terrax/geom2d.ps", NULL, NULL, NULL, NULL, true); + //m_pRenderPassGeometry2D = m_pMaterialSystem->getRenderPass("xGBuffer"); + m_pRenderPassGeometry2D = m_pMaterialSystem->registerRenderPass("xEditor2D", "terrax/geom2d.ps", NULL, NULL, NULL, NULL, true); } } ~CRenderPipeline()