Merge branch 'main' into SP3-8-serialization
This commit is contained in:
commit
b18d1f66ae
|
@ -362,3 +362,5 @@ MigrationBackup/
|
||||||
*.csproj
|
*.csproj
|
||||||
|
|
||||||
*.filters
|
*.filters
|
||||||
|
|
||||||
|
Assets/Editor/Layouts/UserLayout.ini
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: Cube.003
|
||||||
|
ID: 110152941
|
||||||
|
Type:
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: Cube.012
|
||||||
|
ID: 107348815
|
||||||
|
Type:
|
|
@ -0,0 +1,48 @@
|
||||||
|
[Window][MainStatusBar]
|
||||||
|
Pos=0,1060
|
||||||
|
Size=1920,20
|
||||||
|
Collapsed=0
|
||||||
|
|
||||||
|
[Window][SHEditorMenuBar]
|
||||||
|
Pos=0,24
|
||||||
|
Size=1920,1036
|
||||||
|
Collapsed=0
|
||||||
|
|
||||||
|
[Window][Hierarchy Panel]
|
||||||
|
Pos=0,120
|
||||||
|
Size=225,940
|
||||||
|
Collapsed=0
|
||||||
|
DockId=0x00000004,0
|
||||||
|
|
||||||
|
[Window][Debug##Default]
|
||||||
|
Pos=60,60
|
||||||
|
Size=400,400
|
||||||
|
Collapsed=0
|
||||||
|
|
||||||
|
[Window][Inspector]
|
||||||
|
Pos=1686,24
|
||||||
|
Size=234,1036
|
||||||
|
Collapsed=0
|
||||||
|
DockId=0x00000006,0
|
||||||
|
|
||||||
|
[Window][Profiler]
|
||||||
|
Pos=0,24
|
||||||
|
Size=225,94
|
||||||
|
Collapsed=0
|
||||||
|
DockId=0x00000003,0
|
||||||
|
|
||||||
|
[Window][Viewport]
|
||||||
|
Pos=227,24
|
||||||
|
Size=1457,1036
|
||||||
|
Collapsed=0
|
||||||
|
DockId=0x00000002,0
|
||||||
|
|
||||||
|
[Docking][Data]
|
||||||
|
DockSpace ID=0xC5C9B8AB Window=0xBE4044E9 Pos=8,55 Size=1920,1036 Split=X
|
||||||
|
DockNode ID=0x00000005 Parent=0xC5C9B8AB SizeRef=1684,1036 Split=X
|
||||||
|
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=225,1036 Split=Y Selected=0x1E6EB881
|
||||||
|
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=225,94 Selected=0x1E6EB881
|
||||||
|
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=225,940 Selected=0xE096E5AE
|
||||||
|
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1293,1036 CentralNode=1 Selected=0x13926F0B
|
||||||
|
DockNode ID=0x00000006 Parent=0xC5C9B8AB SizeRef=234,1036 Selected=0xE7039252
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: RaccoonPreTexturedVer1_Base9
|
||||||
|
ID: 91918845
|
||||||
|
Type:
|
|
@ -30,13 +30,14 @@ project "SHADE_Application"
|
||||||
|
|
||||||
externalincludedirs
|
externalincludedirs
|
||||||
{
|
{
|
||||||
"%{IncludeDir.spdlog}/include",
|
"%{IncludeDir.RTTR}\\include",
|
||||||
"%{IncludeDir.VULKAN}/include",
|
|
||||||
"%{IncludeDir.VMA}/include",
|
|
||||||
"%{IncludeDir.VULKAN}/Source/SPIRV-Reflect",
|
|
||||||
"%{IncludeDir.tinyddsloader}",
|
|
||||||
"%{IncludeDir.fmod}/include",
|
"%{IncludeDir.fmod}/include",
|
||||||
"%{IncludeDir.RTTR}\\include"
|
"%{IncludeDir.VULKAN}/Source/SPIRV-Reflect",
|
||||||
|
"%{IncludeDir.VMA}/include",
|
||||||
|
"%{IncludeDir.VULKAN}/include",
|
||||||
|
"%{IncludeDir.spdlog}/include",
|
||||||
|
"%{IncludeDir.tinyddsloader}",
|
||||||
|
"%{IncludeDir.reactphysics3d}\\include"
|
||||||
}
|
}
|
||||||
|
|
||||||
externalwarnings "Off"
|
externalwarnings "Off"
|
||||||
|
@ -57,7 +58,7 @@ project "SHADE_Application"
|
||||||
libdirs
|
libdirs
|
||||||
{
|
{
|
||||||
"%{IncludeDir.spdlog}/lib",
|
"%{IncludeDir.spdlog}/lib",
|
||||||
"%{IncludeDir.SDL}/lib",
|
"%{IncludeDir.SDL}/lib"
|
||||||
}
|
}
|
||||||
|
|
||||||
defines
|
defines
|
||||||
|
|
|
@ -16,19 +16,28 @@
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
#include "Scripting/SHScriptEngine.h"
|
|
||||||
#include "Graphics/MiddleEnd/Meshes/SHPrimitiveGenerator.h"
|
#include "Graphics/MiddleEnd/Meshes/SHPrimitiveGenerator.h"
|
||||||
|
|
||||||
|
// Managers
|
||||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
|
||||||
#include "Scene/SHSceneManager.h"
|
#include "Scene/SHSceneManager.h"
|
||||||
|
|
||||||
|
// Systems
|
||||||
|
#include "Scripting/SHScriptEngine.h"
|
||||||
|
#include "Physics/SHPhysicsSystem.h"
|
||||||
#include "Math/Transform/SHTransformSystem.h"
|
#include "Math/Transform/SHTransformSystem.h"
|
||||||
#include "Input/SHInputManager.h"
|
#include "Input/SHInputManager.h"
|
||||||
#include "FRC/SHFramerateController.h"
|
#include "FRC/SHFramerateController.h"
|
||||||
#include "AudioSystem/SHAudioSystem.h"
|
#include "AudioSystem/SHAudioSystem.h"
|
||||||
|
|
||||||
#include "Scenes/SBTestScene.h"
|
// Components
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
|
|
||||||
|
#include "Scenes/SBTestScene.h"
|
||||||
|
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/SHLogger.h"
|
||||||
|
@ -47,43 +56,58 @@ namespace Sandbox
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Set working directory
|
// Set working directory
|
||||||
SHADE::SHFileUtilities::SetWorkDirToExecDir();
|
SHFileUtilities::SetWorkDirToExecDir();
|
||||||
|
|
||||||
window.Create(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
|
window.Create(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
|
||||||
|
|
||||||
// Create Systems
|
// Create Systems
|
||||||
SHADE::SHSystemManager::CreateSystem<SHADE::SHGraphicsSystem>();
|
SHSystemManager::CreateSystem<SHGraphicsSystem>();
|
||||||
SHADE::SHSystemManager::CreateSystem<SHADE::SHScriptEngine>();
|
SHSystemManager::CreateSystem<SHScriptEngine>();
|
||||||
// TODO(Diren): Create Physics System here
|
SHSystemManager::CreateSystem<SHPhysicsSystem>();
|
||||||
SHADE::SHSystemManager::CreateSystem<SHADE::SHTransformSystem>();
|
SHSystemManager::CreateSystem<SHTransformSystem>();
|
||||||
SHADE::SHGraphicsSystem* graphicsSystem = static_cast<SHADE::SHGraphicsSystem*>(SHADE::SHSystemManager::GetSystem<SHADE::SHGraphicsSystem>());
|
SHGraphicsSystem* graphicsSystem = static_cast<SHGraphicsSystem*>(SHSystemManager::GetSystem<SHGraphicsSystem>());
|
||||||
SHADE::SHSystemManager::CreateSystem<SHADE::SHAudioSystem>();
|
SHSystemManager::CreateSystem<SHAudioSystem>();
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
SDL_Init(SDL_INIT_VIDEO);
|
||||||
|
sdlWindow = SDL_CreateWindowFrom(window.GetHWND());
|
||||||
|
SHSystemManager::CreateSystem<SHEditor>();
|
||||||
|
SHSystemManager::GetSystem<SHEditor>()->SetSDLWindow(sdlWindow);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Create Routines
|
// Create Routines
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::FrameSetUpRoutine>();
|
SHSystemManager::RegisterRoutine<SHScriptEngine, SHScriptEngine::FrameSetUpRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::UpdateRoutine>();
|
SHSystemManager::RegisterRoutine<SHScriptEngine, SHScriptEngine::UpdateRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::LateUpdateRoutine>();
|
SHSystemManager::RegisterRoutine<SHScriptEngine, SHScriptEngine::LateUpdateRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::FrameCleanUpRoutine>();
|
SHSystemManager::RegisterRoutine<SHScriptEngine, SHScriptEngine::FrameCleanUpRoutine>();
|
||||||
|
|
||||||
// TODO(Diren): Register Physics System & Routines here
|
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsPreUpdate>();
|
||||||
|
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsFixedUpdate>();
|
||||||
|
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsPostUpdate>();
|
||||||
|
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHTransformSystem, SHADE::SHTransformSystem::TransformUpdateRoutine>();
|
SHSystemManager::RegisterRoutine<SHTransformSystem, SHTransformSystem::TransformUpdateRoutine>();
|
||||||
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHTransformComponent>();
|
|
||||||
|
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::BatcherDispatcherRoutine>();
|
SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::BatcherDispatcherRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::BeginRoutine>();
|
SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::BeginRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::RenderRoutine>();
|
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::EndRoutine>();
|
|
||||||
|
|
||||||
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHRenderable>();
|
#ifdef SHEDITOR
|
||||||
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHTransformComponent>();
|
SHSystemManager::RegisterRoutine<SHEditor, SHEditor::EditorRoutine>();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::RenderRoutine>();
|
||||||
|
SHSystemManager::RegisterRoutine<SHGraphicsSystem, SHGraphicsSystem::EndRoutine>();
|
||||||
|
|
||||||
|
SHComponentManager::CreateComponentSparseSet<SHRigidBodyComponent>();
|
||||||
|
SHComponentManager::CreateComponentSparseSet<SHColliderComponent>();
|
||||||
|
SHComponentManager::CreateComponentSparseSet<SHTransformComponent>();
|
||||||
|
SHComponentManager::CreateComponentSparseSet<SHRenderable>();
|
||||||
|
|
||||||
//TODO: REMOVE AFTER PRESENTATION
|
//TODO: REMOVE AFTER PRESENTATION
|
||||||
//SHADE::SHAssetManager::LoadDataTemp("../../Assets/racoon.gltf");
|
//SHAssetManager::LoadDataTemp("../../Assets/racoon.gltf");
|
||||||
SHADE::SHAssetManager::LoadDataTemp("../../Assets/Cube.012.shmesh");
|
//SHAssetManager::LoadDataTemp("../../Assets/Cube.012.shmesh");
|
||||||
//SHADE::SHAssetManager::LoadDataTemp("../../Assets/RaccoonBag_Color_Ver4.dds");
|
//SHAssetManager::LoadDataTemp("../../Assets/RaccoonBag_Color_Ver4.dds");
|
||||||
//SHADE::SHAssetManager::LoadDataTemp("../../Assets/RaccoonPreTexturedVer1_Base9.dds");
|
//SHAssetManager::LoadDataTemp("../../Assets/RaccoonPreTexturedVer1_Base9.dds");
|
||||||
SHADE::SHAssetManager::LoadDataTemp("../../Assets/RaccoonPreTexturedVer1_Base9.shtex");
|
//SHAssetManager::LoadDataTemp("../../Assets/RaccoonPreTexturedVer1_Base9.shtex");
|
||||||
//TODO: REMOVE AFTER PRESENTATION
|
//TODO: REMOVE AFTER PRESENTATION
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,61 +115,53 @@ namespace Sandbox
|
||||||
auto id2 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
auto id2 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||||
auto id3 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
auto id3 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||||
|
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHAudioSystem, SHADE::SHAudioSystem::AudioRoutine>();
|
SHSystemManager::RegisterRoutine<SHAudioSystem, SHAudioSystem::AudioRoutine>();
|
||||||
|
|
||||||
// Set up graphics system and windows
|
// Set up graphics system and windows
|
||||||
graphicsSystem->SetWindow(&window);
|
graphicsSystem->SetWindow(&window);
|
||||||
|
|
||||||
SHADE::SHSystemManager::Init();
|
SHSystemManager::Init();
|
||||||
#ifdef SHEDITOR
|
|
||||||
SDL_Init(SDL_INIT_VIDEO);
|
|
||||||
sdlWindow = SDL_CreateWindowFrom(window.GetHWND());
|
|
||||||
SHADE::SHEditor::Initialise(sdlWindow);
|
|
||||||
#else
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
SHSceneManager::InitSceneManager<SBTestScene>("TestScene");
|
SHSceneManager::InitSceneManager<SBTestScene>("TestScene");
|
||||||
|
|
||||||
SHFrameRateController::UpdateFRC();
|
SHFrameRateController::UpdateFRC();
|
||||||
|
|
||||||
|
SHAssetManager::Load();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SBApplication::Update(void)
|
void SBApplication::Update(void)
|
||||||
{
|
{
|
||||||
SHADE::SHGraphicsSystem* graphicsSystem = static_cast<SHADE::SHGraphicsSystem*>(SHADE::SHSystemManager::GetSystem<SHADE::SHGraphicsSystem>());
|
SHGraphicsSystem* graphicsSystem = SHADE::SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||||
|
SHEditor* editor = SHADE::SHSystemManager::GetSystem<SHEditor>();
|
||||||
//TODO: Change true to window is open
|
//TODO: Change true to window is open
|
||||||
while (!window.WindowShouldClose())
|
while (!window.WindowShouldClose())
|
||||||
{
|
{
|
||||||
SHFrameRateController::UpdateFRC();
|
SHFrameRateController::UpdateFRC();
|
||||||
SHInputManager::UpdateInput(SHFrameRateController::GetRawDeltaTime());
|
SHInputManager::UpdateInput(SHFrameRateController::GetRawDeltaTime());
|
||||||
SHSceneManager::UpdateSceneManager();
|
SHSceneManager::UpdateSceneManager();
|
||||||
SHSceneManager::SceneUpdate(1/60.0f);
|
|
||||||
//#ifdef SHEDITOR
|
|
||||||
//#endif
|
|
||||||
graphicsSystem->BeginRender();
|
|
||||||
|
|
||||||
#ifdef SHEDITOR
|
#ifdef SHEDITOR
|
||||||
SHADE::SHEditor::Update(0.16f);
|
if(editor->editorState == SHEditor::State::PLAY)
|
||||||
|
SHSceneManager::SceneUpdate(0.016f);
|
||||||
#endif
|
#endif
|
||||||
|
SHSystemManager::RunRoutines(editor->editorState != SHEditor::State::PLAY, 0.016f);
|
||||||
graphicsSystem->Run(1.0f);
|
editor->PollPicking();
|
||||||
graphicsSystem->EndRender();
|
|
||||||
|
|
||||||
SHADE::SHSystemManager::RunRoutines(false, 0.016f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finish all graphics jobs first
|
||||||
|
graphicsSystem->AwaitGraphicsExecution();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SBApplication::Exit(void)
|
void SBApplication::Exit(void)
|
||||||
{
|
{
|
||||||
#ifdef SHEDITOR
|
#ifdef SHEDITOR
|
||||||
SHADE::SHEditor::Exit();
|
|
||||||
SDL_DestroyWindow(sdlWindow);
|
SDL_DestroyWindow(sdlWindow);
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SHSceneManager::Exit();
|
SHSceneManager::Exit();
|
||||||
SHADE::SHSystemManager::Exit();
|
SHSystemManager::Exit();
|
||||||
|
SHAssetManager::Unload();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include "Scripting/SHScriptEngine.h"
|
#include "Scripting/SHScriptEngine.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||||
|
#include "Physics/Components/SHRigidBodyComponent.h"
|
||||||
|
#include "Physics/Components/SHColliderComponent.h"
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
|
||||||
|
@ -75,34 +77,37 @@ namespace Sandbox
|
||||||
customMat->SetProperty("data.alpha", 0.1f);
|
customMat->SetProperty("data.alpha", 0.1f);
|
||||||
|
|
||||||
// Create Stress Test Objects
|
// Create Stress Test Objects
|
||||||
static const SHVec3 TEST_OBJ_SCALE = { 0.05f, 0.05f, 0.05f };
|
static const SHVec3 TEST_OBJ_SCALE = SHVec3::One * 0.5f;
|
||||||
constexpr int NUM_ROWS = 100;
|
constexpr int NUM_ROWS = 10;
|
||||||
constexpr int NUM_COLS = 100;
|
constexpr int NUM_COLS = 10;
|
||||||
static const SHVec3 TEST_OBJ_SPACING = { 0.05f, 0.05f, 0.05f };
|
static const SHVec3 TEST_OBJ_SPACING = { 0.1f, 0.1f, 0.1f };
|
||||||
static const SHVec3 TEST_OBJ_START_POS = { -(NUM_COLS / 2 * TEST_OBJ_SPACING.x) + 1.0f, -2.0f, -1.0f };
|
static const SHVec3 TEST_OBJ_START_POS = { -(NUM_COLS / 2 * TEST_OBJ_SPACING.x) + 1.0f, -2.0f, -1.0f };
|
||||||
|
|
||||||
for (int y = 0; y < NUM_ROWS; ++y)
|
for (int y = 0; y < NUM_ROWS; ++y)
|
||||||
for (int x = 0; x < NUM_COLS; ++x)
|
for (int x = 0; x < NUM_COLS; ++x)
|
||||||
{
|
{
|
||||||
auto entity = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
auto entity = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent, SHRigidBodyComponent, SHColliderComponent>();
|
||||||
auto& renderable = *SHComponentManager::GetComponent_s<SHRenderable>(entity);
|
auto& renderable = *SHComponentManager::GetComponent_s<SHRenderable>(entity);
|
||||||
auto& transform = *SHComponentManager::GetComponent_s<SHTransformComponent>(entity);
|
auto& transform = *SHComponentManager::GetComponent_s<SHTransformComponent>(entity);
|
||||||
|
auto& collider = *SHComponentManager::GetComponent_s<SHColliderComponent>(entity);
|
||||||
|
|
||||||
renderable.Mesh = handles.front();
|
//renderable.Mesh = handles.front();
|
||||||
|
renderable.Mesh = CUBE_MESH;
|
||||||
renderable.SetMaterial(customMat);
|
renderable.SetMaterial(customMat);
|
||||||
|
|
||||||
if (y == 50)
|
if (y == 50)
|
||||||
renderable.GetModifiableMaterial()->SetProperty("data.color", SHVec4(1.0f, 0.0f, 0.0f, 1.0f));
|
renderable.GetModifiableMaterial()->SetProperty("data.color", SHVec4(1.0f, 0.0f, 0.0f, 1.0f));
|
||||||
|
|
||||||
//Set initial positions
|
//Set initial positions
|
||||||
transform.SetWorldPosition(TEST_OBJ_START_POS + SHVec3{
|
transform.SetWorldPosition(TEST_OBJ_START_POS + SHVec3{ x * TEST_OBJ_SPACING.x, y * TEST_OBJ_SPACING.y, SHMath::GenerateRandomNumber(-3.5f, -5.0f) });
|
||||||
x * TEST_OBJ_SPACING.x,
|
|
||||||
y * TEST_OBJ_SPACING.y,
|
|
||||||
0.0f
|
|
||||||
});
|
|
||||||
//transform.SetWorldPosition({-1.0f, -1.0f, -1.0f});
|
//transform.SetWorldPosition({-1.0f, -1.0f, -1.0f});
|
||||||
//transform.SetWorldRotation(3.14159265f * 1.5f, -3.14159265f / 2.0f, 0.0f);
|
transform.SetWorldRotation(SHMath::GenerateRandomNumber(), SHMath::GenerateRandomNumber(), SHMath::GenerateRandomNumber());
|
||||||
transform.SetLocalScale(TEST_OBJ_SCALE);
|
transform.SetWorldScale(TEST_OBJ_SCALE);
|
||||||
|
|
||||||
|
if (const bool IS_EVEN = (y * NUM_ROWS + x) % 2; IS_EVEN)
|
||||||
|
collider.AddBoundingBox(SHVec3::One * 0.5f, SHVec3::Zero);
|
||||||
|
else
|
||||||
|
collider.AddBoundingSphere(0.5f, SHVec3::Zero);
|
||||||
|
|
||||||
stressTestObjects.emplace_back(entity);
|
stressTestObjects.emplace_back(entity);
|
||||||
}
|
}
|
||||||
|
@ -120,22 +125,31 @@ namespace Sandbox
|
||||||
transform.SetWorldPosition({ -3.0f, -1.0f, -1.0f });
|
transform.SetWorldPosition({ -3.0f, -1.0f, -1.0f });
|
||||||
transform.SetLocalScale({ 5.0f, 5.0f, 5.0f });
|
transform.SetLocalScale({ 5.0f, 5.0f, 5.0f });
|
||||||
|
|
||||||
//auto entity = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
auto floor = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent, SHRigidBodyComponent, SHColliderComponent>();
|
||||||
//auto& renderable = *SHComponentManager::GetComponent_s<SHRenderable>(entity);
|
auto& floorRenderable = *SHComponentManager::GetComponent_s<SHRenderable>(floor);
|
||||||
//auto& transform = *SHComponentManager::GetComponent_s<SHTransformComponent>(entity);
|
auto& floorTransform = *SHComponentManager::GetComponent_s<SHTransformComponent>(floor);
|
||||||
|
auto& floorRigidBody = *SHComponentManager::GetComponent_s<SHRigidBodyComponent>(floor);
|
||||||
|
auto& floorCollider = *SHComponentManager::GetComponent_s<SHColliderComponent>(floor);
|
||||||
|
|
||||||
//renderable.Mesh = handles.back();
|
floorRenderable.Mesh = CUBE_MESH;
|
||||||
//renderable.SetMaterial(customMat);
|
floorRenderable.SetMaterial(customMat);
|
||||||
|
floorRenderable.GetModifiableMaterial()->SetProperty("data.color", SHVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
|
|
||||||
//transform.SetLocalScale(TEST_OBJ_SCALE);
|
floorTransform.SetWorldScale({ 7.5f, 0.5f, 7.5 });
|
||||||
//transform.SetWorldPosition({-1.0f, -1.0f, -1.0f});
|
floorTransform.SetWorldPosition({ 0.0f, -3.0f, -5.0f });
|
||||||
|
|
||||||
|
floorRigidBody.SetType(SHRigidBodyComponent::Type::STATIC);
|
||||||
|
|
||||||
|
auto* floorBox = floorCollider.AddBoundingBox();
|
||||||
|
floorBox->SetHalfExtents(floorTransform.GetWorldScale() * 0.5f);
|
||||||
|
|
||||||
// Create blank entity with a script
|
// Create blank entity with a script
|
||||||
//testObj = SHADE::SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
//testObj = SHADE::SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
||||||
//auto& testObjRenderable = *SHComponentManager::GetComponent_s<SHRenderable>(testObj);
|
//auto& testObjRenderable = *SHComponentManager::GetComponent<SHRenderable>(testObj);
|
||||||
//testObjRenderable.Mesh = CUBE_MESH;
|
//testObjRenderable.Mesh = CUBE_MESH;
|
||||||
//testObjRenderable.SetMaterial(matInst);
|
//testObjRenderable.SetMaterial(matInst);
|
||||||
|
|
||||||
|
|
||||||
SHADE::SHScriptEngine* scriptEngine = static_cast<SHADE::SHScriptEngine*>(SHADE::SHSystemManager::GetSystem<SHADE::SHScriptEngine>());
|
SHADE::SHScriptEngine* scriptEngine = static_cast<SHADE::SHScriptEngine*>(SHADE::SHSystemManager::GetSystem<SHADE::SHScriptEngine>());
|
||||||
scriptEngine->AddScript(raccoonSpin, "RaccoonSpin");
|
scriptEngine->AddScript(raccoonSpin, "RaccoonSpin");
|
||||||
|
|
||||||
|
@ -186,8 +200,4 @@ namespace Sandbox
|
||||||
{
|
{
|
||||||
//SHSerialization::SerializeScene("resources/scenes/Scene01.SHADE");
|
//SHSerialization::SerializeScene("resources/scenes/Scene01.SHADE");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ project "SHADE_Engine"
|
||||||
"%{IncludeDir.RTTR}/lib",
|
"%{IncludeDir.RTTR}/lib",
|
||||||
"%{IncludeDir.SDL}/lib",
|
"%{IncludeDir.SDL}/lib",
|
||||||
"%{IncludeDir.spdlog}/lib",
|
"%{IncludeDir.spdlog}/lib",
|
||||||
"%{IncludeDir.fmod}/lib",
|
"%{IncludeDir.fmod}/lib"
|
||||||
}
|
}
|
||||||
|
|
||||||
links
|
links
|
||||||
|
@ -163,8 +163,8 @@ project "SHADE_Engine"
|
||||||
links{"assimp-vc142-mt.lib", "librttr_core.lib", "spdlog.lib"}
|
links{"assimp-vc142-mt.lib", "librttr_core.lib", "spdlog.lib"}
|
||||||
excludes
|
excludes
|
||||||
{
|
{
|
||||||
"%{prj.location}/src/Editor/**.cpp",
|
-- "%{prj.location}/src/Editor/**.cpp",
|
||||||
"%{prj.location}/src/Editor/**.h",
|
-- "%{prj.location}/src/Editor/**.h",
|
||||||
"%{prj.location}/src/Editor/**.hpp",
|
-- "%{prj.location}/src/Editor/**.hpp",
|
||||||
}
|
}
|
||||||
links{"fmodstudio_vc.lib", "fmod_vc.lib"}
|
links{"fmodstudio_vc.lib", "fmod_vc.lib"}
|
|
@ -9,6 +9,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
bool compiled;
|
bool compiled;
|
||||||
|
|
||||||
|
std::string name;
|
||||||
uint32_t numBytes;
|
uint32_t numBytes;
|
||||||
uint32_t width;
|
uint32_t width;
|
||||||
uint32_t height;
|
uint32_t height;
|
||||||
|
@ -17,7 +18,8 @@ namespace SHADE
|
||||||
SHTexture::PixelChannel const * pixelData;
|
SHTexture::PixelChannel const * pixelData;
|
||||||
|
|
||||||
SHTextureAsset()
|
SHTextureAsset()
|
||||||
: numBytes{ 0 },
|
: compiled{ false },
|
||||||
|
numBytes{ 0 },
|
||||||
width{ 0 },
|
width{ 0 },
|
||||||
height{ 0 },
|
height{ 0 },
|
||||||
format{ SHTexture::TextureFormat::eUndefined },
|
format{ SHTexture::TextureFormat::eUndefined },
|
||||||
|
@ -25,7 +27,8 @@ namespace SHADE
|
||||||
{}
|
{}
|
||||||
|
|
||||||
SHTextureAsset(SHTextureAsset const& rhs)
|
SHTextureAsset(SHTextureAsset const& rhs)
|
||||||
: numBytes{ rhs.numBytes },
|
: compiled{ false },
|
||||||
|
numBytes{ rhs.numBytes },
|
||||||
width{ rhs.width },
|
width{ rhs.width },
|
||||||
height{ rhs.height },
|
height{ rhs.height },
|
||||||
format{ rhs.format },
|
format{ rhs.format },
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
void SHADE::SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept
|
std::string SHADE::SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
std::string newPath{ path.string() };
|
std::string newPath{ path.string() };
|
||||||
newPath = newPath.substr(0, newPath.find_last_of('/') + 1);
|
newPath = newPath.substr(0, newPath.find_last_of('/') + 1);
|
||||||
|
@ -67,4 +67,6 @@ void SHADE::SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPat
|
||||||
);
|
);
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
return newPath;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,6 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
public:
|
public:
|
||||||
static void CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept;
|
static std::string CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -91,8 +91,8 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.header.vertexCount = result.vertexPosition.size();
|
result.header.vertexCount = static_cast<uint32_t>(result.vertexPosition.size());
|
||||||
result.header.indexCount = result.indices.size();
|
result.header.indexCount = static_cast<uint32_t>(result.indices.size());
|
||||||
result.header.meshName = mesh.mName.C_Str();
|
result.header.meshName = mesh.mName.C_Str();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -142,8 +142,7 @@ namespace SHADE
|
||||||
SHLOG_ERROR("Unable to open SHMesh File: {}", path.string());
|
SHLOG_ERROR("Unable to open SHMesh File: {}", path.string());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string name{ path.filename().string() };
|
const std::string name{ path.stem().string() };
|
||||||
name = name.substr(0, name.find_last_of('.'));
|
|
||||||
|
|
||||||
file.seekg(0);
|
file.seekg(0);
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,8 @@ namespace SHADE
|
||||||
|
|
||||||
static void LoadExternal(std::vector<SHMeshAsset>& meshes, AssetPath path) noexcept;
|
static void LoadExternal(std::vector<SHMeshAsset>& meshes, AssetPath path) noexcept;
|
||||||
|
|
||||||
static void LoadSHMesh(SHMeshAsset& meshes, AssetPath path) noexcept;
|
|
||||||
public:
|
public:
|
||||||
static void LoadMesh(std::vector<SHMeshAsset>& meshes, AssetPath path) noexcept;
|
static void LoadMesh(std::vector<SHMeshAsset>& meshes, AssetPath path) noexcept;
|
||||||
|
static void LoadSHMesh(SHMeshAsset& meshes, AssetPath path) noexcept;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
void SHTextureCompiler::CompileTextureBinary(SHTextureAsset const& asset, AssetPath path)
|
std::string SHTextureCompiler::CompileTextureBinary(SHTextureAsset const& asset, AssetPath path)
|
||||||
{
|
{
|
||||||
std::string newPath{ path.string() };
|
std::string newPath{ path.string() };
|
||||||
newPath = newPath.substr(0, newPath.find_last_of('.'));
|
newPath = newPath.substr(0, newPath.find_last_of('.'));
|
||||||
|
@ -69,5 +69,7 @@ namespace SHADE
|
||||||
);
|
);
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
return newPath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,6 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
struct SHTextureCompiler
|
struct SHTextureCompiler
|
||||||
{
|
{
|
||||||
static void CompileTextureBinary(SHTextureAsset const& asset, AssetPath path);
|
static std::string CompileTextureBinary(SHTextureAsset const& asset, AssetPath path);
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -83,18 +83,19 @@ namespace SHADE
|
||||||
|
|
||||||
std::vector<uint32_t> mipOff(file.GetMipCount());
|
std::vector<uint32_t> mipOff(file.GetMipCount());
|
||||||
|
|
||||||
for (auto i{0}; i < file.GetMipCount(); ++i)
|
for (size_t i{0}; i < file.GetMipCount(); ++i)
|
||||||
{
|
{
|
||||||
mipOff[i] = totalBytes;
|
mipOff[i] = static_cast<uint32_t>(totalBytes);
|
||||||
totalBytes += file.GetImageData(i, 0)->m_memSlicePitch;
|
totalBytes += file.GetImageData(static_cast<uint32_t>(i), 0)->m_memSlicePitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHTexture::PixelChannel* pixel = new SHTexture::PixelChannel[totalBytes];
|
SHTexture::PixelChannel* pixel = new SHTexture::PixelChannel[totalBytes];
|
||||||
std::memcpy(pixel, file.GetImageData()->m_mem, totalBytes);
|
std::memcpy(pixel, file.GetImageData()->m_mem, totalBytes);
|
||||||
//pixel = std::move(reinterpret_cast<SHTexture::PixelChannel const*>(file.GetDDSData()));
|
//pixel = std::move(reinterpret_cast<SHTexture::PixelChannel const*>(file.GetDDSData()));
|
||||||
|
|
||||||
|
asset.name = path.stem().string();
|
||||||
asset.compiled = false;
|
asset.compiled = false;
|
||||||
asset.numBytes = totalBytes;
|
asset.numBytes = static_cast<uint32_t>(totalBytes);
|
||||||
asset.width = file.GetWidth();
|
asset.width = file.GetWidth();
|
||||||
asset.height = file.GetHeight();
|
asset.height = file.GetHeight();
|
||||||
asset.format = ddsLoaderToVkFormat(file.GetFormat(), true);
|
asset.format = ddsLoaderToVkFormat(file.GetFormat(), true);
|
||||||
|
|
|
@ -26,8 +26,8 @@ namespace SHADE
|
||||||
|
|
||||||
|
|
||||||
static void LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept;
|
static void LoadTinyDDS(AssetPath path, SHTextureAsset& asset) noexcept;
|
||||||
static void LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept;
|
|
||||||
public:
|
public:
|
||||||
static void LoadImageAsset(AssetPath paths, SHTextureAsset& image);
|
static void LoadImageAsset(AssetPath paths, SHTextureAsset& image);
|
||||||
|
static void LoadSHTexture(AssetPath path, SHTextureAsset& asset) noexcept;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ typedef FMOD::Sound* SHSound;
|
||||||
#define ASSET_META_VER "1.0"
|
#define ASSET_META_VER "1.0"
|
||||||
|
|
||||||
// Asset type enum
|
// Asset type enum
|
||||||
enum class AssetType : uint8_t
|
enum class AssetType : AssetTypeMeta
|
||||||
{
|
{
|
||||||
INVALID = 0,
|
INVALID = 0,
|
||||||
AUDIO = 1,
|
AUDIO = 1,
|
||||||
|
@ -57,7 +57,12 @@ enum class AssetType : uint8_t
|
||||||
};
|
};
|
||||||
|
|
||||||
//Directory
|
//Directory
|
||||||
#define ASSET_ROOT "./Assets/"
|
#ifdef _PUBLISH
|
||||||
|
#define ASSET_ROOT "Assets"
|
||||||
|
#else
|
||||||
|
#define ASSET_ROOT "../../Assets"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ASSET EXTENSIONS
|
// ASSET EXTENSIONS
|
||||||
#define META_EXTENSION ".shmeta"
|
#define META_EXTENSION ".shmeta"
|
||||||
|
|
|
@ -72,12 +72,13 @@ namespace SHADE
|
||||||
|
|
||||||
AssetType type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string().c_str());
|
AssetType type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string().c_str());
|
||||||
std::string folder;
|
std::string folder;
|
||||||
switch (type)
|
//TODO Implement asset type generation
|
||||||
{
|
//switch (type)
|
||||||
default:
|
//{
|
||||||
//TODO:ASSERT UNSUPPORTED FILE TYPE
|
//default:
|
||||||
return std::filesystem::path();
|
// //TODO:ASSERT UNSUPPORTED FILE TYPE
|
||||||
}
|
// return std::filesystem::path();
|
||||||
|
//}
|
||||||
|
|
||||||
return std::filesystem::path(ASSET_ROOT + folder + path.filename().string());
|
return std::filesystem::path(ASSET_ROOT + folder + path.filename().string());
|
||||||
}
|
}
|
||||||
|
@ -108,12 +109,13 @@ namespace SHADE
|
||||||
meta.type = type;
|
meta.type = type;
|
||||||
|
|
||||||
std::string folder;
|
std::string folder;
|
||||||
switch (type)
|
//TODO implement folder choosing
|
||||||
{
|
//switch (type)
|
||||||
default:
|
//{
|
||||||
folder = "";
|
//default:
|
||||||
break;
|
// folder = "";
|
||||||
}
|
// break;
|
||||||
|
//}
|
||||||
AssetPath path{ ASSET_ROOT + folder + name + SHAssetMetaHandler::GetExtensionFromType(type) };
|
AssetPath path{ ASSET_ROOT + folder + name + SHAssetMetaHandler::GetExtensionFromType(type) };
|
||||||
|
|
||||||
SHAssetMetaHandler::WriteMetaData(meta);
|
SHAssetMetaHandler::WriteMetaData(meta);
|
||||||
|
@ -253,6 +255,26 @@ namespace SHADE
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHMeshAsset const* SHAssetManager::GetMesh(AssetID id) noexcept
|
||||||
|
{
|
||||||
|
if (meshCollection.find(id) == meshCollection.end())
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &meshCollection[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
SHTextureAsset const* SHAssetManager::GetTexture(AssetID id) noexcept
|
||||||
|
{
|
||||||
|
if (textureCollection.find(id) == textureCollection.end())
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &textureCollection[id];
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* \param Path for meta data file
|
* \param Path for meta data file
|
||||||
* \param Path for asset file
|
* \param Path for asset file
|
||||||
|
@ -305,12 +327,22 @@ namespace SHADE
|
||||||
|
|
||||||
for (auto const& mesh : meshes)
|
for (auto const& mesh : meshes)
|
||||||
{
|
{
|
||||||
meshCollection.emplace(GenerateAssetID(AssetType::MESH), mesh);
|
auto id{ GenerateAssetID(AssetType::MESH) };
|
||||||
|
meshCollection.emplace(id, mesh);
|
||||||
|
|
||||||
|
AssetPath path;
|
||||||
if (!mesh.compiled)
|
if (!mesh.compiled)
|
||||||
{
|
{
|
||||||
SHMeshCompiler::CompileMeshBinary(mesh, asset.path);
|
path = SHMeshCompiler::CompileMeshBinary(mesh, asset.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assetCollection.emplace_back(
|
||||||
|
mesh.header.meshName,
|
||||||
|
id,
|
||||||
|
AssetType::MESH,
|
||||||
|
path,
|
||||||
|
0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -320,11 +352,20 @@ namespace SHADE
|
||||||
|
|
||||||
SHTextureLoader::LoadImageAsset(asset.path, image);
|
SHTextureLoader::LoadImageAsset(asset.path, image);
|
||||||
|
|
||||||
textureCollection.emplace(GenerateAssetID(AssetType::DDS), image);
|
|
||||||
|
|
||||||
if (!image.compiled)
|
if (!image.compiled)
|
||||||
{
|
{
|
||||||
SHTextureCompiler::CompileTextureBinary(image, asset.path);
|
auto id{ GenerateAssetID(AssetType::TEXTURE) };
|
||||||
|
textureCollection.emplace(id, image);
|
||||||
|
|
||||||
|
auto path{ SHTextureCompiler::CompileTextureBinary(image, asset.path) };
|
||||||
|
|
||||||
|
assetCollection.emplace_back(
|
||||||
|
image.name,
|
||||||
|
id,
|
||||||
|
AssetType::TEXTURE,
|
||||||
|
path,
|
||||||
|
0
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,8 +383,24 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void SHAssetManager::LoadAllData() noexcept
|
void SHAssetManager::LoadAllData() noexcept
|
||||||
{
|
{
|
||||||
|
//TODO Remove when on demand loading is done
|
||||||
for (auto const& asset : assetCollection)
|
for (auto const& asset : assetCollection)
|
||||||
{
|
{
|
||||||
|
switch (asset.type)
|
||||||
|
{
|
||||||
|
case AssetType::MESH:
|
||||||
|
meshCollection.emplace(asset.id, SHMeshAsset());
|
||||||
|
SHMeshLoader::LoadSHMesh(meshCollection[asset.id], asset.path);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AssetType::TEXTURE:
|
||||||
|
textureCollection.emplace(asset.id, SHTextureAsset());
|
||||||
|
SHTextureLoader::LoadSHTexture(asset.path, textureCollection[asset.id]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
void;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,40 +417,51 @@ namespace SHADE
|
||||||
std::vector<AssetPath> metaFiles;
|
std::vector<AssetPath> metaFiles;
|
||||||
std::vector<AssetPath> AssetFiles;
|
std::vector<AssetPath> AssetFiles;
|
||||||
|
|
||||||
//TODO: Write new function for file manager to loop through all files
|
for (auto const dir : std::filesystem::recursive_directory_iterator(ASSET_ROOT))
|
||||||
SHFileSystem::StartupFillDirectories(ASSET_ROOT);
|
{
|
||||||
FolderPointer rootFolder = SHFileSystem::GetRoot();
|
if (dir.path().extension().string() == META_EXTENSION)
|
||||||
|
{
|
||||||
|
auto meta{ SHAssetMetaHandler::RetrieveMetaData(dir.path()) };
|
||||||
|
|
||||||
for (auto const& meta : metaFiles)
|
assetCollection.push_back(meta);
|
||||||
{
|
assetRegistry.emplace(meta.id, meta);
|
||||||
for (std::vector<AssetPath>::const_iterator it{ AssetFiles.cbegin() };
|
|
||||||
it != AssetFiles.cend();
|
|
||||||
++it)
|
|
||||||
{
|
|
||||||
// Asset exists for meta file
|
|
||||||
std::string fileExtCheck{ it->filename().string() };
|
|
||||||
fileExtCheck += META_EXTENSION;
|
|
||||||
if (meta.filename().string() == fileExtCheck)
|
|
||||||
{
|
|
||||||
RegisterAsset(meta, *it);
|
|
||||||
AssetFiles.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: Write new function for file manager to loop through all files
|
||||||
|
//SHFileSystem::StartupFillDirectories(ASSET_ROOT);
|
||||||
|
//FolderPointer rootFolder = SHFileSystem::GetRoot();
|
||||||
|
|
||||||
|
//for (auto const& meta : metaFiles)
|
||||||
|
//{
|
||||||
|
// for (std::vector<AssetPath>::const_iterator it{ AssetFiles.cbegin() };
|
||||||
|
// it != AssetFiles.cend();
|
||||||
|
// ++it)
|
||||||
|
// {
|
||||||
|
// // Asset exists for meta file
|
||||||
|
// std::string fileExtCheck{ it->filename().string() };
|
||||||
|
// fileExtCheck += META_EXTENSION;
|
||||||
|
// if (meta.filename().string() == fileExtCheck)
|
||||||
|
// {
|
||||||
|
// RegisterAsset(meta, *it);
|
||||||
|
// AssetFiles.erase(it);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
//TODO: Handle if meta does not match all assets (if meta exist and asset doesnt, vice versa)
|
//TODO: Handle if meta does not match all assets (if meta exist and asset doesnt, vice versa)
|
||||||
for (auto const& file : AssetFiles)
|
//for (auto const& file : AssetFiles)
|
||||||
{
|
//{
|
||||||
if (IsRecognised(file.extension().string().c_str()))
|
// if (IsRecognised(file.extension().string().c_str()))
|
||||||
{
|
// {
|
||||||
SHAssetMetaHandler::WriteMetaData(RegisterAssetNew(file));
|
// SHAssetMetaHandler::WriteMetaData(RegisterAssetNew(file));
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
std::cout << "Unsupported File Format: " << file.filename() << "\n";
|
// std::cout << "Unsupported File Format: " << file.filename() << "\n";
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
AssetID SHAssetManager::RetrieveAsset(char const* path) noexcept
|
AssetID SHAssetManager::RetrieveAsset(char const* path) noexcept
|
||||||
|
|
|
@ -75,6 +75,8 @@ namespace SHADE
|
||||||
static std::vector<SHMeshAsset> GetAllMeshes() noexcept;
|
static std::vector<SHMeshAsset> GetAllMeshes() noexcept;
|
||||||
static std::vector<SHTextureAsset> GetAllTextures() noexcept;
|
static std::vector<SHTextureAsset> GetAllTextures() noexcept;
|
||||||
|
|
||||||
|
static SHMeshAsset const* GetMesh(AssetID id) noexcept;
|
||||||
|
static SHTextureAsset const* GetTexture(AssetID id) noexcept;
|
||||||
private:
|
private:
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* \brief Load resource data into memory
|
* \brief Load resource data into memory
|
||||||
|
|
|
@ -72,6 +72,13 @@ namespace SHADE
|
||||||
std::string line;
|
std::string line;
|
||||||
SHAsset meta;
|
SHAsset meta;
|
||||||
|
|
||||||
|
// Get resource name
|
||||||
|
GetFieldValue(metaFile, line);
|
||||||
|
std::stringstream nameStream{ line };
|
||||||
|
AssetName name;
|
||||||
|
nameStream >> name;
|
||||||
|
meta.name = name;
|
||||||
|
|
||||||
// Get resource id
|
// Get resource id
|
||||||
GetFieldValue(metaFile, line);
|
GetFieldValue(metaFile, line);
|
||||||
std::stringstream idStream{ line };
|
std::stringstream idStream{ line };
|
||||||
|
@ -88,6 +95,8 @@ namespace SHADE
|
||||||
|
|
||||||
metaFile.close();
|
metaFile.close();
|
||||||
|
|
||||||
|
meta.path = path.parent_path().string() + "/" + path.stem().string();
|
||||||
|
|
||||||
return meta;
|
return meta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +112,7 @@ namespace SHADE
|
||||||
std::string path{ meta.path.string() };
|
std::string path{ meta.path.string() };
|
||||||
path.append(META_EXTENSION);
|
path.append(META_EXTENSION);
|
||||||
|
|
||||||
std::ofstream metaFile{ path, std::ios_base::out };
|
std::ofstream metaFile{ path, std::ios_base::out | std::ios_base::trunc };
|
||||||
|
|
||||||
if (!metaFile.is_open())
|
if (!metaFile.is_open())
|
||||||
{
|
{
|
||||||
|
@ -113,17 +122,17 @@ namespace SHADE
|
||||||
|
|
||||||
metaFile << "Name: " << meta.name << "\n";
|
metaFile << "Name: " << meta.name << "\n";
|
||||||
metaFile << "ID: " << meta.id << "\n";
|
metaFile << "ID: " << meta.id << "\n";
|
||||||
metaFile << "Type: " << static_cast<int>(meta.type) << std::endl;
|
metaFile << "Type: " << static_cast<AssetTypeMeta>(meta.type) << std::endl;
|
||||||
|
|
||||||
//TODO Add in information that is specific to types like mesh
|
////TODO Add in information that is specific to types like mesh
|
||||||
switch(meta.type)
|
//switch(meta.type)
|
||||||
{
|
//{
|
||||||
case AssetType::MESH:
|
//case AssetType::MESH:
|
||||||
break;
|
// break;
|
||||||
|
|
||||||
default:
|
//default:
|
||||||
void;
|
// break;
|
||||||
}
|
//}
|
||||||
|
|
||||||
metaFile.close();
|
metaFile.close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,7 @@ namespace SHADE
|
||||||
//PlayEventOnce("event:/SFX/Dawn/Dawn_Attack");
|
//PlayEventOnce("event:/SFX/Dawn/Dawn_Attack");
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHADE::SHAudioSystem::Run(float dt)
|
void SHADE::SHAudioSystem::Run(double dt)
|
||||||
{
|
{
|
||||||
static_cast<void>(dt);
|
static_cast<void>(dt);
|
||||||
//if (GetKeyState(VK_SPACE) & 0x8000)
|
//if (GetKeyState(VK_SPACE) & 0x8000)
|
||||||
|
@ -417,7 +417,7 @@ namespace SHADE
|
||||||
int instanceCount = 0;
|
int instanceCount = 0;
|
||||||
event.second->getInstanceCount(&instanceCount);
|
event.second->getInstanceCount(&instanceCount);
|
||||||
std::vector<FMOD::Studio::EventInstance*> instances(instanceCount);
|
std::vector<FMOD::Studio::EventInstance*> instances(instanceCount);
|
||||||
event.second->getInstanceList(instances.data(), instances.size(), &instanceCount);
|
event.second->getInstanceList(instances.data(), static_cast<int>(instances.size()), &instanceCount);
|
||||||
for (auto const& instance : instances)
|
for (auto const& instance : instances)
|
||||||
{
|
{
|
||||||
instance->setPaused(pause);
|
instance->setPaused(pause);
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace SHADE
|
||||||
~SHAudioSystem();
|
~SHAudioSystem();
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
void Run(float dt);
|
void Run(double dt);
|
||||||
class SH_API AudioRoutine final : public SHSystemRoutine
|
class SH_API AudioRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -8,23 +8,19 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
class SHFixedSystemRoutine: public SHSystemRoutine
|
class SHFixedSystemRoutine: public SHSystemRoutine
|
||||||
{
|
{
|
||||||
private:
|
protected:
|
||||||
double accumulatedTime;
|
double accumulatedTime;
|
||||||
double fixedTimeStep;
|
double fixedTimeStep;
|
||||||
|
|
||||||
protected:
|
|
||||||
SHFixedSystemRoutine(double timeStep = DEFAULT_FIXED_STEP, std::string routineName = "Default Fixed Routine Name", bool editorPause = false)
|
SHFixedSystemRoutine(double timeStep = DEFAULT_FIXED_STEP, std::string routineName = "Default Fixed Routine Name", bool editorPause = false)
|
||||||
:SHSystemRoutine(routineName, editorPause), accumulatedTime(0.0), fixedTimeStep(timeStep){}
|
:SHSystemRoutine(routineName, editorPause), accumulatedTime(0.0), fixedTimeStep(timeStep){}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~SHFixedSystemRoutine() = default;
|
~SHFixedSystemRoutine() = default;
|
||||||
|
|
||||||
virtual void Execute(double dt) noexcept;
|
virtual void Execute(double dt) noexcept override;
|
||||||
|
|
||||||
virtual void FixedExecute(double dt) noexcept {};
|
|
||||||
|
|
||||||
|
virtual void FixedExecute(double dt) noexcept {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,13 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
|
#include "SH_API.h"
|
||||||
|
#include "Scripting/SHScriptEngine.h"
|
||||||
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
class SHBaseCommand
|
class SH_API SHBaseCommand
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~SHBaseCommand() = default;
|
virtual ~SHBaseCommand() = default;
|
||||||
|
@ -48,4 +52,20 @@ namespace SHADE
|
||||||
T newValue;
|
T newValue;
|
||||||
SetterFunction set;
|
SetterFunction set;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SH_API SHCLICommand : SHBaseCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SHCLICommand() = default;
|
||||||
|
void Execute() override
|
||||||
|
{
|
||||||
|
SHScriptEngine* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
||||||
|
scriptEngine->RedoScriptInspectorChanges();
|
||||||
|
}
|
||||||
|
void Undo() override
|
||||||
|
{
|
||||||
|
SHScriptEngine* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
||||||
|
scriptEngine->UndoScriptInspectorChanges();
|
||||||
|
}
|
||||||
|
};
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -27,6 +27,11 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHCommandManager::RegisterCommand(CommandPtr commandPtr)
|
||||||
|
{
|
||||||
|
undoStack.push(commandPtr);
|
||||||
|
}
|
||||||
|
|
||||||
void SHCommandManager::UndoCommand()
|
void SHCommandManager::UndoCommand()
|
||||||
{
|
{
|
||||||
if (undoStack.empty())
|
if (undoStack.empty())
|
||||||
|
|
|
@ -9,10 +9,11 @@
|
||||||
//|| SHADE Includes ||
|
//|| SHADE Includes ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
#include "SHCommand.hpp"
|
#include "SHCommand.hpp"
|
||||||
|
#include "SH_API.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
class SHCommandManager
|
class SH_API SHCommandManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
@ -22,6 +23,7 @@ namespace SHADE
|
||||||
using CommandStack = std::stack<CommandPtr>;
|
using CommandStack = std::stack<CommandPtr>;
|
||||||
|
|
||||||
static void PerformCommand(CommandPtr commandPtr, bool const& overrideValue = false);
|
static void PerformCommand(CommandPtr commandPtr, bool const& overrideValue = false);
|
||||||
|
static void RegisterCommand(CommandPtr commandPtr);
|
||||||
static void UndoCommand();
|
static void UndoCommand();
|
||||||
static void RedoCommand();
|
static void RedoCommand();
|
||||||
static std::size_t GetUndoStackSize();
|
static std::size_t GetUndoStackSize();
|
||||||
|
|
|
@ -6,11 +6,11 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| SHADE Includes ||
|
//|| SHADE Includes ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
#include "Editor/SHEditor.hpp"
|
||||||
#include "Editor/SHImGuiHelpers.hpp"
|
#include "Editor/SHImGuiHelpers.hpp"
|
||||||
#include "Editor/SHEditorWidgets.hpp"
|
#include "Editor/SHEditorWidgets.hpp"
|
||||||
#include "SHHierarchyPanel.h"
|
#include "SHHierarchyPanel.h"
|
||||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
#include "Editor/SHEditor.hpp"
|
|
||||||
#include "Scene/SHSceneManager.h"
|
#include "Scene/SHSceneManager.h"
|
||||||
#include "Editor/DragDrop/SHDragDrop.hpp"
|
#include "Editor/DragDrop/SHDragDrop.hpp"
|
||||||
#include "Tools/SHException.h"
|
#include "Tools/SHException.h"
|
||||||
|
@ -62,11 +62,12 @@ namespace SHADE
|
||||||
|
|
||||||
if(ImGui::IsWindowHovered() && !SHDragDrop::hasDragDrop && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(ImGuiMouseButton_Left))
|
if(ImGui::IsWindowHovered() && !SHDragDrop::hasDragDrop && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(ImGuiMouseButton_Left))
|
||||||
{
|
{
|
||||||
SHEditor::selectedEntities.clear();
|
if(auto editor = SHSystemManager::GetSystem<SHEditor>())
|
||||||
|
editor->selectedEntities.clear();
|
||||||
}
|
}
|
||||||
ImGui::SeparatorEx(ImGuiSeparatorFlags_Horizontal);
|
ImGui::SeparatorEx(ImGuiSeparatorFlags_Horizontal);
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHHierarchyPanel::Exit()
|
void SHHierarchyPanel::Exit()
|
||||||
|
@ -74,6 +75,11 @@ namespace SHADE
|
||||||
SHEditorWindow::Exit();
|
SHEditorWindow::Exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHHierarchyPanel::SetScrollTo(EntityID eid)
|
||||||
|
{
|
||||||
|
scrollTo = eid;
|
||||||
|
}
|
||||||
|
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Private Member Functions ||
|
//|| Private Member Functions ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
@ -81,7 +87,20 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if (ImGui::BeginMenuBar())
|
if (ImGui::BeginMenuBar())
|
||||||
{
|
{
|
||||||
if (ImGui::SmallButton(ICON_MD_ADD))
|
|
||||||
|
ImGui::SetCursorPosX(ImGui::GetContentRegionAvail().x - 35.0f);
|
||||||
|
if(ImGui::SmallButton(ICON_MD_DESELECT))
|
||||||
|
{
|
||||||
|
auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
|
editor->selectedEntities.clear();
|
||||||
|
}
|
||||||
|
if (ImGui::IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui::BeginTooltip();
|
||||||
|
ImGui::Text("Clear Selections");
|
||||||
|
ImGui::EndTooltip();
|
||||||
|
}
|
||||||
|
if (ImGui::SmallButton(ICON_MD_ADD_CIRCLE))
|
||||||
{
|
{
|
||||||
SHEntityManager::CreateEntity();
|
SHEntityManager::CreateEntity();
|
||||||
}
|
}
|
||||||
|
@ -102,7 +121,16 @@ namespace SHADE
|
||||||
//Get node data (Children, eid, selected)
|
//Get node data (Children, eid, selected)
|
||||||
auto& children = currentNode->GetChildren();
|
auto& children = currentNode->GetChildren();
|
||||||
EntityID eid = currentNode->GetEntityID();
|
EntityID eid = currentNode->GetEntityID();
|
||||||
const bool isSelected = (std::ranges::find(SHEditor::selectedEntities, eid) != SHEditor::selectedEntities.end());
|
|
||||||
|
if(scrollTo != MAX_EID && eid == scrollTo)
|
||||||
|
{
|
||||||
|
ImGui::SetScrollHereY();
|
||||||
|
scrollTo = MAX_EID;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
|
|
||||||
|
const bool isSelected = (std::ranges::find(editor->selectedEntities, eid) != editor->selectedEntities.end());
|
||||||
|
|
||||||
const ImGuiTreeNodeFlags nodeFlags = ((isSelected) ? ImGuiTreeNodeFlags_Selected : 0) | ((children.empty()) ? ImGuiTreeNodeFlags_Leaf : ImGuiTreeNodeFlags_OpenOnArrow);
|
const ImGuiTreeNodeFlags nodeFlags = ((isSelected) ? ImGuiTreeNodeFlags_Selected : 0) | ((children.empty()) ? ImGuiTreeNodeFlags_Leaf : ImGuiTreeNodeFlags_OpenOnArrow);
|
||||||
|
|
||||||
|
@ -114,7 +142,7 @@ namespace SHADE
|
||||||
|
|
||||||
auto* entity = SHEntityManager::GetEntityByID(currentNode->GetEntityID());
|
auto* entity = SHEntityManager::GetEntityByID(currentNode->GetEntityID());
|
||||||
//Draw Node
|
//Draw Node
|
||||||
bool isNodeOpen = ImGui::TreeNodeEx((void*)eid, nodeFlags, "%u: %s", EntityHandleGenerator::GetIndex(eid), entity->name.c_str());
|
bool isNodeOpen = ImGui::TreeNodeEx(reinterpret_cast<void*>(entity), nodeFlags, "%u: %s", EntityHandleGenerator::GetIndex(eid), entity->name.c_str());
|
||||||
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
||||||
|
|
||||||
//Check For Begin Drag
|
//Check For Begin Drag
|
||||||
|
@ -140,8 +168,8 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if(!isSelected)
|
if(!isSelected)
|
||||||
{
|
{
|
||||||
SHEditor::selectedEntities.clear();
|
editor->selectedEntities.clear();
|
||||||
SHEditor::selectedEntities.push_back(eid);
|
editor->selectedEntities.push_back(eid);
|
||||||
}
|
}
|
||||||
if(ImGui::Selectable(std::format("{} Delete", ICON_MD_DELETE).data()))
|
if(ImGui::Selectable(std::format("{} Delete", ICON_MD_DELETE).data()))
|
||||||
{
|
{
|
||||||
|
@ -163,19 +191,19 @@ namespace SHADE
|
||||||
if (!isSelected)
|
if (!isSelected)
|
||||||
{
|
{
|
||||||
if (!ImGui::IsKeyDown(ImGuiKey_LeftCtrl))
|
if (!ImGui::IsKeyDown(ImGuiKey_LeftCtrl))
|
||||||
SHEditor::selectedEntities.clear();
|
editor->selectedEntities.clear();
|
||||||
SHEditor::selectedEntities.push_back(eid);
|
editor->selectedEntities.push_back(eid);
|
||||||
}//if not selected
|
}//if not selected
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ImGui::IsKeyDown(ImGuiKey_LeftCtrl))
|
if (!ImGui::IsKeyDown(ImGuiKey_LeftCtrl))
|
||||||
{
|
{
|
||||||
auto it = std::ranges::remove(SHEditor::selectedEntities, eid).begin();
|
auto it = std::ranges::remove(editor->selectedEntities, eid).begin();
|
||||||
}//if mod ctrl is not pressed
|
}//if mod ctrl is not pressed
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SHEditor::selectedEntities.clear();
|
editor->selectedEntities.clear();
|
||||||
SHEditor::selectedEntities.push_back(eid);
|
editor->selectedEntities.push_back(eid);
|
||||||
}
|
}
|
||||||
}//if selected
|
}//if selected
|
||||||
}//if left mouse button released
|
}//if left mouse button released
|
||||||
|
|
|
@ -23,11 +23,13 @@ namespace SHADE
|
||||||
void Init() override;
|
void Init() override;
|
||||||
void Update() override;
|
void Update() override;
|
||||||
void Exit() override;
|
void Exit() override;
|
||||||
|
void SetScrollTo(EntityID eid);
|
||||||
private:
|
private:
|
||||||
void DrawMenuBar() const noexcept;
|
void DrawMenuBar() const noexcept;
|
||||||
ImRect RecursivelyDrawEntityNode(SHSceneNode*);
|
ImRect RecursivelyDrawEntityNode(SHSceneNode*);
|
||||||
void CreateChildEntity(EntityID parentEID) const noexcept;
|
void CreateChildEntity(EntityID parentEID) const noexcept;
|
||||||
std::string filter;
|
std::string filter;
|
||||||
bool isAnyNodeSelected = false;
|
bool isAnyNodeSelected = false;
|
||||||
|
EntityID scrollTo = MAX_EID;
|
||||||
};//class SHHierarchyPanel
|
};//class SHHierarchyPanel
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "Editor/IconsMaterialDesign.h"
|
#include "Editor/IconsMaterialDesign.h"
|
||||||
#include "ECS_Base/Components/SHComponent.h"
|
#include "ECS_Base/Components/SHComponent.h"
|
||||||
#include "Editor/SHEditorWidgets.hpp"
|
#include "Editor/SHEditorWidgets.hpp"
|
||||||
|
#include "Physics/Components/SHColliderComponent.h"
|
||||||
#include "Reflection/SHReflectionMetadata.h"
|
#include "Reflection/SHReflectionMetadata.h"
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -45,8 +46,8 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if (!component)
|
if (!component)
|
||||||
return;
|
return;
|
||||||
auto componentType = rttr::type::get<T>();
|
const auto componentType = rttr::type::get(*component);
|
||||||
CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; });
|
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; });
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::CollapsingHeader(componentType.get_name().data()))
|
if (ImGui::CollapsingHeader(componentType.get_name().data()))
|
||||||
{
|
{
|
||||||
|
@ -190,4 +191,76 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
else DrawContextMenu(component);
|
else DrawContextMenu(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
static void DrawComponent(SHColliderComponent* component)
|
||||||
|
{
|
||||||
|
if (!component)
|
||||||
|
return;
|
||||||
|
const auto componentType = rttr::type::get(*component);
|
||||||
|
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; });
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::CollapsingHeader(componentType.get_name().data()))
|
||||||
|
{
|
||||||
|
DrawContextMenu(component);
|
||||||
|
|
||||||
|
auto& colliders = component->GetColliders();
|
||||||
|
int const size = static_cast<int>(colliders.size());
|
||||||
|
ImGui::BeginChild("Colliders", {0.0f, colliders.empty() ? 1.0f : 250.0f}, true);
|
||||||
|
std::optional<int> colliderToDelete{std::nullopt};
|
||||||
|
for (int i{}; i < size; ++i)
|
||||||
|
{
|
||||||
|
ImGui::PushID(i);
|
||||||
|
SHCollider& collider = component->GetCollider(i);
|
||||||
|
auto cursorPos = ImGui::GetCursorPos();
|
||||||
|
|
||||||
|
if (collider.GetType() == SHCollider::Type::BOX)
|
||||||
|
{
|
||||||
|
SHEditorWidgets::BeginPanel( std::format("{} Box Collider #{}", ICON_MD_VIEW_IN_AR, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y });
|
||||||
|
auto box = reinterpret_cast<SHBoundingBox*>(collider.GetShape());
|
||||||
|
SHEditorWidgets::DragVec3("Half Extents", { "X", "Y", "Z" }, [box] {return box->GetHalfExtents(); }, [box](SHVec3 const& vec) {box->SetHalfExtents(vec);});
|
||||||
|
}
|
||||||
|
else if (collider.GetType() == SHCollider::Type::SPHERE)
|
||||||
|
{
|
||||||
|
SHEditorWidgets::BeginPanel(std::format("{} Sphere Collider #{}", ICON_MD_CIRCLE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y });
|
||||||
|
auto sphere = reinterpret_cast<SHBoundingSphere*>(collider.GetShape());
|
||||||
|
SHEditorWidgets::DragFloat("Radius", [sphere] {return sphere->GetRadius(); }, [sphere](float const& value) {sphere->SetRadius(value);});
|
||||||
|
}
|
||||||
|
else if (collider.GetType() == SHCollider::Type::CAPSULE)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
{
|
||||||
|
SHEditorWidgets::BeginPanel("Offset", { ImGui::GetContentRegionAvail().x, 30.0f });
|
||||||
|
SHEditorWidgets::DragVec3("Position", { "X", "Y", "Z" }, [&collider] {return collider.GetPositionOffset(); }, [&collider](SHVec3 const& vec) {collider.SetPositionOffset(vec); });
|
||||||
|
SHEditorWidgets::EndPanel();
|
||||||
|
}
|
||||||
|
if(ImGui::Button(std::format("{} Remove Collider #{}", ICON_MD_REMOVE, i).data()))
|
||||||
|
{
|
||||||
|
colliderToDelete = i;
|
||||||
|
}
|
||||||
|
SHEditorWidgets::EndPanel();
|
||||||
|
ImGui::PopID();
|
||||||
|
}
|
||||||
|
if(colliderToDelete.has_value())
|
||||||
|
{
|
||||||
|
component->RemoveCollider(colliderToDelete.value());
|
||||||
|
}
|
||||||
|
ImGui::EndChild();
|
||||||
|
|
||||||
|
if (ImGui::BeginMenu("Add Collider"))
|
||||||
|
{
|
||||||
|
if(ImGui::Selectable("Box Collider"))
|
||||||
|
{
|
||||||
|
component->AddBoundingBox();
|
||||||
|
}
|
||||||
|
if(ImGui::Selectable("Sphere Collider"))
|
||||||
|
{
|
||||||
|
component->AddBoundingSphere();
|
||||||
|
}
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else DrawContextMenu(component);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
#include "SHpch.h"
|
#include "SHpch.h"
|
||||||
|
|
||||||
|
#include "Editor/SHEditor.hpp"
|
||||||
#include "SHEditorInspector.h"
|
#include "SHEditorInspector.h"
|
||||||
|
|
||||||
#include "ECS_Base/SHECSMacros.h"
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
|
@ -7,7 +8,6 @@
|
||||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
|
|
||||||
#include "Editor/SHEditor.hpp"
|
|
||||||
#include "Editor/SHImGuiHelpers.hpp"
|
#include "Editor/SHImGuiHelpers.hpp"
|
||||||
#include "Editor/SHEditorWidgets.hpp"
|
#include "Editor/SHEditorWidgets.hpp"
|
||||||
#include "SHEditorComponentView.hpp"
|
#include "SHEditorComponentView.hpp"
|
||||||
|
@ -18,16 +18,21 @@
|
||||||
|
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
#include "AudioSystem/SHAudioSystem.h"
|
#include "AudioSystem/SHAudioSystem.h"
|
||||||
|
#include "Physics/Components/SHRigidBodyComponent.h"
|
||||||
|
#include "Physics/Components/SHColliderComponent.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
template<typename ComponentType, std::enable_if_t<std::is_base_of_v<SHComponent, ComponentType>, bool> = true>
|
template<typename ComponentType, std::enable_if_t<std::is_base_of_v<SHComponent, ComponentType>, bool> = true>
|
||||||
void DrawAddComponentButton(EntityID const& eid)
|
bool DrawAddComponentButton(EntityID const& eid)
|
||||||
{
|
{
|
||||||
if(!SHComponentManager::HasComponent<ComponentType>(eid) && ImGui::Selectable(std::format("Add {}", rttr::type::get<ComponentType>().get_name().data()).data()))
|
bool selected = false;
|
||||||
|
if(!SHComponentManager::HasComponent<ComponentType>(eid))
|
||||||
{
|
{
|
||||||
|
if(selected = ImGui::Selectable(std::format("Add {}", rttr::type::get<ComponentType>().get_name().data()).data()); selected)
|
||||||
SHComponentManager::AddComponent<ComponentType>(eid);
|
SHComponentManager::AddComponent<ComponentType>(eid);
|
||||||
}
|
}
|
||||||
|
return selected;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHEditorInspector::SHEditorInspector()
|
SHEditorInspector::SHEditorInspector()
|
||||||
|
@ -45,15 +50,10 @@ namespace SHADE
|
||||||
SHEditorWindow::Update();
|
SHEditorWindow::Update();
|
||||||
if (Begin())
|
if (Begin())
|
||||||
{
|
{
|
||||||
if (ImGui::Button("AUDIO"))
|
auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
|
if (editor && !editor->selectedEntities.empty())
|
||||||
{
|
{
|
||||||
auto audioSystem = SHSystemManager::GetSystem<SHADE::SHAudioSystem>();
|
EntityID const& eid = editor->selectedEntities[0];
|
||||||
audioSystem->PlayEventOnce("event:/Characters/sfx_footsteps_raccoon");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!SHEditor::selectedEntities.empty())
|
|
||||||
{
|
|
||||||
EntityID const& eid = SHEditor::selectedEntities[0];
|
|
||||||
SHEntity* entity = SHEntityManager::GetEntityByID(eid);
|
SHEntity* entity = SHEntityManager::GetEntityByID(eid);
|
||||||
|
|
||||||
ImGui::TextColored(ImGuiColors::green, "EID: %zu", eid);
|
ImGui::TextColored(ImGuiColors::green, "EID: %zu", eid);
|
||||||
|
@ -70,27 +70,38 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
DrawComponent(renderableComponent);
|
DrawComponent(renderableComponent);
|
||||||
}
|
}
|
||||||
if(auto testComponent = SHComponentManager::GetComponent_s<SHComponent_ENUM>(eid))
|
if(auto colliderComponent = SHComponentManager::GetComponent_s<SHColliderComponent>(eid))
|
||||||
{
|
{
|
||||||
DrawComponent(testComponent);
|
DrawComponent(colliderComponent);
|
||||||
}
|
}
|
||||||
|
if(auto rigidbodyComponent = SHComponentManager::GetComponent_s<SHRigidBodyComponent>(eid))
|
||||||
|
{
|
||||||
|
DrawComponent(rigidbodyComponent);
|
||||||
|
}
|
||||||
|
ImGui::Separator();
|
||||||
|
// Render Scripts
|
||||||
|
SHScriptEngine* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
||||||
|
scriptEngine->RenderScriptsInInspector(eid);
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if(ImGui::BeginMenu(std::format("{} Add Component", ICON_MD_LIBRARY_ADD).data()))
|
if(ImGui::BeginMenu(std::format("{} Add Component", ICON_MD_LIBRARY_ADD).data()))
|
||||||
{
|
{
|
||||||
DrawAddComponentButton<SHTransformComponent>(eid);
|
DrawAddComponentButton<SHTransformComponent>(eid);
|
||||||
DrawAddComponentButton<SHRenderable>(eid);
|
DrawAddComponentButton<SHRenderable>(eid);
|
||||||
DrawAddComponentButton<SHComponent_ENUM>(eid);
|
DrawAddComponentButton<SHColliderComponent>(eid);
|
||||||
|
if(DrawAddComponentButton<SHRigidBodyComponent>(eid))
|
||||||
|
{
|
||||||
|
if(SHComponentManager::GetComponent_s<SHTransformComponent>(eid) == nullptr)
|
||||||
|
{
|
||||||
|
SHComponentManager::AddComponent<SHTransformComponent>(eid);
|
||||||
|
}
|
||||||
|
}
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render Scripts
|
}
|
||||||
SHScriptEngine* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
|
||||||
scriptEngine->RenderScriptsInInspector(eid);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void SHEditorInspector::Exit()
|
void SHEditorInspector::Exit()
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| SHADE Includes ||
|
//|| SHADE Includes ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
#include "Editor/SHEditor.hpp"
|
||||||
#include "SHEditorMenuBar.h"
|
#include "SHEditorMenuBar.h"
|
||||||
#include "Editor/IconsMaterialDesign.h"
|
#include "Editor/IconsMaterialDesign.h"
|
||||||
#include "Editor/Command/SHCommandManager.h"
|
#include "Editor/Command/SHCommandManager.h"
|
||||||
#include "Scripting/SHScriptEngine.h"
|
#include "Scripting/SHScriptEngine.h"
|
||||||
#include "Editor/SHEditor.hpp"
|
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
@ -36,6 +36,11 @@ namespace SHADE
|
||||||
void SHEditorMenuBar::Init()
|
void SHEditorMenuBar::Init()
|
||||||
{
|
{
|
||||||
SHEditorWindow::Init();
|
SHEditorWindow::Init();
|
||||||
|
constexpr std::string_view path = "../../Assets/Editor/Layouts";
|
||||||
|
for(auto const& entry : std::filesystem::directory_iterator(path))
|
||||||
|
{
|
||||||
|
layoutPaths.push_back(entry.path());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHEditorMenuBar::Update()
|
void SHEditorMenuBar::Update()
|
||||||
|
@ -87,19 +92,6 @@ namespace SHADE
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
if(ImGui::BeginMenu("Theme"))
|
|
||||||
{
|
|
||||||
auto styles = rttr::type::get<SHEditor::Style>().get_enumeration();
|
|
||||||
auto values = styles.get_values();
|
|
||||||
for (auto style : values)
|
|
||||||
{
|
|
||||||
if(ImGui::Selectable(style.to_string().c_str()))
|
|
||||||
{
|
|
||||||
SHEditor::SetStyle(style.convert<SHEditor::Style>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ImGui::EndMenu();
|
|
||||||
}
|
|
||||||
if (ImGui::BeginMenu("Scripts"))
|
if (ImGui::BeginMenu("Scripts"))
|
||||||
{
|
{
|
||||||
if (ImGui::Selectable("Generate Visual Studio Project"))
|
if (ImGui::Selectable("Generate Visual Studio Project"))
|
||||||
|
@ -119,18 +111,79 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginMenu("Window"))
|
||||||
|
{
|
||||||
|
for (const auto& window : SHEditorWindowManager::editorWindows | std::views::values)
|
||||||
|
{
|
||||||
|
if (window.get() != this)
|
||||||
|
ImGui::Checkbox(window->windowName.data(), &window->isOpen);
|
||||||
|
}
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
if (ImGui::BeginMenu("Theme"))
|
||||||
|
{
|
||||||
|
const auto styles = rttr::type::get<SHEditor::Style>().get_enumeration();
|
||||||
|
auto values = styles.get_values();
|
||||||
|
for (auto style : values)
|
||||||
|
{
|
||||||
|
if (ImGui::Selectable(style.to_string().c_str()))
|
||||||
|
{
|
||||||
|
if (auto editor = SHSystemManager::GetSystem<SHEditor>())
|
||||||
|
editor->SetStyle(style.convert<SHEditor::Style>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
if(ImGui::BeginMenu("Layout"))
|
||||||
|
{
|
||||||
|
for(auto const& entry : layoutPaths)
|
||||||
|
{
|
||||||
|
if(ImGui::Selectable(entry.stem().string().c_str()))
|
||||||
|
{
|
||||||
|
ImGui::LoadIniSettingsFromDisk(entry.string().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
ImGui::EndMainMenuBar();
|
ImGui::EndMainMenuBar();
|
||||||
}
|
}
|
||||||
|
|
||||||
const ImGuiID dockspace_id = ImGui::GetID("DockSpace");
|
const ImGuiID dockspaceId = ImGui::GetID("DockSpace");
|
||||||
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspaceFlags);
|
ImGui::DockSpace(dockspaceId, ImVec2(0.0f, 0.0f), dockspaceFlags);
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHEditorMenuBar::DrawSecondaryBar() const noexcept
|
void SHEditorMenuBar::DrawSecondaryBar() const noexcept
|
||||||
{
|
{
|
||||||
|
ImGuiViewport* viewport = ImGui::GetMainViewport();
|
||||||
|
if(ImGui::BeginViewportSideBar("##SecondaryMenuBar", viewport, ImGuiDir_Up, ImGui::GetFrameHeight(), ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_MenuBar))
|
||||||
|
{
|
||||||
|
ImGui::BeginMenuBar();
|
||||||
|
ImGui::SetCursorPosX(ImGui::GetContentRegionAvail().x * 0.5f - 80.f);
|
||||||
|
const auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PLAY);
|
||||||
|
if(ImGui::SmallButton(ICON_MD_PLAY_ARROW))
|
||||||
|
{
|
||||||
|
editor->editorState = SHEditor::State::PLAY;
|
||||||
|
}
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PAUSE);
|
||||||
|
if(ImGui::SmallButton(ICON_MD_PAUSE))
|
||||||
|
{
|
||||||
|
editor->editorState = SHEditor::State::PAUSE;
|
||||||
|
}
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::STOP);
|
||||||
|
if(ImGui::SmallButton(ICON_MD_STOP))
|
||||||
|
{
|
||||||
|
editor->editorState = SHEditor::State::STOP;
|
||||||
|
}
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
ImGui::EndMenuBar();
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHEditorMenuBar::DrawStatusBar() const noexcept
|
void SHEditorMenuBar::DrawStatusBar() const noexcept
|
||||||
|
@ -141,8 +194,8 @@ namespace SHADE
|
||||||
if (ImGui::BeginViewportSideBar("MainStatusBar", ImGui::GetMainViewport(), ImGuiDir_Down, menuBarHeight, editorMenuBarFlags))
|
if (ImGui::BeginViewportSideBar("MainStatusBar", ImGui::GetMainViewport(), ImGuiDir_Down, menuBarHeight, editorMenuBarFlags))
|
||||||
{
|
{
|
||||||
ImGui::Text("Entity count: ");
|
ImGui::Text("Entity count: ");
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
ImGui::PopStyleVar(3);
|
ImGui::PopStyleVar(3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,5 +18,6 @@ namespace SHADE
|
||||||
void DrawSecondaryBar() const noexcept;
|
void DrawSecondaryBar() const noexcept;
|
||||||
void DrawStatusBar() const noexcept;
|
void DrawStatusBar() const noexcept;
|
||||||
float menuBarHeight = 20.0f;
|
float menuBarHeight = 20.0f;
|
||||||
|
std::vector<std::filesystem::path> layoutPaths;
|
||||||
};//class SHEditorMenuBar
|
};//class SHEditorMenuBar
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
|
@ -37,8 +37,8 @@ namespace SHADE
|
||||||
if(Begin())
|
if(Begin())
|
||||||
{
|
{
|
||||||
ImGui::PlotLines("DT", frames.data(), static_cast<int>(frames.size()), 0, nullptr, 0.0f, 16.0f);
|
ImGui::PlotLines("DT", frames.data(), static_cast<int>(frames.size()), 0, nullptr, 0.0f, 16.0f);
|
||||||
ImGui::End();
|
|
||||||
}
|
}
|
||||||
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHEditorProfiler::Exit()
|
void SHEditorProfiler::Exit()
|
||||||
|
|
|
@ -19,7 +19,7 @@ namespace SHADE
|
||||||
//|| Public Member Functions ||
|
//|| Public Member Functions ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
SHEditorWindow::SHEditorWindow(std::string_view const& name, ImGuiWindowFlags const& inFlags)
|
SHEditorWindow::SHEditorWindow(std::string_view const& name, ImGuiWindowFlags const& inFlags)
|
||||||
: isOpen(true), windowName(name), windowFlags(inFlags), io(ImGui::GetIO())
|
: windowName(name), windowFlags(inFlags), io(ImGui::GetIO())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,30 @@ namespace SHADE
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
bool SHEditorWindow::Begin()
|
bool SHEditorWindow::Begin()
|
||||||
{
|
{
|
||||||
return ImGui::Begin(windowName.data(), &isOpen, windowFlags);
|
bool result = ImGui::Begin(windowName.data(), &isOpen, windowFlags);
|
||||||
|
|
||||||
|
auto wndSize = ImGui::GetWindowSize();
|
||||||
|
if(windowSize.x != wndSize.x || windowSize.y != wndSize.y)
|
||||||
|
{
|
||||||
|
windowSize = {wndSize.x, wndSize.y};
|
||||||
|
OnResize();
|
||||||
|
}
|
||||||
|
auto wndPos = ImGui::GetWindowPos();
|
||||||
|
if(windowPos.x != wndPos.x || windowPos.y != wndPos.y)
|
||||||
|
{
|
||||||
|
windowPos = {wndPos.x, wndPos.y};
|
||||||
|
OnPosChange();
|
||||||
|
}
|
||||||
|
isWindowHovered = ImGui::IsWindowHovered();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditorWindow::OnResize()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditorWindow::OnPosChange()
|
||||||
|
{
|
||||||
}
|
}
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "Math/Vector/SHVec2.h"
|
||||||
|
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Forward Declarations ||
|
//|| Forward Declarations ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
@ -21,11 +23,18 @@ namespace SHADE
|
||||||
virtual void Init();
|
virtual void Init();
|
||||||
virtual void Update();
|
virtual void Update();
|
||||||
virtual void Exit();
|
virtual void Exit();
|
||||||
bool isOpen = false;
|
bool isOpen;
|
||||||
|
bool isWindowHovered;
|
||||||
std::string_view windowName;
|
std::string_view windowName;
|
||||||
protected:
|
protected:
|
||||||
virtual bool Begin();
|
virtual bool Begin();
|
||||||
|
virtual void OnResize();
|
||||||
|
virtual void OnPosChange();
|
||||||
|
|
||||||
ImGuiWindowFlags windowFlags = 0;
|
ImGuiWindowFlags windowFlags = 0;
|
||||||
ImGuiIO& io;
|
ImGuiIO& io;
|
||||||
|
SHVec2 windowSize;
|
||||||
|
SHVec2 windowPos;
|
||||||
|
SHVec2 viewportMousePos;
|
||||||
};//class SHEditorWindow
|
};//class SHEditorWindow
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -3,3 +3,4 @@
|
||||||
#include "HierarchyPanel/SHHierarchyPanel.h" //Hierarchy Panel
|
#include "HierarchyPanel/SHHierarchyPanel.h" //Hierarchy Panel
|
||||||
#include "Inspector/SHEditorInspector.h" //Inspector
|
#include "Inspector/SHEditorInspector.h" //Inspector
|
||||||
#include "Profiling/SHEditorProfiler.h" //Profiler
|
#include "Profiling/SHEditorProfiler.h" //Profiler
|
||||||
|
#include "ViewportWindow/SHEditorViewport.h" //Editor Viewport
|
|
@ -0,0 +1,84 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHEditorViewport.h"
|
||||||
|
|
||||||
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
#include "Editor/SHEditor.hpp"
|
||||||
|
#include "Editor/EditorWindow/HierarchyPanel/SHHierarchyPanel.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h"
|
||||||
|
#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHMousePickSystem.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
SHEditorViewport::SHEditorViewport()
|
||||||
|
:SHEditorWindow("Viewport", ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoScrollbar)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditorViewport::Init()
|
||||||
|
{
|
||||||
|
SHEditorWindow::Init();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditorViewport::Update()
|
||||||
|
{
|
||||||
|
SHEditorWindow::Update();
|
||||||
|
if(Begin())
|
||||||
|
{
|
||||||
|
DrawMenuBar();
|
||||||
|
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||||
|
auto const& descriptorSet = gfxSystem->GetPostOffscreenRenderSystem()->GetDescriptorSetGroup()->GetVkHandle()[0];
|
||||||
|
auto mousePos = ImGui::GetMousePos();
|
||||||
|
auto cursorPos = ImGui::GetCursorScreenPos();
|
||||||
|
viewportMousePos = {mousePos.x - cursorPos.x, mousePos.y - cursorPos.y};
|
||||||
|
gfxSystem->GetMousePickSystem ()->SetViewportMousePos (viewportMousePos);
|
||||||
|
//if (ImGui::IsMouseReleased(ImGuiMouseButton_Left))
|
||||||
|
//{
|
||||||
|
// auto eid = gfxSystem->GetMousePickSystem ()->GetPickedEntity();
|
||||||
|
// if(eid != MAX_EID)
|
||||||
|
// {
|
||||||
|
// auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
|
// editor->selectedEntities.clear();
|
||||||
|
// editor->selectedEntities.push_back(eid);
|
||||||
|
// if (const auto hierarchyPanel = SHEditorWindowManager::GetEditorWindow<SHHierarchyPanel>())
|
||||||
|
// {
|
||||||
|
// hierarchyPanel->SetScrollTo(eid);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
ImGui::Image((ImTextureID)descriptorSet, ImGui::GetWindowSize());
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditorViewport::Exit()
|
||||||
|
{
|
||||||
|
SHEditorWindow::Exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditorViewport::OnResize()
|
||||||
|
{
|
||||||
|
SHEditorWindow::OnResize();
|
||||||
|
//Get graphics system to resize swapchain image
|
||||||
|
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||||
|
|
||||||
|
//auto pos = ImGui::GetCursorPos();
|
||||||
|
//windowCursorPos = {}
|
||||||
|
gfxSystem->PrepareResize(static_cast<uint32_t>(windowSize.x), static_cast<uint32_t>(windowSize.y));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditorViewport::OnPosChange()
|
||||||
|
{
|
||||||
|
SHEditorWindow::OnPosChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditorViewport::DrawMenuBar() const noexcept
|
||||||
|
{
|
||||||
|
if(ImGui::BeginMenuBar())
|
||||||
|
{
|
||||||
|
ImGui::EndMenuBar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//namespace SHADE
|
|
@ -0,0 +1,29 @@
|
||||||
|
#pragma once
|
||||||
|
//#==============================================================#
|
||||||
|
//|| Library Includes ||
|
||||||
|
//#==============================================================#
|
||||||
|
#include <imgui.h>
|
||||||
|
|
||||||
|
//#==============================================================#
|
||||||
|
//|| SHADE Includes ||
|
||||||
|
//#==============================================================#
|
||||||
|
#include "imgui_internal.h"
|
||||||
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
|
#include "Editor/EditorWindow/SHEditorWindow.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHEditorViewport final : public SHEditorWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SHEditorViewport();
|
||||||
|
void Init() override;
|
||||||
|
void Update() override;
|
||||||
|
void Exit() override;
|
||||||
|
protected:
|
||||||
|
void OnResize() override;
|
||||||
|
void OnPosChange() override;
|
||||||
|
private:
|
||||||
|
void DrawMenuBar() const noexcept;
|
||||||
|
};//class SHEditorViewport
|
||||||
|
}//namespace SHADE
|
|
@ -843,7 +843,7 @@
|
||||||
#define ICON_MD_FLIP_TO_FRONT "\xee\xa2\x83" // U+e883
|
#define ICON_MD_FLIP_TO_FRONT "\xee\xa2\x83" // U+e883
|
||||||
#define ICON_MD_FLOOD "\xee\xaf\xa6" // U+ebe6
|
#define ICON_MD_FLOOD "\xee\xaf\xa6" // U+ebe6
|
||||||
#define ICON_MD_FLOURESCENT "\xee\xb0\xb1" // U+ec31
|
#define ICON_MD_FLOURESCENT "\xee\xb0\xb1" // U+ec31
|
||||||
#define ICON_MD_FLOURESCENT "\xef\x80\x8d" // U+f00d
|
#define ICON_MD_FLOURESCENT2 "\xef\x80\x8d" // U+f00d
|
||||||
#define ICON_MD_FLUORESCENT "\xee\xb0\xb1" // U+ec31
|
#define ICON_MD_FLUORESCENT "\xee\xb0\xb1" // U+ec31
|
||||||
#define ICON_MD_FLUTTER_DASH "\xee\x80\x8b" // U+e00b
|
#define ICON_MD_FLUTTER_DASH "\xee\x80\x8b" // U+e00b
|
||||||
#define ICON_MD_FMD_BAD "\xef\x80\x8e" // U+f00e
|
#define ICON_MD_FMD_BAD "\xef\x80\x8e" // U+f00e
|
||||||
|
|
|
@ -43,6 +43,8 @@
|
||||||
#include <backends/imgui_impl_sdl.h>
|
#include <backends/imgui_impl_sdl.h>
|
||||||
#include <backends/imgui_impl_vulkan.h>
|
#include <backends/imgui_impl_vulkan.h>
|
||||||
|
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHMousePickSystem.h"
|
||||||
|
|
||||||
RTTR_REGISTRATION
|
RTTR_REGISTRATION
|
||||||
{
|
{
|
||||||
using namespace SHADE;
|
using namespace SHADE;
|
||||||
|
@ -60,19 +62,20 @@ RTTR_REGISTRATION
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Initialise static members ||
|
//|| Init static members ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
Handle<SHVkCommandPool> SHEditor::imguiCommandPool;
|
//Handle<SHVkCommandPool> SHEditor::imguiCommandPool;
|
||||||
Handle<SHVkCommandBuffer> SHEditor::imguiCommandBuffer;
|
//Handle<SHVkCommandBuffer> SHEditor::imguiCommandBuffer;
|
||||||
SHEditor::EditorWindowMap SHEditor::editorWindows{};
|
SHEditorWindowManager::EditorWindowMap SHEditorWindowManager::editorWindows{};
|
||||||
SHEditor::EditorWindowID SHEditor::windowCount{};
|
SHEditorWindowManager::EditorWindowID SHEditorWindowManager::windowCount{};
|
||||||
std::vector<EntityID> SHEditor::selectedEntities;
|
//std::vector<EntityID> SHEditor::selectedEntities;
|
||||||
|
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Public Member Functions ||
|
//|| Public Member Functions ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
void SHEditor::Initialise(SDL_Window* const sdlWindow)
|
void SHEditor::Init()
|
||||||
{
|
{
|
||||||
|
|
||||||
IMGUI_CHECKVERSION();
|
IMGUI_CHECKVERSION();
|
||||||
if(auto context = ImGui::CreateContext())
|
if(auto context = ImGui::CreateContext())
|
||||||
{
|
{
|
||||||
|
@ -82,36 +85,46 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
//Add editor windows
|
||||||
|
SHEditorWindowManager::CreateEditorWindow<SHEditorMenuBar>();
|
||||||
|
SHEditorWindowManager::CreateEditorWindow<SHEditorViewport>();
|
||||||
|
SHEditorWindowManager::CreateEditorWindow<SHHierarchyPanel>();
|
||||||
|
SHEditorWindowManager::CreateEditorWindow<SHEditorInspector>();
|
||||||
|
SHEditorWindowManager::CreateEditorWindow<SHEditorProfiler>();
|
||||||
|
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
io = &ImGui::GetIO();
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; //Enable for Multi-Viewports
|
|
||||||
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; //Enable docking
|
io->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
||||||
|
io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; //Enable for Multi-Viewports
|
||||||
|
io->ConfigFlags |= ImGuiConfigFlags_DockingEnable; //Enable docking
|
||||||
|
io->IniFilename = "../../Assets/Editor/Layouts/UserLayout.ini";
|
||||||
|
|
||||||
|
InitLayout();
|
||||||
|
|
||||||
InitFonts();
|
InitFonts();
|
||||||
|
|
||||||
|
|
||||||
auto id = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
auto id = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||||
auto id2 = SHFamilyID<SHSystem>::GetID<SHTransformSystem>();
|
auto id2 = SHFamilyID<SHSystem>::GetID<SHTransformSystem>();
|
||||||
auto id3 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
auto id3 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||||
InitBackend(sdlWindow);
|
|
||||||
|
InitBackend();
|
||||||
|
|
||||||
SetStyle(Style::SHADE);
|
SetStyle(Style::SHADE);
|
||||||
|
|
||||||
//Add editor windows
|
|
||||||
CreateEditorWindow<SHEditorMenuBar>();
|
for (const auto& window : SHEditorWindowManager::editorWindows | std::views::values)
|
||||||
CreateEditorWindow<SHHierarchyPanel>();
|
{
|
||||||
CreateEditorWindow<SHEditorInspector>();
|
window->Init();
|
||||||
CreateEditorWindow<SHEditorProfiler>();
|
}
|
||||||
|
|
||||||
SHLOG_INFO("Successfully initialised SHADE Engine Editor")
|
SHLOG_INFO("Successfully initialised SHADE Engine Editor")
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHEditor::Update(float const dt)
|
void SHEditor::Update(double const dt)
|
||||||
{
|
{
|
||||||
(void)dt;
|
(void)dt;
|
||||||
NewFrame();
|
NewFrame();
|
||||||
for (const auto& window : editorWindows | std::views::values)
|
for (const auto& window : SHEditorWindowManager::editorWindows | std::views::values)
|
||||||
{
|
{
|
||||||
if(window->isOpen)
|
if(window->isOpen)
|
||||||
window->Update();
|
window->Update();
|
||||||
|
@ -126,35 +139,45 @@ namespace SHADE
|
||||||
SHCommandManager::UndoCommand();
|
SHCommandManager::UndoCommand();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Render();
|
Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHEditor::Render()
|
void SHEditor::Render()
|
||||||
{
|
{
|
||||||
ImGui::Render();
|
ImGui::Render();
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
if (io->ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
||||||
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
||||||
{
|
{
|
||||||
ImGui::UpdatePlatformWindows();
|
ImGui::UpdatePlatformWindows();
|
||||||
ImGui::RenderPlatformWindowsDefault();
|
ImGui::RenderPlatformWindowsDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHEditor::InitLayout() noexcept
|
||||||
|
{
|
||||||
|
if(!std::filesystem::exists(io->IniFilename))
|
||||||
|
{
|
||||||
|
std::filesystem::copy_file("../../Assets/Editor/Layouts/Default.ini", io->IniFilename);
|
||||||
|
}
|
||||||
|
//eventually load preferred layout here
|
||||||
|
}
|
||||||
|
|
||||||
void SHEditor::InitFonts() noexcept
|
void SHEditor::InitFonts() noexcept
|
||||||
{
|
{
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImFont* mainFont = io->Fonts->AddFontFromFileTTF("../../Assets/Editor/Fonts/Segoe UI.ttf", 20.f);//TODO: Change to config based assets path
|
||||||
ImFont* mainFont = io.Fonts->AddFontFromFileTTF("../../Assets/Editor/Fonts/Segoe UI.ttf", 20.f);//TODO: Change to config based assets path
|
|
||||||
|
|
||||||
static const ImWchar icon_ranges[] = { ICON_MIN_MD, ICON_MAX_16_MD, 0 };
|
constexpr ImWchar icon_ranges[] = { ICON_MIN_MD, ICON_MAX_16_MD, 0 };
|
||||||
ImFontConfig icons_config{}; icons_config.MergeMode = true; icons_config.PixelSnapH = true;
|
ImFontConfig icons_config{}; icons_config.MergeMode = true; icons_config.GlyphOffset.y = 5.f;
|
||||||
ImFont* UIFont = io.Fonts->AddFontFromFileTTF("../../Assets/Editor/Fonts/MaterialIcons-Regular.ttf", 20.f, &icons_config, icon_ranges); //TODO: Change to config based assets path
|
ImFont* UIFont = io->Fonts->AddFontFromFileTTF("../../Assets/Editor/Fonts/MaterialIcons-Regular.ttf", 20.f, &icons_config, icon_ranges); //TODO: Change to config based assets path
|
||||||
|
|
||||||
io.Fonts->Build();
|
io->Fonts->Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHEditor::Exit()
|
void SHEditor::Exit()
|
||||||
{
|
{
|
||||||
|
for (const auto& window : SHEditorWindowManager::editorWindows | std::views::values)
|
||||||
|
{
|
||||||
|
window->Init();
|
||||||
|
}
|
||||||
ImGui_ImplVulkan_Shutdown();
|
ImGui_ImplVulkan_Shutdown();
|
||||||
ImGui_ImplSDL2_Shutdown();
|
ImGui_ImplSDL2_Shutdown();
|
||||||
ImGui::DestroyContext();
|
ImGui::DestroyContext();
|
||||||
|
@ -260,7 +283,7 @@ namespace SHADE
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Private Member Functions ||
|
//|| Private Member Functions ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
void SHEditor::InitBackend(SDL_Window* sdlWindow)
|
void SHEditor::InitBackend()
|
||||||
{
|
{
|
||||||
if(ImGui_ImplSDL2_InitForVulkan(sdlWindow) == false)
|
if(ImGui_ImplSDL2_InitForVulkan(sdlWindow) == false)
|
||||||
{
|
{
|
||||||
|
@ -281,10 +304,11 @@ namespace SHADE
|
||||||
imguiCommandPool = gfxSystem->GetDevice()->CreateCommandPool(SH_QUEUE_FAMILY_ARRAY_INDEX::GRAPHICS, SH_CMD_POOL_RESET::POOL_BASED, true);
|
imguiCommandPool = gfxSystem->GetDevice()->CreateCommandPool(SH_QUEUE_FAMILY_ARRAY_INDEX::GRAPHICS, SH_CMD_POOL_RESET::POOL_BASED, true);
|
||||||
imguiCommandBuffer = imguiCommandPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
imguiCommandBuffer = imguiCommandPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||||
|
|
||||||
auto const& renderers = gfxSystem->GetDefaultViewport()->GetRenderers();
|
//auto const& renderers = gfxSystem->GetDefaultViewport()->GetRenderers();
|
||||||
|
auto const& renderers = gfxSystem->GetEditorViewport()->GetRenderers();
|
||||||
|
|
||||||
SHASSERT(!renderers.empty(), "No Renderers available")
|
SHASSERT(!renderers.empty(), "No Renderers available")
|
||||||
auto renderGraph = renderers[0]->GetRenderGraph();
|
auto renderGraph = renderers[SHGraphicsConstants::RenderGraphIndices::EDITOR]->GetRenderGraph();
|
||||||
auto renderPass = renderGraph->GetNode("ImGui Node")->GetRenderpass();
|
auto renderPass = renderGraph->GetNode("ImGui Node")->GetRenderpass();
|
||||||
|
|
||||||
if(ImGui_ImplVulkan_Init(&initInfo, renderPass->GetVkRenderpass()) == false)
|
if(ImGui_ImplVulkan_Init(&initInfo, renderPass->GetVkRenderpass()) == false)
|
||||||
|
@ -309,6 +333,29 @@ namespace SHADE
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHEditor::PollPicking()
|
||||||
|
{
|
||||||
|
if (auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>())
|
||||||
|
{
|
||||||
|
auto viewportWindow = SHEditorWindowManager::GetEditorWindow<SHEditorViewport>();
|
||||||
|
if (viewportWindow->isWindowHovered && ImGui::IsMouseReleased(ImGuiMouseButton_Left))
|
||||||
|
{
|
||||||
|
EntityID pickedEID = gfxSystem->GetMousePickSystem()->GetPickedEntity();
|
||||||
|
if(pickedEID == MAX_EID)
|
||||||
|
return;
|
||||||
|
if (!ImGui::IsKeyDown(ImGuiKey_LeftCtrl))
|
||||||
|
{
|
||||||
|
if (const auto hierarchyPanel = SHEditorWindowManager::GetEditorWindow<SHHierarchyPanel>())
|
||||||
|
{
|
||||||
|
hierarchyPanel->SetScrollTo(pickedEID);
|
||||||
|
}
|
||||||
|
selectedEntities.clear();
|
||||||
|
}
|
||||||
|
selectedEntities.push_back(pickedEID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SHEditor::NewFrame()
|
void SHEditor::NewFrame()
|
||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
@ -322,4 +369,9 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SHEditor::EditorRoutine::Execute(double dt) noexcept
|
||||||
|
{
|
||||||
|
reinterpret_cast<SHEditor*>(system)->Update(dt);
|
||||||
|
}
|
||||||
|
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
#include "ECS_Base/SHECSMacros.h"
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
|
#include "ECS_Base/System/SHSystem.h"
|
||||||
|
#include "ECS_Base/System/SHSystemRoutine.h"
|
||||||
#include "Resource/Handle.h"
|
#include "Resource/Handle.h"
|
||||||
#include "EditorWindow/SHEditorWindow.h"
|
#include "EditorWindow/SHEditorWindow.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/SHLogger.h"
|
||||||
|
@ -28,11 +30,7 @@ namespace SHADE
|
||||||
class SHVkCommandBuffer;
|
class SHVkCommandBuffer;
|
||||||
class SHVkCommandPool;
|
class SHVkCommandPool;
|
||||||
|
|
||||||
/**
|
class SHEditorWindowManager
|
||||||
* @brief SHEditor static class contains editor variables and implementation of editor functions.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class SH_API SHEditor
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
@ -41,46 +39,6 @@ namespace SHADE
|
||||||
using EditorWindowID = uint8_t;
|
using EditorWindowID = uint8_t;
|
||||||
using EditorWindowPtr = std::unique_ptr<SHEditorWindow>;
|
using EditorWindowPtr = std::unique_ptr<SHEditorWindow>;
|
||||||
using EditorWindowMap = std::unordered_map<EditorWindowID, EditorWindowPtr>;
|
using EditorWindowMap = std::unordered_map<EditorWindowID, EditorWindowPtr>;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Style options
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
enum class Style : uint8_t
|
|
||||||
{
|
|
||||||
SHADE,
|
|
||||||
DARK,
|
|
||||||
LIGHT,
|
|
||||||
CLASSIC
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialise the editor
|
|
||||||
*
|
|
||||||
* @param sdlWindow pointer to SDL_Window object created in application
|
|
||||||
*/
|
|
||||||
static void Initialise(SDL_Window* sdlWindow);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Update the editor and add to ImGui DrawList
|
|
||||||
*
|
|
||||||
* @param dt Delta-time of the frame
|
|
||||||
*/
|
|
||||||
static void Update(float dt);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Safely shutdown the editor
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void Exit();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set the Style for the editor
|
|
||||||
*
|
|
||||||
* @param style Desired style
|
|
||||||
*/
|
|
||||||
static void SetStyle(Style style);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get ID for the Editor Window Type
|
* @brief Get ID for the Editor Window Type
|
||||||
*
|
*
|
||||||
|
@ -100,39 +58,6 @@ namespace SHADE
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get pointer to the Editor Window
|
|
||||||
*
|
|
||||||
* @tparam T Type of editor window to retrieve
|
|
||||||
* @return T* Pointer to the editor window
|
|
||||||
*/
|
|
||||||
template <typename T, std::enable_if_t<std::is_base_of_v<SHEditorWindow, T>, bool> = true>
|
|
||||||
static T* GetEditorWindow()
|
|
||||||
{
|
|
||||||
return reinterpret_cast<T*>(editorWindows[GetEditorWindowID<T>()].get());
|
|
||||||
}
|
|
||||||
|
|
||||||
// List of selected entities
|
|
||||||
static std::vector<EntityID> selectedEntities;
|
|
||||||
|
|
||||||
private:
|
|
||||||
/**
|
|
||||||
* @brief Initialise Backend for ImGui (SDL and Vulkan backend)
|
|
||||||
*
|
|
||||||
* @param sdlWindow Pointer to SDL_Window
|
|
||||||
*/
|
|
||||||
static void InitBackend(SDL_Window* sdlWindow);
|
|
||||||
/**
|
|
||||||
* @brief Start new frame for editor
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void NewFrame();
|
|
||||||
/**
|
|
||||||
* @brief Perform ImGui and ImGui Backend Render
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void Render();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Create an Editor Window
|
* @brief Create an Editor Window
|
||||||
*
|
*
|
||||||
|
@ -153,16 +78,127 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void InitFonts() noexcept;
|
/**
|
||||||
|
* @brief Get pointer to the Editor Window
|
||||||
// Handle to command pool used for ImGui Vulkan Backend
|
*
|
||||||
static Handle<SHVkCommandPool> imguiCommandPool;
|
* @tparam T Type of editor window to retrieve
|
||||||
// Handle to command buffer used for ImGui Vulkan Backend
|
* @return T* Pointer to the editor window
|
||||||
static Handle<SHVkCommandBuffer> imguiCommandBuffer;
|
*/
|
||||||
|
template <typename T, std::enable_if_t<std::is_base_of_v<SHEditorWindow, T>, bool> = true>
|
||||||
|
static T* GetEditorWindow()
|
||||||
|
{
|
||||||
|
return reinterpret_cast<T*>(editorWindows[GetEditorWindowID<T>()].get());
|
||||||
|
}
|
||||||
|
|
||||||
|
static EditorWindowMap editorWindows;
|
||||||
|
private:
|
||||||
// Number of windows; used for Editor Window ID Generation
|
// Number of windows; used for Editor Window ID Generation
|
||||||
static EditorWindowID windowCount;
|
static EditorWindowID windowCount;
|
||||||
// Map of Editor Windows
|
// Map of Editor Windows
|
||||||
static EditorWindowMap editorWindows;
|
friend class SHEditor;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SHEditor static class contains editor variables and implementation of editor functions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class SH_API SHEditor final : public SHSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
class SH_API EditorRoutine final : public SHSystemRoutine
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EditorRoutine():SHSystemRoutine("Editor routine", true) {};
|
||||||
|
void Execute(double dt) noexcept override final;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class State : uint8_t
|
||||||
|
{
|
||||||
|
PLAY,
|
||||||
|
PAUSE,
|
||||||
|
STOP
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Style options
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
enum class Style : uint8_t
|
||||||
|
{
|
||||||
|
SHADE,
|
||||||
|
DARK,
|
||||||
|
LIGHT,
|
||||||
|
CLASSIC
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialise the editor
|
||||||
|
*
|
||||||
|
* @param sdlWindow pointer to SDL_Window object created in application
|
||||||
|
*/
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Update the editor and add to ImGui DrawList
|
||||||
|
*
|
||||||
|
* @param dt Delta-time of the frame
|
||||||
|
*/
|
||||||
|
void Update(double dt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Safely shutdown the editor
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void Exit();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the Style for the editor
|
||||||
|
*
|
||||||
|
* @param style Desired style
|
||||||
|
*/
|
||||||
|
void SetStyle(Style style);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialise Backend for ImGui (SDL and Vulkan backend)
|
||||||
|
*
|
||||||
|
* @param sdlWindow Pointer to SDL_Window
|
||||||
|
*/
|
||||||
|
void InitBackend();
|
||||||
|
|
||||||
|
void SetSDLWindow(SDL_Window* inSDLWindow){sdlWindow = inSDLWindow;};
|
||||||
|
|
||||||
|
void PollPicking();
|
||||||
|
|
||||||
|
// List of selected entities
|
||||||
|
std::vector<EntityID> selectedEntities;
|
||||||
|
|
||||||
|
State editorState = State::STOP;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* @brief Start new frame for editor
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void NewFrame();
|
||||||
|
/**
|
||||||
|
* @brief Perform ImGui and ImGui Backend Render
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void Render();
|
||||||
|
|
||||||
|
void InitLayout() noexcept;
|
||||||
|
|
||||||
|
void InitFonts() noexcept;
|
||||||
|
|
||||||
|
// Handle to command pool used for ImGui Vulkan Backend
|
||||||
|
Handle<SHVkCommandPool> imguiCommandPool;
|
||||||
|
// Handle to command buffer used for ImGui Vulkan Backend
|
||||||
|
Handle<SHVkCommandBuffer> imguiCommandBuffer;
|
||||||
|
|
||||||
|
SDL_Window* sdlWindow {nullptr};
|
||||||
|
|
||||||
|
ImGuiIO* io{nullptr};
|
||||||
};//class SHEditor
|
};//class SHEditor
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -35,6 +35,118 @@ namespace SHADE
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Custom Widgets ||
|
//|| Custom Widgets ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
inline static ImVector<ImRect> panelStack{};
|
||||||
|
static void BeginPanel(std::string_view const& name, const ImVec2& size)
|
||||||
|
{
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
|
||||||
|
auto cursorPos = ImGui::GetCursorScreenPos();
|
||||||
|
auto itemSpacing = ImGui::GetStyle().ItemSpacing;
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f));
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f));
|
||||||
|
|
||||||
|
auto frameHeight = ImGui::GetFrameHeight();
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
|
||||||
|
ImVec2 effectiveSize = size;
|
||||||
|
if (size.x < 0.0f)
|
||||||
|
effectiveSize.x = ImGui::GetContentRegionAvail().x;
|
||||||
|
else
|
||||||
|
effectiveSize.x = size.x;
|
||||||
|
ImGui::Dummy(ImVec2(effectiveSize.x, 0.0f));
|
||||||
|
|
||||||
|
ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f));
|
||||||
|
ImGui::SameLine(0.0f, 0.0f);
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f));
|
||||||
|
ImGui::SameLine(0.0f, 0.0f);
|
||||||
|
ImGui::TextUnformatted(name.data());
|
||||||
|
auto labelMin = ImGui::GetItemRectMin();
|
||||||
|
auto labelMax = ImGui::GetItemRectMax();
|
||||||
|
ImGui::SameLine(0.0f, 0.0f);
|
||||||
|
ImGui::Dummy(ImVec2(0.0, frameHeight + itemSpacing.y));
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
|
||||||
|
ImGui::PopStyleVar(2);
|
||||||
|
|
||||||
|
ImGui::GetCurrentWindow()->ContentRegionRect.Max.x -= frameHeight * 0.5f;
|
||||||
|
ImGui::GetCurrentWindow()->WorkRect.Max.x -= frameHeight * 0.5f;
|
||||||
|
ImGui::GetCurrentWindow()->InnerRect.Max.x -= frameHeight * 0.5f;
|
||||||
|
|
||||||
|
ImGui::GetCurrentWindow()->Size.x -= frameHeight;
|
||||||
|
|
||||||
|
auto itemWidth = ImGui::CalcItemWidth();
|
||||||
|
ImGui::PushItemWidth(ImMax(0.0f, itemWidth - frameHeight));
|
||||||
|
|
||||||
|
panelStack.push_back(ImRect(labelMin, labelMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void EndPanel()
|
||||||
|
{
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
|
auto itemSpacing = ImGui::GetStyle().ItemSpacing;
|
||||||
|
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0f, 0.0f));
|
||||||
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f));
|
||||||
|
|
||||||
|
auto frameHeight = ImGui::GetFrameHeight();
|
||||||
|
|
||||||
|
ImGui::EndGroup();
|
||||||
|
|
||||||
|
ImGui::EndGroup();
|
||||||
|
|
||||||
|
ImGui::SameLine(0.0f, 0.0f);
|
||||||
|
ImGui::Dummy(ImVec2(frameHeight * 0.5f, 0.0f));
|
||||||
|
ImGui::Dummy(ImVec2(0.0, frameHeight - frameHeight * 0.5f - itemSpacing.y));
|
||||||
|
|
||||||
|
ImGui::EndGroup();
|
||||||
|
|
||||||
|
auto itemMin = ImGui::GetItemRectMin();
|
||||||
|
auto itemMax = ImGui::GetItemRectMax();
|
||||||
|
|
||||||
|
auto labelRect = panelStack.back();
|
||||||
|
panelStack.pop_back();
|
||||||
|
|
||||||
|
ImVec2 halfFrame = ImVec2(frameHeight * 0.25f, frameHeight) * 0.5f;
|
||||||
|
ImRect frameRect = ImRect(itemMin + halfFrame, itemMax - ImVec2(halfFrame.x, 0.0f));
|
||||||
|
labelRect.Min.x -= itemSpacing.x;
|
||||||
|
labelRect.Max.x += itemSpacing.x;
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
// left half-plane
|
||||||
|
case 0: ImGui::PushClipRect(ImVec2(-FLT_MAX, -FLT_MAX), ImVec2(labelRect.Min.x, FLT_MAX), true); break;
|
||||||
|
// right half-plane
|
||||||
|
case 1: ImGui::PushClipRect(ImVec2(labelRect.Max.x, -FLT_MAX), ImVec2(FLT_MAX, FLT_MAX), true); break;
|
||||||
|
// top
|
||||||
|
case 2: ImGui::PushClipRect(ImVec2(labelRect.Min.x, -FLT_MAX), ImVec2(labelRect.Max.x, labelRect.Min.y), true); break;
|
||||||
|
// bottom
|
||||||
|
case 3: ImGui::PushClipRect(ImVec2(labelRect.Min.x, labelRect.Max.y), ImVec2(labelRect.Max.x, FLT_MAX), true); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::GetWindowDrawList()->AddRect(
|
||||||
|
frameRect.Min, frameRect.Max,
|
||||||
|
ImColor(ImGui::GetStyleColorVec4(ImGuiCol_Button)),
|
||||||
|
halfFrame.x);
|
||||||
|
|
||||||
|
ImGui::PopClipRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopStyleVar(2);
|
||||||
|
|
||||||
|
ImGui::GetCurrentWindow()->ContentRegionRect.Max.x += frameHeight * 0.5f;
|
||||||
|
ImGui::GetCurrentWindow()->WorkRect.Max.x += frameHeight * 0.5f;
|
||||||
|
ImGui::GetCurrentWindow()->InnerRect.Max.x += frameHeight * 0.5f;
|
||||||
|
|
||||||
|
ImGui::GetCurrentWindow()->Size.x += frameHeight;
|
||||||
|
|
||||||
|
ImGui::Dummy(ImVec2(0.0f, 0.0f));
|
||||||
|
|
||||||
|
ImGui::EndGroup();
|
||||||
|
}
|
||||||
|
|
||||||
static bool Splitter(bool verticalSplit, float thickness, float* size1, float* size2, float minSize1, float minSize2, float splitterAxisSize = -1.0f)
|
static bool Splitter(bool verticalSplit, float thickness, float* size1, float* size2, float minSize1, float minSize2, float splitterAxisSize = -1.0f)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
ImGuiWindow* window = ImGui::GetCurrentWindow();
|
||||||
|
@ -327,7 +439,7 @@ namespace SHADE
|
||||||
ImGui::PushID(fieldLabel.c_str());
|
ImGui::PushID(fieldLabel.c_str());
|
||||||
ImGui::Text(fieldLabel.c_str()); ImGui::SameLine();
|
ImGui::Text(fieldLabel.c_str()); ImGui::SameLine();
|
||||||
|
|
||||||
if (edited = ImGui::Combo("##Combo", &selected, list.data(), list.size()))
|
if (edited = ImGui::Combo("##Combo", &selected, list.data(), static_cast<int>(list.size())))
|
||||||
{
|
{
|
||||||
SHCommandManager::PerformCommand(std::reinterpret_pointer_cast<SHBaseCommand>(std::make_shared<SHCommand<int>>(get(), selected, set)), false);
|
SHCommandManager::PerformCommand(std::reinterpret_pointer_cast<SHBaseCommand>(std::make_shared<SHCommand<int>>(get(), selected, set)), false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
#include "SHFileSystem.h"
|
#include "SHFileSystem.h"
|
||||||
#include "fileapi.h"
|
#include "fileapi.h"
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <cassert>
|
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -28,7 +27,10 @@ namespace SHADE
|
||||||
|
|
||||||
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
||||||
|
|
||||||
assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
|
if (count >= FOLDER_MAX_COUNT)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Max subfolder reached: {}\n", name);
|
||||||
|
}
|
||||||
|
|
||||||
auto const location = static_cast<FolderLocation>(count);
|
auto const location = static_cast<FolderLocation>(count);
|
||||||
|
|
||||||
|
@ -37,7 +39,10 @@ namespace SHADE
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(folders.contains(here), "Folder creation location does not exist/invalid\n");
|
if (!folders.contains(here))
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Folder creation location does not exist/invalid: {}\n", here);
|
||||||
|
}
|
||||||
|
|
||||||
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
||||||
|
|
||||||
|
@ -45,7 +50,11 @@ namespace SHADE
|
||||||
location <<= FOLDER_BIT_ALLOCATE;
|
location <<= FOLDER_BIT_ALLOCATE;
|
||||||
location |= count;
|
location |= count;
|
||||||
|
|
||||||
assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
|
if (count >= FOLDER_MAX_COUNT)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Max subfolder reached: {}\n", name);
|
||||||
|
}
|
||||||
|
|
||||||
CreateFolder(folders[0]->path, here, location, name);
|
CreateFolder(folders[0]->path, here, location, name);
|
||||||
|
|
||||||
return location;
|
return location;
|
||||||
|
@ -53,7 +62,10 @@ namespace SHADE
|
||||||
|
|
||||||
bool SHFileSystem::DeleteFolder(FolderPointer location) noexcept
|
bool SHFileSystem::DeleteFolder(FolderPointer location) noexcept
|
||||||
{
|
{
|
||||||
assert(folders.contains(location->id), "Delete target does not exist/invalid.\n");
|
if (!folders.contains(location->id))
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Delete target does not exist/invalid: {}\n", location->name);
|
||||||
|
}
|
||||||
|
|
||||||
for (auto const& subFolder : folders[location->id]->subFolders)
|
for (auto const& subFolder : folders[location->id]->subFolders)
|
||||||
{
|
{
|
||||||
|
@ -116,10 +128,11 @@ namespace SHADE
|
||||||
|
|
||||||
FolderPointer SHFileSystem::CreateFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept
|
FolderPointer SHFileSystem::CreateFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept
|
||||||
{
|
{
|
||||||
assert(
|
|
||||||
CreateDirectoryA(path.c_str(), nullptr),
|
if (!CreateDirectoryA(path.c_str(), nullptr))
|
||||||
"Failed to create folder\n"
|
{
|
||||||
);
|
SHLOG_ERROR("Failed to create folder: {}\n", path);
|
||||||
|
}
|
||||||
|
|
||||||
folders[location] = std::make_unique<SHFolder>(location, name);
|
folders[location] = std::make_unique<SHFolder>(location, name);
|
||||||
folders[location]->path = path;
|
folders[location]->path = path;
|
||||||
|
|
|
@ -105,6 +105,17 @@ namespace SHADE
|
||||||
vk::Buffer GetVkBuffer (void) const noexcept;
|
vk::Buffer GetVkBuffer (void) const noexcept;
|
||||||
vk::BufferUsageFlags GetUsageBits(void) const noexcept;
|
vk::BufferUsageFlags GetUsageBits(void) const noexcept;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T GetDataFromMappedPointer(uint32_t index) const noexcept
|
||||||
|
{
|
||||||
|
if (mappedPtr && index < sizeStored / sizeof (T))
|
||||||
|
{
|
||||||
|
return (static_cast<T*>(mappedPtr))[index];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace SHADE
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
SHVkCommandBuffer::~SHVkCommandBuffer(void) noexcept
|
SHVkCommandBuffer::~SHVkCommandBuffer(void) noexcept
|
||||||
{
|
{
|
||||||
if (vkCommandBuffer)
|
if (vkCommandBuffer && parentPool)
|
||||||
parentPool->GetLogicalDevice()->GetVkLogicalDevice().freeCommandBuffers(parentPool->GetVkCommandPool(), commandBufferCount, &vkCommandBuffer);
|
parentPool->GetLogicalDevice()->GetVkLogicalDevice().freeCommandBuffers(parentPool->GetVkCommandPool(), commandBufferCount, &vkCommandBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,6 +461,11 @@ namespace SHADE
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHVkCommandBuffer::CopyImageToBuffer(const vk::Image& src, const vk::Buffer& dst, const std::vector<vk::BufferImageCopy>& copyInfo)
|
||||||
|
{
|
||||||
|
vkCommandBuffer.copyImageToBuffer (src, vk::ImageLayout::eTransferSrcOptimal, dst, copyInfo);
|
||||||
|
}
|
||||||
|
|
||||||
void SHVkCommandBuffer::PipelineBarrier(
|
void SHVkCommandBuffer::PipelineBarrier(
|
||||||
vk::PipelineStageFlags srcStage,
|
vk::PipelineStageFlags srcStage,
|
||||||
vk::PipelineStageFlags dstStage,
|
vk::PipelineStageFlags dstStage,
|
||||||
|
|
|
@ -121,6 +121,7 @@ namespace SHADE
|
||||||
|
|
||||||
// Buffer Copy
|
// Buffer Copy
|
||||||
void CopyBufferToImage (const vk::Buffer& src, const vk::Image& dst, const std::vector<vk::BufferImageCopy>& copyInfo);
|
void CopyBufferToImage (const vk::Buffer& src, const vk::Image& dst, const std::vector<vk::BufferImageCopy>& copyInfo);
|
||||||
|
void CopyImageToBuffer (const vk::Image& src, const vk::Buffer& dst, const std::vector<vk::BufferImageCopy>& copyInfo);
|
||||||
|
|
||||||
// memory barriers
|
// memory barriers
|
||||||
void PipelineBarrier (
|
void PipelineBarrier (
|
||||||
|
|
|
@ -102,8 +102,6 @@ namespace SHADE
|
||||||
logicalDeviceHdl = rhs.logicalDeviceHdl;
|
logicalDeviceHdl = rhs.logicalDeviceHdl;
|
||||||
transient = rhs.transient;
|
transient = rhs.transient;
|
||||||
|
|
||||||
static_cast<ISelfHandle<SHVkCommandPool>&>(*this) = static_cast<ISelfHandle<SHVkCommandPool>&>(rhs);
|
|
||||||
|
|
||||||
rhs.vkCommandPool = VK_NULL_HANDLE;
|
rhs.vkCommandPool = VK_NULL_HANDLE;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
|
|
|
@ -99,7 +99,7 @@ namespace SHADE
|
||||||
|
|
||||||
void SHVulkanDebugUtil::ReportVkSuccess(std::string_view message) noexcept
|
void SHVulkanDebugUtil::ReportVkSuccess(std::string_view message) noexcept
|
||||||
{
|
{
|
||||||
SHLOGV_INFO(message);
|
//SHLOGV_INFO(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
|
@ -172,7 +172,7 @@ namespace SHADE
|
||||||
// write sampler and image view
|
// write sampler and image view
|
||||||
auto& [view, sampler, layout] = imageViewsAndSamplers[i];
|
auto& [view, sampler, layout] = imageViewsAndSamplers[i];
|
||||||
writeInfo.descImageInfos[i].imageView = view->GetImageView();
|
writeInfo.descImageInfos[i].imageView = view->GetImageView();
|
||||||
writeInfo.descImageInfos[i].sampler = sampler->GetVkSampler();
|
writeInfo.descImageInfos[i].sampler = sampler ? sampler->GetVkSampler() : nullptr;
|
||||||
writeInfo.descImageInfos[i].imageLayout = layout;
|
writeInfo.descImageInfos[i].imageLayout = layout;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,7 +208,7 @@ namespace SHADE
|
||||||
BindingAndSetHash bsHash = SHVkUtil::GenBindingSetHash(set, binding);
|
BindingAndSetHash bsHash = SHVkUtil::GenBindingSetHash(set, binding);
|
||||||
|
|
||||||
// to index a set
|
// to index a set
|
||||||
uint32_t setIndex = setIndexing[bsHash];
|
uint32_t setIndex = setIndexing[set];
|
||||||
|
|
||||||
// to index a write for a binding
|
// to index a write for a binding
|
||||||
uint32_t writeInfoIndex = updater.writeHashMap[bsHash];
|
uint32_t writeInfoIndex = updater.writeHashMap[bsHash];
|
||||||
|
@ -233,7 +233,7 @@ namespace SHADE
|
||||||
BindingAndSetHash bsHash = SHVkUtil::GenBindingSetHash(set, binding);
|
BindingAndSetHash bsHash = SHVkUtil::GenBindingSetHash(set, binding);
|
||||||
|
|
||||||
// to index a set
|
// to index a set
|
||||||
uint32_t setIndex = setIndexing[bsHash];
|
uint32_t setIndex = setIndexing[set];
|
||||||
|
|
||||||
// to index a write for a binding
|
// to index a write for a binding
|
||||||
uint32_t writeInfoIndex = updater.writeHashMap[bsHash];
|
uint32_t writeInfoIndex = updater.writeHashMap[bsHash];
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
#include "SHPch.h"
|
#include "SHPch.h"
|
||||||
#include "SHVkDescriptorSetLayout.h"
|
#include "SHVkDescriptorSetLayout.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
|
#include "Graphics/Images/SHVkSampler.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Constructor/Destructor */
|
/* Constructor/Destructor */
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
SHVkDescriptorSetLayout::SHVkDescriptorSetLayout(Handle<SHVkLogicalDevice> device, SetIndex set, const std::vector<Binding>& bindings)
|
SHVkDescriptorSetLayout::SHVkDescriptorSetLayout(Handle<SHVkLogicalDevice> device, SetIndex set, const std::vector<Binding>& bindings, bool genImmutableSamplers/* = false*/)
|
||||||
: device { device }
|
: device { device }
|
||||||
, layoutDesc { bindings }
|
, layoutDesc { bindings }
|
||||||
, setIndex {set}
|
, setIndex {set}
|
||||||
|
, immutableSampler{}
|
||||||
{
|
{
|
||||||
// Check if auto-binding point calculation configuration is valid
|
// Check if auto-binding point calculation configuration is valid
|
||||||
bool autoCalc = false;
|
bool autoCalc = false;
|
||||||
|
@ -26,6 +28,25 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vk::Sampler tempVkSampler = nullptr;
|
||||||
|
if (genImmutableSamplers)
|
||||||
|
{
|
||||||
|
// Create sampler
|
||||||
|
immutableSampler = device->CreateSampler(
|
||||||
|
{
|
||||||
|
.minFilter = vk::Filter::eLinear,
|
||||||
|
.magFilter = vk::Filter::eLinear,
|
||||||
|
.addressMode = vk::SamplerAddressMode::eRepeat,
|
||||||
|
.mipmapMode = vk::SamplerMipmapMode::eLinear,
|
||||||
|
.minLod = -1000,
|
||||||
|
.maxLod = 1000
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
tempVkSampler = immutableSampler->GetVkSampler();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Fill up VK bindings with auto calculated bind points if needed
|
// Fill up VK bindings with auto calculated bind points if needed
|
||||||
std::vector<vk::DescriptorSetLayoutBinding> layoutBindings;
|
std::vector<vk::DescriptorSetLayoutBinding> layoutBindings;
|
||||||
layoutBindings.reserve(bindings.size());
|
layoutBindings.reserve(bindings.size());
|
||||||
|
@ -39,7 +60,7 @@ namespace SHADE
|
||||||
.descriptorType = binding.Type,
|
.descriptorType = binding.Type,
|
||||||
.descriptorCount = binding.DescriptorCount,
|
.descriptorCount = binding.DescriptorCount,
|
||||||
.stageFlags = binding.Stage,
|
.stageFlags = binding.Stage,
|
||||||
.pImmutableSamplers = nullptr // We will create our own samplers
|
.pImmutableSamplers = genImmutableSamplers ? &tempVkSampler : nullptr,
|
||||||
};
|
};
|
||||||
layoutBindings.emplace_back(VK_BINDING);
|
layoutBindings.emplace_back(VK_BINDING);
|
||||||
|
|
||||||
|
@ -76,6 +97,7 @@ namespace SHADE
|
||||||
, setLayout {rhs.setLayout}
|
, setLayout {rhs.setLayout}
|
||||||
, layoutDesc{std::move (rhs.layoutDesc)}
|
, layoutDesc{std::move (rhs.layoutDesc)}
|
||||||
, setIndex{ rhs.setIndex }
|
, setIndex{ rhs.setIndex }
|
||||||
|
, immutableSampler{ rhs.immutableSampler }
|
||||||
{
|
{
|
||||||
rhs.setLayout = VK_NULL_HANDLE;
|
rhs.setLayout = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
|
@ -106,6 +128,7 @@ namespace SHADE
|
||||||
setLayout = rhs.setLayout;
|
setLayout = rhs.setLayout;
|
||||||
layoutDesc = std::move(rhs.layoutDesc);
|
layoutDesc = std::move(rhs.layoutDesc);
|
||||||
setIndex = rhs.setIndex;
|
setIndex = rhs.setIndex;
|
||||||
|
immutableSampler = rhs.immutableSampler;
|
||||||
|
|
||||||
rhs.setLayout = VK_NULL_HANDLE;
|
rhs.setLayout = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ namespace SHADE
|
||||||
/* Forward Declarations */
|
/* Forward Declarations */
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
class SHVkLogicalDevice;
|
class SHVkLogicalDevice;
|
||||||
|
class SHVkSampler;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Type Definitions */
|
/* Type Definitions */
|
||||||
|
@ -74,7 +75,7 @@ namespace SHADE
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="device"></param>
|
/// <param name="device"></param>
|
||||||
/// <param name="bindings"></param>
|
/// <param name="bindings"></param>
|
||||||
SHVkDescriptorSetLayout(Handle<SHVkLogicalDevice> device, SetIndex setIndex, const std::vector<Binding>& bindings);
|
SHVkDescriptorSetLayout(Handle<SHVkLogicalDevice> device, SetIndex setIndex, const std::vector<Binding>& bindings, bool genImmutableSamplers = false);
|
||||||
SHVkDescriptorSetLayout(const SHVkDescriptorSetLayout&) = delete;
|
SHVkDescriptorSetLayout(const SHVkDescriptorSetLayout&) = delete;
|
||||||
SHVkDescriptorSetLayout(SHVkDescriptorSetLayout&& rhs) noexcept;
|
SHVkDescriptorSetLayout(SHVkDescriptorSetLayout&& rhs) noexcept;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -107,5 +108,6 @@ namespace SHADE
|
||||||
vk::DescriptorSetLayout setLayout;
|
vk::DescriptorSetLayout setLayout;
|
||||||
std::vector<Binding> layoutDesc; // Stores description of the layout
|
std::vector<Binding> layoutDesc; // Stores description of the layout
|
||||||
SetIndex setIndex; // Index of the set
|
SetIndex setIndex; // Index of the set
|
||||||
|
Handle<SHVkSampler> immutableSampler;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -92,7 +92,7 @@ namespace SHADE
|
||||||
//uint32_t minBuffer
|
//uint32_t minBuffer
|
||||||
if (alignmentSize > 0)
|
if (alignmentSize > 0)
|
||||||
{
|
{
|
||||||
alignedSize = (alignedSize + alignmentSize - 1) & ~(alignmentSize - 1);
|
alignedSize = (alignedSize + static_cast<uint32_t>(alignmentSize) - 1) & ~(alignmentSize - 1);
|
||||||
}
|
}
|
||||||
return alignedSize;
|
return alignedSize;
|
||||||
}
|
}
|
||||||
|
@ -195,6 +195,8 @@ namespace SHADE
|
||||||
|
|
||||||
vk::PhysicalDeviceDescriptorIndexingFeatures descIndexingFeature{};
|
vk::PhysicalDeviceDescriptorIndexingFeatures descIndexingFeature{};
|
||||||
descIndexingFeature.descriptorBindingVariableDescriptorCount = true;
|
descIndexingFeature.descriptorBindingVariableDescriptorCount = true;
|
||||||
|
descIndexingFeature.shaderSampledImageArrayNonUniformIndexing = true;
|
||||||
|
descIndexingFeature.runtimeDescriptorArray = true;
|
||||||
|
|
||||||
// Prepare to create the device
|
// Prepare to create the device
|
||||||
vk::DeviceCreateInfo deviceCreateInfo
|
vk::DeviceCreateInfo deviceCreateInfo
|
||||||
|
@ -249,6 +251,22 @@ namespace SHADE
|
||||||
vkLogicalDevice.destroy(nullptr);
|
vkLogicalDevice.destroy(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHVkLogicalDevice& SHVkLogicalDevice::operator=(SHVkLogicalDevice&& rhs) noexcept
|
||||||
|
{
|
||||||
|
if (this == &rhs)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
vkLogicalDevice = std::move (rhs.vkLogicalDevice);
|
||||||
|
queueFamilyIndices = std::move (rhs.queueFamilyIndices);
|
||||||
|
vmaAllocator = rhs.vmaAllocator;
|
||||||
|
nonDedicatedBestIndex = 0;
|
||||||
|
parentPhysicalDeviceHdl = rhs.parentPhysicalDeviceHdl;
|
||||||
|
|
||||||
|
rhs.vkLogicalDevice = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
@ -532,10 +550,9 @@ namespace SHADE
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<SHVkDescriptorSetLayout> SHVkLogicalDevice::CreateDescriptorSetLayout(SetIndex setIndex, std::vector<SHVkDescriptorSetLayout::Binding> const& bindings) noexcept
|
Handle<SHVkDescriptorSetLayout> SHVkLogicalDevice::CreateDescriptorSetLayout(SetIndex setIndex, std::vector<SHVkDescriptorSetLayout::Binding> const& bindings, bool genImmutableSamplers/* = false*/) noexcept
|
||||||
{
|
{
|
||||||
return SHVkInstance::GetResourceManager().Create <SHVkDescriptorSetLayout>(GetHandle(), setIndex, bindings);
|
return SHVkInstance::GetResourceManager().Create <SHVkDescriptorSetLayout>(GetHandle(), setIndex, bindings, genImmutableSamplers);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<SHVkDescriptorPool> SHVkLogicalDevice::CreateDescriptorPools(const SHVkDescriptorPool::Config& config /*= {}*/) noexcept
|
Handle<SHVkDescriptorPool> SHVkLogicalDevice::CreateDescriptorPools(const SHVkDescriptorPool::Config& config /*= {}*/) noexcept
|
||||||
|
|
|
@ -115,7 +115,7 @@ namespace SHADE
|
||||||
~SHVkLogicalDevice (void) noexcept;
|
~SHVkLogicalDevice (void) noexcept;
|
||||||
|
|
||||||
SHVkLogicalDevice& operator= (SHVkLogicalDevice const& rhs) noexcept = default;
|
SHVkLogicalDevice& operator= (SHVkLogicalDevice const& rhs) noexcept = default;
|
||||||
SHVkLogicalDevice& operator= (SHVkLogicalDevice&& rhs) noexcept = default;
|
SHVkLogicalDevice& operator= (SHVkLogicalDevice&& rhs) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* PUBLIC MEMBER VARIABLES */
|
/* PUBLIC MEMBER VARIABLES */
|
||||||
|
@ -186,7 +186,7 @@ namespace SHADE
|
||||||
Handle<SHVkRenderpass> CreateRenderpass (std::span<vk::AttachmentDescription> const vkDescriptions, std::vector<SHVkSubpassParams> const& subpasses) noexcept;
|
Handle<SHVkRenderpass> CreateRenderpass (std::span<vk::AttachmentDescription> const vkDescriptions, std::vector<SHVkSubpassParams> const& subpasses) noexcept;
|
||||||
Handle<SHVkRenderpass> CreateRenderpass (std::span<vk::AttachmentDescription> const vkDescriptions, std::span<vk::SubpassDescription> const spDescs, std::span<vk::SubpassDependency> const spDeps) noexcept;
|
Handle<SHVkRenderpass> CreateRenderpass (std::span<vk::AttachmentDescription> const vkDescriptions, std::span<vk::SubpassDescription> const spDescs, std::span<vk::SubpassDependency> const spDeps) noexcept;
|
||||||
Handle<SHVkFramebuffer> CreateFramebuffer (Handle<SHVkRenderpass> const& renderpassHdl, std::vector<Handle<SHVkImageView>> const& attachments, uint32_t inWidth, uint32_t inHeight) noexcept;
|
Handle<SHVkFramebuffer> CreateFramebuffer (Handle<SHVkRenderpass> const& renderpassHdl, std::vector<Handle<SHVkImageView>> const& attachments, uint32_t inWidth, uint32_t inHeight) noexcept;
|
||||||
Handle<SHVkDescriptorSetLayout> CreateDescriptorSetLayout (SetIndex setIndex, std::vector<SHVkDescriptorSetLayout::Binding> const& bindings) noexcept;
|
Handle<SHVkDescriptorSetLayout> CreateDescriptorSetLayout (SetIndex setIndex, std::vector<SHVkDescriptorSetLayout::Binding> const& bindings, bool genImmutableSamplers = false) noexcept;
|
||||||
Handle<SHVkDescriptorPool> CreateDescriptorPools (const SHVkDescriptorPool::Config& config = {}) noexcept;
|
Handle<SHVkDescriptorPool> CreateDescriptorPools (const SHVkDescriptorPool::Config& config = {}) noexcept;
|
||||||
Handle<SHVkDescriptorSetGroup> CreateDescriptorSetGroup(Handle<SHVkDescriptorPool> pool,
|
Handle<SHVkDescriptorSetGroup> CreateDescriptorSetGroup(Handle<SHVkDescriptorPool> pool,
|
||||||
std::vector<Handle<SHVkDescriptorSetLayout>> const& layouts,
|
std::vector<Handle<SHVkDescriptorSetLayout>> const& layouts,
|
||||||
|
|
|
@ -98,6 +98,51 @@ namespace SHADE
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHVkFramebuffer::HandleResize(Handle<SHVkRenderpass> const& renderpassHdl, std::vector<Handle<SHVkImageView>> const& attachments, uint32_t inWidth, uint32_t inHeight) noexcept
|
||||||
|
{
|
||||||
|
width = inWidth;
|
||||||
|
height = inHeight;
|
||||||
|
|
||||||
|
for (auto& attachment : attachments)
|
||||||
|
{
|
||||||
|
// Not sure if its an error to pass in diff dimension images.
|
||||||
|
if (attachment->GetParentImage()->GetWidth() != (*attachments.begin())->GetParentImage()->GetWidth() || attachment->GetParentImage()->GetHeight() != (*attachments.begin())->GetParentImage()->GetHeight())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Dimensions of images not same as each other. Cannot create framebuffer.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<vk::ImageView> vkAttachments(attachments.size());
|
||||||
|
|
||||||
|
uint32_t i = 0;
|
||||||
|
for(auto const& attachment : attachments)
|
||||||
|
{
|
||||||
|
vkAttachments[i] = attachment->GetImageView();
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
vk::FramebufferCreateInfo createInfo
|
||||||
|
{
|
||||||
|
.renderPass = renderpassHdl->GetVkRenderpass(),
|
||||||
|
.attachmentCount = static_cast<uint32_t>(vkAttachments.size()),
|
||||||
|
.pAttachments = vkAttachments.data(),
|
||||||
|
.width = width,
|
||||||
|
.height = height,
|
||||||
|
.layers = 1 // TODO: Find out why this is 1
|
||||||
|
};
|
||||||
|
|
||||||
|
if (auto result = logicalDeviceHdl->GetVkLogicalDevice().createFramebuffer(&createInfo, nullptr, &vkFramebuffer); result != vk::Result::eSuccess)
|
||||||
|
{
|
||||||
|
SHVulkanDebugUtil::ReportVkError(result, "Failed to create framebuffer. ");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHVulkanDebugUtil::ReportVkSuccess("Successfully created framebuffer. ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,8 @@ namespace SHADE
|
||||||
SHVkFramebuffer(SHVkFramebuffer&& rhs) noexcept;
|
SHVkFramebuffer(SHVkFramebuffer&& rhs) noexcept;
|
||||||
SHVkFramebuffer& operator=(SHVkFramebuffer&& rhs) noexcept;
|
SHVkFramebuffer& operator=(SHVkFramebuffer&& rhs) noexcept;
|
||||||
|
|
||||||
|
void HandleResize (Handle<SHVkRenderpass> const& renderpassHdl, std::vector<Handle<SHVkImageView>> const& attachments, uint32_t inWidth, uint32_t inHeight) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* SETTERS AND GETTERS */
|
/* SETTERS AND GETTERS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
|
|
@ -79,6 +79,41 @@ namespace SHADE
|
||||||
vmaUnmapMemory(*vmaAllocator, stagingAlloc);
|
vmaUnmapMemory(*vmaAllocator, stagingAlloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHVkImage::CreateFramebufferImage(void) noexcept
|
||||||
|
{
|
||||||
|
vk::ImageCreateInfo imageCreateInfo{};
|
||||||
|
imageCreateInfo.imageType = vk::ImageType::e2D;
|
||||||
|
imageCreateInfo.extent.width = width;
|
||||||
|
imageCreateInfo.extent.height = height;
|
||||||
|
imageCreateInfo.extent.depth = depth;
|
||||||
|
imageCreateInfo.mipLevels = mipLevelCount;
|
||||||
|
imageCreateInfo.arrayLayers = layerCount;
|
||||||
|
imageCreateInfo.format = imageFormat;
|
||||||
|
imageCreateInfo.tiling = vk::ImageTiling::eOptimal;
|
||||||
|
imageCreateInfo.initialLayout = vk::ImageLayout::eUndefined;
|
||||||
|
imageCreateInfo.usage = usageFlags;
|
||||||
|
imageCreateInfo.sharingMode = vk::SharingMode::eExclusive;
|
||||||
|
imageCreateInfo.samples = vk::SampleCountFlagBits::e1;
|
||||||
|
imageCreateInfo.flags = createFlags;
|
||||||
|
|
||||||
|
|
||||||
|
// Prepare allocation parameters for call to create images later
|
||||||
|
VmaAllocationCreateInfo allocCreateInfo{};
|
||||||
|
allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;
|
||||||
|
allocCreateInfo.flags = {}; // TODO: Make sure the vk::MemoryPropertyFlags returned from vmaGetAllocationMemoryProperties has the device local bit set
|
||||||
|
|
||||||
|
VmaAllocationInfo allocInfo{};
|
||||||
|
|
||||||
|
VkImage tempImage;
|
||||||
|
auto result = vmaCreateImage(*vmaAllocator, &imageCreateInfo.operator VkImageCreateInfo & (), &allocCreateInfo, &tempImage, &alloc, &allocInfo);
|
||||||
|
vkImage = tempImage;
|
||||||
|
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
SHVulkanDebugUtil::ReportVkError(vk::Result(result), "Failed to create vulkan image. ");
|
||||||
|
else
|
||||||
|
SHVulkanDebugUtil::ReportVkSuccess("Successfully created image. ");
|
||||||
|
}
|
||||||
|
|
||||||
SHVkImage::SHVkImage(
|
SHVkImage::SHVkImage(
|
||||||
VmaAllocator const* allocator,
|
VmaAllocator const* allocator,
|
||||||
SHImageCreateParams const& imageDetails,
|
SHImageCreateParams const& imageDetails,
|
||||||
|
@ -196,37 +231,7 @@ namespace SHADE
|
||||||
, createFlags {create}
|
, createFlags {create}
|
||||||
, vmaAllocator {allocator}
|
, vmaAllocator {allocator}
|
||||||
{
|
{
|
||||||
vk::ImageCreateInfo imageCreateInfo{};
|
CreateFramebufferImage();
|
||||||
imageCreateInfo.imageType = vk::ImageType::e2D;
|
|
||||||
imageCreateInfo.extent.width = width;
|
|
||||||
imageCreateInfo.extent.height = height;
|
|
||||||
imageCreateInfo.extent.depth = depth;
|
|
||||||
imageCreateInfo.mipLevels = mipLevelCount;
|
|
||||||
imageCreateInfo.arrayLayers = layerCount;
|
|
||||||
imageCreateInfo.format = imageFormat;
|
|
||||||
imageCreateInfo.tiling = vk::ImageTiling::eOptimal;
|
|
||||||
imageCreateInfo.initialLayout = vk::ImageLayout::eUndefined;
|
|
||||||
imageCreateInfo.usage = usageFlags;
|
|
||||||
imageCreateInfo.sharingMode = vk::SharingMode::eExclusive;
|
|
||||||
imageCreateInfo.samples = vk::SampleCountFlagBits::e1;
|
|
||||||
imageCreateInfo.flags = createFlags;
|
|
||||||
|
|
||||||
|
|
||||||
// Prepare allocation parameters for call to create images later
|
|
||||||
VmaAllocationCreateInfo allocCreateInfo{};
|
|
||||||
allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;
|
|
||||||
allocCreateInfo.flags = {}; // TODO: Make sure the vk::MemoryPropertyFlags returned from vmaGetAllocationMemoryProperties has the device local bit set
|
|
||||||
|
|
||||||
VmaAllocationInfo allocInfo{};
|
|
||||||
|
|
||||||
VkImage tempImage;
|
|
||||||
auto result = vmaCreateImage(*vmaAllocator, &imageCreateInfo.operator VkImageCreateInfo & (), &allocCreateInfo, &tempImage, &alloc, &allocInfo);
|
|
||||||
vkImage = tempImage;
|
|
||||||
|
|
||||||
if (result != VK_SUCCESS)
|
|
||||||
SHVulkanDebugUtil::ReportVkError(vk::Result(result), "Failed to create vulkan image. ");
|
|
||||||
else
|
|
||||||
SHVulkanDebugUtil::ReportVkSuccess("Successfully created image. ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<SHVkImageView> SHVkImage::CreateImageView(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) const noexcept
|
Handle<SHVkImageView> SHVkImage::CreateImageView(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) const noexcept
|
||||||
|
@ -288,6 +293,16 @@ namespace SHADE
|
||||||
barrier.subresourceRange.layerCount = layerCount;
|
barrier.subresourceRange.layerCount = layerCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHVkImage::HandleResizeFramebufferImage(uint32_t newWidth, uint32_t newHeight) noexcept
|
||||||
|
{
|
||||||
|
vmaDestroyImage(*vmaAllocator, vkImage, alloc);
|
||||||
|
|
||||||
|
width = newWidth;
|
||||||
|
height = newHeight;
|
||||||
|
|
||||||
|
CreateFramebufferImage();
|
||||||
|
}
|
||||||
|
|
||||||
void SHVkImage::LinkWithExteriorImage(vk::Image inVkImage, vk::ImageType type, uint32_t inWidth, uint32_t inHeight, uint32_t inDepth, uint32_t layers, uint8_t levels, vk::Format format, vk::ImageUsageFlags flags) noexcept
|
void SHVkImage::LinkWithExteriorImage(vk::Image inVkImage, vk::ImageType type, uint32_t inWidth, uint32_t inHeight, uint32_t inDepth, uint32_t layers, uint8_t levels, vk::Format format, vk::ImageUsageFlags flags) noexcept
|
||||||
{
|
{
|
||||||
vkImage = inVkImage;
|
vkImage = inVkImage;
|
||||||
|
|
|
@ -108,7 +108,7 @@ namespace SHADE
|
||||||
/* PRIVATE MEMBER FUNCTIONS */
|
/* PRIVATE MEMBER FUNCTIONS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
void PrepStagingBuffer(const void* data, uint32_t srcSize) noexcept;
|
void PrepStagingBuffer(const void* data, uint32_t srcSize) noexcept;
|
||||||
|
void CreateFramebufferImage (void) noexcept;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
@ -137,6 +137,7 @@ namespace SHADE
|
||||||
Handle<SHVkImageView> CreateImageView (Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) const noexcept;
|
Handle<SHVkImageView> CreateImageView (Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) const noexcept;
|
||||||
void TransferToDeviceResource (Handle<SHVkCommandBuffer> cmdBufferHdl) noexcept;
|
void TransferToDeviceResource (Handle<SHVkCommandBuffer> cmdBufferHdl) noexcept;
|
||||||
void PrepareImageTransitionInfo (vk::ImageLayout oldLayout, vk::ImageLayout newLayout, vk::ImageMemoryBarrier& barrier) noexcept;
|
void PrepareImageTransitionInfo (vk::ImageLayout oldLayout, vk::ImageLayout newLayout, vk::ImageMemoryBarrier& barrier) noexcept;
|
||||||
|
void HandleResizeFramebufferImage(uint32_t newWidth, uint32_t newHeight) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* GETTERS AND SETTERS */
|
/* GETTERS AND SETTERS */
|
||||||
|
|
|
@ -6,27 +6,13 @@
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
/***************************************************************************/
|
|
||||||
/*!
|
|
||||||
|
|
||||||
\brief
|
void SHVkImageView::Create(void) noexcept
|
||||||
Non-default ctor. Initializes image view with image that it is a view of.
|
|
||||||
|
|
||||||
\param parent
|
|
||||||
Parent image the view is a view of.
|
|
||||||
|
|
||||||
*/
|
|
||||||
/***************************************************************************/
|
|
||||||
SHVkImageView::SHVkImageView(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) noexcept
|
|
||||||
: parentImage{ }
|
|
||||||
, vkImageView{}
|
|
||||||
, imageViewDetails{}
|
|
||||||
, logicalDeviceHdl {inLogicalDeviceHdl}
|
|
||||||
{
|
{
|
||||||
auto parentImageCreateFlags = parent->GetImageeCreateFlags();
|
auto parentImageCreateFlags = parentImage->GetImageeCreateFlags();
|
||||||
|
|
||||||
// 2D array image type means parent image must be 2D array compatible
|
// 2D array image type means parent image must be 2D array compatible
|
||||||
if (createParams.viewType == vk::ImageViewType::e2DArray)
|
if (imageViewDetails.viewType == vk::ImageViewType::e2DArray)
|
||||||
{
|
{
|
||||||
if (!(parentImageCreateFlags & vk::ImageCreateFlagBits::e2DArrayCompatible))
|
if (!(parentImageCreateFlags & vk::ImageCreateFlagBits::e2DArrayCompatible))
|
||||||
{
|
{
|
||||||
|
@ -36,7 +22,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if its possible for the image view to have different format than parent image
|
// Check if its possible for the image view to have different format than parent image
|
||||||
if (createParams.format != parent->GetImageFormat())
|
if (imageViewDetails.format != parentImage->GetImageFormat())
|
||||||
{
|
{
|
||||||
if (!(parentImageCreateFlags & vk::ImageCreateFlagBits::eMutableFormat))
|
if (!(parentImageCreateFlags & vk::ImageCreateFlagBits::eMutableFormat))
|
||||||
{
|
{
|
||||||
|
@ -49,9 +35,9 @@ namespace SHADE
|
||||||
vk::ImageViewCreateInfo viewCreateInfo
|
vk::ImageViewCreateInfo viewCreateInfo
|
||||||
{
|
{
|
||||||
.pNext = nullptr, // Can be used to override with a VkImageViewUsageCreateInfo to override usage. See Vulkan spec page 877 for more information
|
.pNext = nullptr, // Can be used to override with a VkImageViewUsageCreateInfo to override usage. See Vulkan spec page 877 for more information
|
||||||
.image = parent->GetVkImage(),
|
.image = parentImage->GetVkImage(),
|
||||||
.viewType = createParams.viewType,
|
.viewType = imageViewDetails.viewType,
|
||||||
.format = createParams.format,
|
.format = imageViewDetails.format,
|
||||||
.components
|
.components
|
||||||
{
|
{
|
||||||
.r = vk::ComponentSwizzle::eR,
|
.r = vk::ComponentSwizzle::eR,
|
||||||
|
@ -61,15 +47,15 @@ namespace SHADE
|
||||||
},
|
},
|
||||||
.subresourceRange
|
.subresourceRange
|
||||||
{
|
{
|
||||||
.aspectMask = createParams.imageAspectFlags,
|
.aspectMask = imageViewDetails.imageAspectFlags,
|
||||||
.baseMipLevel = createParams.baseMipLevel,
|
.baseMipLevel = imageViewDetails.baseMipLevel,
|
||||||
.levelCount = createParams.mipLevelCount,
|
.levelCount = imageViewDetails.mipLevelCount,
|
||||||
.baseArrayLayer = createParams.baseArrayLayer,
|
.baseArrayLayer = imageViewDetails.baseArrayLayer,
|
||||||
.layerCount = createParams.layerCount,
|
.layerCount = imageViewDetails.layerCount,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (auto result = inLogicalDeviceHdl->GetVkLogicalDevice().createImageView(&viewCreateInfo, nullptr, &vkImageView); result != vk::Result::eSuccess)
|
if (auto result = logicalDeviceHdl->GetVkLogicalDevice().createImageView(&viewCreateInfo, nullptr, &vkImageView); result != vk::Result::eSuccess)
|
||||||
{
|
{
|
||||||
SHVulkanDebugUtil::ReportVkError(result, "Failed to create image view! ");
|
SHVulkanDebugUtil::ReportVkError(result, "Failed to create image view! ");
|
||||||
return;
|
return;
|
||||||
|
@ -79,9 +65,26 @@ namespace SHADE
|
||||||
SHVulkanDebugUtil::ReportVkSuccess("Successfully created image view. ");
|
SHVulkanDebugUtil::ReportVkSuccess("Successfully created image view. ");
|
||||||
}
|
}
|
||||||
|
|
||||||
// After success, THEN assign variables
|
}
|
||||||
parentImage = parent;
|
|
||||||
imageViewDetails = createParams;
|
/***************************************************************************/
|
||||||
|
/*!
|
||||||
|
|
||||||
|
\brief
|
||||||
|
Non-default ctor. Initializes image view with image that it is a view of.
|
||||||
|
|
||||||
|
\param parent
|
||||||
|
Parent image the view is a view of.
|
||||||
|
|
||||||
|
*/
|
||||||
|
/***************************************************************************/
|
||||||
|
SHVkImageView::SHVkImageView(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) noexcept
|
||||||
|
: parentImage{ parent }
|
||||||
|
, vkImageView{}
|
||||||
|
, imageViewDetails{createParams}
|
||||||
|
, logicalDeviceHdl {inLogicalDeviceHdl}
|
||||||
|
{
|
||||||
|
Create();
|
||||||
}
|
}
|
||||||
|
|
||||||
SHVkImageView::SHVkImageView(SHVkImageView&& rhs) noexcept
|
SHVkImageView::SHVkImageView(SHVkImageView&& rhs) noexcept
|
||||||
|
@ -94,6 +97,17 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SHVkImageView::ViewNewImage(Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) noexcept
|
||||||
|
{
|
||||||
|
imageViewDetails = createParams;
|
||||||
|
parentImage = parent;
|
||||||
|
|
||||||
|
if (vkImageView)
|
||||||
|
logicalDeviceHdl->GetVkLogicalDevice().destroyImageView(vkImageView, nullptr);
|
||||||
|
|
||||||
|
Create();
|
||||||
|
}
|
||||||
|
|
||||||
Handle<SHVkImage> const& SHVkImageView::GetParentImage(void) const noexcept
|
Handle<SHVkImage> const& SHVkImageView::GetParentImage(void) const noexcept
|
||||||
{
|
{
|
||||||
return parentImage;
|
return parentImage;
|
||||||
|
|
|
@ -25,12 +25,17 @@ namespace SHADE
|
||||||
//! Logical Device needed for creation and destruction
|
//! Logical Device needed for creation and destruction
|
||||||
Handle<SHVkLogicalDevice> logicalDeviceHdl;
|
Handle<SHVkLogicalDevice> logicalDeviceHdl;
|
||||||
|
|
||||||
|
//! Create new image view
|
||||||
|
void Create (void) noexcept;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SHVkImageView(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) noexcept;
|
SHVkImageView(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) noexcept;
|
||||||
~SHVkImageView(void) noexcept;
|
~SHVkImageView(void) noexcept;
|
||||||
SHVkImageView(SHVkImageView&& rhs) noexcept;
|
SHVkImageView(SHVkImageView&& rhs) noexcept;
|
||||||
SHVkImageView& operator=(SHVkImageView&& rhs) noexcept;
|
SHVkImageView& operator=(SHVkImageView&& rhs) noexcept;
|
||||||
|
|
||||||
|
void ViewNewImage (Handle<SHVkImage> const& parent, SHImageViewDetails const& createParams) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* GETTERS AND SETTERS */
|
/* GETTERS AND SETTERS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
|
|
@ -30,8 +30,9 @@ namespace SHADE
|
||||||
.addressModeU = params.addressMode,
|
.addressModeU = params.addressMode,
|
||||||
.addressModeV = params.addressMode,
|
.addressModeV = params.addressMode,
|
||||||
.addressModeW = params.addressMode,
|
.addressModeW = params.addressMode,
|
||||||
|
.maxAnisotropy = 1.0f,
|
||||||
.minLod = params.minLod,
|
.minLod = params.minLod,
|
||||||
.maxLod = params.maxLod
|
.maxLod = params.maxLod,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create the sampler
|
// Create the sampler
|
||||||
|
@ -40,6 +41,7 @@ namespace SHADE
|
||||||
|
|
||||||
SHVkSampler::SHVkSampler(SHVkSampler&& rhs) noexcept
|
SHVkSampler::SHVkSampler(SHVkSampler&& rhs) noexcept
|
||||||
: vkSampler{ rhs.vkSampler }
|
: vkSampler{ rhs.vkSampler }
|
||||||
|
, device{ rhs.device }
|
||||||
{
|
{
|
||||||
rhs.vkSampler = nullptr;
|
rhs.vkSampler = nullptr;
|
||||||
}
|
}
|
||||||
|
@ -56,6 +58,7 @@ namespace SHADE
|
||||||
SHADE::SHVkSampler& SHVkSampler::operator=(SHVkSampler&& rhs) noexcept
|
SHADE::SHVkSampler& SHVkSampler::operator=(SHVkSampler&& rhs) noexcept
|
||||||
{
|
{
|
||||||
vkSampler = rhs.vkSampler;
|
vkSampler = rhs.vkSampler;
|
||||||
|
device = rhs.device;
|
||||||
rhs.vkSampler = nullptr;
|
rhs.vkSampler = nullptr;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,6 +110,7 @@ namespace SHADE
|
||||||
// Clear CPU buffers
|
// Clear CPU buffers
|
||||||
drawData.clear();
|
drawData.clear();
|
||||||
transformData.clear();
|
transformData.clear();
|
||||||
|
eidData.clear();
|
||||||
matPropsData.reset();
|
matPropsData.reset();
|
||||||
matPropsDataSize = 0;
|
matPropsDataSize = 0;
|
||||||
|
|
||||||
|
@ -119,6 +120,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
drawDataBuffer[i].Free();
|
drawDataBuffer[i].Free();
|
||||||
transformDataBuffer[i].Free();
|
transformDataBuffer[i].Free();
|
||||||
|
eidBuffer[i].Free();
|
||||||
matPropsBuffer[i].Free();
|
matPropsBuffer[i].Free();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -206,6 +208,30 @@ namespace SHADE
|
||||||
transformDataBuffer[frameIndex]->WriteToMemory(transformData.data(), static_cast<uint32_t>(transformData.size() * sizeof(SHMatrix)), 0, 0);
|
transformDataBuffer[frameIndex]->WriteToMemory(transformData.data(), static_cast<uint32_t>(transformData.size() * sizeof(SHMatrix)), 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHBatch::UpdateEIDBuffer(uint32_t frameIndex)
|
||||||
|
{
|
||||||
|
if (frameIndex >= SHGraphicsConstants::NUM_FRAME_BUFFERS)
|
||||||
|
{
|
||||||
|
SHLOG_WARNING("[SHBatch] Attempted to update eid buffers with an invalid frame index.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset Transform Data
|
||||||
|
eidData.clear();
|
||||||
|
|
||||||
|
// Populate on the CPU
|
||||||
|
for (auto& subBatch : subBatches)
|
||||||
|
for (const SHRenderable* renderable : subBatch.Renderables)
|
||||||
|
{
|
||||||
|
eidData.emplace_back(renderable->GetEID());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transfer to GPU
|
||||||
|
if (eidBuffer[frameIndex])
|
||||||
|
eidBuffer[frameIndex]->WriteToMemory(eidData.data(), static_cast<EntityID>(eidData.size() * sizeof(EntityID)), 0, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void SHBatch::Build(Handle<SHVkLogicalDevice> _device, Handle<SHVkDescriptorPool> descPool, uint32_t frameIndex)
|
void SHBatch::Build(Handle<SHVkLogicalDevice> _device, Handle<SHVkDescriptorPool> descPool, uint32_t frameIndex)
|
||||||
{
|
{
|
||||||
if (frameIndex >= SHGraphicsConstants::NUM_FRAME_BUFFERS)
|
if (frameIndex >= SHGraphicsConstants::NUM_FRAME_BUFFERS)
|
||||||
|
@ -237,6 +263,11 @@ namespace SHADE
|
||||||
// - Transform data
|
// - Transform data
|
||||||
transformData.reserve(numTotalElements);
|
transformData.reserve(numTotalElements);
|
||||||
transformData.clear();
|
transformData.clear();
|
||||||
|
// - EID data
|
||||||
|
eidData.reserve(numTotalElements);
|
||||||
|
eidData.clear();
|
||||||
|
|
||||||
|
|
||||||
// - Material Properties Data
|
// - Material Properties Data
|
||||||
const Handle<SHShaderBlockInterface> SHADER_INFO = pipeline->GetPipelineLayout()->GetShaderBlockInterface
|
const Handle<SHShaderBlockInterface> SHADER_INFO = pipeline->GetPipelineLayout()->GetShaderBlockInterface
|
||||||
(
|
(
|
||||||
|
@ -249,7 +280,7 @@ namespace SHADE
|
||||||
if (!EMPTY_MAT_PROPS)
|
if (!EMPTY_MAT_PROPS)
|
||||||
{
|
{
|
||||||
singleMatPropSize = SHADER_INFO->GetBytesRequired();
|
singleMatPropSize = SHADER_INFO->GetBytesRequired();
|
||||||
singleMatPropAlignedSize = device->PadSSBOSize(singleMatPropSize);
|
singleMatPropAlignedSize = device->PadSSBOSize(static_cast<uint32_t>(singleMatPropSize));
|
||||||
matPropTotalBytes = numTotalElements * singleMatPropAlignedSize;
|
matPropTotalBytes = numTotalElements * singleMatPropAlignedSize;
|
||||||
if (matPropsDataSize < matPropTotalBytes)
|
if (matPropsDataSize < matPropTotalBytes)
|
||||||
{
|
{
|
||||||
|
@ -277,7 +308,8 @@ namespace SHADE
|
||||||
for (const SHRenderable* renderable : subBatch.Renderables)
|
for (const SHRenderable* renderable : subBatch.Renderables)
|
||||||
{
|
{
|
||||||
// Transform
|
// Transform
|
||||||
auto transform = SHComponentManager::GetComponent_s<SHTransformComponent>(renderable->GetEID());
|
EntityID eid = renderable->GetEID();
|
||||||
|
auto transform = SHComponentManager::GetComponent_s<SHTransformComponent>(eid);
|
||||||
if (!transform)
|
if (!transform)
|
||||||
{
|
{
|
||||||
SHLOG_WARNING("[SHBatch] Entity contianing a SHRenderable with no SHTransformComponent found!");
|
SHLOG_WARNING("[SHBatch] Entity contianing a SHRenderable with no SHTransformComponent found!");
|
||||||
|
@ -288,6 +320,8 @@ namespace SHADE
|
||||||
transformData.emplace_back(transform->GetTRS());
|
transformData.emplace_back(transform->GetTRS());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eidData.emplace_back(eid);
|
||||||
|
|
||||||
// Material Properties
|
// Material Properties
|
||||||
if (!EMPTY_MAT_PROPS)
|
if (!EMPTY_MAT_PROPS)
|
||||||
{
|
{
|
||||||
|
@ -317,6 +351,12 @@ namespace SHADE
|
||||||
device, transformDataBuffer[frameIndex], transformData.data(), TF_DATA_BYTES,
|
device, transformDataBuffer[frameIndex], transformData.data(), TF_DATA_BYTES,
|
||||||
BuffUsage::eVertexBuffer
|
BuffUsage::eVertexBuffer
|
||||||
);
|
);
|
||||||
|
const uint32_t EID_DATA_BYTES = static_cast<uint32_t>(eidData.size() * sizeof(EntityID));
|
||||||
|
SHVkUtil::EnsureBufferAndCopyHostVisibleData
|
||||||
|
(
|
||||||
|
device, eidBuffer[frameIndex], eidData.data(), EID_DATA_BYTES,
|
||||||
|
BuffUsage::eVertexBuffer
|
||||||
|
);
|
||||||
// - Material Properties Buffer
|
// - Material Properties Buffer
|
||||||
rebuildMaterialBuffers(frameIndex, descPool);
|
rebuildMaterialBuffers(frameIndex, descPool);
|
||||||
|
|
||||||
|
@ -339,6 +379,7 @@ namespace SHADE
|
||||||
static std::array<uint32_t, 1> dynamicOffset { 0 };
|
static std::array<uint32_t, 1> dynamicOffset { 0 };
|
||||||
cmdBuffer->BindPipeline(pipeline);
|
cmdBuffer->BindPipeline(pipeline);
|
||||||
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::TRANSFORM, transformDataBuffer[frameIndex], 0);
|
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::TRANSFORM, transformDataBuffer[frameIndex], 0);
|
||||||
|
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::EID, eidBuffer[frameIndex], 0);
|
||||||
if (matPropsDescSet[frameIndex])
|
if (matPropsDescSet[frameIndex])
|
||||||
{
|
{
|
||||||
cmdBuffer->BindDescriptorSet
|
cmdBuffer->BindDescriptorSet
|
||||||
|
@ -386,7 +427,7 @@ namespace SHADE
|
||||||
SHGraphicsConstants::DescriptorSetIndex::PER_INSTANCE,
|
SHGraphicsConstants::DescriptorSetIndex::PER_INSTANCE,
|
||||||
SHGraphicsConstants::DescriptorSetBindings::BATCHED_PER_INST_DATA,
|
SHGraphicsConstants::DescriptorSetBindings::BATCHED_PER_INST_DATA,
|
||||||
bufferList,
|
bufferList,
|
||||||
0, matPropsDataSize
|
0, static_cast<uint32_t>(matPropsDataSize)
|
||||||
);
|
);
|
||||||
matPropsDescSet[frameIndex]->UpdateDescriptorSetBuffer
|
matPropsDescSet[frameIndex]->UpdateDescriptorSetBuffer
|
||||||
(
|
(
|
||||||
|
|
|
@ -22,6 +22,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMaterial.h"
|
#include "Graphics/MiddleEnd/Interface/SHMaterial.h"
|
||||||
#include "Math/SHMatrix.h"
|
#include "Math/SHMatrix.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h"
|
#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h"
|
||||||
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -78,6 +79,7 @@ namespace SHADE
|
||||||
void Clear();
|
void Clear();
|
||||||
void UpdateMaterialBuffer(uint32_t frameIndex, Handle<SHVkDescriptorPool> descPool);
|
void UpdateMaterialBuffer(uint32_t frameIndex, Handle<SHVkDescriptorPool> descPool);
|
||||||
void UpdateTransformBuffer(uint32_t frameIndex);
|
void UpdateTransformBuffer(uint32_t frameIndex);
|
||||||
|
void UpdateEIDBuffer(uint32_t frameIndex);
|
||||||
void Build(Handle<SHVkLogicalDevice> device, Handle<SHVkDescriptorPool> descPool, uint32_t frameIndex) ;
|
void Build(Handle<SHVkLogicalDevice> device, Handle<SHVkDescriptorPool> descPool, uint32_t frameIndex) ;
|
||||||
void Draw(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex);
|
void Draw(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex);
|
||||||
|
|
||||||
|
@ -109,6 +111,7 @@ namespace SHADE
|
||||||
// CPU Buffers
|
// CPU Buffers
|
||||||
std::vector<vk::DrawIndexedIndirectCommand> drawData;
|
std::vector<vk::DrawIndexedIndirectCommand> drawData;
|
||||||
std::vector<SHMatrix> transformData;
|
std::vector<SHMatrix> transformData;
|
||||||
|
std::vector<EntityID> eidData;
|
||||||
std::unique_ptr<char> matPropsData;
|
std::unique_ptr<char> matPropsData;
|
||||||
Byte matPropsDataSize = 0;
|
Byte matPropsDataSize = 0;
|
||||||
Byte singleMatPropAlignedSize = 0;
|
Byte singleMatPropAlignedSize = 0;
|
||||||
|
@ -117,6 +120,7 @@ namespace SHADE
|
||||||
// GPU Buffers
|
// GPU Buffers
|
||||||
TripleBuffer drawDataBuffer;
|
TripleBuffer drawDataBuffer;
|
||||||
TripleBuffer transformDataBuffer;
|
TripleBuffer transformDataBuffer;
|
||||||
|
TripleBuffer eidBuffer;
|
||||||
TripleBuffer matPropsBuffer;
|
TripleBuffer matPropsBuffer;
|
||||||
TripleDescSet matPropsDescSet;
|
TripleDescSet matPropsDescSet;
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
batch.UpdateMaterialBuffer(frameIndex, descPool);
|
batch.UpdateMaterialBuffer(frameIndex, descPool);
|
||||||
batch.UpdateTransformBuffer(frameIndex);
|
batch.UpdateTransformBuffer(frameIndex);
|
||||||
|
batch.UpdateEIDBuffer(frameIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,7 @@ namespace SHADE
|
||||||
defaultVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); // Normals at binding 2
|
defaultVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); // Normals at binding 2
|
||||||
defaultVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); // Tangents at binding 3
|
defaultVertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); // Tangents at binding 3
|
||||||
defaultVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::MAT_4D) }); // Transform at binding 4 - 7 (4 slots)
|
defaultVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::MAT_4D) }); // Transform at binding 4 - 7 (4 slots)
|
||||||
|
defaultVertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::UINT32_1D) }); // EID at binding 8
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHGraphicsGlobalData::Init(Handle<SHVkLogicalDevice> logicalDevice) noexcept
|
void SHGraphicsGlobalData::Init(Handle<SHVkLogicalDevice> logicalDevice) noexcept
|
||||||
|
|
|
@ -69,7 +69,7 @@ namespace SHADE
|
||||||
SHMatrix inverseViewMatrix;
|
SHMatrix inverseViewMatrix;
|
||||||
SHMatrix inverseProjMatrix;
|
SHMatrix inverseProjMatrix;
|
||||||
SHMatrix inverseVpMatrix;
|
SHMatrix inverseVpMatrix;
|
||||||
bool isDirty;
|
bool isDirty = true;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Helper Functions */
|
/* Helper Functions */
|
||||||
|
|
|
@ -25,6 +25,12 @@ namespace SHADE
|
||||||
struct SHGraphicsConstants
|
struct SHGraphicsConstants
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
struct RenderGraphIndices
|
||||||
|
{
|
||||||
|
static constexpr uint32_t WORLD = 0;
|
||||||
|
static constexpr uint32_t EDITOR = 0;
|
||||||
|
};
|
||||||
|
|
||||||
struct DescriptorSetIndex
|
struct DescriptorSetIndex
|
||||||
{
|
{
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
@ -144,6 +150,14 @@ namespace SHADE
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
static constexpr uint32_t TRANSFORM = 4;
|
static constexpr uint32_t TRANSFORM = 4;
|
||||||
|
/***************************************************************************/
|
||||||
|
/*!
|
||||||
|
\brief
|
||||||
|
Vertex buffer bindings for the eid buffer.
|
||||||
|
*/
|
||||||
|
/***************************************************************************/
|
||||||
|
static constexpr uint32_t EID = 5;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
|
@ -32,14 +32,13 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Graphics/Buffers/SHVkBuffer.h"
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
#include "Graphics/Images/SHVkSampler.h"
|
#include "Graphics/Images/SHVkSampler.h"
|
||||||
#include "Assets/Asset Types/SHTextureAsset.h"
|
#include "Assets/Asset Types/SHTextureAsset.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHMousePickSystem.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
#pragma region INIT_EXIT
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
void SHGraphicsSystem::InitBoilerplate(void) noexcept
|
||||||
/* Constructor/Destructors */
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
|
||||||
void SHGraphicsSystem::Init(void)
|
|
||||||
{
|
{
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* BACKEND BOILERPLATE */
|
/* BACKEND BOILERPLATE */
|
||||||
|
@ -67,9 +66,25 @@ namespace SHADE
|
||||||
// Register callback to notify render context upon a window resize
|
// Register callback to notify render context upon a window resize
|
||||||
window->RegisterWindowSizeCallback([&]([[maybe_unused]] uint32_t width, [[maybe_unused]] uint32_t height)
|
window->RegisterWindowSizeCallback([&]([[maybe_unused]] uint32_t width, [[maybe_unused]] uint32_t height)
|
||||||
{
|
{
|
||||||
renderContext.SetIsResized(true);
|
if (width == 0 || height == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
|
||||||
|
//PrepareResize(1, 1, SHVec2(0, 0));
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
PrepareResize(resizeWidth, resizeHeight, SHVec2(0, 0));
|
||||||
|
|
||||||
|
#endif
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window->RegisterWindowCloseCallback([&](void)
|
||||||
|
{
|
||||||
|
renderContext.SetWindowIsDead(true);
|
||||||
|
}
|
||||||
|
);
|
||||||
// Create graphics queue
|
// Create graphics queue
|
||||||
graphicsQueue = device->GetQueue(SH_Q_FAM::GRAPHICS, 0);
|
graphicsQueue = device->GetQueue(SH_Q_FAM::GRAPHICS, 0);
|
||||||
transferQueue = device->GetQueue(SH_Q_FAM::TRANSFER, 0);
|
transferQueue = device->GetQueue(SH_Q_FAM::TRANSFER, 0);
|
||||||
|
@ -97,9 +112,10 @@ namespace SHADE
|
||||||
graphicsCmdPool = device->CreateCommandPool(SH_QUEUE_FAMILY_ARRAY_INDEX::GRAPHICS, SH_CMD_POOL_RESET::POOL_BASED, true);
|
graphicsCmdPool = device->CreateCommandPool(SH_QUEUE_FAMILY_ARRAY_INDEX::GRAPHICS, SH_CMD_POOL_RESET::POOL_BASED, true);
|
||||||
transferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
transferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||||
graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHGraphicsSystem::InitSceneRenderGraph(void) noexcept
|
||||||
|
{
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* MIDDLE END SETUP
|
/* MIDDLE END SETUP
|
||||||
- Viewports
|
- Viewports
|
||||||
|
@ -109,23 +125,23 @@ namespace SHADE
|
||||||
- Default vertex input state
|
- Default vertex input state
|
||||||
- Global data
|
- Global data
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
auto windowDims = window->GetWindowSize();
|
||||||
|
|
||||||
SHGraphicsGlobalData::Init(device);
|
|
||||||
|
|
||||||
// Set Up Cameras
|
// Set Up Cameras
|
||||||
screenCamera = resourceManager.Create<SHCamera>();
|
screenCamera = resourceManager.Create<SHCamera>();
|
||||||
screenCamera->SetLookAt(SHVec3(0.0f, 0.0f, -1.0f), SHVec3(0.0f, 0.0f, 1.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
screenCamera->SetLookAt(SHVec3(0.0f, 0.0f, -1.0f), SHVec3(0.0f, 0.0f, 1.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
||||||
screenCamera->SetOrthographic(static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.01f, 100.0f);
|
screenCamera->SetOrthographic(static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.01f, 100.0f);
|
||||||
|
|
||||||
worldCamera = resourceManager.Create<SHCamera>();
|
worldCamera = resourceManager.Create<SHCamera>();
|
||||||
//worldCamera->SetLookAt(SHVec3(1.0f, 0.0f, -1.0f), SHVec3(0.0f, 0.0f, 2.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
|
||||||
worldCamera->SetLookAt(SHVec3(0.0f, 0.0f, 0.0f), SHVec3(0.0f, 0.0f, -2.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
worldCamera->SetLookAt(SHVec3(0.0f, 0.0f, 0.0f), SHVec3(0.0f, 0.0f, -2.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
||||||
worldCamera->SetPerspective(90.0f, static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.0f, 100.0f);
|
worldCamera->SetPerspective(90.0f, static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.0f, 100.0f);
|
||||||
|
|
||||||
// Create Default Viewport
|
// Create Default Viewport
|
||||||
defaultViewport = AddViewport(vk::Viewport(0.0f, 0.0f, static_cast<float>(window->GetWindowSize().first), static_cast<float>(window->GetWindowSize().second), 0.0f, 1.0f));
|
worldViewport = AddViewport(vk::Viewport(0.0f, 0.0f, static_cast<float>(window->GetWindowSize().first), static_cast<float>(window->GetWindowSize().second), 0.0f, 1.0f));
|
||||||
|
|
||||||
// Get render graph from default viewport world renderer
|
// Get render graph from default viewport world renderer
|
||||||
auto worldRenderGraph = resourceManager.Create<SHRenderGraph>();
|
worldRenderGraph = resourceManager.Create<SHRenderGraph>();
|
||||||
|
|
||||||
std::vector<Handle<SHVkCommandPool>> renderContextCmdPools{ swapchain->GetNumImages() };
|
std::vector<Handle<SHVkCommandPool>> renderContextCmdPools{ swapchain->GetNumImages() };
|
||||||
for (uint32_t i = 0; i < renderContextCmdPools.size(); ++i)
|
for (uint32_t i = 0; i < renderContextCmdPools.size(); ++i)
|
||||||
|
@ -135,48 +151,27 @@ namespace SHADE
|
||||||
|
|
||||||
// Initialize world render graph
|
// Initialize world render graph
|
||||||
worldRenderGraph->Init(device, swapchain);
|
worldRenderGraph->Init(device, swapchain);
|
||||||
worldRenderGraph->AddResource("Depth Buffer", SH_ATT_DESC_TYPE::DEPTH_STENCIL, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint);
|
worldRenderGraph->AddResource("Scene", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT }, windowDims.first, windowDims.second);
|
||||||
//worldRenderGraph->AddResource("Position", SH_ATT_DESC_TYPE::COLOR, windowDims.first, windowDims.second, vk::Format::eR16G16B16A16Sfloat);
|
worldRenderGraph->AddResource("Depth Buffer", { SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL }, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint);
|
||||||
//worldRenderGraph->AddResource("Normals", SH_ATT_DESC_TYPE::COLOR, windowDims.first, windowDims.second, vk::Format::eR16G16B16A16Sfloat);
|
worldRenderGraph->AddResource("Entity ID", { SH_ATT_DESC_TYPE_FLAGS::COLOR }, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc);
|
||||||
//worldRenderGraph->AddResource("Composite", SH_ATT_DESC_TYPE::COLOR, windowDims.first, windowDims.second, vk::Format::eR16G16B16A16Sfloat);
|
|
||||||
//worldRenderGraph->AddResource("Scene", SH_ATT_DESC_TYPE::COLOR, windowDims.first, windowDims.second, vk::Format::eB8G8R8A8Unorm);
|
auto node = worldRenderGraph->AddNode("G-Buffer", { "Entity ID", "Depth Buffer", "Scene"}, {}); // no predecessors
|
||||||
worldRenderGraph->AddResource("Present", SH_ATT_DESC_TYPE::COLOR_PRESENT, windowDims.first, windowDims.second);
|
|
||||||
auto node = worldRenderGraph->AddNode("G-Buffer", { /*"Composite", "Position", */"Depth Buffer", "Present" }, {}); // no predecessors
|
|
||||||
|
|
||||||
//First subpass to write to G-Buffer
|
//First subpass to write to G-Buffer
|
||||||
auto gBufferWriteSubpass = node->AddSubpass("G-Buffer Write");
|
auto gBufferWriteSubpass = node->AddSubpass("G-Buffer Write");
|
||||||
//gBufferWriteSubpass->AddColorOutput("Scene");
|
gBufferWriteSubpass->AddColorOutput("Scene");
|
||||||
gBufferWriteSubpass->AddColorOutput("Present");
|
gBufferWriteSubpass->AddColorOutput("Entity ID");
|
||||||
gBufferWriteSubpass->AddDepthOutput ("Depth Buffer", SH_ATT_DESC_TYPE::DEPTH_STENCIL);
|
gBufferWriteSubpass->AddDepthOutput("Depth Buffer", SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL);
|
||||||
//writeSubpass->AddColorOutput("Normals");
|
|
||||||
|
|
||||||
// //Second subpass to read from G-Buffer
|
// We do this to just transition our scene layout to shader read
|
||||||
//auto compositeSubpass = node->AddSubpass("G-Buffer Composite");
|
auto sceneLayoutTransitionSubpass = node->AddSubpass("Scene Layout Transition");
|
||||||
//compositeSubpass->AddColorOutput("Present"); // TODO: This should be "Composite" and then composite will write to swapchain image "Present"
|
sceneLayoutTransitionSubpass->AddInput("Scene");
|
||||||
//compositeSubpass->AddInput("Normals");
|
|
||||||
//compositeSubpass->AddInput("Position");
|
|
||||||
|
|
||||||
// TODO: Use macro to add this node when SH_EDITOR is enabled
|
|
||||||
auto imguiNode = worldRenderGraph->AddNode("ImGui Node", { "Present" }, {"G-Buffer"});
|
|
||||||
auto imguiSubpass = imguiNode->AddSubpass("ImGui Draw");
|
|
||||||
imguiSubpass->AddColorOutput("Present");
|
|
||||||
|
|
||||||
|
// Generate world render graph
|
||||||
worldRenderGraph->Generate();
|
worldRenderGraph->Generate();
|
||||||
|
|
||||||
// Create Semaphore
|
|
||||||
for (auto& semaHandle : graphSemaphores)
|
|
||||||
{
|
|
||||||
semaHandle = device->CreateSemaphore();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create Debug Renderers
|
|
||||||
/*debugScreenRenderer = defaultViewport->AddRenderer(resourceManager, worldRenderGraph);
|
|
||||||
debugScreenRenderer->SetCamera(screenCamera);
|
|
||||||
debugWorldRenderer = defaultViewport->AddRenderer(resourceManager, worldRenderGraph);
|
|
||||||
debugWorldRenderer->SetCamera(worldCamera);*/
|
|
||||||
|
|
||||||
// Add world renderer to default viewport
|
// Add world renderer to default viewport
|
||||||
worldRenderer = defaultViewport->AddRenderer(resourceManager, swapchain->GetNumImages(), renderContextCmdPools, descPool, SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS], worldRenderGraph);
|
worldRenderer = worldViewport->AddRenderer(resourceManager, swapchain->GetNumImages(), renderContextCmdPools, descPool, SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS], worldRenderGraph);
|
||||||
worldRenderer->SetCamera(worldCamera);
|
worldRenderer->SetCamera(worldCamera);
|
||||||
|
|
||||||
|
|
||||||
|
@ -195,6 +190,95 @@ namespace SHADE
|
||||||
defaultMaterial = AddMaterial(cubeVS, cubeFS, gBufferWriteSubpass);
|
defaultMaterial = AddMaterial(cubeVS, cubeFS, gBufferWriteSubpass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHGraphicsSystem::InitMiddleEnd(void) noexcept
|
||||||
|
{
|
||||||
|
SHGraphicsGlobalData::Init(device);
|
||||||
|
|
||||||
|
InitSceneRenderGraph();
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
InitEditorRenderGraph();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Create Semaphore
|
||||||
|
for (auto& semaHandle : graphSemaphores)
|
||||||
|
{
|
||||||
|
semaHandle = device->CreateSemaphore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHGraphicsSystem::InitSubsystems(void) noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
mousePickSystem = resourceManager.Create<SHMousePickSystem>();
|
||||||
|
|
||||||
|
std::vector<Handle<SHVkCommandPool>> cmdPools;
|
||||||
|
cmdPools.reserve(swapchain->GetNumImages());
|
||||||
|
for (uint32_t i = 0; i < swapchain->GetNumImages(); ++i)
|
||||||
|
cmdPools.push_back(renderContext.GetFrameData(i).cmdPoolHdls[0]);
|
||||||
|
|
||||||
|
mousePickSystem->Init(device, cmdPools, worldRenderGraph->GetRenderGraphResource("Entity ID"));
|
||||||
|
|
||||||
|
// Register the post offscreen render to the system
|
||||||
|
postOffscreenRender = resourceManager.Create<SHPostOffscreenRenderSystem>();
|
||||||
|
postOffscreenRender->Init(device, worldRenderGraph->GetRenderGraphResource("Scene"), descPool);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
void SHGraphicsSystem::InitEditorRenderGraph(void) noexcept
|
||||||
|
{
|
||||||
|
auto windowDims = window->GetWindowSize();
|
||||||
|
|
||||||
|
// Create Default Viewport
|
||||||
|
editorViewport = AddViewport(vk::Viewport(0.0f, 0.0f, static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.0f, 1.0f));
|
||||||
|
|
||||||
|
// Get render graph from viewport editor renderer
|
||||||
|
editorRenderGraph = resourceManager.Create<SHRenderGraph>();
|
||||||
|
|
||||||
|
std::vector<Handle<SHVkCommandPool>> renderContextCmdPools{ swapchain->GetNumImages() };
|
||||||
|
for (uint32_t i = 0; i < renderContextCmdPools.size(); ++i)
|
||||||
|
renderContextCmdPools[i] = renderContext.GetFrameData(i).cmdPoolHdls[0];
|
||||||
|
|
||||||
|
editorRenderGraph->Init(device, swapchain);
|
||||||
|
editorRenderGraph->AddResource("Present", { SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT }, windowDims.first, windowDims.second);
|
||||||
|
|
||||||
|
|
||||||
|
auto imguiNode = editorRenderGraph->AddNode("ImGui Node", { "Present"}, {});
|
||||||
|
auto imguiSubpass = imguiNode->AddSubpass("ImGui Draw");
|
||||||
|
imguiSubpass->AddColorOutput("Present");
|
||||||
|
|
||||||
|
// Generate world render graph
|
||||||
|
editorRenderGraph->Generate();
|
||||||
|
|
||||||
|
// Add world renderer to default viewport
|
||||||
|
editorRenderer = editorViewport->AddRenderer(resourceManager, swapchain->GetNumImages(), renderContextCmdPools, descPool, SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS], editorRenderGraph);
|
||||||
|
editorRenderer->SetCamera(worldCamera);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Constructor/Destructors */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
void SHGraphicsSystem::Init(void)
|
||||||
|
{
|
||||||
|
InitBoilerplate();
|
||||||
|
InitMiddleEnd();
|
||||||
|
InitSubsystems();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHGraphicsSystem::Exit(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma endregion INIT_EXIT
|
||||||
|
|
||||||
|
#pragma region LIFECYCLE
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Lifecycle Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
@ -210,6 +294,9 @@ namespace SHADE
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void SHGraphicsSystem::Run(double) noexcept
|
void SHGraphicsSystem::Run(double) noexcept
|
||||||
{
|
{
|
||||||
|
if (window->IsMinimized() || renderContext.GetWindowIsDead())
|
||||||
|
return;
|
||||||
|
|
||||||
// Frame data for the current frame
|
// Frame data for the current frame
|
||||||
auto const& frameData = renderContext.GetCurrentFrameData();
|
auto const& frameData = renderContext.GetCurrentFrameData();
|
||||||
uint32_t frameIndex = renderContext.GetCurrentFrame();
|
uint32_t frameIndex = renderContext.GetCurrentFrame();
|
||||||
|
@ -249,6 +336,10 @@ namespace SHADE
|
||||||
// Begin recording the command buffer
|
// Begin recording the command buffer
|
||||||
currentCmdBuffer->BeginRecording();
|
currentCmdBuffer->BeginRecording();
|
||||||
|
|
||||||
|
uint32_t w = static_cast<uint32_t>(viewports[vpIndex]->GetWidth());
|
||||||
|
uint32_t h = static_cast<uint32_t>(viewports[vpIndex]->GetHeight());
|
||||||
|
currentCmdBuffer->SetViewportScissor (static_cast<float>(w), static_cast<float>(h), w, h);
|
||||||
|
|
||||||
currentCmdBuffer->ForceSetPipelineLayout(SHGraphicsGlobalData::GetDummyPipelineLayout());
|
currentCmdBuffer->ForceSetPipelineLayout(SHGraphicsGlobalData::GetDummyPipelineLayout());
|
||||||
|
|
||||||
// Bind all the buffers required for meshes
|
// Bind all the buffers required for meshes
|
||||||
|
@ -302,20 +393,6 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHGraphicsSystem::Exit(void)
|
|
||||||
{
|
|
||||||
renderContext.Destroy();
|
|
||||||
graphicsQueue.Free();
|
|
||||||
swapchain.Free();
|
|
||||||
surface.Free();
|
|
||||||
device.Free();
|
|
||||||
|
|
||||||
SHVkInstance::Destroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
|
||||||
/* Lifecycle Functions */
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
@ -328,6 +405,9 @@ namespace SHADE
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void SHGraphicsSystem::BeginRender()
|
void SHGraphicsSystem::BeginRender()
|
||||||
{
|
{
|
||||||
|
if (window->IsMinimized() || renderContext.GetWindowIsDead())
|
||||||
|
return;
|
||||||
|
|
||||||
// Finalise all batches
|
// Finalise all batches
|
||||||
for (auto vp : viewports)
|
for (auto vp : viewports)
|
||||||
for (auto renderer : vp->GetRenderers())
|
for (auto renderer : vp->GetRenderers())
|
||||||
|
@ -341,10 +421,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
device->WaitIdle();
|
device->WaitIdle();
|
||||||
|
|
||||||
// Resize the swapchain
|
HandleResize();
|
||||||
swapchain->Resize(surface, windowDims.first, windowDims.second);
|
|
||||||
|
|
||||||
renderContext.HandleResize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t CURR_FRAME_IDX = renderContext.GetCurrentFrame();
|
const uint32_t CURR_FRAME_IDX = renderContext.GetCurrentFrame();
|
||||||
|
@ -377,9 +454,13 @@ namespace SHADE
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void SHGraphicsSystem::EndRender()
|
void SHGraphicsSystem::EndRender()
|
||||||
{
|
{
|
||||||
|
if (window->IsMinimized() || renderContext.GetWindowIsDead())
|
||||||
|
return;
|
||||||
|
|
||||||
const uint32_t CURR_FRAME_IDX = renderContext.GetCurrentFrame();
|
const uint32_t CURR_FRAME_IDX = renderContext.GetCurrentFrame();
|
||||||
auto& currFrameData = renderContext.GetCurrentFrameData();
|
auto& currFrameData = renderContext.GetCurrentFrameData();
|
||||||
|
|
||||||
|
mousePickSystem->Run(graphicsQueue, CURR_FRAME_IDX);
|
||||||
|
|
||||||
// #BackEndTest: queues an image for presentation
|
// #BackEndTest: queues an image for presentation
|
||||||
if (auto result = graphicsQueue->Present(swapchain, { currFrameData.semRenderFinishHdl }, CURR_FRAME_IDX); result != vk::Result::eSuccess)
|
if (auto result = graphicsQueue->Present(swapchain, { currFrameData.semRenderFinishHdl }, CURR_FRAME_IDX); result != vk::Result::eSuccess)
|
||||||
|
@ -387,11 +468,7 @@ namespace SHADE
|
||||||
// If swapchain is incompatible/outdated
|
// If swapchain is incompatible/outdated
|
||||||
if (result == vk::Result::eErrorOutOfDateKHR || result == vk::Result::eSuboptimalKHR)
|
if (result == vk::Result::eErrorOutOfDateKHR || result == vk::Result::eSuboptimalKHR)
|
||||||
{
|
{
|
||||||
auto windowDims = window->GetWindowSize();
|
HandleResize();
|
||||||
swapchain->Resize(surface, windowDims.first, windowDims.second);
|
|
||||||
|
|
||||||
renderContext.HandleResize();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,6 +476,10 @@ namespace SHADE
|
||||||
renderContext.AdvanceFrame();
|
renderContext.AdvanceFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma endregion LIFECYCLE
|
||||||
|
|
||||||
|
#pragma region ADD_REMOVE_BUILD
|
||||||
|
|
||||||
Handle<SHViewport> SHGraphicsSystem::AddViewport(const vk::Viewport& viewport)
|
Handle<SHViewport> SHGraphicsSystem::AddViewport(const vk::Viewport& viewport)
|
||||||
{
|
{
|
||||||
// Create the viewport
|
// Create the viewport
|
||||||
|
@ -509,25 +590,52 @@ namespace SHADE
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHGraphicsSystem::SetWindow(SHWindow* wind) noexcept
|
#pragma endregion ADD_REMOVE
|
||||||
{
|
|
||||||
window = wind;
|
#pragma region ROUTINES
|
||||||
}
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* System Routine Functions - BeginRoutine */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
SHGraphicsSystem::BeginRoutine::BeginRoutine()
|
||||||
|
: SHSystemRoutine("Graphics System Frame Set Up", true)
|
||||||
|
{}
|
||||||
|
|
||||||
void SHGraphicsSystem::BeginRoutine::Execute(double) noexcept
|
void SHGraphicsSystem::BeginRoutine::Execute(double) noexcept
|
||||||
{
|
{
|
||||||
reinterpret_cast<SHGraphicsSystem*>(system)->BeginRender();
|
reinterpret_cast<SHGraphicsSystem*>(system)->BeginRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* System Routine Functions - RenderRoutine */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
SHGraphicsSystem::RenderRoutine::RenderRoutine()
|
||||||
|
: SHSystemRoutine("Graphics System Render", true)
|
||||||
|
{}
|
||||||
|
|
||||||
void SHGraphicsSystem::RenderRoutine::Execute(double dt) noexcept
|
void SHGraphicsSystem::RenderRoutine::Execute(double dt) noexcept
|
||||||
{
|
{
|
||||||
reinterpret_cast<SHGraphicsSystem*>(system)->Run(dt);
|
reinterpret_cast<SHGraphicsSystem*>(system)->Run(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* System Routine Functions - EndRoutine */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
SHGraphicsSystem::EndRoutine::EndRoutine()
|
||||||
|
: SHSystemRoutine("Graphics System Frame Clean Up", true)
|
||||||
|
{}
|
||||||
|
|
||||||
void SHGraphicsSystem::EndRoutine::Execute(double) noexcept
|
void SHGraphicsSystem::EndRoutine::Execute(double) noexcept
|
||||||
{
|
{
|
||||||
reinterpret_cast<SHGraphicsSystem*>(system)->EndRender();
|
reinterpret_cast<SHGraphicsSystem*>(system)->EndRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* System Routine Functions - BatcherDispatcherRoutine */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
SHGraphicsSystem::BatcherDispatcherRoutine::BatcherDispatcherRoutine()
|
||||||
|
: SHSystemRoutine("Graphics System Batcher Dispatcher", true)
|
||||||
|
{}
|
||||||
|
|
||||||
void SHGraphicsSystem::BatcherDispatcherRoutine::Execute(double) noexcept
|
void SHGraphicsSystem::BatcherDispatcherRoutine::Execute(double) noexcept
|
||||||
{
|
{
|
||||||
auto& renderables = SHComponentManager::GetDense<SHRenderable>();
|
auto& renderables = SHComponentManager::GetDense<SHRenderable>();
|
||||||
|
@ -556,5 +664,62 @@ namespace SHADE
|
||||||
renderable.ResetChangedFlag();
|
renderable.ResetChangedFlag();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#pragma endregion ROUTINES
|
||||||
|
|
||||||
|
#pragma region MISC
|
||||||
|
|
||||||
|
void SHGraphicsSystem::PrepareResize(uint32_t newWidth, uint32_t newHeight) noexcept
|
||||||
|
{
|
||||||
|
resizeWidth = newWidth;
|
||||||
|
resizeHeight = newHeight;
|
||||||
|
|
||||||
|
renderContext.SetIsResized(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHGraphicsSystem::HandleResize(void) noexcept
|
||||||
|
{
|
||||||
|
device->WaitIdle();
|
||||||
|
|
||||||
|
if (window->IsMinimized() || renderContext.GetWindowIsDead())
|
||||||
|
return;
|
||||||
|
|
||||||
|
graphSemaphores[0].Free();
|
||||||
|
graphSemaphores[1].Free();
|
||||||
|
|
||||||
|
auto windowDims = window->GetWindowSize();
|
||||||
|
|
||||||
|
// Resize the swapchain
|
||||||
|
swapchain->Resize(surface, windowDims.first, windowDims.second);
|
||||||
|
|
||||||
|
renderContext.HandleResize();
|
||||||
|
|
||||||
|
worldRenderGraph->HandleResize(resizeWidth, resizeHeight);
|
||||||
|
editorRenderGraph->HandleResize(windowDims.first, windowDims.second);
|
||||||
|
|
||||||
|
mousePickSystem->HandleResize();
|
||||||
|
postOffscreenRender->HandleResize();
|
||||||
|
|
||||||
|
worldViewport->SetWidth(static_cast<float>(resizeWidth));
|
||||||
|
worldViewport->SetHeight(static_cast<float>(resizeHeight));
|
||||||
|
|
||||||
|
worldCamera->SetPerspective(90.0f, static_cast<float>(resizeWidth), static_cast<float>(resizeHeight), 0.0f, 100.0f);
|
||||||
|
|
||||||
|
for (auto& semaHandle : graphSemaphores)
|
||||||
|
semaHandle = device->CreateSemaphore();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHGraphicsSystem::AwaitGraphicsExecution()
|
||||||
|
{
|
||||||
|
device->WaitIdle();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHGraphicsSystem::SetWindow(SHWindow* wind) noexcept
|
||||||
|
{
|
||||||
|
window = wind;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma endregion MISC
|
||||||
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Graphics/MiddleEnd/Materials/SHMaterialInstanceCache.h"
|
#include "Graphics/MiddleEnd/Materials/SHMaterialInstanceCache.h"
|
||||||
#include "../Textures/SHTextureLibrary.h"
|
#include "../Textures/SHTextureLibrary.h"
|
||||||
#include "../Textures/SHVkSamplerCache.h"
|
#include "../Textures/SHVkSamplerCache.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHPostOffscreenRenderSystem.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -52,6 +53,7 @@ namespace SHADE
|
||||||
class SHVkShaderModule;
|
class SHVkShaderModule;
|
||||||
class SHMaterial;
|
class SHMaterial;
|
||||||
class SHMaterialInstance;
|
class SHMaterialInstance;
|
||||||
|
class SHMousePickSystem;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Type Definitions */
|
/* Type Definitions */
|
||||||
|
@ -65,25 +67,39 @@ namespace SHADE
|
||||||
/***********************************************************************************/
|
/***********************************************************************************/
|
||||||
class SH_API SHGraphicsSystem : public SHSystem
|
class SH_API SHGraphicsSystem : public SHSystem
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
void InitBoilerplate (void) noexcept;
|
||||||
|
void InitSceneRenderGraph (void) noexcept;
|
||||||
|
void InitMiddleEnd (void) noexcept;
|
||||||
|
void InitSubsystems (void) noexcept;
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
void InitEditorRenderGraph (void) noexcept;
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
class SH_API BeginRoutine final : public SHSystemRoutine
|
class SH_API BeginRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
BeginRoutine();
|
||||||
virtual void Execute(double dt) noexcept override final;
|
virtual void Execute(double dt) noexcept override final;
|
||||||
};
|
};
|
||||||
class SH_API RenderRoutine final : public SHSystemRoutine
|
class SH_API RenderRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
RenderRoutine();
|
||||||
virtual void Execute(double dt) noexcept override final;
|
virtual void Execute(double dt) noexcept override final;
|
||||||
};
|
};
|
||||||
class SH_API EndRoutine final : public SHSystemRoutine
|
class SH_API EndRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
EndRoutine();
|
||||||
virtual void Execute(double dt) noexcept override final;
|
virtual void Execute(double dt) noexcept override final;
|
||||||
};
|
};
|
||||||
class SH_API BatcherDispatcherRoutine final : public SHSystemRoutine
|
class SH_API BatcherDispatcherRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
BatcherDispatcherRoutine();
|
||||||
virtual void Execute(double dt) noexcept override final;
|
virtual void Execute(double dt) noexcept override final;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -246,6 +262,10 @@ namespace SHADE
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void BuildTextures();
|
void BuildTextures();
|
||||||
|
|
||||||
|
void PrepareResize(uint32_t newWidth, uint32_t newHeight) noexcept;
|
||||||
|
void HandleResize(void) noexcept;
|
||||||
|
void AwaitGraphicsExecution();
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Setters */
|
/* Setters */
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
@ -260,13 +280,19 @@ namespace SHADE
|
||||||
Handle<SHVkPhysicalDevice> GetPhysicalDevice() const { return physicalDevice; }
|
Handle<SHVkPhysicalDevice> GetPhysicalDevice() const { return physicalDevice; }
|
||||||
Handle<SHVkQueue> GetQueue() const { return graphicsQueue; }
|
Handle<SHVkQueue> GetQueue() const { return graphicsQueue; }
|
||||||
Handle<SHVkDescriptorPool> GetDescriptorPool() const { return descPool; }
|
Handle<SHVkDescriptorPool> GetDescriptorPool() const { return descPool; }
|
||||||
Handle<SHViewport> GetDefaultViewport() const {return defaultViewport;}
|
Handle<SHViewport> GetDefaultViewport() const {return worldViewport;}
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
Handle<SHViewport> GetEditorViewport () const {return editorViewport;};
|
||||||
|
#endif
|
||||||
|
Handle<SHMousePickSystem> GetMousePickSystem(void) const noexcept {return mousePickSystem;};
|
||||||
|
Handle<SHPostOffscreenRenderSystem> GetPostOffscreenRenderSystem(void) const noexcept {return postOffscreenRender;};
|
||||||
//SHRenderGraph const& GetRenderGraph(void) const noexcept;
|
//SHRenderGraph const& GetRenderGraph(void) const noexcept;
|
||||||
|
|
||||||
//Handle<SHVkRenderpass> GetRenderPass() const { return renderPass; }
|
//Handle<SHVkRenderpass> GetRenderPass() const { return renderPass; }
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Data Members */
|
/* Data Members */
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
@ -279,7 +305,6 @@ namespace SHADE
|
||||||
Handle<SHVkQueue> transferQueue;
|
Handle<SHVkQueue> transferQueue;
|
||||||
Handle<SHVkDescriptorPool> descPool;
|
Handle<SHVkDescriptorPool> descPool;
|
||||||
Handle<SHVkCommandPool> graphicsCmdPool;
|
Handle<SHVkCommandPool> graphicsCmdPool;
|
||||||
Handle<SHVkCommandPool> transferCmdPool;
|
|
||||||
Handle<SHVkCommandBuffer> transferCmdBuffer;
|
Handle<SHVkCommandBuffer> transferCmdBuffer;
|
||||||
Handle<SHVkCommandBuffer> graphicsTexCmdBuffer;
|
Handle<SHVkCommandBuffer> graphicsTexCmdBuffer;
|
||||||
SHRenderContext renderContext;
|
SHRenderContext renderContext;
|
||||||
|
@ -294,7 +319,13 @@ namespace SHADE
|
||||||
SHSamplerCache samplerCache;
|
SHSamplerCache samplerCache;
|
||||||
SHMaterialInstanceCache materialInstanceCache;
|
SHMaterialInstanceCache materialInstanceCache;
|
||||||
// Viewports
|
// Viewports
|
||||||
Handle<SHViewport> defaultViewport; // Whole screen
|
#ifdef SHEDITOR
|
||||||
|
Handle<SHViewport> editorViewport;
|
||||||
|
Handle<SHRenderer> editorRenderer;
|
||||||
|
Handle<SHRenderGraph> editorRenderGraph;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Handle<SHViewport> worldViewport; // Whole screen
|
||||||
std::vector<Handle<SHViewport>> viewports; // Additional viewports
|
std::vector<Handle<SHViewport>> viewports; // Additional viewports
|
||||||
|
|
||||||
// Debug Renderers
|
// Debug Renderers
|
||||||
|
@ -314,5 +345,14 @@ namespace SHADE
|
||||||
|
|
||||||
// Temp Materials
|
// Temp Materials
|
||||||
Handle<SHMaterial> defaultMaterial;
|
Handle<SHMaterial> defaultMaterial;
|
||||||
|
|
||||||
|
Handle<SHRenderGraph> worldRenderGraph;
|
||||||
|
|
||||||
|
// Sub systems
|
||||||
|
Handle<SHMousePickSystem> mousePickSystem;
|
||||||
|
Handle<SHPostOffscreenRenderSystem> postOffscreenRender;
|
||||||
|
|
||||||
|
uint32_t resizeWidth;
|
||||||
|
uint32_t resizeHeight;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -63,7 +63,7 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
Handle<SHVkPipeline> pipeline;
|
Handle<SHVkPipeline> pipeline;
|
||||||
std::unique_ptr<char> propMemory;
|
std::unique_ptr<char> propMemory;
|
||||||
Byte propMemorySize;
|
Byte propMemorySize = 0;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Helper Functions */
|
/* Helper Functions */
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHMousePickSystem.h"
|
||||||
|
#include "Input/SHInputManager.h"
|
||||||
|
#include "Graphics/Commands/SHVkCommandPool.h"
|
||||||
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
|
#include "Graphics/Synchronization/SHVkFence.h"
|
||||||
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
|
#include "Graphics/SHVkUtil.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHViewport.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
void SHMousePickSystem::Init(Handle<SHVkLogicalDevice> device, std::span<Handle<SHVkCommandPool>> cmdPools, Handle<SHRenderGraphResource> eidAttachment) noexcept
|
||||||
|
{
|
||||||
|
logicalDevice = device;
|
||||||
|
|
||||||
|
pickedEID = MAX_EID;
|
||||||
|
|
||||||
|
// Create command buffers
|
||||||
|
for (auto& pool : cmdPools)
|
||||||
|
{
|
||||||
|
commandBuffers.push_back(pool->RequestCommandBuffer (SH_CMD_BUFFER_TYPE::PRIMARY));
|
||||||
|
}
|
||||||
|
|
||||||
|
// assign the attachment
|
||||||
|
entityIDAttachment = eidAttachment;
|
||||||
|
|
||||||
|
HandleResize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHMousePickSystem::Run(Handle<SHVkQueue> queue, uint32_t frameIndex) noexcept
|
||||||
|
{
|
||||||
|
// if input detected
|
||||||
|
if (SHInputManager::GetKeyUp(SHInputManager::SH_KEYCODE::LMB))
|
||||||
|
{
|
||||||
|
afterCopyFence->Reset();
|
||||||
|
|
||||||
|
// begin command buffer for recording
|
||||||
|
commandBuffers[frameIndex]->BeginRecording();
|
||||||
|
|
||||||
|
// transition the image for optimized copying
|
||||||
|
entityIDAttachment->TransitionImage (vk::ImageLayout::eColorAttachmentOptimal, vk::ImageLayout::eTransferSrcOptimal, commandBuffers[frameIndex], vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eTransfer, 0);
|
||||||
|
|
||||||
|
// copy the image here. Last argument is 0 because the attachment isn't a swapchain image.
|
||||||
|
entityIDAttachment->CopyToBuffer(imageDataDstBuffer, commandBuffers[frameIndex], 0);
|
||||||
|
|
||||||
|
// end command buffer for recording
|
||||||
|
commandBuffers[frameIndex]->EndRecording();
|
||||||
|
|
||||||
|
// submit the command buffer to copy image to buffer
|
||||||
|
queue->SubmitCommandBuffer({ commandBuffers[frameIndex] }, {}, {}, vk::PipelineStageFlagBits::eColorAttachmentOutput, afterCopyFence);
|
||||||
|
|
||||||
|
// wait for the copy to be done
|
||||||
|
afterCopyFence->Wait(true, std::numeric_limits<uint64_t>::max());
|
||||||
|
|
||||||
|
pickedEID = imageDataDstBuffer->GetDataFromMappedPointer<uint32_t>(static_cast<uint32_t>(viewportMousePos.y) * entityIDAttachment->GetWidth() + static_cast<uint32_t>(viewportMousePos.x));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHMousePickSystem::HandleResize(void) noexcept
|
||||||
|
{
|
||||||
|
if (afterCopyFence)
|
||||||
|
{
|
||||||
|
afterCopyFence->Reset();
|
||||||
|
afterCopyFence.Free();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (imageDataDstBuffer)
|
||||||
|
imageDataDstBuffer.Free();
|
||||||
|
|
||||||
|
// Create the fence
|
||||||
|
afterCopyFence = logicalDevice->CreateFence();
|
||||||
|
|
||||||
|
uint32_t bufferSize = entityIDAttachment->GetWidth() * entityIDAttachment->GetHeight() * SHVkUtil::GetBytesPerPixelFromFormat(entityIDAttachment->GetResourceFormat());
|
||||||
|
|
||||||
|
// Create the buffer
|
||||||
|
imageDataDstBuffer = logicalDevice->CreateBuffer(bufferSize, nullptr, bufferSize, vk::BufferUsageFlagBits::eTransferDst, VMA_MEMORY_USAGE_AUTO, VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHMousePickSystem::SetViewportMousePos(SHVec2 vpMousePos) noexcept
|
||||||
|
{
|
||||||
|
viewportMousePos = vpMousePos;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityID SHMousePickSystem::GetPickedEntity(void) const noexcept
|
||||||
|
{
|
||||||
|
return pickedEID;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Graphics/RenderGraph/SHRenderGraphResource.h"
|
||||||
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
|
#include "Math/Vector/SHVec2.h"
|
||||||
|
#include <span>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHVkLogicalDevice;
|
||||||
|
class SHVkCommandPool;
|
||||||
|
class SHVkCommandBuffer;
|
||||||
|
class SHVkFence;
|
||||||
|
class SHVkQueue;
|
||||||
|
class SHVkBuffer;
|
||||||
|
class SHViewport;
|
||||||
|
|
||||||
|
class SHMousePickSystem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Handle<SHVkLogicalDevice> logicalDevice;
|
||||||
|
|
||||||
|
//! Handle to the render graph resource that will contain the entity IDs
|
||||||
|
Handle<SHRenderGraphResource> entityIDAttachment;
|
||||||
|
|
||||||
|
//! Command buffers meant for copying image to buffer
|
||||||
|
std::vector<Handle<SHVkCommandBuffer>> commandBuffers;
|
||||||
|
|
||||||
|
//! After the attachment has copied its data to a buffer, we want to signal this fence
|
||||||
|
Handle<SHVkFence> afterCopyFence;
|
||||||
|
|
||||||
|
//! buffer to contain the attachment data after copying
|
||||||
|
Handle<SHVkBuffer> imageDataDstBuffer;
|
||||||
|
|
||||||
|
//! eid picked from screen
|
||||||
|
EntityID pickedEID;
|
||||||
|
|
||||||
|
//! mouse position relative to the viewport window displaying the world
|
||||||
|
SHVec2 viewportMousePos;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* PUBLIC MEMBER FUNCTIONS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
void Init(Handle<SHVkLogicalDevice> device, std::span<Handle<SHVkCommandPool>> cmdPools, Handle<SHRenderGraphResource> eidAttachment) noexcept;
|
||||||
|
void Run (Handle<SHVkQueue> queue, uint32_t frameIndex) noexcept;
|
||||||
|
void HandleResize (void) noexcept;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* SETTERS AND GETTERS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
void SetViewportMousePos (SHVec2 vpMousePos) noexcept;
|
||||||
|
|
||||||
|
EntityID GetPickedEntity (void) const noexcept;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHPostOffscreenRenderSystem.h"
|
||||||
|
#include "Graphics/Descriptors/SHVkDescriptorSetLayout.h"
|
||||||
|
#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h"
|
||||||
|
#include "Graphics/Descriptors/SHVkDescriptorPool.h"
|
||||||
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
|
#include "Graphics/Images/SHVkSampler.h"
|
||||||
|
#include "Graphics/RenderGraph/SHRenderGraphResource.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/***************************************************************************/
|
||||||
|
/*!
|
||||||
|
|
||||||
|
\brief
|
||||||
|
This function basically creates the entities required for offscreen
|
||||||
|
rendering. It takes in a render graph resource. Side note: it creates
|
||||||
|
a descriptor set layout that is similar to the one created in imgui. This
|
||||||
|
is so that the descriptor set passed to imGui won't be invalid.
|
||||||
|
|
||||||
|
\param logicalDevice
|
||||||
|
For vulkan object creation
|
||||||
|
|
||||||
|
\param renderGraphResource
|
||||||
|
The resource in which has been
|
||||||
|
|
||||||
|
\param descriptorPool
|
||||||
|
|
||||||
|
\return
|
||||||
|
|
||||||
|
*/
|
||||||
|
/***************************************************************************/
|
||||||
|
void SHPostOffscreenRenderSystem::Init(Handle<SHVkLogicalDevice> logicalDevice, Handle<SHRenderGraphResource> renderGraphResource, Handle<SHVkDescriptorPool> descriptorPool) noexcept
|
||||||
|
{
|
||||||
|
offscreenRender = renderGraphResource;
|
||||||
|
|
||||||
|
// Create sampler
|
||||||
|
offscreenRenderSampler = logicalDevice->CreateSampler(
|
||||||
|
{
|
||||||
|
.minFilter = vk::Filter::eLinear,
|
||||||
|
.magFilter = vk::Filter::eLinear,
|
||||||
|
.addressMode = vk::SamplerAddressMode::eRepeat,
|
||||||
|
.mipmapMode = vk::SamplerMipmapMode::eLinear,
|
||||||
|
.minLod = -1000,
|
||||||
|
.maxLod = 1000
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// Create descriptor set layout binding
|
||||||
|
SHVkDescriptorSetLayout::Binding imageBinding
|
||||||
|
{
|
||||||
|
.Type = vk::DescriptorType::eCombinedImageSampler,
|
||||||
|
.Stage = vk::ShaderStageFlagBits::eFragment,
|
||||||
|
.BindPoint = 0,
|
||||||
|
.DescriptorCount = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create descriptor set layout
|
||||||
|
offscreenRenderDescSetLayout = logicalDevice->CreateDescriptorSetLayout(0, { imageBinding }, false);
|
||||||
|
|
||||||
|
// Create descriptor set
|
||||||
|
offscreenRenderDescSet = descriptorPool->Allocate({ offscreenRenderDescSetLayout }, { 1 });
|
||||||
|
|
||||||
|
HandleResize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPostOffscreenRenderSystem::HandleResize(void) noexcept
|
||||||
|
{
|
||||||
|
std::vector combinedImageSampler
|
||||||
|
{
|
||||||
|
std::make_tuple(offscreenRender->GetImageView(), offscreenRenderSampler, vk::ImageLayout::eShaderReadOnlyOptimal),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Register the image view and sampler with the descriptor set. Now whenever rendering to the offscreen image is done, the descriptor set will see the change
|
||||||
|
offscreenRenderDescSet->ModifyWriteDescImage(0, 0, combinedImageSampler);
|
||||||
|
offscreenRenderDescSet->UpdateDescriptorSetImages(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle<SHVkDescriptorSetGroup> SHPostOffscreenRenderSystem::GetDescriptorSetGroup(void) const noexcept
|
||||||
|
{
|
||||||
|
return offscreenRenderDescSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Resource/Handle.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHVkLogicalDevice;
|
||||||
|
class SHVkDescriptorSetLayout;
|
||||||
|
class SHVkDescriptorSetGroup;
|
||||||
|
class SHVkDescriptorPool;
|
||||||
|
class SHVkSampler;
|
||||||
|
class SHRenderGraphResource;
|
||||||
|
|
||||||
|
class SHPostOffscreenRenderSystem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Handle<SHRenderGraphResource> offscreenRender;
|
||||||
|
|
||||||
|
Handle<SHVkDescriptorSetLayout> offscreenRenderDescSetLayout;
|
||||||
|
Handle<SHVkDescriptorSetGroup> offscreenRenderDescSet;
|
||||||
|
Handle<SHVkSampler> offscreenRenderSampler;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void Init (Handle<SHVkLogicalDevice> logicalDevice, Handle<SHRenderGraphResource> renderGraphResource, Handle<SHVkDescriptorPool> descriptorPool) noexcept;
|
||||||
|
//void Run ()
|
||||||
|
|
||||||
|
void HandleResize (void) noexcept;
|
||||||
|
|
||||||
|
Handle<SHVkDescriptorSetGroup> GetDescriptorSetGroup (void) const noexcept;
|
||||||
|
};
|
||||||
|
}
|
|
@ -49,6 +49,14 @@ namespace SHADE
|
||||||
cameraDescriptorSet->UpdateDescriptorSetBuffer(SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS, SHGraphicsConstants::DescriptorSetBindings::CAMERA_DATA);
|
cameraDescriptorSet->UpdateDescriptorSetBuffer(SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS, SHGraphicsConstants::DescriptorSetBindings::CAMERA_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHRenderer::~SHRenderer(void)
|
||||||
|
{
|
||||||
|
//for (auto& cmdBuffer : commandBuffers)
|
||||||
|
//{
|
||||||
|
// cmdBuffer.Free();
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
/* Camera Registration */
|
/* Camera Registration */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
@ -66,6 +74,8 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHRenderer::UpdateDataAndBind(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex) noexcept
|
void SHRenderer::UpdateDataAndBind(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex) noexcept
|
||||||
|
{
|
||||||
|
if (camera)
|
||||||
{
|
{
|
||||||
cpuCameraData.viewProjectionMatrix = camera->GetViewProjectionMatrix();
|
cpuCameraData.viewProjectionMatrix = camera->GetViewProjectionMatrix();
|
||||||
cameraBuffer->WriteToMemory(&cpuCameraData, sizeof(SHShaderCameraData), 0, cameraDataAlignedSize * frameIndex);
|
cameraBuffer->WriteToMemory(&cpuCameraData, sizeof(SHShaderCameraData), 0, cameraDataAlignedSize * frameIndex);
|
||||||
|
@ -74,6 +84,7 @@ namespace SHADE
|
||||||
|
|
||||||
cmdBuffer->BindDescriptorSet(cameraDescriptorSet, vk::PipelineBindPoint::eGraphics, SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS, std::span{ dynamicOffsets.data(), 1 });
|
cmdBuffer->BindDescriptorSet(cameraDescriptorSet, vk::PipelineBindPoint::eGraphics, SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS, std::span{ dynamicOffsets.data(), 1 });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SHRenderer::UpdateCameraDataToBuffer(void) noexcept
|
void SHRenderer::UpdateCameraDataToBuffer(void) noexcept
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,6 +65,7 @@ namespace SHADE
|
||||||
/* Constructor/Destructors */
|
/* Constructor/Destructors */
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
SHRenderer(Handle<SHVkLogicalDevice> logicalDevice, uint32_t numFrames, std::vector<Handle<SHVkCommandPool>>& cmdPools, Handle<SHVkDescriptorPool> descriptorPool, Handle<SHVkDescriptorSetLayout> cameraDescLayout, Handle<SHViewport> viewport, Handle<SHRenderGraph> renderGraph);
|
SHRenderer(Handle<SHVkLogicalDevice> logicalDevice, uint32_t numFrames, std::vector<Handle<SHVkCommandPool>>& cmdPools, Handle<SHVkDescriptorPool> descriptorPool, Handle<SHVkDescriptorSetLayout> cameraDescLayout, Handle<SHViewport> viewport, Handle<SHRenderGraph> renderGraph);
|
||||||
|
~SHRenderer(void);
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Camera Registration */
|
/* Camera Registration */
|
||||||
|
|
|
@ -73,4 +73,26 @@ namespace SHADE
|
||||||
iter->Free();
|
iter->Free();
|
||||||
renderers.erase(iter);
|
renderers.erase(iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHViewport::SetWidth(float w) noexcept
|
||||||
|
{
|
||||||
|
viewport.width = w;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHViewport::SetHeight(float h) noexcept
|
||||||
|
{
|
||||||
|
viewport.height = h;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHViewport::SetX(float x) noexcept
|
||||||
|
{
|
||||||
|
viewport.x = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHViewport::SetY(float y) noexcept
|
||||||
|
{
|
||||||
|
viewport.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,14 @@ namespace SHADE
|
||||||
Handle<SHRenderer> AddRenderer(ResourceManager& resourceManager, uint32_t numFrames, std::vector<Handle<SHVkCommandPool>>& cmdPools, Handle<SHVkDescriptorPool> descriptorPool, Handle<SHVkDescriptorSetLayout> cameraDescLayout, Handle<SHRenderGraph> renderGraph);
|
Handle<SHRenderer> AddRenderer(ResourceManager& resourceManager, uint32_t numFrames, std::vector<Handle<SHVkCommandPool>>& cmdPools, Handle<SHVkDescriptorPool> descriptorPool, Handle<SHVkDescriptorSetLayout> cameraDescLayout, Handle<SHRenderGraph> renderGraph);
|
||||||
void RemoveRenderer(Handle<SHRenderer> renderer);
|
void RemoveRenderer(Handle<SHRenderer> renderer);
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
/* Setters */
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
void SetWidth(float w) noexcept;
|
||||||
|
void SetHeight (float h) noexcept;
|
||||||
|
void SetX (float x) noexcept;
|
||||||
|
void SetY (float y) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Getters */
|
/* Getters */
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -196,12 +196,12 @@ namespace SHADE
|
||||||
static SHMeshData meshData = Cube();
|
static SHMeshData meshData = Cube();
|
||||||
return meshLibrary.AddMesh
|
return meshLibrary.AddMesh
|
||||||
(
|
(
|
||||||
meshData.VertexPositions.size(),
|
static_cast<uint32_t>(meshData.VertexPositions.size()),
|
||||||
meshData.VertexPositions.data(),
|
meshData.VertexPositions.data(),
|
||||||
meshData.VertexTexCoords.data(),
|
meshData.VertexTexCoords.data(),
|
||||||
meshData.VertexTangents.data(),
|
meshData.VertexTangents.data(),
|
||||||
meshData.VertexNormals.data(),
|
meshData.VertexNormals.data(),
|
||||||
meshData.Indices.size(),
|
static_cast<uint32_t>(meshData.Indices.size()),
|
||||||
meshData.Indices.data()
|
meshData.Indices.data()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -211,12 +211,12 @@ namespace SHADE
|
||||||
static SHMeshData meshData = Cube();
|
static SHMeshData meshData = Cube();
|
||||||
return gfxSystem.AddMesh
|
return gfxSystem.AddMesh
|
||||||
(
|
(
|
||||||
meshData.VertexPositions.size(),
|
static_cast<uint32_t>(meshData.VertexPositions.size()),
|
||||||
meshData.VertexPositions.data(),
|
meshData.VertexPositions.data(),
|
||||||
meshData.VertexTexCoords.data(),
|
meshData.VertexTexCoords.data(),
|
||||||
meshData.VertexTangents.data(),
|
meshData.VertexTangents.data(),
|
||||||
meshData.VertexNormals.data(),
|
meshData.VertexNormals.data(),
|
||||||
meshData.Indices.size(),
|
static_cast<uint32_t>(meshData.Indices.size()),
|
||||||
meshData.Indices.data()
|
meshData.Indices.data()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,6 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
frameData[i].cmdPoolHdls.push_back(logicalDeviceHdl->CreateCommandPool(params.cmdPoolQueueFamilyType, params.cmdPoolResetMode, params.cmdBufferTransient));
|
frameData[i].cmdPoolHdls.push_back(logicalDeviceHdl->CreateCommandPool(params.cmdPoolQueueFamilyType, params.cmdPoolResetMode, params.cmdBufferTransient));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize all the info.
|
// Initialize all the info.
|
||||||
|
@ -168,6 +167,11 @@ namespace SHADE
|
||||||
isResized = resized;
|
isResized = resized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHRenderContext::SetWindowIsDead(bool dead) noexcept
|
||||||
|
{
|
||||||
|
windowIsDead = dead;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
@ -197,6 +201,11 @@ namespace SHADE
|
||||||
return currentFrame;
|
return currentFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SHRenderContext::GetResized(void) noexcept
|
||||||
|
{
|
||||||
|
return isResized;
|
||||||
|
}
|
||||||
|
|
||||||
bool SHRenderContext::GetResizeAndReset(void) noexcept
|
bool SHRenderContext::GetResizeAndReset(void) noexcept
|
||||||
{
|
{
|
||||||
bool b = isResized;
|
bool b = isResized;
|
||||||
|
@ -204,4 +213,9 @@ namespace SHADE
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SHRenderContext::GetWindowIsDead(void) const noexcept
|
||||||
|
{
|
||||||
|
return windowIsDead;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -36,6 +36,7 @@ namespace SHADE
|
||||||
uint32_t currentFrame;
|
uint32_t currentFrame;
|
||||||
|
|
||||||
bool isResized{ false };
|
bool isResized{ false };
|
||||||
|
bool windowIsDead {false};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SHRenderContext(void) noexcept;
|
SHRenderContext(void) noexcept;
|
||||||
|
@ -52,11 +53,14 @@ namespace SHADE
|
||||||
void ResetFence (void) noexcept;
|
void ResetFence (void) noexcept;
|
||||||
|
|
||||||
void SetIsResized (bool resized) noexcept;
|
void SetIsResized (bool resized) noexcept;
|
||||||
|
void SetWindowIsDead (bool dead) noexcept;
|
||||||
|
|
||||||
SHPerFrameData& GetCurrentFrameData(void) noexcept;
|
SHPerFrameData& GetCurrentFrameData(void) noexcept;
|
||||||
SHPerFrameData& GetFrameData (uint32_t index) noexcept;
|
SHPerFrameData& GetFrameData (uint32_t index) noexcept;
|
||||||
uint32_t GetCurrentFrame (void) const noexcept;
|
uint32_t GetCurrentFrame (void) const noexcept;
|
||||||
|
bool GetResized (void) noexcept;
|
||||||
bool GetResizeAndReset (void) noexcept;
|
bool GetResizeAndReset (void) noexcept;
|
||||||
|
bool GetWindowIsDead (void) const noexcept;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
#include "SHPipelineLibrary.h"
|
#include "SHPipelineLibrary.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.h"
|
#include "Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.h"
|
||||||
|
#include "Graphics/RenderGraph/SHSubpass.h"
|
||||||
|
#include "Graphics/SHVkUtil.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -21,6 +23,31 @@ namespace SHADE
|
||||||
auto newPipeline = logicalDevice->CreateGraphicsPipeline(pipelineLayout, nullptr, renderpass, subpass);
|
auto newPipeline = logicalDevice->CreateGraphicsPipeline(pipelineLayout, nullptr, renderpass, subpass);
|
||||||
newPipeline->GetPipelineState().SetVertexInputState(SHGraphicsGlobalData::GetDefaultViState());
|
newPipeline->GetPipelineState().SetVertexInputState(SHGraphicsGlobalData::GetDefaultViState());
|
||||||
|
|
||||||
|
SHColorBlendState colorBlendState{};
|
||||||
|
colorBlendState.logic_op_enable = VK_FALSE;
|
||||||
|
colorBlendState.logic_op = vk::LogicOp::eCopy;
|
||||||
|
|
||||||
|
auto const& subpassColorReferences = subpass->GetColorAttachmentReferences();
|
||||||
|
colorBlendState.attachments.reserve(subpassColorReferences.size());
|
||||||
|
|
||||||
|
for (auto& att : subpassColorReferences)
|
||||||
|
{
|
||||||
|
colorBlendState.attachments.push_back(vk::PipelineColorBlendAttachmentState
|
||||||
|
{
|
||||||
|
.blendEnable = SHVkUtil::IsBlendCompatible (subpass->GetFormatFromAttachmentReference(att.attachment)) ? true : false,
|
||||||
|
.srcColorBlendFactor = vk::BlendFactor::eSrcAlpha,
|
||||||
|
.dstColorBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha,
|
||||||
|
.colorBlendOp = vk::BlendOp::eAdd,
|
||||||
|
.srcAlphaBlendFactor = vk::BlendFactor::eOne,
|
||||||
|
.dstAlphaBlendFactor = vk::BlendFactor::eZero,
|
||||||
|
.alphaBlendOp = vk::BlendOp::eAdd,
|
||||||
|
.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
newPipeline->GetPipelineState().SetColorBlenState(colorBlendState);
|
||||||
|
|
||||||
// Actually construct the pipeline
|
// Actually construct the pipeline
|
||||||
newPipeline->ConstructPipeline();
|
newPipeline->ConstructPipeline();
|
||||||
|
|
||||||
|
|
|
@ -149,7 +149,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
texOrder.emplace_back(job.TextureHandle);
|
texOrder.emplace_back(job.TextureHandle);
|
||||||
combinedImageSamplers.emplace_back(std::make_tuple(job.TextureHandle->ImageView, job.Sampler, vk::ImageLayout::eShaderReadOnlyOptimal));
|
combinedImageSamplers.emplace_back(std::make_tuple(job.TextureHandle->ImageView, job.Sampler, vk::ImageLayout::eShaderReadOnlyOptimal));
|
||||||
job.TextureHandle->TextureArrayIndex = texOrder.size() - 1;
|
job.TextureHandle->TextureArrayIndex = static_cast<uint32_t>(texOrder.size()) - 1U;
|
||||||
}
|
}
|
||||||
addJobs.clear();
|
addJobs.clear();
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace SHADE
|
||||||
class SHVkDescriptorSetLayout;
|
class SHVkDescriptorSetLayout;
|
||||||
class SHVkDescriptorSetGroup;
|
class SHVkDescriptorSetGroup;
|
||||||
class SHVkSampler;
|
class SHVkSampler;
|
||||||
class SHTextureAsset;
|
struct SHTextureAsset;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Type Definitions */
|
/* Type Definitions */
|
||||||
|
|
|
@ -137,22 +137,9 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
VkBool32 logic_op_enable{ VK_FALSE };
|
VkBool32 logic_op_enable{ VK_FALSE };
|
||||||
|
|
||||||
vk::LogicOp logic_op{ VK_LOGIC_OP_COPY };
|
vk::LogicOp logic_op{ vk::LogicOp::eCopy };
|
||||||
|
|
||||||
std::vector<vk::PipelineColorBlendAttachmentState> attachments =
|
std::vector<vk::PipelineColorBlendAttachmentState> attachments{};
|
||||||
{
|
|
||||||
vk::PipelineColorBlendAttachmentState
|
|
||||||
{
|
|
||||||
.blendEnable = true,
|
|
||||||
.srcColorBlendFactor = vk::BlendFactor::eSrcAlpha,
|
|
||||||
.dstColorBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha,
|
|
||||||
.colorBlendOp = vk::BlendOp::eAdd,
|
|
||||||
.srcAlphaBlendFactor = vk::BlendFactor::eOne,
|
|
||||||
.dstAlphaBlendFactor = vk::BlendFactor::eZero,
|
|
||||||
.alphaBlendOp = vk::BlendOp::eAdd,
|
|
||||||
.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Specialization constants
|
// TODO: Specialization constants
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHAttachmentDescInitParams.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Resource/Handle.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHRenderGraphResource;
|
||||||
|
|
||||||
|
struct SHAttachmentDescInitParams
|
||||||
|
{
|
||||||
|
Handle<SHRenderGraphResource> resourceHdl;
|
||||||
|
bool dontClearOnLoad{false};
|
||||||
|
};
|
||||||
|
}
|
|
@ -3,12 +3,13 @@
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
// Used for attachment description creation for renderpass node
|
// Used for attachment description creation for renderpass node
|
||||||
enum class SH_ATT_DESC_TYPE
|
enum class SH_ATT_DESC_TYPE_FLAGS
|
||||||
{
|
{
|
||||||
COLOR,
|
COLOR = 0x01,
|
||||||
COLOR_PRESENT,
|
COLOR_PRESENT = 0x02,
|
||||||
DEPTH,
|
DEPTH = 0x04,
|
||||||
STENCIL,
|
STENCIL = 0x08,
|
||||||
DEPTH_STENCIL,
|
DEPTH_STENCIL = 0x10,
|
||||||
|
INPUT = 0x20
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,10 +8,17 @@
|
||||||
#include "Graphics/Framebuffer/SHVkFramebuffer.h"
|
#include "Graphics/Framebuffer/SHVkFramebuffer.h"
|
||||||
#include "Graphics/Buffers/SHVkBuffer.h"
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/SHLogger.h"
|
||||||
|
#include "SHAttachmentDescInitParams.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
||||||
|
SHRenderGraph::ResourceInstruction::ResourceInstruction(char const* resourceName, bool dontClearOnLoad /*= false*/) noexcept
|
||||||
|
: resourceName{ resourceName }
|
||||||
|
, dontClearOnLoad{ dontClearOnLoad }
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
@ -40,17 +47,17 @@ namespace SHADE
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void SHRenderGraph::AddResource(std::string resourceName, SH_ATT_DESC_TYPE type, uint32_t w /*= static_cast<uint32_t>(-1)*/, uint32_t h /*= static_cast<uint32_t>(-1)*/, vk::Format format/* = vk::Format::eB8G8R8A8Unorm*/, uint8_t levels /*= 1*/, vk::ImageCreateFlagBits createFlags /*= {}*/)
|
void SHRenderGraph::AddResource(std::string resourceName, std::initializer_list<SH_ATT_DESC_TYPE_FLAGS> typeFlags, uint32_t w /*= static_cast<uint32_t>(-1)*/, uint32_t h /*= static_cast<uint32_t>(-1)*/, vk::Format format/* = vk::Format::eB8G8R8A8Unorm*/, uint8_t levels /*= 1*/, vk::ImageUsageFlagBits usageFlags/* = {}*/, vk::ImageCreateFlagBits createFlags /*= {}*/)
|
||||||
{
|
{
|
||||||
// If we set to
|
// If we set to
|
||||||
if (w == static_cast<uint32_t>(-1) && h == static_cast<uint32_t>(-1))
|
if (w == static_cast<uint32_t>(-1) && h == static_cast<uint32_t>(-1))
|
||||||
{
|
{
|
||||||
w = swapchainHdl->GetSwapchainImage(0)->GetWidth();
|
w = swapchainHdl->GetSwapchainImage(0)->GetWidth();
|
||||||
w = swapchainHdl->GetSwapchainImage(0)->GetHeight();
|
h = swapchainHdl->GetSwapchainImage(0)->GetHeight();
|
||||||
format = swapchainHdl->GetSurfaceFormatKHR().format;
|
format = swapchainHdl->GetSurfaceFormatKHR().format;
|
||||||
}
|
}
|
||||||
|
|
||||||
graphResources.try_emplace(resourceName, resourceManager.Create<SHRenderGraphResource>(logicalDeviceHdl, swapchainHdl, resourceName, type, format, w, h, levels, createFlags));
|
graphResources.try_emplace(resourceName, resourceManager->Create<SHRenderGraphResource>(logicalDeviceHdl, swapchainHdl, resourceName, typeFlags, format, w, h, levels, usageFlags, createFlags));
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
@ -82,7 +89,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
for (auto& color : subpass->colorReferences)
|
for (auto& color : subpass->colorReferences)
|
||||||
{
|
{
|
||||||
if (i == nodes.size() - 1 && node->attResources[color.attachment]->resourceType == SH_ATT_DESC_TYPE::COLOR_PRESENT)
|
if (i == nodes.size() - 1 && (node->attResources[color.attachment]->resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT)))
|
||||||
resourceAttLayouts[color.attachment] = vk::ImageLayout::ePresentSrcKHR;
|
resourceAttLayouts[color.attachment] = vk::ImageLayout::ePresentSrcKHR;
|
||||||
else
|
else
|
||||||
resourceAttLayouts[color.attachment] = color.layout;
|
resourceAttLayouts[color.attachment] = color.layout;
|
||||||
|
@ -95,11 +102,11 @@ namespace SHADE
|
||||||
resourceAttLayouts[input.attachment] = input.layout;
|
resourceAttLayouts[input.attachment] = input.layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < node->attachmentDescriptions.size(); ++i)
|
for (uint32_t j = 0; j < node->attachmentDescriptions.size(); ++j)
|
||||||
{
|
{
|
||||||
auto& att = node->attachmentDescriptions[i];
|
auto& att = node->attachmentDescriptions[j];
|
||||||
att.initialLayout = vk::ImageLayout::eUndefined;
|
att.initialLayout = vk::ImageLayout::eUndefined;
|
||||||
att.finalLayout = resourceAttLayouts[i];
|
att.finalLayout = resourceAttLayouts[j];
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
@ -210,11 +217,19 @@ namespace SHADE
|
||||||
for (auto& inputAtt : subpass->inputReferences)
|
for (auto& inputAtt : subpass->inputReferences)
|
||||||
{
|
{
|
||||||
auto resource = node->attResources[inputAtt.attachment];
|
auto resource = node->attResources[inputAtt.attachment];
|
||||||
if (resource->resourceType == SH_ATT_DESC_TYPE::COLOR || resource->resourceType == SH_ATT_DESC_TYPE::COLOR_PRESENT)
|
if (resource->resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::INPUT))
|
||||||
|
{
|
||||||
|
if (resource->resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::COLOR) ||
|
||||||
|
resource->resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT))
|
||||||
colorRead |= (1 << i);
|
colorRead |= (1 << i);
|
||||||
else if (resource->resourceType == SH_ATT_DESC_TYPE::DEPTH_STENCIL)
|
else if (resource->resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL))
|
||||||
depthRead |= (1 << i);
|
depthRead |= (1 << i);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("While configuring subpass, an input reference was detected but the resource to be used is not marked as SH_ATT_DESC_TYPE_FLAGS::INPUT. ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
@ -350,10 +365,9 @@ namespace SHADE
|
||||||
, swapchainHdl{ }
|
, swapchainHdl{ }
|
||||||
, nodes{}
|
, nodes{}
|
||||||
, graphResources{}
|
, graphResources{}
|
||||||
, resourceManager{}
|
, resourceManager{nullptr}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
resourceManager = std::make_shared<ResourceManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
SHRenderGraph::SHRenderGraph(SHRenderGraph&& rhs) noexcept
|
SHRenderGraph::SHRenderGraph(SHRenderGraph&& rhs) noexcept
|
||||||
|
@ -400,7 +414,7 @@ namespace SHADE
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
Handle<SHRenderGraphNode> SHRenderGraph::AddNode(std::string nodeName, std::initializer_list<std::string> resourceNames, std::initializer_list<std::string> predecessorNodes) noexcept
|
SHADE::Handle<SHADE::SHRenderGraphNode> SHRenderGraph::AddNode(std::string nodeName, std::initializer_list<ResourceInstruction> resourceInstruction, std::initializer_list<std::string> predecessorNodes) noexcept
|
||||||
{
|
{
|
||||||
if (nodeIndexing.contains(nodeName))
|
if (nodeIndexing.contains(nodeName))
|
||||||
{
|
{
|
||||||
|
@ -408,12 +422,19 @@ namespace SHADE
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Handle<SHRenderGraphResource>> resources;
|
std::vector<SHAttachmentDescInitParams> descInitParams;
|
||||||
for (auto const& name : resourceNames)
|
for (auto const& instruction : resourceInstruction)
|
||||||
{
|
{
|
||||||
// If the resource that the new node is requesting for exists, allow the graph to reference it
|
// If the resource that the new node is requesting for exists, allow the graph to reference it
|
||||||
if (graphResources.contains(name))
|
if (graphResources.contains(instruction.resourceName))
|
||||||
resources.push_back(graphResources.at(name));
|
{
|
||||||
|
descInitParams.push_back(
|
||||||
|
{
|
||||||
|
.resourceHdl = graphResources.at(instruction.resourceName),
|
||||||
|
.dontClearOnLoad = false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SHLOG_ERROR("Resource doesn't exist in graph yet. Cannot create new node.");
|
SHLOG_ERROR("Resource doesn't exist in graph yet. Cannot create new node.");
|
||||||
|
@ -435,7 +456,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes.emplace_back(resourceManager.Create<SHRenderGraphNode>(resourceManager, logicalDeviceHdl, swapchainHdl, std::move(resources), std::move(predecessors), &graphResources));
|
nodes.emplace_back(resourceManager->Create<SHRenderGraphNode>(resourceManager, logicalDeviceHdl, swapchainHdl, std::move(descInitParams), std::move(predecessors), &graphResources));
|
||||||
nodeIndexing.emplace(nodeName, static_cast<uint32_t>(nodes.size()) - 1u);
|
nodeIndexing.emplace(nodeName, static_cast<uint32_t>(nodes.size()) - 1u);
|
||||||
return nodes.at(nodeIndexing[nodeName]);
|
return nodes.at(nodeIndexing[nodeName]);
|
||||||
}
|
}
|
||||||
|
@ -465,9 +486,6 @@ namespace SHADE
|
||||||
// better way to manage these
|
// better way to manage these
|
||||||
void SHRenderGraph::Execute(uint32_t frameIndex, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkDescriptorPool> descPool) noexcept
|
void SHRenderGraph::Execute(uint32_t frameIndex, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkDescriptorPool> descPool) noexcept
|
||||||
{
|
{
|
||||||
// TODO: DON'T HARDCODE THIS
|
|
||||||
cmdBuffer->SetViewportScissor(1920.0f, 1080.0f, 1920, 1080);
|
|
||||||
|
|
||||||
for (auto& node : nodes)
|
for (auto& node : nodes)
|
||||||
node->Execute(cmdBuffer, descPool, frameIndex);
|
node->Execute(cmdBuffer, descPool, frameIndex);
|
||||||
}
|
}
|
||||||
|
@ -480,6 +498,18 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHRenderGraph::HandleResize(uint32_t newWidth, uint32_t newHeight) noexcept
|
||||||
|
{
|
||||||
|
// resize resources
|
||||||
|
for (auto& [name, resource]: graphResources)
|
||||||
|
resource->HandleResize(newWidth, newHeight);
|
||||||
|
|
||||||
|
for (auto& node : nodes)
|
||||||
|
{
|
||||||
|
node->HandleResize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Handle<SHRenderGraphNode> SHRenderGraph::GetNode(std::string const& nodeName) const noexcept
|
Handle<SHRenderGraphNode> SHRenderGraph::GetNode(std::string const& nodeName) const noexcept
|
||||||
{
|
{
|
||||||
if (nodeIndexing.contains(nodeName))
|
if (nodeIndexing.contains(nodeName))
|
||||||
|
@ -489,4 +519,13 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Handle<SHRenderGraphResource> SHRenderGraph::GetRenderGraphResource(std::string const& resourceName) const noexcept
|
||||||
|
{
|
||||||
|
if (graphResources.contains(resourceName))
|
||||||
|
{
|
||||||
|
return graphResources.at(resourceName);
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -33,7 +34,17 @@ namespace SHADE
|
||||||
|
|
||||||
class SH_API SHRenderGraph
|
class SH_API SHRenderGraph
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
struct ResourceInstruction
|
||||||
|
{
|
||||||
|
std::string resourceName;
|
||||||
|
bool dontClearOnLoad;
|
||||||
|
|
||||||
|
ResourceInstruction (char const* resourceName, bool dontClearOnLoad = false) noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* PRIVATE MEMBER FUNCTIONS */
|
/* PRIVATE MEMBER FUNCTIONS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
@ -60,7 +71,7 @@ namespace SHADE
|
||||||
std::unordered_map<std::string, Handle<SHRenderGraphResource>> graphResources;
|
std::unordered_map<std::string, Handle<SHRenderGraphResource>> graphResources;
|
||||||
|
|
||||||
//! Resource library for graph handles
|
//! Resource library for graph handles
|
||||||
ResourceManager resourceManager;
|
std::shared_ptr<ResourceManager> resourceManager;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
@ -75,16 +86,19 @@ namespace SHADE
|
||||||
/* PUBLIC MEMBER FUNCTIONS */
|
/* PUBLIC MEMBER FUNCTIONS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
void Init (Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain) noexcept;
|
void Init (Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain) noexcept;
|
||||||
void AddResource (std::string resourceName, SH_ATT_DESC_TYPE type, uint32_t w = static_cast<uint32_t>(-1), uint32_t h = static_cast<uint32_t>(-1), vk::Format format = vk::Format::eB8G8R8A8Unorm, uint8_t levels = 1, vk::ImageCreateFlagBits createFlags = {});
|
void AddResource(std::string resourceName, std::initializer_list<SH_ATT_DESC_TYPE_FLAGS> typeFlags, uint32_t w = static_cast<uint32_t>(-1), uint32_t h = static_cast<uint32_t>(-1), vk::Format format = vk::Format::eB8G8R8A8Unorm, uint8_t levels = 1, vk::ImageUsageFlagBits usageFlags = {}, vk::ImageCreateFlagBits createFlags = {});
|
||||||
Handle<SHRenderGraphNode> AddNode (std::string nodeName, std::initializer_list<std::string> resourceNames, std::initializer_list<std::string> predecessorNodes) noexcept;
|
Handle<SHRenderGraphNode> AddNode (std::string nodeName, std::initializer_list<ResourceInstruction> resourceInstruction, std::initializer_list<std::string> predecessorNodes) noexcept;
|
||||||
|
|
||||||
void Generate (void) noexcept;
|
void Generate (void) noexcept;
|
||||||
void Execute (uint32_t frameIndex, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkDescriptorPool> descPool) noexcept;
|
void Execute (uint32_t frameIndex, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkDescriptorPool> descPool) noexcept;
|
||||||
void FinaliseBatch(uint32_t frameIndex, Handle<SHVkDescriptorPool> descPool);
|
void FinaliseBatch(uint32_t frameIndex, Handle<SHVkDescriptorPool> descPool);
|
||||||
|
void HandleResize (uint32_t newWidth, uint32_t newHeight) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* SETTERS AND GETTERS */
|
/* SETTERS AND GETTERS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
Handle<SHRenderGraphNode> GetNode (std::string const& nodeName) const noexcept;
|
Handle<SHRenderGraphNode> GetNode (std::string const& nodeName) const noexcept;
|
||||||
|
Handle<SHRenderGraphResource> GetRenderGraphResource (std::string const& resourceName) const noexcept;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Images/SHVkImageView.h"
|
#include "Graphics/Images/SHVkImageView.h"
|
||||||
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
||||||
|
#include "Graphics/Framebuffer/SHVkFramebuffer.h"
|
||||||
#include "SHRenderGraphResource.h"
|
#include "SHRenderGraphResource.h"
|
||||||
#include "SHSubpass.h"
|
#include "SHSubpass.h"
|
||||||
|
|
||||||
|
@ -41,7 +42,7 @@ namespace SHADE
|
||||||
|
|
||||||
for (uint32_t j = 0; j < attResources.size(); ++j)
|
for (uint32_t j = 0; j < attResources.size(); ++j)
|
||||||
{
|
{
|
||||||
uint32_t imageViewIndex = (attResources[j]->resourceType == SH_ATT_DESC_TYPE::COLOR_PRESENT) ? i : 0;
|
uint32_t imageViewIndex = (attResources[j]->resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT)) ? i : 0;
|
||||||
imageViews[j] = attResources[j]->imageViews[imageViewIndex];
|
imageViews[j] = attResources[j]->imageViews[imageViewIndex];
|
||||||
|
|
||||||
// We want the minimum dimensions for the framebuffer because the image attachments referenced cannot have dimensions smaller than the framebuffer's
|
// We want the minimum dimensions for the framebuffer because the image attachments referenced cannot have dimensions smaller than the framebuffer's
|
||||||
|
@ -56,6 +57,33 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHRenderGraphNode::HandleResize(void) noexcept
|
||||||
|
{
|
||||||
|
renderpass->HandleResize();
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < framebuffers.size(); ++i)
|
||||||
|
{
|
||||||
|
std::vector<Handle<SHVkImageView>> imageViews(attResources.size());
|
||||||
|
uint32_t fbWidth = std::numeric_limits<uint32_t>::max();
|
||||||
|
uint32_t fbHeight = std::numeric_limits<uint32_t>::max();
|
||||||
|
|
||||||
|
for (uint32_t j = 0; j < attResources.size(); ++j)
|
||||||
|
{
|
||||||
|
uint32_t imageViewIndex = (attResources[j]->resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT)) ? i : 0;
|
||||||
|
imageViews[j] = attResources[j]->imageViews[imageViewIndex];
|
||||||
|
|
||||||
|
// We want the minimum dimensions for the framebuffer because the image attachments referenced cannot have dimensions smaller than the framebuffer's
|
||||||
|
if (fbWidth > attResources[j]->width)
|
||||||
|
fbWidth = attResources[j]->width;
|
||||||
|
if (fbHeight > attResources[j]->height)
|
||||||
|
fbHeight = attResources[j]->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
framebuffers[i]->HandleResize(renderpass, imageViews, fbWidth, fbHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
@ -76,14 +104,14 @@ namespace SHADE
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
SHRenderGraphNode::SHRenderGraphNode(ResourceManager& rm, Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::vector<Handle<SHRenderGraphResource>> attRes, std::vector<Handle<SHRenderGraphNode>> predecessors, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* resources) noexcept
|
SHRenderGraphNode::SHRenderGraphNode(std::shared_ptr<ResourceManager> rm, Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::vector<SHAttachmentDescInitParams> attDescInitParams, std::vector<Handle<SHRenderGraphNode>> predecessors, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* resources) noexcept
|
||||||
: logicalDeviceHdl{ logicalDevice }
|
: logicalDeviceHdl{ logicalDevice }
|
||||||
, renderpass{}
|
, renderpass{}
|
||||||
, framebuffers{}
|
, framebuffers{}
|
||||||
, prereqNodes{ std::move(predecessors) }
|
, prereqNodes{ std::move(predecessors) }
|
||||||
, attachmentDescriptions{}
|
, attachmentDescriptions{}
|
||||||
, resourceAttachmentMapping{}
|
, resourceAttachmentMapping{}
|
||||||
, attResources{ std::move(attRes) }
|
, attResources{ }
|
||||||
, subpasses{}
|
, subpasses{}
|
||||||
, executed{ false }
|
, executed{ false }
|
||||||
, configured{ false }
|
, configured{ false }
|
||||||
|
@ -93,6 +121,12 @@ namespace SHADE
|
||||||
// pipeline library initialization
|
// pipeline library initialization
|
||||||
pipelineLibrary.Init(logicalDeviceHdl);
|
pipelineLibrary.Init(logicalDeviceHdl);
|
||||||
|
|
||||||
|
// Store all the handles to resources
|
||||||
|
attResources.reserve (attDescInitParams.size());
|
||||||
|
for (auto& param : attDescInitParams)
|
||||||
|
attResources.push_back(param.resourceHdl);
|
||||||
|
|
||||||
|
// We have as many descriptions as we have resources
|
||||||
attachmentDescriptions.resize(attResources.size());
|
attachmentDescriptions.resize(attResources.size());
|
||||||
|
|
||||||
bool containsSwapchainImage = false;
|
bool containsSwapchainImage = false;
|
||||||
|
@ -112,7 +146,7 @@ namespace SHADE
|
||||||
|
|
||||||
newDesc.format = attResources[i]->resourceFormat;
|
newDesc.format = attResources[i]->resourceFormat;
|
||||||
|
|
||||||
if (attResources[i]->resourceType == SH_ATT_DESC_TYPE::COLOR_PRESENT)
|
if (attResources[i]->resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT))
|
||||||
containsSwapchainImage = true;
|
containsSwapchainImage = true;
|
||||||
|
|
||||||
resourceAttachmentMapping.try_emplace(attResources[i].GetId().Raw, i);
|
resourceAttachmentMapping.try_emplace(attResources[i].GetId().Raw, i);
|
||||||
|
@ -128,7 +162,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
SHRenderGraphNode::SHRenderGraphNode(SHRenderGraphNode&& rhs) noexcept
|
SHRenderGraphNode::SHRenderGraphNode(SHRenderGraphNode&& rhs) noexcept
|
||||||
: resourceManager{ rhs.resourceManager }
|
: resourceManager{ std::move (rhs.resourceManager) }
|
||||||
, logicalDeviceHdl{ rhs.logicalDeviceHdl }
|
, logicalDeviceHdl{ rhs.logicalDeviceHdl }
|
||||||
, renderpass{ rhs.renderpass }
|
, renderpass{ rhs.renderpass }
|
||||||
, framebuffers{ std::move(rhs.framebuffers) }
|
, framebuffers{ std::move(rhs.framebuffers) }
|
||||||
|
@ -143,6 +177,8 @@ namespace SHADE
|
||||||
, ptrToResources{ rhs.ptrToResources }
|
, ptrToResources{ rhs.ptrToResources }
|
||||||
, pipelineLibrary{ std::move(rhs.pipelineLibrary) }
|
, pipelineLibrary{ std::move(rhs.pipelineLibrary) }
|
||||||
, batcher{ std::move(rhs.batcher) }
|
, batcher{ std::move(rhs.batcher) }
|
||||||
|
, spDescs{ std::move(rhs.spDescs) }
|
||||||
|
, spDeps{ std::move(rhs.spDeps) }
|
||||||
|
|
||||||
{
|
{
|
||||||
rhs.renderpass = {};
|
rhs.renderpass = {};
|
||||||
|
@ -153,7 +189,7 @@ namespace SHADE
|
||||||
if (&rhs == this)
|
if (&rhs == this)
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
resourceManager = rhs.resourceManager;
|
resourceManager = std::move(rhs.resourceManager);
|
||||||
logicalDeviceHdl = rhs.logicalDeviceHdl;
|
logicalDeviceHdl = rhs.logicalDeviceHdl;
|
||||||
renderpass = rhs.renderpass;
|
renderpass = rhs.renderpass;
|
||||||
framebuffers = std::move(rhs.framebuffers);
|
framebuffers = std::move(rhs.framebuffers);
|
||||||
|
@ -166,6 +202,9 @@ namespace SHADE
|
||||||
ptrToResources = std::move(rhs.ptrToResources);
|
ptrToResources = std::move(rhs.ptrToResources);
|
||||||
pipelineLibrary = std::move(rhs.pipelineLibrary);
|
pipelineLibrary = std::move(rhs.pipelineLibrary);
|
||||||
batcher = std::move(rhs.batcher);
|
batcher = std::move(rhs.batcher);
|
||||||
|
spDescs = std::move(rhs.spDescs);
|
||||||
|
spDeps = std::move(rhs.spDeps);
|
||||||
|
|
||||||
|
|
||||||
rhs.renderpass = {};
|
rhs.renderpass = {};
|
||||||
|
|
||||||
|
@ -196,10 +235,10 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add subpass to container and create mapping for it
|
// Add subpass to container and create mapping for it
|
||||||
subpasses.emplace_back(resourceManager.Create<SHSubpass>(resourceManager, GetHandle(), subpasses.size(), &resourceAttachmentMapping, ptrToResources));
|
subpasses.emplace_back(resourceManager->Create<SHSubpass>(GetHandle(), subpasses.size(), &resourceAttachmentMapping, ptrToResources));
|
||||||
subpassIndexing.try_emplace(subpassName, static_cast<uint32_t>(subpasses.size()) - 1u);
|
subpassIndexing.try_emplace(subpassName, static_cast<uint32_t>(subpasses.size()) - 1u);
|
||||||
Handle<SHSubpass> subpass = subpasses.back();
|
Handle<SHSubpass> subpass = subpasses.back();
|
||||||
subpass->Init(resourceManager);
|
subpass->Init(*resourceManager);
|
||||||
|
|
||||||
// Register the SuperBatch
|
// Register the SuperBatch
|
||||||
batcher.RegisterSuperBatch(subpass->GetSuperBatch());
|
batcher.RegisterSuperBatch(subpass->GetSuperBatch());
|
||||||
|
@ -233,6 +272,7 @@ namespace SHADE
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Handle<SHVkPipeline> pipeline = pipelineLibrary.GetDrawPipline(vsFsPair);
|
Handle<SHVkPipeline> pipeline = pipelineLibrary.GetDrawPipline(vsFsPair);
|
||||||
if (!pipeline)
|
if (!pipeline)
|
||||||
{
|
{
|
||||||
|
@ -273,4 +313,12 @@ namespace SHADE
|
||||||
return subpasses[subpassIndexing.at(subpassName.data())];
|
return subpasses[subpassIndexing.at(subpassName.data())];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Handle<SHRenderGraphResource> SHRenderGraphNode::GetResource(uint32_t resourceIndex) const noexcept
|
||||||
|
{
|
||||||
|
if (resourceIndex < attResources.size())
|
||||||
|
return attResources[resourceIndex];
|
||||||
|
else
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -9,6 +9,7 @@
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
#include "Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.h"
|
#include "Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.h"
|
||||||
#include "Graphics/MiddleEnd/Batching/SHBatcher.h"
|
#include "Graphics/MiddleEnd/Batching/SHBatcher.h"
|
||||||
|
#include "SHAttachmentDescInitParams.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -25,7 +26,7 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* PRIVATE MEMBER VARIABLES */
|
/* PRIVATE MEMBER VARIABLES */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
ResourceManager& resourceManager;
|
std::shared_ptr<ResourceManager> resourceManager;
|
||||||
|
|
||||||
//! For Vulkan object creation
|
//! For Vulkan object creation
|
||||||
Handle<SHVkLogicalDevice> logicalDeviceHdl;
|
Handle<SHVkLogicalDevice> logicalDeviceHdl;
|
||||||
|
@ -81,12 +82,13 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
void CreateRenderpass(void) noexcept;
|
void CreateRenderpass(void) noexcept;
|
||||||
void CreateFramebuffer(void) noexcept;
|
void CreateFramebuffer(void) noexcept;
|
||||||
|
void HandleResize (void) noexcept;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* CTORS AND DTORS */
|
/* CTORS AND DTORS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
SHRenderGraphNode(ResourceManager& rm, Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::vector<Handle<SHRenderGraphResource>> attRes, std::vector<Handle<SHRenderGraphNode>> predecessors, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* resources) noexcept;
|
SHRenderGraphNode(std::shared_ptr<ResourceManager> rm, Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::vector<SHAttachmentDescInitParams> attDescInitParams, std::vector<Handle<SHRenderGraphNode>> predecessors, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* resources) noexcept;
|
||||||
SHRenderGraphNode(SHRenderGraphNode&& rhs) noexcept;
|
SHRenderGraphNode(SHRenderGraphNode&& rhs) noexcept;
|
||||||
SHRenderGraphNode& operator= (SHRenderGraphNode&& rhs) noexcept;
|
SHRenderGraphNode& operator= (SHRenderGraphNode&& rhs) noexcept;
|
||||||
|
|
||||||
|
@ -104,6 +106,7 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
Handle<SHVkRenderpass> GetRenderpass(void) const noexcept;
|
Handle<SHVkRenderpass> GetRenderpass(void) const noexcept;
|
||||||
Handle<SHSubpass> GetSubpass(std::string_view subpassName) const noexcept;
|
Handle<SHSubpass> GetSubpass(std::string_view subpassName) const noexcept;
|
||||||
|
Handle<SHRenderGraphResource> GetResource (uint32_t resourceIndex) const noexcept;
|
||||||
friend class SHRenderGraph;
|
friend class SHRenderGraph;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,13 @@
|
||||||
#include "SHRenderGraphResource.h"
|
#include "SHRenderGraphResource.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
||||||
|
#include "Graphics/Images/SHVkImageView.h"
|
||||||
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
|
#include "Graphics/SHVkUtil.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
@ -41,8 +45,10 @@ namespace SHADE
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
SHRenderGraphResource::SHRenderGraphResource(Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::string const& name, SH_ATT_DESC_TYPE type, vk::Format format, uint32_t w, uint32_t h, uint8_t levels, vk::ImageCreateFlagBits createFlags) noexcept
|
SHRenderGraphResource::SHRenderGraphResource(Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::string const& name, std::initializer_list<SH_ATT_DESC_TYPE_FLAGS> typeFlags, vk::Format format, uint32_t w, uint32_t h, uint8_t levels, vk::ImageUsageFlagBits usageFlags, vk::ImageCreateFlagBits createFlags) noexcept
|
||||||
: resourceType{ type }
|
: logicalDevice {logicalDevice}
|
||||||
|
, swapchain{ swapchain }
|
||||||
|
, resourceTypeFlags{ }
|
||||||
, resourceFormat{ format }
|
, resourceFormat{ format }
|
||||||
, images{}
|
, images{}
|
||||||
, imageViews{}
|
, imageViews{}
|
||||||
|
@ -52,52 +58,10 @@ namespace SHADE
|
||||||
, resourceName{ name }
|
, resourceName{ name }
|
||||||
{
|
{
|
||||||
// If the resource type is an arbitrary image and not swapchain image
|
// If the resource type is an arbitrary image and not swapchain image
|
||||||
if (type != SH_ATT_DESC_TYPE::COLOR_PRESENT)
|
if (typeFlags.size() == 1 && *typeFlags.begin() == SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT)
|
||||||
{
|
{
|
||||||
vk::ImageAspectFlags imageAspectFlags;
|
resourceTypeFlags |= static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT);
|
||||||
vk::ImageUsageFlags usage = {};
|
|
||||||
|
|
||||||
// Check the resource type and set image usage flags and image aspect flags accordingly
|
|
||||||
switch (resourceType)
|
|
||||||
{
|
|
||||||
case SH_ATT_DESC_TYPE::COLOR:
|
|
||||||
usage |= vk::ImageUsageFlagBits::eColorAttachment;
|
|
||||||
imageAspectFlags |= vk::ImageAspectFlagBits::eColor;
|
|
||||||
break;
|
|
||||||
case SH_ATT_DESC_TYPE::DEPTH:
|
|
||||||
usage |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
|
|
||||||
imageAspectFlags |= vk::ImageAspectFlagBits::eDepth;
|
|
||||||
break;
|
|
||||||
case SH_ATT_DESC_TYPE::STENCIL:
|
|
||||||
usage |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
|
|
||||||
imageAspectFlags |= vk::ImageAspectFlagBits::eStencil;
|
|
||||||
break;
|
|
||||||
case SH_ATT_DESC_TYPE::DEPTH_STENCIL:
|
|
||||||
usage |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
|
|
||||||
imageAspectFlags |= vk::ImageAspectFlagBits::eStencil | vk::ImageAspectFlagBits::eDepth;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The resource is not a swapchain image, just use the first slot of the vector
|
|
||||||
images.push_back(logicalDevice->CreateImage(width, height, mipLevels, resourceFormat, usage, createFlags));
|
|
||||||
|
|
||||||
// prepare image view details
|
|
||||||
SHImageViewDetails viewDetails
|
|
||||||
{
|
|
||||||
.viewType = vk::ImageViewType::e2D,
|
|
||||||
.format = images[0]->GetImageFormat(),
|
|
||||||
.imageAspectFlags = imageAspectFlags,
|
|
||||||
.baseMipLevel = 0,
|
|
||||||
.mipLevelCount = mipLevels,
|
|
||||||
.baseArrayLayer = 0,
|
|
||||||
.layerCount = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
// just 1 image view created
|
|
||||||
imageViews.push_back(images[0]->CreateImageView(logicalDevice, images[0], viewDetails));
|
|
||||||
}
|
|
||||||
else // if swapchain image resource
|
|
||||||
{
|
|
||||||
// Prepare image view details
|
// Prepare image view details
|
||||||
SHImageViewDetails viewDetails
|
SHImageViewDetails viewDetails
|
||||||
{
|
{
|
||||||
|
@ -120,6 +84,65 @@ namespace SHADE
|
||||||
imageViews[i] = images[i]->CreateImageView(logicalDevice, images[i], viewDetails);
|
imageViews[i] = images[i]->CreateImageView(logicalDevice, images[i], viewDetails);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else // if swapchain image resource
|
||||||
|
{
|
||||||
|
imageAspectFlags = vk::ImageAspectFlags{};
|
||||||
|
usage = usageFlags;
|
||||||
|
|
||||||
|
for (auto& type : typeFlags)
|
||||||
|
{
|
||||||
|
// store the flags
|
||||||
|
resourceTypeFlags |= static_cast<uint32_t>(type);
|
||||||
|
|
||||||
|
// Check the resource type and set image usage flags and image aspect flags accordingly
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case SH_ATT_DESC_TYPE_FLAGS::COLOR:
|
||||||
|
usage |= vk::ImageUsageFlagBits::eColorAttachment;
|
||||||
|
imageAspectFlags |= vk::ImageAspectFlagBits::eColor;
|
||||||
|
break;
|
||||||
|
case SH_ATT_DESC_TYPE_FLAGS::DEPTH:
|
||||||
|
usage |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
|
||||||
|
imageAspectFlags |= vk::ImageAspectFlagBits::eDepth;
|
||||||
|
break;
|
||||||
|
case SH_ATT_DESC_TYPE_FLAGS::STENCIL:
|
||||||
|
usage |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
|
||||||
|
imageAspectFlags |= vk::ImageAspectFlagBits::eStencil;
|
||||||
|
break;
|
||||||
|
case SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL:
|
||||||
|
usage |= vk::ImageUsageFlagBits::eDepthStencilAttachment;
|
||||||
|
imageAspectFlags |= vk::ImageAspectFlagBits::eStencil | vk::ImageAspectFlagBits::eDepth;
|
||||||
|
break;
|
||||||
|
case SH_ATT_DESC_TYPE_FLAGS::INPUT:
|
||||||
|
usage |= vk::ImageUsageFlagBits::eInputAttachment;
|
||||||
|
usage |= vk::ImageUsageFlagBits::eSampled;
|
||||||
|
break;
|
||||||
|
case SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT:
|
||||||
|
{
|
||||||
|
SHLOG_ERROR ("COLOR_PRESENT cannot be with other resource type flags. ");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The resource is not a swapchain image, just use the first slot of the vector
|
||||||
|
images.push_back(logicalDevice->CreateImage(width, height, mipLevels, resourceFormat, usage, createFlags));
|
||||||
|
|
||||||
|
// prepare image view details
|
||||||
|
SHImageViewDetails viewDetails
|
||||||
|
{
|
||||||
|
.viewType = vk::ImageViewType::e2D,
|
||||||
|
.format = images[0]->GetImageFormat(),
|
||||||
|
.imageAspectFlags = imageAspectFlags,
|
||||||
|
.baseMipLevel = 0,
|
||||||
|
.mipLevelCount = mipLevels,
|
||||||
|
.baseArrayLayer = 0,
|
||||||
|
.layerCount = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
// just 1 image view created
|
||||||
|
imageViews.push_back(images[0]->CreateImageView(logicalDevice, images[0], viewDetails));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
@ -135,13 +158,15 @@ namespace SHADE
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
SHRenderGraphResource::SHRenderGraphResource(SHRenderGraphResource&& rhs) noexcept
|
SHRenderGraphResource::SHRenderGraphResource(SHRenderGraphResource&& rhs) noexcept
|
||||||
: resourceName{ std::move(rhs.resourceName) }
|
: resourceName{ std::move(rhs.resourceName) }
|
||||||
, resourceType{ std::move(rhs.resourceType) }
|
, resourceTypeFlags{ std::move(rhs.resourceTypeFlags) }
|
||||||
, images{ std::move(rhs.images) }
|
, images{ std::move(rhs.images) }
|
||||||
, imageViews{ std::move(rhs.imageViews) }
|
, imageViews{ std::move(rhs.imageViews) }
|
||||||
, resourceFormat{ std::move(rhs.resourceFormat) }
|
, resourceFormat{ std::move(rhs.resourceFormat) }
|
||||||
, width{ rhs.width }
|
, width{ rhs.width }
|
||||||
, height{ rhs.height }
|
, height{ rhs.height }
|
||||||
, mipLevels{ rhs.mipLevels }
|
, mipLevels{ rhs.mipLevels }
|
||||||
|
, imageAspectFlags{ rhs.imageAspectFlags }
|
||||||
|
, swapchain {rhs.swapchain}
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -165,13 +190,15 @@ namespace SHADE
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
resourceName = std::move(rhs.resourceName);
|
resourceName = std::move(rhs.resourceName);
|
||||||
resourceType = std::move(rhs.resourceType);
|
resourceTypeFlags = std::move(rhs.resourceTypeFlags);
|
||||||
images = std::move(rhs.images);
|
images = std::move(rhs.images);
|
||||||
imageViews = std::move(rhs.imageViews);
|
imageViews = std::move(rhs.imageViews);
|
||||||
resourceFormat = std::move(rhs.resourceFormat);
|
resourceFormat = std::move(rhs.resourceFormat);
|
||||||
width = rhs.width;
|
width = rhs.width;
|
||||||
height = rhs.height;
|
height = rhs.height;
|
||||||
mipLevels = rhs.mipLevels;
|
mipLevels = rhs.mipLevels;
|
||||||
|
imageAspectFlags = rhs.imageAspectFlags;
|
||||||
|
swapchain = rhs.swapchain;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -189,4 +216,111 @@ namespace SHADE
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHRenderGraphResource::HandleResize(uint32_t newWidth, uint32_t newHeight) noexcept
|
||||||
|
{
|
||||||
|
width = newWidth;
|
||||||
|
height = newHeight;
|
||||||
|
|
||||||
|
if ((resourceTypeFlags & static_cast<uint32_t>(SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT)) == 0)
|
||||||
|
{
|
||||||
|
// prepare image view details
|
||||||
|
SHImageViewDetails viewDetails
|
||||||
|
{
|
||||||
|
.viewType = vk::ImageViewType::e2D,
|
||||||
|
.format = images[0]->GetImageFormat(),
|
||||||
|
.imageAspectFlags = imageAspectFlags,
|
||||||
|
.baseMipLevel = 0,
|
||||||
|
.mipLevelCount = mipLevels,
|
||||||
|
.baseArrayLayer = 0,
|
||||||
|
.layerCount = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < images.size(); ++i)
|
||||||
|
{
|
||||||
|
images[i]->HandleResizeFramebufferImage(width, height);
|
||||||
|
imageViews[i]->ViewNewImage(images[i], viewDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Prepare image view details
|
||||||
|
SHImageViewDetails viewDetails
|
||||||
|
{
|
||||||
|
.viewType = vk::ImageViewType::e2D,
|
||||||
|
.format = swapchain->GetSurfaceFormatKHR().format,
|
||||||
|
.imageAspectFlags = vk::ImageAspectFlagBits::eColor,
|
||||||
|
.baseMipLevel = 0,
|
||||||
|
.mipLevelCount = 1,
|
||||||
|
.baseArrayLayer = 0,
|
||||||
|
.layerCount = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < swapchain->GetNumImages(); ++i)
|
||||||
|
{
|
||||||
|
images[i] = swapchain->GetSwapchainImage(i);
|
||||||
|
imageViews[i]->ViewNewImage(images[i], viewDetails);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRenderGraphResource::TransitionImage(vk::ImageLayout oldLayout, vk::ImageLayout newLayout, Handle<SHVkCommandBuffer> commandBuffer, vk::PipelineStageFlagBits srcStage, vk::PipelineStageFlagBits dstStage, uint32_t frameIndex) noexcept
|
||||||
|
{
|
||||||
|
vk::ImageMemoryBarrier barrier;
|
||||||
|
barrier.oldLayout = oldLayout;
|
||||||
|
barrier.newLayout = newLayout;
|
||||||
|
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
barrier.image = images[frameIndex]->GetVkImage(),
|
||||||
|
barrier.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor; // TODO: Need to change this to base it off image format.
|
||||||
|
barrier.subresourceRange.baseMipLevel = 0;
|
||||||
|
barrier.subresourceRange.levelCount = mipLevels;
|
||||||
|
barrier.subresourceRange.baseArrayLayer = 0;
|
||||||
|
barrier.subresourceRange.layerCount = 1; // always 1 since we wont have array of images for attachments
|
||||||
|
|
||||||
|
commandBuffer->PipelineBarrier(srcStage, dstStage, {}, {}, {}, {barrier});
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRenderGraphResource::CopyToBuffer(Handle<SHVkBuffer> dstBuffer, Handle<SHVkCommandBuffer> commandBuffer, uint32_t frameIndex) const noexcept
|
||||||
|
{
|
||||||
|
vk::ImageSubresourceLayers subResource
|
||||||
|
{
|
||||||
|
.aspectMask = SHVkUtil::IsDepthOnlyFormat(resourceFormat) ? vk::ImageAspectFlagBits::eDepth : vk::ImageAspectFlagBits::eColor,
|
||||||
|
.mipLevel = 0,
|
||||||
|
.baseArrayLayer = 0,
|
||||||
|
.layerCount = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
vk::BufferImageCopy region
|
||||||
|
{
|
||||||
|
.bufferOffset = 0,
|
||||||
|
.bufferRowLength = 0,
|
||||||
|
.bufferImageHeight = 0,
|
||||||
|
.imageSubresource = subResource,
|
||||||
|
.imageOffset = vk::Offset3D {0,0,0},
|
||||||
|
.imageExtent = vk::Extent3D {width, height, 1}
|
||||||
|
};
|
||||||
|
|
||||||
|
commandBuffer->CopyImageToBuffer(images[frameIndex]->GetVkImage(), dstBuffer->GetVkBuffer(), {region});
|
||||||
|
}
|
||||||
|
|
||||||
|
vk::Format SHRenderGraphResource::GetResourceFormat(void) const noexcept
|
||||||
|
{
|
||||||
|
return resourceFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t SHRenderGraphResource::GetWidth(void) const noexcept
|
||||||
|
{
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t SHRenderGraphResource::GetHeight(void) const noexcept
|
||||||
|
{
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle<SHVkImageView> SHRenderGraphResource::GetImageView(uint32_t index /*= NON_SWAPCHAIN_RESOURCE_INDEX*/) const noexcept
|
||||||
|
{
|
||||||
|
return imageViews [index];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -13,6 +13,10 @@ namespace SHADE
|
||||||
class SHVkImageView;
|
class SHVkImageView;
|
||||||
class SHVkLogicalDevice;
|
class SHVkLogicalDevice;
|
||||||
class SHVkSwapchain;
|
class SHVkSwapchain;
|
||||||
|
class SHVkCommandBuffer;
|
||||||
|
class SHVkBuffer;
|
||||||
|
|
||||||
|
static constexpr uint32_t NON_SWAPCHAIN_RESOURCE_INDEX = 0;
|
||||||
|
|
||||||
class SH_API SHRenderGraphResource
|
class SH_API SHRenderGraphResource
|
||||||
{
|
{
|
||||||
|
@ -20,11 +24,17 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* PRIVATE MEMBER VARIABLES */
|
/* PRIVATE MEMBER VARIABLES */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
// for creation/recreation
|
||||||
|
Handle<SHVkLogicalDevice> logicalDevice;
|
||||||
|
|
||||||
|
// for creation/recreation
|
||||||
|
Handle<SHVkSwapchain> swapchain;
|
||||||
|
|
||||||
//! Name of the resource
|
//! Name of the resource
|
||||||
std::string resourceName;
|
std::string resourceName;
|
||||||
|
|
||||||
//! Used for initializing image layouts
|
//! Used for initializing image layouts
|
||||||
SH_ATT_DESC_TYPE resourceType;
|
SHRenderGraphResourceFlags resourceTypeFlags;
|
||||||
|
|
||||||
//! The resource itself (this is a vector because if the resource happens
|
//! The resource itself (this is a vector because if the resource happens
|
||||||
//! to be a swapchain image, then we need however many frames in flight).
|
//! to be a swapchain image, then we need however many frames in flight).
|
||||||
|
@ -47,15 +57,38 @@ namespace SHADE
|
||||||
|
|
||||||
//! Number of mipmap levels
|
//! Number of mipmap levels
|
||||||
uint8_t mipLevels;
|
uint8_t mipLevels;
|
||||||
|
|
||||||
|
//! image aspect flags
|
||||||
|
vk::ImageAspectFlags imageAspectFlags;
|
||||||
|
|
||||||
|
//! usage flags
|
||||||
|
vk::ImageUsageFlags usage = {};
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* CTORS AND DTORS */
|
/* CTORS AND DTORS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
SHRenderGraphResource(Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::string const& name, SH_ATT_DESC_TYPE type, vk::Format format, uint32_t w, uint32_t h, uint8_t levels, vk::ImageCreateFlagBits createFlags) noexcept;
|
SHRenderGraphResource(Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::string const& name, std::initializer_list<SH_ATT_DESC_TYPE_FLAGS> typeFlags, vk::Format format, uint32_t w, uint32_t h, uint8_t levels, vk::ImageUsageFlagBits usageFlags, vk::ImageCreateFlagBits createFlags) noexcept;
|
||||||
SHRenderGraphResource(SHRenderGraphResource&& rhs) noexcept;
|
SHRenderGraphResource(SHRenderGraphResource&& rhs) noexcept;
|
||||||
SHRenderGraphResource& operator=(SHRenderGraphResource&& rhs) noexcept;
|
SHRenderGraphResource& operator=(SHRenderGraphResource&& rhs) noexcept;
|
||||||
~SHRenderGraphResource(void) noexcept;
|
~SHRenderGraphResource(void) noexcept;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* PUBLIC MEMBER FUNCTIONS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
void HandleResize (uint32_t newWidth, uint32_t newHeight) noexcept;
|
||||||
|
void TransitionImage(vk::ImageLayout oldLayout, vk::ImageLayout newLayout, Handle<SHVkCommandBuffer> commandBuffer, vk::PipelineStageFlagBits srcStage, vk::PipelineStageFlagBits dstStage, uint32_t frameIndex) noexcept;
|
||||||
|
void CopyToBuffer (Handle<SHVkBuffer> dstBuffer, Handle<SHVkCommandBuffer> commandBuffer, uint32_t frameIndex = 0) const noexcept;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* SETTERS AND GETTERS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
vk::Format GetResourceFormat (void) const noexcept;
|
||||||
|
uint32_t GetWidth (void) const noexcept;
|
||||||
|
uint32_t GetHeight (void) const noexcept;
|
||||||
|
Handle<SHVkImageView> GetImageView (uint32_t index = NON_SWAPCHAIN_RESOURCE_INDEX) const noexcept;
|
||||||
|
|
||||||
friend class SHRenderGraphNode;
|
friend class SHRenderGraphNode;
|
||||||
friend class SHRenderGraph;
|
friend class SHRenderGraph;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
#include "SHSubpass.h"
|
#include "SHSubpass.h"
|
||||||
#include "Graphics/MiddleEnd/Batching/SHSuperBatch.h"
|
#include "Graphics/MiddleEnd/Batching/SHSuperBatch.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
|
#include "SHRenderGraphNode.h"
|
||||||
|
#include "SHRenderGraphResource.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -21,7 +23,7 @@ namespace SHADE
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
SHSubpass::SHSubpass(ResourceManager& rm, Handle<SHRenderGraphNode> const& parent, uint32_t index, std::unordered_map<uint64_t, uint32_t> const* mapping, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* resources) noexcept
|
SHSubpass::SHSubpass(Handle<SHRenderGraphNode> const& parent, uint32_t index, std::unordered_map<uint64_t, uint32_t> const* mapping, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* resources) noexcept
|
||||||
: resourceAttachmentMapping{ mapping }
|
: resourceAttachmentMapping{ mapping }
|
||||||
, ptrToResources{ resources }
|
, ptrToResources{ resources }
|
||||||
, parentNode{ parent }
|
, parentNode{ parent }
|
||||||
|
@ -53,6 +55,8 @@ namespace SHADE
|
||||||
, inputReferences{ std::move(rhs.inputReferences) }
|
, inputReferences{ std::move(rhs.inputReferences) }
|
||||||
, resourceAttachmentMapping{ rhs.resourceAttachmentMapping }
|
, resourceAttachmentMapping{ rhs.resourceAttachmentMapping }
|
||||||
, ptrToResources{ rhs.ptrToResources }
|
, ptrToResources{ rhs.ptrToResources }
|
||||||
|
, descriptorSetLayout{ rhs.descriptorSetLayout }
|
||||||
|
, exteriorDrawCalls{ std::move (rhs.exteriorDrawCalls) }
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -81,6 +85,8 @@ namespace SHADE
|
||||||
inputReferences = std::move(rhs.inputReferences);
|
inputReferences = std::move(rhs.inputReferences);
|
||||||
resourceAttachmentMapping = rhs.resourceAttachmentMapping;
|
resourceAttachmentMapping = rhs.resourceAttachmentMapping;
|
||||||
ptrToResources = rhs.ptrToResources;
|
ptrToResources = rhs.ptrToResources;
|
||||||
|
descriptorSetLayout = rhs.descriptorSetLayout;
|
||||||
|
exteriorDrawCalls = std::move(rhs.exteriorDrawCalls);
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -118,18 +124,18 @@ namespace SHADE
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void SHSubpass::AddDepthOutput(std::string resourceToReference, SH_ATT_DESC_TYPE attachmentDescriptionType) noexcept
|
void SHSubpass::AddDepthOutput(std::string resourceToReference, SH_ATT_DESC_TYPE_FLAGS attachmentDescriptionType) noexcept
|
||||||
{
|
{
|
||||||
vk::ImageLayout imageLayout;
|
vk::ImageLayout imageLayout;
|
||||||
switch (attachmentDescriptionType)
|
switch (attachmentDescriptionType)
|
||||||
{
|
{
|
||||||
case SH_ATT_DESC_TYPE::DEPTH:
|
case SH_ATT_DESC_TYPE_FLAGS::DEPTH:
|
||||||
imageLayout = vk::ImageLayout::eDepthAttachmentOptimal;
|
imageLayout = vk::ImageLayout::eDepthAttachmentOptimal;
|
||||||
break;
|
break;
|
||||||
case SH_ATT_DESC_TYPE::STENCIL:
|
case SH_ATT_DESC_TYPE_FLAGS::STENCIL:
|
||||||
imageLayout = vk::ImageLayout::eStencilAttachmentOptimal;
|
imageLayout = vk::ImageLayout::eStencilAttachmentOptimal;
|
||||||
break;
|
break;
|
||||||
case SH_ATT_DESC_TYPE::DEPTH_STENCIL:
|
case SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL:
|
||||||
imageLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
|
imageLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -207,4 +213,15 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
return superBatch;
|
return superBatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<vk::AttachmentReference> const& SHSubpass::GetColorAttachmentReferences(void) const noexcept
|
||||||
|
{
|
||||||
|
return colorReferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
vk::Format SHSubpass::GetFormatFromAttachmentReference(uint32_t attachmentReference) const noexcept
|
||||||
|
{
|
||||||
|
return parentNode->GetResource(attachmentReference)->GetResourceFormat();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -62,7 +62,7 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* CTORS AND DTORS */
|
/* CTORS AND DTORS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
SHSubpass(ResourceManager& rm, Handle<SHRenderGraphNode> const& parent, uint32_t index, std::unordered_map<uint64_t, uint32_t> const* mapping, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* ptrToResources) noexcept;
|
SHSubpass(Handle<SHRenderGraphNode> const& parent, uint32_t index, std::unordered_map<uint64_t, uint32_t> const* mapping, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* ptrToResources) noexcept;
|
||||||
SHSubpass(SHSubpass&& rhs) noexcept;
|
SHSubpass(SHSubpass&& rhs) noexcept;
|
||||||
SHSubpass& operator=(SHSubpass&& rhs) noexcept;
|
SHSubpass& operator=(SHSubpass&& rhs) noexcept;
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
// Preparation functions
|
// Preparation functions
|
||||||
void AddColorOutput(std::string resourceToReference) noexcept;
|
void AddColorOutput(std::string resourceToReference) noexcept;
|
||||||
void AddDepthOutput(std::string resourceToReference, SH_ATT_DESC_TYPE attachmentDescriptionType = SH_ATT_DESC_TYPE::DEPTH_STENCIL) noexcept;
|
void AddDepthOutput(std::string resourceToReference, SH_ATT_DESC_TYPE_FLAGS attachmentDescriptionType = SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL) noexcept;
|
||||||
void AddInput(std::string resourceToReference) noexcept;
|
void AddInput(std::string resourceToReference) noexcept;
|
||||||
|
|
||||||
// Runtime functions
|
// Runtime functions
|
||||||
|
@ -86,7 +86,8 @@ namespace SHADE
|
||||||
Handle<SHRenderGraphNode> const& GetParentNode(void) const noexcept;
|
Handle<SHRenderGraphNode> const& GetParentNode(void) const noexcept;
|
||||||
SHSubPassIndex GetIndex() const noexcept;
|
SHSubPassIndex GetIndex() const noexcept;
|
||||||
Handle<SHSuperBatch> GetSuperBatch(void) const noexcept;
|
Handle<SHSuperBatch> GetSuperBatch(void) const noexcept;
|
||||||
|
std::vector<vk::AttachmentReference> const& GetColorAttachmentReferences (void) const noexcept;
|
||||||
|
vk::Format GetFormatFromAttachmentReference (uint32_t attachmentReference) const noexcept;
|
||||||
|
|
||||||
friend class SHRenderGraphNode;
|
friend class SHRenderGraphNode;
|
||||||
friend class SHRenderGraph;
|
friend class SHRenderGraph;
|
||||||
|
|
|
@ -30,7 +30,10 @@ namespace SHADE
|
||||||
SHVkRenderpass::SHVkRenderpass(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, std::span<vk::AttachmentDescription> const vkDescriptions, std::vector<SHVkSubpassParams> const& subpasses) noexcept
|
SHVkRenderpass::SHVkRenderpass(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, std::span<vk::AttachmentDescription> const vkDescriptions, std::vector<SHVkSubpassParams> const& subpasses) noexcept
|
||||||
: logicalDeviceHdl {inLogicalDeviceHdl}
|
: logicalDeviceHdl {inLogicalDeviceHdl}
|
||||||
, numAttDescs {static_cast<uint32_t>(vkDescriptions.size())}
|
, numAttDescs {static_cast<uint32_t>(vkDescriptions.size())}
|
||||||
|
, vkSubpassDescriptions{}
|
||||||
|
, vkSubpassDeps{}
|
||||||
, clearColors{}
|
, clearColors{}
|
||||||
|
, vkAttachmentDescriptions{}
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < vkDescriptions.size(); ++i)
|
for (uint32_t i = 0; i < vkDescriptions.size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -42,7 +45,6 @@ namespace SHADE
|
||||||
|
|
||||||
|
|
||||||
vk::RenderPassCreateInfo renderPassCreateInfo{};
|
vk::RenderPassCreateInfo renderPassCreateInfo{};
|
||||||
std::vector<vk::SubpassDependency> subpassDeps;
|
|
||||||
|
|
||||||
// For validating the depth ref
|
// For validating the depth ref
|
||||||
auto isValidDepthRef = [&](vk::AttachmentReference const& depthRef) -> bool
|
auto isValidDepthRef = [&](vk::AttachmentReference const& depthRef) -> bool
|
||||||
|
@ -50,13 +52,16 @@ namespace SHADE
|
||||||
return !(depthRef.attachment == static_cast<uint32_t> (-1) && depthRef.layout == vk::ImageLayout::eUndefined);
|
return !(depthRef.attachment == static_cast<uint32_t> (-1) && depthRef.layout == vk::ImageLayout::eUndefined);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < vkDescriptions.size(); ++i)
|
||||||
|
vkAttachmentDescriptions[i] = vkDescriptions[i];
|
||||||
|
|
||||||
uint32_t subpassIndex = 0;
|
uint32_t subpassIndex = 0;
|
||||||
if (!subpasses.empty())
|
if (!subpasses.empty())
|
||||||
{
|
{
|
||||||
for (auto& subpass : subpasses)
|
for (auto& subpass : subpasses)
|
||||||
{
|
{
|
||||||
subpassDescriptions.emplace_back();
|
vkSubpassDescriptions.emplace_back();
|
||||||
auto& spDesc = subpassDescriptions.back();
|
auto& spDesc = vkSubpassDescriptions.back();
|
||||||
|
|
||||||
spDesc.pColorAttachments = subpass.colorRefs.data();
|
spDesc.pColorAttachments = subpass.colorRefs.data();
|
||||||
spDesc.colorAttachmentCount = static_cast<uint32_t>(subpass.colorRefs.size());
|
spDesc.colorAttachmentCount = static_cast<uint32_t>(subpass.colorRefs.size());
|
||||||
|
@ -88,18 +93,18 @@ namespace SHADE
|
||||||
};
|
};
|
||||||
|
|
||||||
// Push a new dependency
|
// Push a new dependency
|
||||||
subpassDeps.push_back(dependency);
|
vkSubpassDeps.push_back(dependency);
|
||||||
|
|
||||||
++subpassIndex;
|
++subpassIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Renderpass create info for render pass creation
|
// Renderpass create info for render pass creation
|
||||||
renderPassCreateInfo.attachmentCount = static_cast<uint32_t>(vkDescriptions.size());
|
renderPassCreateInfo.attachmentCount = static_cast<uint32_t>(vkAttachmentDescriptions.size());
|
||||||
renderPassCreateInfo.pAttachments = vkDescriptions.data();
|
renderPassCreateInfo.pAttachments = vkAttachmentDescriptions.data();
|
||||||
renderPassCreateInfo.subpassCount = static_cast<uint32_t>(subpassDescriptions.size());
|
renderPassCreateInfo.subpassCount = static_cast<uint32_t>(vkSubpassDescriptions.size());
|
||||||
renderPassCreateInfo.pSubpasses = subpassDescriptions.data();
|
renderPassCreateInfo.pSubpasses = vkSubpassDescriptions.data();
|
||||||
renderPassCreateInfo.dependencyCount = static_cast<uint32_t>(subpassDeps.size());
|
renderPassCreateInfo.dependencyCount = static_cast<uint32_t>(vkSubpassDeps.size());
|
||||||
renderPassCreateInfo.pDependencies = subpassDeps.data();
|
renderPassCreateInfo.pDependencies = vkSubpassDeps.data();
|
||||||
|
|
||||||
}
|
}
|
||||||
// No subpasses passed in, create a default one.
|
// No subpasses passed in, create a default one.
|
||||||
|
@ -172,6 +177,8 @@ namespace SHADE
|
||||||
: logicalDeviceHdl{ inLogicalDeviceHdl }
|
: logicalDeviceHdl{ inLogicalDeviceHdl }
|
||||||
, numAttDescs{ static_cast<uint32_t>(vkDescriptions.size()) }
|
, numAttDescs{ static_cast<uint32_t>(vkDescriptions.size()) }
|
||||||
, clearColors{}
|
, clearColors{}
|
||||||
|
, vkSubpassDescriptions{ }
|
||||||
|
, vkSubpassDeps{ }
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < vkDescriptions.size(); ++i)
|
for (uint32_t i = 0; i < vkDescriptions.size(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -181,18 +188,24 @@ namespace SHADE
|
||||||
clearColors[i].color = { {{0.0f, 0.0f, 0.0f, 1.0f}} };
|
clearColors[i].color = { {{0.0f, 0.0f, 0.0f, 1.0f}} };
|
||||||
}
|
}
|
||||||
|
|
||||||
subpassDescriptions.resize (spDescs.size());
|
vkAttachmentDescriptions.resize(vkDescriptions.size());
|
||||||
for (uint32_t i = 0; i < subpassDescriptions.size(); ++i)
|
for (uint32_t i = 0; i < vkDescriptions.size(); ++i)
|
||||||
{
|
vkAttachmentDescriptions[i] = vkDescriptions[i];
|
||||||
subpassDescriptions[i] = spDescs[i];
|
|
||||||
}
|
vkSubpassDescriptions.resize (spDescs.size());
|
||||||
|
for (uint32_t i = 0; i < vkSubpassDescriptions.size(); ++i)
|
||||||
|
vkSubpassDescriptions[i] = spDescs[i];
|
||||||
|
|
||||||
|
vkSubpassDeps.resize(spDeps.size());
|
||||||
|
for (uint32_t i = 0; i < vkSubpassDeps.size(); ++i)
|
||||||
|
vkSubpassDeps[i] = spDeps[i];
|
||||||
|
|
||||||
vk::RenderPassCreateInfo renderPassCreateInfo{};
|
vk::RenderPassCreateInfo renderPassCreateInfo{};
|
||||||
|
|
||||||
renderPassCreateInfo.attachmentCount = static_cast<uint32_t>(vkDescriptions.size());
|
renderPassCreateInfo.attachmentCount = static_cast<uint32_t>(vkDescriptions.size());
|
||||||
renderPassCreateInfo.pAttachments = vkDescriptions.data();
|
renderPassCreateInfo.pAttachments = vkDescriptions.data();
|
||||||
renderPassCreateInfo.subpassCount = static_cast<uint32_t>(subpassDescriptions.size());
|
renderPassCreateInfo.subpassCount = static_cast<uint32_t>(vkSubpassDescriptions.size());
|
||||||
renderPassCreateInfo.pSubpasses = subpassDescriptions.data();
|
renderPassCreateInfo.pSubpasses = vkSubpassDescriptions.data();
|
||||||
renderPassCreateInfo.dependencyCount = static_cast<uint32_t>(spDeps.size());
|
renderPassCreateInfo.dependencyCount = static_cast<uint32_t>(spDeps.size());
|
||||||
renderPassCreateInfo.pDependencies = spDeps.data();
|
renderPassCreateInfo.pDependencies = spDeps.data();
|
||||||
|
|
||||||
|
@ -210,8 +223,11 @@ namespace SHADE
|
||||||
SHVkRenderpass::SHVkRenderpass(SHVkRenderpass&& rhs) noexcept
|
SHVkRenderpass::SHVkRenderpass(SHVkRenderpass&& rhs) noexcept
|
||||||
: vkRenderpass {rhs.vkRenderpass}
|
: vkRenderpass {rhs.vkRenderpass}
|
||||||
, logicalDeviceHdl {rhs.logicalDeviceHdl}
|
, logicalDeviceHdl {rhs.logicalDeviceHdl}
|
||||||
, subpassDescriptions {std::move (rhs.subpassDescriptions)}
|
, vkSubpassDescriptions{ std::move(rhs.vkSubpassDescriptions) }
|
||||||
|
, vkSubpassDeps{ std::move(rhs.vkSubpassDeps) }
|
||||||
, clearColors{ std::move(rhs.clearColors) }
|
, clearColors{ std::move(rhs.clearColors) }
|
||||||
|
, vkAttachmentDescriptions{ std::move(rhs.vkAttachmentDescriptions) }
|
||||||
|
, numAttDescs{rhs.numAttDescs}
|
||||||
{
|
{
|
||||||
rhs.vkRenderpass = VK_NULL_HANDLE;
|
rhs.vkRenderpass = VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
|
@ -224,8 +240,11 @@ namespace SHADE
|
||||||
|
|
||||||
vkRenderpass = rhs.vkRenderpass;
|
vkRenderpass = rhs.vkRenderpass;
|
||||||
logicalDeviceHdl = rhs.logicalDeviceHdl;
|
logicalDeviceHdl = rhs.logicalDeviceHdl;
|
||||||
subpassDescriptions = std::move(rhs.subpassDescriptions);
|
vkSubpassDescriptions = std::move(rhs.vkSubpassDescriptions);
|
||||||
|
vkSubpassDeps = std::move(rhs.vkSubpassDeps);
|
||||||
clearColors = std::move(rhs.clearColors);
|
clearColors = std::move(rhs.clearColors);
|
||||||
|
vkAttachmentDescriptions = std::move(rhs.vkAttachmentDescriptions);
|
||||||
|
numAttDescs = std::move(rhs.numAttDescs);
|
||||||
|
|
||||||
rhs.vkRenderpass = VK_NULL_HANDLE;
|
rhs.vkRenderpass = VK_NULL_HANDLE;
|
||||||
|
|
||||||
|
@ -234,10 +253,36 @@ namespace SHADE
|
||||||
|
|
||||||
SHVkRenderpass::~SHVkRenderpass(void) noexcept
|
SHVkRenderpass::~SHVkRenderpass(void) noexcept
|
||||||
{
|
{
|
||||||
|
if (vkRenderpass)
|
||||||
logicalDeviceHdl->GetVkLogicalDevice().destroyRenderPass(vkRenderpass, nullptr);
|
logicalDeviceHdl->GetVkLogicalDevice().destroyRenderPass(vkRenderpass, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SHVkRenderpass::HandleResize(void) noexcept
|
||||||
|
{
|
||||||
|
logicalDeviceHdl->GetVkLogicalDevice().destroyRenderPass(vkRenderpass, nullptr);
|
||||||
|
|
||||||
|
vk::RenderPassCreateInfo renderPassCreateInfo{};
|
||||||
|
|
||||||
|
renderPassCreateInfo.attachmentCount = static_cast<uint32_t>(vkAttachmentDescriptions.size());
|
||||||
|
renderPassCreateInfo.pAttachments = vkAttachmentDescriptions.data();
|
||||||
|
renderPassCreateInfo.subpassCount = static_cast<uint32_t>(vkSubpassDescriptions.size());
|
||||||
|
renderPassCreateInfo.pSubpasses = vkSubpassDescriptions.data();
|
||||||
|
renderPassCreateInfo.dependencyCount = static_cast<uint32_t>(vkSubpassDeps.size());
|
||||||
|
renderPassCreateInfo.pDependencies = vkSubpassDeps.data();
|
||||||
|
|
||||||
|
|
||||||
|
if (auto result = logicalDeviceHdl->GetVkLogicalDevice().createRenderPass(&renderPassCreateInfo, nullptr, &vkRenderpass); result != vk::Result::eSuccess)
|
||||||
|
{
|
||||||
|
SHVulkanDebugUtil::ReportVkError(result, "Failed to create Renderpass. ");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHVulkanDebugUtil::ReportVkSuccess("Successfully created Renderpass. ");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
vk::RenderPass SHVkRenderpass::GetVkRenderpass(void) const noexcept
|
vk::RenderPass SHVkRenderpass::GetVkRenderpass(void) const noexcept
|
||||||
{
|
{
|
||||||
return vkRenderpass;
|
return vkRenderpass;
|
||||||
|
|
|
@ -29,7 +29,13 @@ namespace SHADE
|
||||||
Handle<SHVkLogicalDevice> logicalDeviceHdl;
|
Handle<SHVkLogicalDevice> logicalDeviceHdl;
|
||||||
|
|
||||||
//! Container of subpass information used to construct subpasses
|
//! Container of subpass information used to construct subpasses
|
||||||
std::vector<vk::SubpassDescription> subpassDescriptions;
|
std::vector<vk::SubpassDescription> vkSubpassDescriptions;
|
||||||
|
|
||||||
|
//! Container of subpass dependencies used to create renderpass
|
||||||
|
std::vector<vk::SubpassDependency> vkSubpassDeps;
|
||||||
|
|
||||||
|
//! Attachment descriptions
|
||||||
|
std::vector<vk::AttachmentDescription> vkAttachmentDescriptions;
|
||||||
|
|
||||||
//! Clear colors for the color and depth
|
//! Clear colors for the color and depth
|
||||||
std::array<vk::ClearValue, NUM_CLEAR_COLORS> clearColors;
|
std::array<vk::ClearValue, NUM_CLEAR_COLORS> clearColors;
|
||||||
|
@ -49,6 +55,8 @@ namespace SHADE
|
||||||
SHVkRenderpass(SHVkRenderpass&& rhs) noexcept;
|
SHVkRenderpass(SHVkRenderpass&& rhs) noexcept;
|
||||||
SHVkRenderpass& operator=(SHVkRenderpass&& rhs) noexcept;
|
SHVkRenderpass& operator=(SHVkRenderpass&& rhs) noexcept;
|
||||||
|
|
||||||
|
void HandleResize (void) noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* PUBLIC MEMBER FUNCTIONS */
|
/* PUBLIC MEMBER FUNCTIONS */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
|
|
@ -23,6 +23,38 @@ namespace SHADE
|
||||||
IsDepthOnlyFormat(format);
|
IsDepthOnlyFormat(format);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SHVkUtil::IsBlendCompatible(vk::Format format) noexcept
|
||||||
|
{
|
||||||
|
// TODO: Update with all formats
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case vk::Format::eR32Sint:
|
||||||
|
case vk::Format::eR32G32Sint:
|
||||||
|
case vk::Format::eR32G32B32Sint:
|
||||||
|
case vk::Format::eR32G32B32A32Sint:
|
||||||
|
return false;
|
||||||
|
case vk::Format::eR32Sfloat:
|
||||||
|
case vk::Format::eR32G32Sfloat:
|
||||||
|
case vk::Format::eR32G32B32Sfloat:
|
||||||
|
case vk::Format::eR32G32B32A32Sfloat:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t SHVkUtil::GetBytesPerPixelFromFormat(vk::Format format) noexcept
|
||||||
|
{
|
||||||
|
// TODO: Update with all formats
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case vk::Format::eR32Sint:
|
||||||
|
case vk::Format::eR32Uint:
|
||||||
|
case vk::Format::eR32Sfloat:
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void SHVkUtil::EnsureBufferAndCopyData(Handle<SHVkLogicalDevice> device, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkBuffer>& bufferHandle, void* src, uint32_t size, vk::BufferUsageFlagBits usage)
|
void SHVkUtil::EnsureBufferAndCopyData(Handle<SHVkLogicalDevice> device, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkBuffer>& bufferHandle, void* src, uint32_t size, vk::BufferUsageFlagBits usage)
|
||||||
{
|
{
|
||||||
if (bufferHandle)
|
if (bufferHandle)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue