BVB Source Codes

CRYENGINE Show MaterialEffectsDebug.cpp Source code

Return Download CRYENGINE: download MaterialEffectsDebug.cpp Source code - Download CRYENGINE Source code - Type:.cpp
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #include "StdAfx.h"
  4. #include "MaterialEffectsDebug.h"
  5.  
  6. #include "MaterialEffects.h"
  7. #include "MaterialEffectsCVars.h"
  8. #include "MFXContainer.h"
  9.  
  10. namespace MaterialEffectsUtils
  11. {
  12. #ifdef MATERIAL_EFFECTS_DEBUG
  13.  
  14.         #define DEFAULT_DEBUG_VISUAL_MFX_LIFETIME 12.0f
  15.  
  16. void CVisualDebug::AddEffectDebugVisual(const TMFXEffectId effectId, const SMFXRunTimeEffectParams& runtimeParams)
  17. {
  18.         //Only add, if hint search matches (this allows to filter effects invoked by name from game, and get all info we need to display)
  19.         if (effectId == m_lastSearchHint.fxId)
  20.         {
  21.                 if (m_nextHit >= kMaxDebugVisualMfxEntries)
  22.                 {
  23.                         m_nextHit = 0;
  24.                 }
  25.  
  26.                 const char* debugFilter = CMaterialEffectsCVars::Get().mfx_DebugVisualFilter->GetString();
  27.                 assert(debugFilter);
  28.                 bool ignoreFilter = (strlen(debugFilter) == 0) || (strcmp(debugFilter, "0") == 0);
  29.                 bool addToDebugList = ignoreFilter || (stricmp(debugFilter, m_lastSearchHint.materialName1.c_str()) == 0);
  30.  
  31.                 if (addToDebugList)
  32.                 {
  33.                         m_effectList[m_nextHit].fxPosition = runtimeParams.pos;
  34.                         m_effectList[m_nextHit].fxDirection = (runtimeParams.normal.IsZero() == false) ? runtimeParams.normal : Vec3(0.0f, 0.0f, 1.0f);
  35.                         m_effectList[m_nextHit].lifeTime = DEFAULT_DEBUG_VISUAL_MFX_LIFETIME;
  36.                         m_effectList[m_nextHit].fxId = effectId;
  37.                         m_effectList[m_nextHit].materialName1 = m_lastSearchHint.materialName1.c_str();
  38.                         m_effectList[m_nextHit].materialName2 = m_lastSearchHint.materialName2.c_str();
  39.  
  40.                         m_nextHit++;
  41.                 }
  42.         }
  43. }
  44.  
  45. void CVisualDebug::AddLastSearchHint(const TMFXEffectId effectId, const char* customName, const int surfaceIndex2)
  46. {
  47.         m_lastSearchHint.Reset();
  48.  
  49.         ISurfaceTypeManager* pSurfaceTypeManager = gEnv->p3DEngine->GetMaterialManager()->GetSurfaceTypeManager();
  50.         assert(pSurfaceTypeManager);
  51.  
  52.         m_lastSearchHint.materialName1 = customName;
  53.         m_lastSearchHint.materialName2 = pSurfaceTypeManager->GetSurfaceType(surfaceIndex2)->GetName();
  54.         m_lastSearchHint.fxId = effectId;
  55. }
  56.  
  57. void CVisualDebug::AddLastSearchHint(const TMFXEffectId effectId, const IEntityClass* pEntityClass, const int surfaceIndex2)
  58. {
  59.         m_lastSearchHint.Reset();
  60.  
  61.         ISurfaceTypeManager* pSurfaceTypeManager = gEnv->p3DEngine->GetMaterialManager()->GetSurfaceTypeManager();
  62.         assert(pSurfaceTypeManager);
  63.         assert(pEntityClass);
  64.  
  65.         m_lastSearchHint.materialName1 = pEntityClass->GetName();
  66.         m_lastSearchHint.materialName2 = pSurfaceTypeManager->GetSurfaceType(surfaceIndex2)->GetName();
  67.         m_lastSearchHint.fxId = effectId;
  68. }
  69.  
  70. void CVisualDebug::AddLastSearchHint(const TMFXEffectId effectId, const int surfaceIndex1, const int surfaceIndex2)
  71. {
  72.         m_lastSearchHint.Reset();
  73.  
  74.         ISurfaceTypeManager* pSurfaceTypeManager = gEnv->p3DEngine->GetMaterialManager()->GetSurfaceTypeManager();
  75.         assert(pSurfaceTypeManager);
  76.  
  77.         m_lastSearchHint.materialName1 = pSurfaceTypeManager->GetSurfaceType(surfaceIndex1)->GetName();
  78.         m_lastSearchHint.materialName2 = pSurfaceTypeManager->GetSurfaceType(surfaceIndex2)->GetName();
  79.         m_lastSearchHint.fxId = effectId;
  80. }
  81.  
  82. void CVisualDebug::Update(const CMaterialEffects& materialEffects, const float frameTime)
  83. {
  84.         IRenderAuxGeom* pRenderAux = gEnv->pRenderer->GetIRenderAuxGeom();
  85.  
  86.         SAuxGeomRenderFlags oldFlags = pRenderAux->GetRenderFlags();
  87.         SAuxGeomRenderFlags newFlags = e_Def3DPublicRenderflags;
  88.         newFlags.SetAlphaBlendMode(e_AlphaBlended);
  89.         newFlags.SetDepthTestFlag(e_DepthTestOff);
  90.         newFlags.SetCullMode(e_CullModeNone);
  91.         pRenderAux->SetRenderFlags(newFlags);
  92.  
  93.         const float baseDebugTimeOut = DEFAULT_DEBUG_VISUAL_MFX_LIFETIME;
  94.  
  95.         bool extendedDebugInfo = (CMaterialEffectsCVars::Get().mfx_DebugVisual == 2);
  96.  
  97.         for (int i = 0; i < kMaxDebugVisualMfxEntries; ++i)
  98.         {
  99.                 SDebugVisualEntry& currentFX = m_effectList[i];
  100.  
  101.                 if (currentFX.lifeTime <= 0.0f)
  102.                 {
  103.                         continue;
  104.                 }
  105.  
  106.                 currentFX.lifeTime -= frameTime;
  107.  
  108.                 TMFXContainerPtr pEffectContainer = materialEffects.InternalGetEffect(currentFX.fxId);
  109.                 if (pEffectContainer)
  110.                 {
  111.                         const float alpha = clamp_tpl(powf(((currentFX.lifeTime + 2.0f) / baseDebugTimeOut), 3.0f), 0.0f, 1.0f);
  112.                         const ColorB blue(0, 0, 255, (uint8)(192 * alpha));
  113.                         const Vec3 coneBase = currentFX.fxPosition + (currentFX.fxDirection * 0.4f);
  114.                         const Vec3 lineEnd = currentFX.fxPosition;
  115.                         pRenderAux->DrawCone(coneBase, currentFX.fxDirection, 0.12f, 0.2f, blue);
  116.                         pRenderAux->DrawLine(coneBase, blue, lineEnd, blue, 3.0f);
  117.  
  118.                         const Vec3 baseText = coneBase + (0.2f * currentFX.fxDirection);
  119.                         const Vec3 textLineOffset(0.0f, 0.0f, 0.14f);
  120.                         const float textColorOk[4] = { 1.0f, 1.0f, 1.0f, alpha };
  121.                         const float textColorError[4] = { 1.0f, 0.0f, 0.0f, alpha };
  122.                         const float titleColor[4] = { 1.0f, 1.0f, 0.0f, alpha };
  123.  
  124.                         bool matDefaultDetected = ((stricmp(currentFX.materialName1.c_str(), "mat_default") == 0) ||
  125.                                                    (stricmp(currentFX.materialName2.c_str(), "mat_default") == 0));
  126.  
  127.                         const float* textColor = matDefaultDetected ? textColorError : textColorOk;
  128.  
  129.                         if (matDefaultDetected)
  130.                                 IRenderAuxText::DrawLabelEx(baseText, 1.75f, textColor, true, false, "FIX ME (mat_default)!");
  131.  
  132.                         IRenderAuxText::DrawLabelExF(baseText - (textLineOffset * 2.0f), 1.25f, textColor, true, false, "%s / %s", currentFX.materialName1.c_str(), currentFX.materialName2.c_str());
  133.                         IRenderAuxText::DrawLabelExF(baseText - (textLineOffset * 3.0f), 1.25f, textColor, true, false, "Lib: %s, FX: %s", pEffectContainer->GetParams().libraryName.c_str(), pEffectContainer->GetParams().name.c_str());
  134.  
  135.                         if (extendedDebugInfo)
  136.                         {
  137.                                 float textOffsetCount = 5.0f;
  138.                                 SMFXResourceListPtr pFxResources = materialEffects.GetResources(currentFX.fxId);
  139.  
  140.                                 //Particles
  141.                                 SMFXParticleListNode* pParticlesNode = pFxResources->m_particleList;
  142.                                 if (pParticlesNode)
  143.                                 {
  144.                                         IRenderAuxText::DrawLabelEx(baseText - (textLineOffset * textOffsetCount), 1.35f, titleColor, true, false, "** Particles **");
  145.                                         while (pParticlesNode)
  146.                                         {
  147.                                                 textOffsetCount += 1.0f;
  148.                                                 IRenderAuxText::DrawLabelExF(baseText - (textLineOffset * textOffsetCount), 1.25f, textColor, true, false, "  %s", pParticlesNode->m_particleParams.name);
  149.                                                 pParticlesNode = pParticlesNode->pNext;
  150.                                         }
  151.                                 }
  152.  
  153.                                 //Audio
  154.                                 SMFXAudioListNode* pAudioNode = pFxResources->m_audioList;
  155.                                 if (pAudioNode)
  156.                                 {
  157.                                         textOffsetCount += 1.0f;
  158.                                         stack_string audioDebugLine;
  159.                                         IRenderAuxText::DrawLabelEx(baseText - (textLineOffset * textOffsetCount), 1.35f, titleColor, true, false, "** Audio **");
  160.                                         while (pAudioNode)
  161.                                         {
  162.                                                 textOffsetCount += 1.0f;
  163.  
  164.                                                 audioDebugLine.Format("Trigger:  %s ", pAudioNode->m_audioParams.triggerName);
  165.                                                 for (uint32 switchIdx = 0; switchIdx < pAudioNode->m_audioParams.triggerSwitches.size(); ++switchIdx)
  166.                                                 {
  167.                                                         const IMFXAudioParams::SSwitchData& switchData = pAudioNode->m_audioParams.triggerSwitches[switchIdx];
  168.                                                         audioDebugLine.append(stack_string().Format("| '%s'='%s' ", switchData.switchName, switchData.switchStateName).c_str());
  169.                                                 }
  170.  
  171.                                                 IRenderAuxText::DrawLabelEx(baseText - (textLineOffset * textOffsetCount), 1.25f, textColor, true, false, audioDebugLine.c_str());
  172.                                                 pAudioNode = pAudioNode->pNext;
  173.                                         }
  174.                                 }
  175.  
  176.                                 //Decals
  177.                                 SMFXDecalListNode* pDecalNode = pFxResources->m_decalList;
  178.                                 if (pDecalNode)
  179.                                 {
  180.                                         textOffsetCount += 1.0f;
  181.                                         IRenderAuxText::DrawLabelEx(baseText - (textLineOffset * textOffsetCount), 1.35f, titleColor, true, false, "** Decals **");
  182.                                         while (pDecalNode)
  183.                                         {
  184.                                                 textOffsetCount += 1.0f;
  185.                                                 IRenderAuxText::DrawLabelExF(baseText - (textLineOffset * textOffsetCount), 1.25f, textColor, true, false, "  Mat: %s / Tex: %s", pDecalNode->m_decalParams.material, pDecalNode->m_decalParams.filename);
  186.                                                 pDecalNode = pDecalNode->pNext;
  187.                                         }
  188.                                 }
  189.  
  190.                                 //Flow graphs
  191.                                 SMFXFlowGraphListNode* pFlowgraphNode = pFxResources->m_flowGraphList;
  192.                                 if (pFlowgraphNode)
  193.                                 {
  194.                                         textOffsetCount += 1.0f;
  195.                                         IRenderAuxText::DrawLabelEx(baseText - (textLineOffset * textOffsetCount), 1.35f, titleColor, true, false, "** Flow graphs **");
  196.                                         while (pFlowgraphNode)
  197.                                         {
  198.                                                 textOffsetCount += 1.0f;
  199.                                                 IRenderAuxText::DrawLabelExF(baseText - (textLineOffset * textOffsetCount), 1.25f, textColor, true, false, "  %s", pFlowgraphNode->m_flowGraphParams.name);
  200.                                                 pFlowgraphNode = pFlowgraphNode->pNext;
  201.                                         }
  202.                                 }
  203.  
  204.                                 //Force feedback
  205.                                 SMFXForceFeedbackListNode* pForceFeedbackNode = pFxResources->m_forceFeedbackList;
  206.                                 if (pForceFeedbackNode)
  207.                                 {
  208.                                         textOffsetCount += 1.0f;
  209.                                         IRenderAuxText::DrawLabelEx(baseText - (textLineOffset * textOffsetCount), 1.35f, titleColor, true, false, "** Force feedback **");
  210.                                         while (pForceFeedbackNode)
  211.                                         {
  212.                                                 textOffsetCount += 1.0f;
  213.                                                 IRenderAuxText::DrawLabelExF(baseText - (textLineOffset * textOffsetCount), 1.25f, textColor, true, false, "  %s", pForceFeedbackNode->m_forceFeedbackParams.forceFeedbackEventName);
  214.                                                 pForceFeedbackNode = pForceFeedbackNode->pNext;
  215.                                         }
  216.                                 }
  217.                         }
  218.                 }
  219.         }
  220.  
  221.         pRenderAux->SetRenderFlags(oldFlags);
  222. }
  223.  
  224. #endif //MATERIAL_EFFECTS_DEBUG
  225. }
  226.  
downloadMaterialEffectsDebug.cpp Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top