Skip to content

Commit 0deb7f1

Browse files
General fixes.
1 parent 78c4fc7 commit 0deb7f1

10 files changed

Lines changed: 97 additions & 43 deletions

File tree

Engine/Source/CoreModule/Private/CoreModule/PluginSystem/PluginRegistry.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ namespace Volt
106106
if (!jsonReader.Parse(jsonString))
107107
{
108108
VT_LOGC(Warning, LogPluginSystem, "Plugin file {} is invalid!", filepath);
109+
return;
109110
}
110111

111112
PluginDefinition newPlugin{};

Engine/Source/Sandbox/Private/Sandbox/DebugRendering.cpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,13 @@ void Sandbox::DrawEntityGizmos()
2323

2424
const auto& settings = UserSettingsManager::GetSettings().sceneSettings;
2525

26-
AssetReference<Volt::Scene> tempScene;
27-
28-
if (m_sceneState == SceneState::Edit)
29-
{
30-
tempScene = m_runtimeScene;
31-
}
32-
else
33-
{
34-
tempScene = m_intermediateScene;
35-
}
36-
37-
if (!settings.showGizmos || !tempScene || !tempScene->IsFinishedLoadingEntities())
26+
if (!settings.showGizmos || !m_runtimeScene || !m_runtimeScene->IsFinishedLoadingEntities())
3827
{
3928
return;
4029
}
4130

4231
// There will be one gizmo per entity.
43-
const entt::registry& registry = tempScene->GetEntityScene().GetRegistry();
32+
const entt::registry& registry = m_runtimeScene->GetEntityScene().GetRegistry();
4433
auto entityView = registry.view<Volt::IDComponent>();
4534

4635
const uint32_t numEntities = static_cast<uint32_t>(entityView.size());
@@ -52,7 +41,7 @@ void Sandbox::DrawEntityGizmos()
5241
&entityView,
5342
&editorCameraPosition,
5443
&editorCameraViewMatrix,
55-
scene = tempScene,
44+
scene = m_runtimeScene,
5645
&debugRenderer = m_debugRenderer,
5746
&visProxyContextManagersMutex = m_visProxyContextManagersMutex,
5847
&visProxyContextManagers = m_visProxyContextManagers

Engine/Source/Sandbox/Private/Sandbox/Sandbox.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,8 @@ void Sandbox::SetupNewSceneData()
315315
m_debugSceneRendererExtension = m_sceneRenderer->AddExtension<DebugSceneRendererExtension>(Volt::SceneRendererExtensionStage::PostPostProcessing, m_debugRenderer);
316316

317317
m_gameSceneRenderer = m_sceneContainer->AttachSceneRenderer(gameSpec);
318+
319+
m_debugRenderer.Reset();
318320
}
319321
}
320322

@@ -401,6 +403,16 @@ void Sandbox::OnSceneStop()
401403
//Amp::MusicManager::RemoveEvent();
402404
}
403405

406+
void Sandbox::QueueScenePlay()
407+
{
408+
m_sceneQueueState = SceneQueueState::Play;
409+
}
410+
411+
void Sandbox::QueueSceneStop()
412+
{
413+
m_sceneQueueState = SceneQueueState::Stop;
414+
}
415+
404416
void Sandbox::OnSimulationStart()
405417
{
406418
//todo: reimplement
@@ -634,10 +646,28 @@ bool Sandbox::OnUpdateEvent(Volt::AppUpdateEvent& e)
634646

635647
EditorCommandStack::GetInstance().Update(100);
636648

649+
// Play or stop the scene if it's queued.
650+
// This is required since rendering may be happening when ImGui
651+
// is running, which crashes.
652+
{
653+
if (m_sceneQueueState == SceneQueueState::Play)
654+
{
655+
OnScenePlay();
656+
}
657+
else if (m_sceneQueueState == SceneQueueState::Stop)
658+
{
659+
OnSceneStop();
660+
}
661+
m_sceneQueueState = SceneQueueState::None;
662+
}
663+
637664
auto mousePos = Volt::Input::GetMousePosition();
638665
Volt::Input::SetViewportMousePosition(m_gameViewPanel->GetViewportLocalPosition(mousePos));
639666

640-
DrawDebug();
667+
if (m_sceneState == SceneState::Edit)
668+
{
669+
DrawDebug();
670+
}
641671

642672
if (m_gameSceneRenderer)
643673
{

Engine/Source/Sandbox/Private/Sandbox/SceneRendererExtensions/DebugSceneRendererExtension.cpp

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,14 @@ DebugSceneRendererExtension::DebugSceneRendererExtension(IRenderScene* renderSce
5252
: SceneRendererExtension(renderScene),
5353
m_debugRenderer(debugRenderer)
5454
{
55-
m_debugRenderer.AddDebugMeshRenderer<ForwardLitDebugMeshRenderer>();
56-
m_debugRenderer.AddDebugMeshRenderer<TranslucencyDebugMeshRenderer>();
55+
m_forwardLitDebugMeshRenderer = m_debugRenderer.AddDebugMeshRenderer<ForwardLitDebugMeshRenderer>();
56+
m_translucencyDebugMeshRenderer = m_debugRenderer.AddDebugMeshRenderer<TranslucencyDebugMeshRenderer>();
57+
}
58+
59+
DebugSceneRendererExtension::~DebugSceneRendererExtension()
60+
{
61+
m_debugRenderer.RemoveDebugMeshRenderer(m_forwardLitDebugMeshRenderer);
62+
m_debugRenderer.RemoveDebugMeshRenderer(m_translucencyDebugMeshRenderer);
5763
}
5864

5965
RGTextureRef DebugSceneRendererExtension::OnRender(RenderGraph& renderGraph, RenderGraphBlackboard& blackboard, const RenderView& view, RGTextureRef prevOutputImage)
@@ -97,9 +103,7 @@ RGTextureRef DebugSceneRendererExtension::OnRender(RenderGraph& renderGraph, Ren
97103

98104
void DebugSceneRendererExtension::RenderForwardLitDebugMeshes(Volt::RenderGraph& renderGraph, Volt::RenderGraphBlackboard& blackboard, const Volt::RenderView& view, Volt::RGTextureRef prevOutputImage)
99105
{
100-
ForwardLitDebugMeshRenderer* forwardLitDebugMeshRenderer = m_debugRenderer.GetDebugMeshRenderer<ForwardLitDebugMeshRenderer>();
101-
102-
if (forwardLitDebugMeshRenderer->HasAnyDraw())
106+
if (m_forwardLitDebugMeshRenderer->HasAnyDraw())
103107
{
104108
const SceneTextures& sceneTextures = blackboard.Get<SceneTextures>();
105109
const ObjectIDTexture& objectIdTexture = blackboard.Get<ObjectIDTexture>();
@@ -108,8 +112,8 @@ void DebugSceneRendererExtension::RenderForwardLitDebugMeshes(Volt::RenderGraph&
108112

109113
ForwardLitDebugMeshParameters* passParameters = renderGraph.AllocParameters<ForwardLitDebugMeshParameters>();
110114
passParameters->VS.View = view.viewUniformBuffer;
111-
passParameters->VS.DebugMeshDatas = renderGraph.CreateSRV(forwardLitDebugMeshRenderer->GetDebugMeshDataBuffer());
112-
passParameters->VS.PrimitiveIndexVertexBuffer = forwardLitDebugMeshRenderer->GetPrimitiveIndexBuffer();
115+
passParameters->VS.DebugMeshDatas = renderGraph.CreateSRV(m_forwardLitDebugMeshRenderer->GetDebugMeshDataBuffer());
116+
passParameters->VS.PrimitiveIndexVertexBuffer = m_forwardLitDebugMeshRenderer->GetPrimitiveIndexBuffer();
113117

114118
passParameters->PS.SceneDepth = renderGraph.CreateSRV(sceneTextures.sceneDepth);
115119

@@ -140,7 +144,7 @@ void DebugSceneRendererExtension::RenderForwardLitDebugMeshes(Volt::RenderGraph&
140144
renderGraph.AddPass("ForwardLit",
141145
RenderGraphPassFlags::Raster,
142146
passParameters,
143-
[passParameters, view, forwardLitDebugMeshRenderer](RenderContext& context)
147+
[passParameters, view, forwardLitDebugMeshRenderer = m_forwardLitDebugMeshRenderer](RenderContext& context)
144148
{
145149
BatchedShaderParameters batchedShaderParameters;
146150
context.CollectParameters(passParameters, batchedShaderParameters);
@@ -160,8 +164,7 @@ void DebugSceneRendererExtension::RenderForwardLitDebugMeshes(Volt::RenderGraph&
160164

161165
void DebugSceneRendererExtension::RenderTranslucentDebugMeshes(Volt::RenderGraph& renderGraph, Volt::RenderGraphBlackboard& blackboard, const Volt::RenderView& view, Volt::RGTextureRef prevOutputImage)
162166
{
163-
TranslucencyDebugMeshRenderer* translucencyDebugMeshRenderer = m_debugRenderer.GetDebugMeshRenderer<TranslucencyDebugMeshRenderer>();
164-
if (translucencyDebugMeshRenderer->HasAnyDraw())
167+
if (m_translucencyDebugMeshRenderer->HasAnyDraw())
165168
{
166169
const SceneTextures& sceneTextures = blackboard.Get<SceneTextures>();
167170
const ObjectIDTexture& objectIdTexture = blackboard.Get<ObjectIDTexture>();
@@ -175,8 +178,8 @@ void DebugSceneRendererExtension::RenderTranslucentDebugMeshes(Volt::RenderGraph
175178
{
176179
TranslucencyDebugMeshParameters* passParameters = renderGraph.AllocParameters<TranslucencyDebugMeshParameters>();
177180
passParameters->VS.View = view.viewUniformBuffer;
178-
passParameters->VS.DebugMeshDatas = renderGraph.CreateSRV(translucencyDebugMeshRenderer->GetDebugMeshDataBuffer());
179-
passParameters->VS.PrimitiveIndexVertexBuffer = translucencyDebugMeshRenderer->GetPrimitiveIndexBuffer();
181+
passParameters->VS.DebugMeshDatas = renderGraph.CreateSRV(m_translucencyDebugMeshRenderer->GetDebugMeshDataBuffer());
182+
passParameters->VS.PrimitiveIndexVertexBuffer = m_translucencyDebugMeshRenderer->GetPrimitiveIndexBuffer();
180183

181184
passParameters->PS.SceneDepth = renderGraph.CreateSRV(sceneTextures.sceneDepth);
182185

@@ -208,7 +211,7 @@ void DebugSceneRendererExtension::RenderTranslucentDebugMeshes(Volt::RenderGraph
208211
renderGraph.AddPass("Translucency",
209212
RenderGraphPassFlags::Raster,
210213
passParameters,
211-
[passParameters, view, translucencyDebugMeshRenderer](RenderContext& context)
214+
[passParameters, view, translucencyDebugMeshRenderer = m_translucencyDebugMeshRenderer](RenderContext& context)
212215
{
213216
BatchedShaderParameters batchedShaderParameters;
214217
context.CollectParameters(passParameters, batchedShaderParameters);

Engine/Source/Sandbox/Private/Sandbox/SceneRendererExtensions/DebugSceneRendererExtension.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ class DebugSceneRendererExtension : public Volt::SceneRendererExtension
1111
{
1212
public:
1313
DebugSceneRendererExtension(Volt::IRenderScene* renderScene, Volt::DebugRenderer& debugRenderer);
14+
~DebugSceneRendererExtension() override;
15+
1416
Volt::RGTextureRef OnRender(Volt::RenderGraph& renderGraph, Volt::RenderGraphBlackboard& blackboard, const Volt::RenderView& view, Volt::RGTextureRef prevOutputImage);
1517

1618
VT_INLINE VT_NODISCARD IntRef<Volt::RHI::Image> GetVisProxyIDImage() const { return m_visProxyIdImage; }
@@ -25,4 +27,7 @@ class DebugSceneRendererExtension : public Volt::SceneRendererExtension
2527
Volt::RGTextureRef m_depthTexture;
2628

2729
Volt::DebugRenderer& m_debugRenderer;
30+
31+
class TranslucencyDebugMeshRenderer* m_translucencyDebugMeshRenderer = nullptr;
32+
class ForwardLitDebugMeshRenderer* m_forwardLitDebugMeshRenderer = nullptr;
2833
};

Engine/Source/Sandbox/Private/Sandbox/Window/ViewportPanel.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ void ViewportPanel::UpdateContent()
274274

275275
if (m_sceneState == SceneState::Edit)
276276
{
277-
Sandbox::Get().OnScenePlay();
277+
Sandbox::Get().QueueScenePlay();
278278

279279
if (settings.sceneSettings.fullscreenOnPlay)
280280
{
@@ -290,7 +290,7 @@ void ViewportPanel::UpdateContent()
290290
}
291291
else if (m_sceneState == SceneState::Play)
292292
{
293-
Sandbox::Get().OnSceneStop();
293+
Sandbox::Get().QueueSceneStop();
294294

295295
if (settings.sceneSettings.fullscreenOnPlay)
296296
{

Engine/Source/Sandbox/Public/Sandbox/Sandbox.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ class Sandbox : public Volt::ApplicationLayer, public Volt::EventListener
6363
void OnAttach() override;
6464
void OnDetach() override;
6565

66-
void OnScenePlay();
67-
void OnSceneStop();
66+
void QueueScenePlay();
67+
void QueueSceneStop();
6868

6969
void OnSimulationStart();
7070
void OnSimulationStop();
@@ -95,6 +95,13 @@ class Sandbox : public Volt::ApplicationLayer, public Volt::EventListener
9595
void UnloadActiveScene();
9696

9797
private:
98+
enum class SceneQueueState
99+
{
100+
None,
101+
Play,
102+
Stop
103+
};
104+
98105
struct SaveSceneAsData
99106
{
100107
String name = "New Scene";
@@ -111,6 +118,9 @@ class Sandbox : public Volt::ApplicationLayer, public Volt::EventListener
111118
//false when user cancels unload
112119
bool PromptUnloadCurrentScene();
113120

121+
void OnScenePlay();
122+
void OnSceneStop();
123+
114124
bool OnUpdateEvent(Volt::AppUpdateEvent& e);
115125
bool OnImGuiUpdateEvent(Volt::AppImGuiUpdateEvent& e);
116126
bool OnKeyPressedEvent(Volt::KeyPressedEvent& e);
@@ -180,6 +190,7 @@ class Sandbox : public Volt::ApplicationLayer, public Volt::EventListener
180190
AssetReference<Volt::Scene> m_intermediateScene;
181191

182192
SceneState m_sceneState = SceneState::Edit;
193+
SceneQueueState m_sceneQueueState = SceneQueueState::None;
183194

184195
Ref<ViewportPanel> m_viewportPanel;
185196
Ref<GameViewPanel> m_gameViewPanel;

Engine/Source/Volt-Renderer/Private/Volt-Renderer/Debug/DebugMeshRenderer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,9 +312,9 @@ namespace Volt
312312

313313
DebugMeshRendererRegistry::~DebugMeshRendererRegistry()
314314
{
315-
for (DestructorHelper& destructorHelper : m_debugMeshRendererDestructors)
315+
for (DebugMeshRendererContainer& container : m_debugMeshRenderers)
316316
{
317-
destructorHelper.Destroy();
317+
container.destructor.Destroy();
318318
}
319319
}
320320

Engine/Source/Volt-Renderer/Public/Volt-Renderer/Debug/DebugMeshRenderer.h

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,7 @@ namespace Volt
8888
void* alloc = m_debugMeshRendererAllocator.Allocate(AllocationSize);
8989
T* processor = new (alloc) T();
9090

91-
m_debugMeshRendererDestructors.emplace_back() = DestructorHelper::Create<T>(alloc);
92-
m_debugMeshRenderers.emplace_back(TypeTraits::TypeIndex::FromType<T>(), processor);
91+
m_debugMeshRenderers.emplace_back(TypeTraits::TypeIndex::FromType<T>(), processor, DestructorHelper::Create<T>(alloc));
9392

9493
return processor;
9594
}
@@ -111,15 +110,31 @@ namespace Volt
111110
return nullptr;
112111
}
113112

113+
template<typename T>
114+
requires(std::is_base_of_v<DebugMeshRenderer, T>)
115+
void RemoveRenderer(T* meshRenderer)
116+
{
117+
auto it = m_debugMeshRenderers.find_with_predicate([meshRenderer](const DebugMeshRendererContainer& container)
118+
{
119+
return container.debugMeshRenderer == meshRenderer;
120+
});
121+
122+
if (it != m_debugMeshRenderers.end())
123+
{
124+
it->destructor.Destroy();
125+
m_debugMeshRenderers.erase_unsorted(it);
126+
}
127+
}
128+
114129
private:
115130
struct DebugMeshRendererContainer
116131
{
117132
TypeTraits::TypeIndex typeIndex = TypeTraits::TypeIndex::FromType<void>();
118133
DebugMeshRenderer* debugMeshRenderer = nullptr;
134+
DestructorHelper destructor;
119135
};
120136

121137
PagedAtomicLinearAllocator<1024> m_debugMeshRendererAllocator;
122138
Vector<DebugMeshRendererContainer> m_debugMeshRenderers;
123-
Vector<DestructorHelper> m_debugMeshRendererDestructors;
124139
};
125140
}

Engine/Source/Volt-Renderer/Public/Volt-Renderer/Debug/DebugRenderer.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ namespace Volt
4343
VTR_API size_t GetNumLinesPerLineSphere() const;
4444

4545
template<typename T>
46-
void AddDebugMeshRenderer();
46+
T* AddDebugMeshRenderer();
4747

4848
template<typename T>
49-
T* GetDebugMeshRenderer();
49+
void RemoveDebugMeshRenderer(T* meshRenderer);
5050

5151
/*
5252
Custom rendering
@@ -229,14 +229,14 @@ namespace Volt
229229
};
230230

231231
template<typename T>
232-
T* DebugRenderer::GetDebugMeshRenderer()
232+
T* DebugRenderer::AddDebugMeshRenderer()
233233
{
234-
return m_debugMeshRendererRegistry.GetRenderer<T>();
234+
return m_debugMeshRendererRegistry.AddRenderer<T>();
235235
}
236236

237237
template<typename T>
238-
void DebugRenderer::AddDebugMeshRenderer()
238+
void DebugRenderer::RemoveDebugMeshRenderer(T* meshRenderer)
239239
{
240-
m_debugMeshRendererRegistry.AddRenderer<T>();
240+
m_debugMeshRendererRegistry.RemoveRenderer(meshRenderer);
241241
}
242242
}

0 commit comments

Comments
 (0)