Integrated into SBApplication and accounted for case where number of points to draw is 0.

This commit is contained in:
Kah Wei 2022-10-26 16:27:58 +08:00
parent 550b8d85f0
commit 57027da80b
4 changed files with 47 additions and 15 deletions

View File

@ -31,6 +31,7 @@
#include "FRC/SHFramerateController.h" #include "FRC/SHFramerateController.h"
#include "AudioSystem/SHAudioSystem.h" #include "AudioSystem/SHAudioSystem.h"
#include "Camera/SHCameraSystem.h" #include "Camera/SHCameraSystem.h"
#include "Graphics/MiddleEnd/Interface/SHDebugDrawSystem.h"
// Components // Components
#include "Graphics/MiddleEnd/Interface/SHRenderable.h" #include "Graphics/MiddleEnd/Interface/SHRenderable.h"
@ -69,6 +70,7 @@ namespace Sandbox
SHGraphicsSystem* graphicsSystem = static_cast<SHGraphicsSystem*>(SHSystemManager::GetSystem<SHGraphicsSystem>()); SHGraphicsSystem* graphicsSystem = static_cast<SHGraphicsSystem*>(SHSystemManager::GetSystem<SHGraphicsSystem>());
SHSystemManager::CreateSystem<SHAudioSystem>(); SHSystemManager::CreateSystem<SHAudioSystem>();
SHSystemManager::CreateSystem<SHCameraSystem>(); SHSystemManager::CreateSystem<SHCameraSystem>();
SHSystemManager::CreateSystem<SHDebugDrawSystem>();
#ifdef SHEDITOR #ifdef SHEDITOR
SDL_Init(SDL_INIT_VIDEO); SDL_Init(SDL_INIT_VIDEO);
@ -90,6 +92,7 @@ namespace Sandbox
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsPostUpdate>(); SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsPostUpdate>();
SHSystemManager::RegisterRoutine<SHTransformSystem, SHTransformSystem::TransformPostPhysicsUpdate>(); SHSystemManager::RegisterRoutine<SHTransformSystem, SHTransformSystem::TransformPostPhysicsUpdate>();
SHSystemManager::RegisterRoutine<SHDebugDrawSystem, SHDebugDrawSystem::ProcessPointsRoutine>();
SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::BatcherDispatcherRoutine>(); SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::BatcherDispatcherRoutine>();
SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::BeginRoutine>(); SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::BeginRoutine>();

View File

@ -25,11 +25,11 @@ namespace SHADE
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
/* DrawRoutine */ /* DrawRoutine */
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
SHDebugDrawSystem::DrawRoutine::DrawRoutine() SHDebugDrawSystem::ProcessPointsRoutine::ProcessPointsRoutine()
: SHSystemRoutine("Debug Draw") : SHSystemRoutine("Debug Draw")
{} {}
void SHDebugDrawSystem::DrawRoutine::Execute(double dt) noexcept void SHDebugDrawSystem::ProcessPointsRoutine::Execute(double dt) noexcept
{ {
auto gfxSys = SHSystemManager::GetSystem<SHGraphicsSystem>(); auto gfxSys = SHSystemManager::GetSystem<SHGraphicsSystem>();
if (gfxSys) if (gfxSys)
@ -40,8 +40,12 @@ namespace SHADE
// Create the buffer if it doesn't exist or just update it // Create the buffer if it doesn't exist or just update it
SHDebugDrawSystem* system = static_cast<SHDebugDrawSystem*>(GetSystem()); SHDebugDrawSystem* system = static_cast<SHDebugDrawSystem*>(GetSystem());
system->numPoints = system->points.size();
const uint32_t DATA_SIZE = sizeof(PointVertex) * system->points.size(); const uint32_t DATA_SIZE = sizeof(PointVertex) * system->points.size();
SHVkUtil::EnsureBufferAndCopyHostVisibleData(gfxSys->GetDevice(), system->vertexBuffer, system->points.data(), DATA_SIZE, vk::BufferUsageFlagBits::eVertexBuffer); if (DATA_SIZE > 0)
{
SHVkUtil::EnsureBufferAndCopyHostVisibleData(gfxSys->GetDevice(), system->vertexBuffer, system->points.data(), DATA_SIZE, vk::BufferUsageFlagBits::eVertexBuffer);
}
// Reset for next frame // Reset for next frame
system->points.clear(); system->points.clear();
@ -59,6 +63,10 @@ namespace SHADE
auto subPass = renderGraph->GetNode("Debug Draw")->GetSubpass("Debug Draw"); auto subPass = renderGraph->GetNode("Debug Draw")->GetSubpass("Debug Draw");
subPass->AddExteriorDrawCalls([&](Handle<SHVkCommandBuffer>& cmdBuffer) subPass->AddExteriorDrawCalls([&](Handle<SHVkCommandBuffer>& cmdBuffer)
{ {
// Don't draw if no points
if (numPoints <= 0)
return;
cmdBuffer->BindPipeline(GFX_SYSTEM->GetDebugDrawPipeline()); cmdBuffer->BindPipeline(GFX_SYSTEM->GetDebugDrawPipeline());
cmdBuffer->BindVertexBuffer(0, vertexBuffer, 0); cmdBuffer->BindVertexBuffer(0, vertexBuffer, 0);
cmdBuffer->DrawArrays(static_cast<uint32_t>(points.size()), 1, 0, 0); cmdBuffer->DrawArrays(static_cast<uint32_t>(points.size()), 1, 0, 0);
@ -67,7 +75,10 @@ namespace SHADE
void SHDebugDrawSystem::Exit() void SHDebugDrawSystem::Exit()
{ {
if (vertexBuffer)
{
vertexBuffer.Free();
}
} }
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/

View File

@ -21,14 +21,10 @@ of DigiPen Institute of Technology is prohibited.
#include "ECS_Base/System/SHSystem.h" #include "ECS_Base/System/SHSystem.h"
#include "ECS_Base/System/SHSystemRoutine.h" #include "ECS_Base/System/SHSystemRoutine.h"
#include "Resource/SHHandle.h" #include "Resource/SHHandle.h"
#include "Graphics/Buffers/SHVkBuffer.h"
namespace SHADE namespace SHADE
{ {
/*---------------------------------------------------------------------------------*/
/* Forward Declarations */
/*---------------------------------------------------------------------------------*/
class SHVkBuffer;
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
/* Type Definitions */ /* Type Definitions */
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
@ -44,10 +40,10 @@ namespace SHADE
/*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/
/* System Routines */ /* System Routines */
/*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/
class SH_API DrawRoutine final : public SHSystemRoutine class SH_API ProcessPointsRoutine final : public SHSystemRoutine
{ {
public: public:
DrawRoutine(); ProcessPointsRoutine();
virtual void Execute(double dt) noexcept override final; virtual void Execute(double dt) noexcept override final;
}; };
@ -73,7 +69,7 @@ namespace SHADE
/*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/
/* Type Definitions */ /* Type Definitions */
/*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/
struct PointVertex struct SH_API PointVertex
{ {
SHVec3 Position; SHVec3 Position;
SHVec4 Color; SHVec4 Color;
@ -85,6 +81,7 @@ namespace SHADE
std::vector<PointVertex> points; std::vector<PointVertex> points;
// GPU Buffers // GPU Buffers
Handle<SHVkBuffer> vertexBuffer; Handle<SHVkBuffer> vertexBuffer;
uint32_t numPoints = 0;
// Cached Points for polygon drawing // Cached Points for polygon drawing
std::vector<SHVec3> spherePoints; std::vector<SHVec3> spherePoints;
}; };

View File

@ -204,12 +204,15 @@ namespace SHADE
auto pureCopyShader = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl"); auto pureCopyShader = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl");
gBufferNode->AddNodeCompute(pureCopyShader, { "Scene Pre-Process", "Scene" }); gBufferNode->AddNodeCompute(pureCopyShader, { "Scene Pre-Process", "Scene" });
// Set up Debug Draw Pass
auto debugDrawNode = worldRenderGraph->AddNode("Debug Draw", { "Scene" }, { "G-Buffer" });
auto debugDrawSubpass = debugDrawNode->AddSubpass("Debug Draw");
debugDrawSubpass->AddColorOutput("Scene");
auto dummyNode = worldRenderGraph->AddNode("Dummy Pass", { "Scene" }, {"G-Buffer"}); // no predecessors auto dummyNode = worldRenderGraph->AddNode("Dummy Pass", { "Scene" }, {"Debug Draw"}); // no predecessors
auto dummySubpass = dummyNode->AddSubpass("Dummy Subpass"); auto dummySubpass = dummyNode->AddSubpass("Dummy Subpass");
dummySubpass->AddInput("Scene"); dummySubpass->AddInput("Scene");
// Generate world render graph // Generate world render graph
worldRenderGraph->Generate(); worldRenderGraph->Generate();
@ -224,6 +227,24 @@ namespace SHADE
defaultMaterial = AddMaterial(cubeVS, cubeFS, gBufferSubpass); defaultMaterial = AddMaterial(cubeVS, cubeFS, gBufferSubpass);
// Create debug draw pipeline
auto debugDrawVS = shaderModuleLibrary.GetShaderModule("DebugDrawVs.glsl");
auto debugDrawFS = shaderModuleLibrary.GetShaderModule("DebugDrawFs.glsl");
auto debugDrawPipelineLayout = resourceManager.Create<SHVkPipelineLayout>
(
device, SHPipelineLayoutParams
{
.shaderModules = { debugDrawVS, debugDrawFS },
.globalDescSetLayouts = SHGraphicsGlobalData::GetDescSetLayouts()
}
);
debugDrawPipeline = resourceManager.Create<SHVkPipeline>(device, debugDrawPipelineLayout);
debugDrawPipeline->GetPipelineState().SetRasterizationState(SHRasterizationState
{
.polygonMode = vk::PolygonMode::eLine,
.cull_mode = vk::CullModeFlagBits::eNone
});
} }
void SHGraphicsSystem::InitMiddleEnd(void) noexcept void SHGraphicsSystem::InitMiddleEnd(void) noexcept