Files
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

515 lines
14 KiB
C++

//
// filename: RenderPhaseDebugNY.cpp
// description:
//
// --- Include Files ------------------------------------------------------------
#include "grcore/debugdraw.h"
#include "debug/Debug.h"
#if DEBUG_DISPLAY_BAR
// C headers
// Framework headers
#include "fwscene/search/Search.h"
#include "fwscene/scan/Scan.h"
#include "video/VideoPlayback.h"
// Rage headers
#include "grcore/allocscope.h"
#include "system/param.h"
#include "pheffects/mouseinput.h"
#include "profile/timebars.h"
// Game headers
#include "audio/northaudioengine.h"
#include "camera/CamInterface.h"
#include "camera/viewports/Viewport.h"
#include "camera/viewports/ViewportManager.h"
#include "debug/bugstar/BugstarIntegrationSwitch.h"
#include "debug/DebugDraw.h"
#include "debug/DebugDraw/DebugHangingCableTest.h"
#include "debug/debugscene.h"
#include "debug/LightProbe.h"
#include "debug/NodeViewer.h"
#include "debug/TextureViewer/TextureViewer.h"
#include "debug/Rendering/DebugRendering.h"
#include "debug/OverviewScreen.h"
#include "debug/TiledScreenCapture.h"
#include "debug/UiGadget/UiGadgetBase.h"
#include "Event/ShockingEvents.h"
#include "game/weather.h"
#include "game/clock.h"
#include "Peds/rendering/PedDamage.h"
#include "renderer/DrawLists/DrawListMgr.h"
#include "renderer/occlusion.h"
#include "renderer/PlantsMgr.h"
#include "renderer/PostProcessFXHelper.h"
#include "renderer/rendertargets.h"
#include "renderer/RenderPhases/RenderPhaseCascadeShadows.h"
#include "renderer/zonecull.h"
#include "renderer/SpuPM/SpuPmMgr.h"
#include "renderer/ScreenshotManager.h"
#include "SaveLoad/savegame_photo_manager.h"
#include "scene/debug/PostScanDebug.h"
#include "scene/decorator/decoratorinterface.h"
#include "scene/downloadabletexturemanager.h"
#include "scene/scene.h"
#include "scene/EntityBatch.h"
#include "scene/portals/portalDebugHelper.h"
#include "scene/portals/Portal.h"
#include "scene/Volume/VolumeManager.h"
#include "System/ControlMgr.h"
#include "Peds/PopCycle.h"
#include "Peds/PedEventScanner.h"
#include "Network/NetworkInterface.h"
#include "Animation/debug/AnimViewer.h"
#include "Script/script.h"
#include "Script/script_hud.h"
#include "Vfx/visualeffects.h"
#include "Vfx/misc/MovieManager.h"
#include "physics/physics.h"
#include "Text/TextFormat.h"
#include "Peds/rendering/PedHeadshotManager.h"
#include "renderer/RenderPhases/RenderPhaseDebugNY.h"
#if __XENON
//OPTIMISATIONS_OFF()
#endif
// --- Defines ------------------------------------------------------------------
// --- Constants ----------------------------------------------------------------
// --- Structure/Class Definitions ----------------------------------------------
// Custom draw list commands
#if DEBUG_DRAW
class dlCmdDebug2dStaticRender : public dlCmdBase {
public:
enum {
INSTRUCTION_ID = DC_Debug2dStaticRender,
};
explicit dlCmdDebug2dStaticRender(u32 numBatchers) { m_numBatchers = numBatchers; }
s32 GetCommandSize() { return(sizeof(*this)); }
static void ExecuteStatic(dlCmdBase & cmd) { CRenderPhaseDebug2d::StaticRender(((dlCmdDebug2dStaticRender&)cmd).m_numBatchers); }
private:
u32 m_numBatchers;
};
#endif // DEBUG_DRAW
class dlCmdDebug3dStaticRender : public dlCmdBase {
public:
enum {
INSTRUCTION_ID = DC_Debug3dStaticRender,
};
explicit dlCmdDebug3dStaticRender(u32 numBatchers) { m_numBatchers = numBatchers; }
s32 GetCommandSize() { return(sizeof(*this)); }
static void ExecuteStatic(dlCmdBase & cmd) { CRenderPhaseDebug3d::StaticRender(((dlCmdDebug3dStaticRender&)cmd).m_numBatchers); }
private:
u32 m_numBatchers;
};
class dlCmdDebugRenderReleaseInfo : public dlCmdBase {
public:
enum {
INSTRUCTION_ID = DC_DebugRenderReleaseInfo,
};
s32 GetCommandSize() { return(sizeof(*this)); }
static void ExecuteStatic(dlCmdBase & /*cmd*/) { CDebug::RenderReleaseInfoToScreen(); }
};
// --- Globals ------------------------------------------------------------------
// --- Static Globals -----------------------------------------------------------
// --- Static class members -----------------------------------------------------
// --- Code ---------------------------------------------------------------------
/// ***********************
// **** DEBUG2D PHASE ****
// ***********************
#if DEBUG_DISPLAY_BAR
grcRasterizerStateHandle CRenderPhaseDebug2d::sm_rasterizerState;
#endif // DEBUG_DISPLAY_BAR
#if DEBUG_DRAW
//
// name: PrintDebugInfo
static void PrintDebugInfo()
{
#if __BANK
camInterface::DebugDisplayCameraInfoText();
#endif
#if __DEV
char lString[255];
if (CPortalDebugHelper::BuildCamLocationString(lString))
{
grcDebugDraw::AddDebugOutput(lString);
}
#endif // __DEV
CPopCycle::Display();
#if __BANK
NetworkInterface::PrintNetworkInfo(); // display debug text for the network code
#endif
DLC_Add(CDebug::RenderDebugScaleformInfo);
DLC(dlCmdDebugRenderReleaseInfo, ());
}
void CRenderPhaseDebug2d::StaticRender(u32 numBatchers)
{
GRC_ALLOC_SCOPE_AUTO_PUSH_POP()
CRenderTargets::LockUIRenderTargets();
CSprite2d::SetAutoRestoreViewport(true);
grcStateBlock::SetStates(sm_rasterizerState, grcStateBlock::DSS_IgnoreDepth, grcStateBlock::BS_Normal);
CShaderLib::SetGlobalEmissiveScale(1.0f,true);
grcLightState::SetEnabled(false);
grcBindTexture(NULL);
grcWorldIdentity();
#if __BANK
//CRenderPhaseCascadeShadowsInterface::DebugDraw_render(); -- doesn't work anymore here, since the depth buffer is not available
CDebugTextureViewerInterface::Render();
PF_START_TIMEBAR_DETAIL("Ped Damage Debug");
CPedDamageManager::DebugDraw();
#endif
PF_START_TIMEBAR_DETAIL("LastGen Message");
DebugDraw::RenderLastGen();
PF_START_TIMEBAR_DETAIL("Render Profiler");
CDebug::RenderProfiler();
PF_PUSH_TIMEBAR_DETAIL("MovieManager Debug");
g_movieMgr.RenderDebug();
PF_POP_TIMEBAR_DETAIL();
#if __BANK
PF_PUSH_TIMEBAR_DETAIL("MovieManager Debug");
CPhotoManager::RenderCameraPhotoDebug();
PHONEPHOTOEDITOR.RenderDebug();
VIDEO_PLAYBACK_ONLY(VideoPlayback::RenderVideoOverlayBank());
// if (CLowQualityScreenshot::IsRendering() && CLowQualityScreenshot::GetRenderDebug())
// {
// CLowQualityScreenshot::Render(false);
// }
PF_POP_TIMEBAR_DETAIL();
PF_PUSH_TIMEBAR_DETAIL("PedHeadshotManager Debug");
PedHeadshotManager::DebugRender();
PF_POP_TIMEBAR_DETAIL();
PF_PUSH_TIMEBAR_DETAIL("DownloadableTextureManager Debug");
DOWNLOADABLETEXTUREMGRDEBUG.Render();
PF_POP_TIMEBAR_DETAIL();
PF_START_TIMEBAR_DETAIL("Audio Debug");
audNorthAudioEngine::DebugDraw();
# if RSG_DURANGO
// adding support for latency measurement (B*2058011 : use light sensor to measure input latency)
if (CDebug::sm_bDisplayLightSensorQuad)
{
bool any = CControlMgr::GetDebugPad().GetButtonCircle() ||
CControlMgr::GetDebugPad().GetButtonCross() ||
CControlMgr::GetDebugPad().GetButtonSquare() ||
CControlMgr::GetDebugPad().GetButtonTriangle() ||
CControlMgr::GetDebugPad().GetRightShoulder2() ||
CControlMgr::GetDebugPad().GetLeftShoulder2();
if (any) CSprite2d::DrawRect(0.0f, 0.0f, 0.25f, 0.25f, 0.0f, Color_white);
else CSprite2d::DrawRect(0.0f, 0.0f, 0.25f, 0.25f, 0.0f, Color_black);
}
# endif
#endif
#if SPUPMMGR_TEST
SpuPM_RenderTestTexture();
#endif
PF_START_TIMEBAR_DETAIL("2D Debug Render");
grcDebugDraw::Render2D(numBatchers);
CSprite2d::SetAutoRestoreViewport(false);
CRenderTargets::UnlockUIRenderTargets();
}
#endif // DEBUG_DRAW
CRenderPhaseDebug2d::CRenderPhaseDebug2d(CViewport* pGameViewport)
: CRenderPhase(pGameViewport, "Debug2D", DL_RENDERPHASE_DEBUG, 0.0f, false)
{
USE_DEBUG_MEMORY();
grcRasterizerStateDesc rasterizerDesc;
rasterizerDesc.CullMode = grcRSV::CULL_NONE;
rasterizerDesc.AntialiasedLineEnable = TRUE;
sm_rasterizerState = grcStateBlock::CreateRasterizerState(rasterizerDesc);
}
void CRenderPhaseDebug2d::UpdateViewport()
{
#if __BANK
TiledScreenCapture::Update();
#endif // __BANK
}
//----------------------------------------------------
// build and execute the drawlist for this renderphase
void CRenderPhaseDebug2d::BuildDrawList()
{
if (!GetViewport()->IsActive() || !camInterface::IsInitialized())
{
return;
}
DrawListPrologue();
DURANGO_ONLY(DLC_Add(CRenderTargets::LockUIRenderTargets);)
DLC(dlCmdSetCurrentViewport, (&GetGrcViewport()));
DLC_Add(&CTextFormat::FlushFontBuffer);
#if __BANK
TiledScreenCapture::BuildDrawList();
DLC_Add(CScriptHud::DrawScriptScaleformDebugInfo);
#endif // __BANK
#if DEBUG_DRAW
CRenderPhaseCascadeShadowsInterface::DebugDraw_update();
PrintDebugInfo();
// Close the main threads batchers, so that any further main thread debug drawing is forced to the next render frame.
grcDebugDraw::CloseBatcher(grcDebugDraw::LINGER_2D);
DLC(dlCmdDebug2dStaticRender, (grcDebugDraw::GetNumBatchers(grcDebugDraw::LINGER_2D)));
grcDebugDraw::ClearRenderState();
#else
DLC_Add(CDebug::RenderDebugScaleformInfo);
DLC_Add(CDebug::RenderReleaseInfoToScreen);
#endif
//#if __BANK
// DLC_Add(CRenderTargets::RenderBank, 0);
//#endif
DLC(dlCmdSetCurrentViewportToNULL, ());
DURANGO_ONLY(DLC_Add(CRenderTargets::UnlockUIRenderTargets, false);)
DrawListEpilogue();
}
// ***********************
// **** DEBUG3D PHASE ****
// ***********************
grcRasterizerStateHandle CRenderPhaseDebug3d::sm_rasterizerState;
void CRenderPhaseDebug3d::StaticRender(u32 DEBUG_DRAW_ONLY(numBatchers))
{
#if __BANK //this whole class should not exist in non-bank but this cleans up the ifdef hell below a bit and preserves most of the logic...
CShaderLib::SetGlobalEmissiveScale(1.0f,true);
GRC_ALLOC_SCOPE_AUTO_PUSH_POP()
CRenderTargets::LockUIRenderTargets();
CSprite2d::SetAutoRestoreViewport(true);
if (grcDebugDraw::GetGlobalDoDebugZTest())
{
grcStateBlock::SetDepthStencilState(CShaderLib::DSS_Default_Invert);
}
else
{
grcStateBlock::SetDepthStencilState(grcStateBlock::DSS_IgnoreDepth);
}
grcStateBlock::SetBlendState(grcStateBlock::BS_Normal);
grcStateBlock::SetRasterizerState(sm_rasterizerState);
grcLightState::SetEnabled(true);
#if __DEV
CDebugScene::RenderModelViewer();
#endif // __DEV
CDebugScene::Render_RenderThread();
COverviewScreenManager::Render();
grcBindTexture(NULL);
grcLightState::SetEnabled(false);
// Debug Rendering draw
DebugRenderingMgr::Draw();
LightProbe::Render();
#if __DEV
#if HANGING_CABLE_TEST
CHangingCableTestInterface::Render();
#endif // HANGING_CABLE_TEST
#endif // __DEV
#if DEBUG_DRAW
fwSearch::DrawDebug();
CPostScanDebug::Draw();
#endif // DEBUG_DRAW
// visual effects debug
CVisualEffects::RenderDebug();
// visual effects debug
#if VOLUME_SUPPORT
g_VolumeManager.RenderDebug();
#endif // __BANK && VOLUME_SUPPORT
#if DECORATOR_DEBUG
gp_DecoratorInterface->RenderDebug();
#endif // DECORATOR_DEBUG
CNodeViewer::Render();
PF_START_TIMEBAR_DETAIL("CCullZones Render");
CCullZones::Render();
PF_START_TIMEBAR_DETAIL("Ped Damage Debug");
CPedDamageManager::DebugDraw3D();
PF_START_TIMEBAR_DETAIL("Local Shadow Debug");
CParaboloidShadow::BankDebugDraw();
PF_START_TIMEBAR_DETAIL("CPlantMgr Debug");
CPlantMgr::RenderDebugForward();
#if __BANK
PF_START_TIMEBAR_DETAIL("CEntityBatch Debug");
CEntityBatch::RenderDebug();
#endif
// render all debug lines/sphere/polys etc
#if(DEBUG_RENDER_BUG_LIST)
PF_START_TIMEBAR_DETAIL("Buglist Render");
CDebug::RenderTheBugList();
#endif // DEBUG_RENDER_BUG_LIST
#if DEBUG_DRAW
PF_START_TIMEBAR_DETAIL("3D Debug Render");
grcDebugDraw::SetCameraPosition(RCC_VEC3V(camInterface::GetPos()));
grcDebugDraw::Render3D(numBatchers);
#if __PFDRAW
if (CPhysics::ms_mouseInput)
{
CPhysics::ms_mouseInput->Draw();
}
#endif // __PFDRAW
#endif // DEBUG_DRAW
PF_START_TIMEBAR_DETAIL("Occluder Render");
COcclusion::DrawDebug();
CSprite2d::SetAutoRestoreViewport(false);
CRenderTargets::UnlockUIRenderTargets();
#endif //__BANK
}
CRenderPhaseDebug3d::CRenderPhaseDebug3d(CViewport* pGameViewport)
: CRenderPhase(pGameViewport, "Debug3d", DL_RENDERPHASE_DEBUG, 0.0f, false)
{
USE_DEBUG_MEMORY();
grcRasterizerStateDesc rasterizerDesc;
rasterizerDesc.CullMode = grcRSV::CULL_NONE;
rasterizerDesc.AntialiasedLineEnable = TRUE;
sm_rasterizerState = grcStateBlock::CreateRasterizerState(rasterizerDesc);
}
//----------------------------------------------------
// build and execute the drawlist for this renderphase
void CRenderPhaseDebug3d::BuildDrawList()
{
if (!GetViewport()->IsActive() || !camInterface::IsInitialized())
{
return;
}
DrawListPrologue();
#if USE_INVERTED_PROJECTION_ONLY
grcViewport viewport = GetGrcViewport();
viewport.SetInvertZInProjectionMatrix( true );
#else
const grcViewport& viewport = GetGrcViewport();
#endif
DLC(dlCmdSetCurrentViewport, (&viewport));
// Close the main threads batchers, so that any further main thread debug drawing is forced to the next render frame.
DEBUG_DRAW_ONLY(grcDebugDraw::CloseBatcher(grcDebugDraw::LINGER_3D);)
DLC(dlCmdDebug3dStaticRender, (0 DEBUG_DRAW_ONLY(+grcDebugDraw::GetNumBatchers(grcDebugDraw::LINGER_3D))));
DLC(dlCmdSetCurrentViewportToNULL, ());
DrawListEpilogue();
}
CRenderPhaseScreenShot::CRenderPhaseScreenShot(CViewport* pGameViewport)
: CRenderPhase(pGameViewport, "Screenshot", DL_RENDERPHASE_DEBUG, 0.0f, false)
{
}
void CRenderPhaseScreenShot::BuildDrawList()
{
DrawListPrologue();
#if BUGSTAR_INTEGRATION_ACTIVE
PF_START_TIMEBAR_DETAIL("BugRequests");
CDebug::HandleBugRequests();
#endif // BUGSTAR_INTEGRATION_ACTIVE
DrawListEpilogue();
}
namespace CRenderPhaseDebug
{
void InitDLCCommands()
{
#if DEBUG_DRAW
DLC_REGISTER_EXTERNAL(dlCmdDebug2dStaticRender);
#endif // DEBUG_DRAW
DLC_REGISTER_EXTERNAL(dlCmdDebug3dStaticRender);
DLC_REGISTER_EXTERNAL(dlCmdDebugRenderReleaseInfo);
}
} // namespace CRenderPhaseDebug
#endif //DEBUG_DISPLAY_BAR