void MirrorRenderLoop_cl::CreateSimpleShaders() { // create a dummy diffuse-only surface m_dummySurface.SetEffect(NULL); // make sure all lighting shaders are set properly VCompiledEffect *pFX = m_dummySurface.m_spCurrentEffect; VVERIFY_MSG(pFX != NULL,"failed to initialize mirror shaders"); VTechniqueConfig *pGlobalConfig = Vision::Shaders.GetGlobalTechniqueConfig(); VTechniqueConfig usageConfig; // default technique to render lightmapped geometry usageConfig.SetInclusionTags("MIRROR;LIGHTMAP"); m_spDefaultLightMapping = pFX->FindCompatibleTechnique(&usageConfig, pGlobalConfig); if (!m_spDefaultLightMapping) m_spDefaultLightMapping = pFX->GetDefaultTechnique(); // technique to render geometry with light grid usageConfig.SetInclusionTags("MIRROR;LIGHTGRID"); m_spDefaultLightGrid = pFX->FindCompatibleTechnique(&usageConfig, pGlobalConfig); if (!m_spDefaultLightGrid) m_spDefaultLightGrid = pFX->GetDefaultTechnique(); // depth stencil state m_dynLightDefaultState = *VisRenderStates_cl::GetDepthStencilDefaultState(); m_dynLightDefaultState.m_cDepthComparisonFunc = COMPARISON_EQUAL; m_dynLightDefaultState.m_iStencilReadMask = 0; m_dynLightDefaultState.m_bDepthWriteEnabled = false; m_dynLightDefaultState.ComputeHash(); VASSERT(m_spDefaultLightMapping && m_spDefaultLightGrid); }
void VImageState::SerializeX( VArchive &ar ) { char iLocalVersion = 1; if (ar.IsLoading()) { ar >> iLocalVersion; VASSERT_MSG(iLocalVersion<=1,"Invalid version"); ar >> (int &)m_eStretchMode >> m_iColor; SetTexture((VTextureObject *)ar.ReadProxyObject()); ar >> texCoord; m_spCursor = (VCursor *)ar.ReadProxyObject(); ar >> (int &)m_eTranspType >> m_iAdditionalStateFlags; if (iLocalVersion>=1) { VisEffectConfig_cl fxConfig; fxConfig.SerializeX(ar); VCompiledEffect *pFX = fxConfig.GetEffect(); if (pFX) m_spTechnique = pFX->GetDefaultTechnique(); } }
void VTerrainDecorationEntityModel::RecreateIRShaders(VisSurface_cl* pSurface, VShaderEffectLib* pEffectLib) { if (pSurface == NULL) return; // check for supported transparency types if (pSurface->GetTransparencyType() != VIS_TRANSP_NONE && pSurface->GetTransparencyType() != VIS_TRANSP_ALPHATEST && pSurface->GetTransparencyType() != VIS_TRANSP_ALPHA) return; char szParam[1024]; VTechniqueConfig baseCfg("INSTANCING;WIND", NULL); // if (Vision::Renderer.GetCurrentRendererNode() != NULL && Vision::Renderer.GetRendererNode()->GetMultisampleMode() != VVIDEO_MULTISAMPLE_OFF) // baseCfg.AddInclusionTag("MSAA"); switch (pSurface->GetGeometryTopology()) { case VisSurface_cl::VGT_3DMesh: baseCfg.AddInclusionTag("GEO_3D"); break; default: Vision::Error.Warning("VTerrainDecorationEntityModel::RecreateIRShaders: Only 3DMesh geometry topology is supported"); return; } hkvVec4 vWindPhaseParams(0.0071f, 0.0092f, 0.0f, 0.0f); const hkvAlignedBBox& bbox = m_spMesh->GetBoundingBox(); if (bbox.isValid()) vWindPhaseParams.w = -bbox.m_vMin.z; { // 1. Assign G-Pass pass technique //////////////////////////////////// szParam[0] = '\0'; // Get params needed for IR shader creation from IR renderer char* pszParamPos = GetParamStringForIRSurface(pSurface, szParam); pszParamPos += sprintf(pszParamPos, "WindPhaseParams=%g,%g,%g,%g;", vWindPhaseParams.x, vWindPhaseParams.y, vWindPhaseParams.z, vWindPhaseParams.w); VTechniqueConfig cfg(baseCfg); bool bHasMaterialTex = pSurface->GetAuxiliaryTextureCount() >= 1 && pSurface->GetAuxiliaryTexture(0) != NULL; bool bHasHotSpotTex = pSurface->GetAuxiliaryTextureCount() >= 2 && pSurface->GetAuxiliaryTexture(1) != NULL; if (bHasMaterialTex) { // --- Thermal params are taken from auxiliary texture cfg.AddInclusionTag("AUX_TEX"); } else { int iMaterialID = 0; if (pSurface->GetMesh() != NULL) iMaterialID = (int)pSurface->GetMesh()->GetBaseSubmesh(0)->GetGeometryInfo().m_sUserFlags; // --- Thermal params are taken from submesh user flags pszParamPos += sprintf(pszParamPos, "ThermalMaterialID=%i;", iMaterialID); } if (bHasHotSpotTex) cfg.AddInclusionTag("HEATING_POWER"); VCompiledEffect* pFX = Vision::Shaders.CreateEffect("InitialPass", szParam, EFFECTCREATEFLAG_NONE, pEffectLib); if (pFX == NULL) { Vision::Error.Warning("VTerrainDecorationEntityModel::RecreateIRShaders: Failed to create InitialPass effect"); return; } VCompiledTechnique* pTechnique = pFX->FindCompatibleTechnique(&cfg); if (pTechnique == NULL) { Vision::Error.Warning("VTerrainDecorationEntityModel::RecreateIRShaders: No compatible technique found; using default technique"); pTechnique = pFX->GetDefaultTechnique(); // find default technique } VASSERT(pTechnique != NULL && pTechnique->GetShaderCount() == 1); m_spInstancingTechIRMainPass = pTechnique; } { // 2. Assign Pre-Pass pass technique ///////////////////////////////////// szParam[0] = '\0'; char* pszParamPos = szParam; pszParamPos += sprintf(pszParamPos, "WindPhaseParams=%g,%g,%g,%g;", vWindPhaseParams.x, vWindPhaseParams.y, vWindPhaseParams.z, vWindPhaseParams.w); VTechniqueConfig cfg(baseCfg); if (pSurface->GetTransparencyType() == VIS_TRANSP_ALPHATEST || pSurface->GetTransparencyType() == VIS_TRANSP_ALPHA) { cfg.AddInclusionTag("ALPHATEST"); pszParamPos += sprintf(pszParamPos, "AlphaTestThreshold=%g;", pSurface->GetAlphaTestThreshold()); } VCompiledEffect* pFX = Vision::Shaders.CreateEffect("PrePass", szParam, EFFECTCREATEFLAG_NONE, pEffectLib); if (pFX == NULL) { Vision::Error.Warning("VTerrainDecorationEntityModel::RecreateIRShaders: Failed to create PrePass effect"); return; } VCompiledTechnique* pTechnique = pFX->FindCompatibleTechnique(&cfg); if (pTechnique == NULL) { Vision::Error.Warning("VTerrainDecorationEntityModel::RecreateIRShaders: No compatible technique found; using default technique"); pTechnique = pFX->GetDefaultTechnique(); // find default technique } VASSERT(pTechnique != NULL && pTechnique->GetShaderCount() == 1); m_spInstancingTechIRPrePass = pTechnique; } }