Changed preview renderer states to use construction and destruction instead of start and stop functions to make sure everything is shut down cleanly
Signed-off-by: Guthrie Adams <guthadam@amazon.com>
This commit is contained in:
+1
-13
@@ -47,17 +47,6 @@ namespace AtomToolsFramework
|
||||
AZ::RPI::ViewPtr GetView() const;
|
||||
AZ::Uuid GetEntityContextId() const;
|
||||
|
||||
enum class State : AZ::s8
|
||||
{
|
||||
None,
|
||||
IdleState,
|
||||
LoadState,
|
||||
CaptureState
|
||||
};
|
||||
|
||||
void SetState(State state);
|
||||
State GetState() const;
|
||||
|
||||
void ProcessCaptureRequests();
|
||||
void CancelCaptureRequest();
|
||||
void CompleteCaptureRequest();
|
||||
@@ -91,7 +80,6 @@ namespace AtomToolsFramework
|
||||
AZStd::queue<CaptureRequest> m_captureRequestQueue;
|
||||
CaptureRequest m_currentCaptureRequest;
|
||||
|
||||
AZStd::unordered_map<State, AZStd::shared_ptr<PreviewRendererState>> m_states;
|
||||
State m_currentState = PreviewRenderer::State::None;
|
||||
AZStd::unique_ptr<PreviewRendererState> m_state;
|
||||
};
|
||||
} // namespace AtomToolsFramework
|
||||
|
||||
-6
@@ -23,12 +23,6 @@ namespace AtomToolsFramework
|
||||
|
||||
virtual ~PreviewRendererState() = default;
|
||||
|
||||
//! Start is called when state begins execution
|
||||
virtual void Start() = 0;
|
||||
|
||||
//! Stop is called when state ends execution
|
||||
virtual void Stop() = 0;
|
||||
|
||||
protected:
|
||||
PreviewRenderer* m_renderer = {};
|
||||
};
|
||||
|
||||
+11
-31
@@ -79,17 +79,15 @@ namespace AtomToolsFramework
|
||||
m_view->SetViewToClipMatrix(viewToClipMatrix);
|
||||
m_renderPipeline->SetDefaultView(m_view);
|
||||
|
||||
m_states[PreviewRenderer::State::IdleState] = AZStd::make_shared<PreviewRendererIdleState>(this);
|
||||
m_states[PreviewRenderer::State::LoadState] = AZStd::make_shared<PreviewRendererLoadState>(this);
|
||||
m_states[PreviewRenderer::State::CaptureState] = AZStd::make_shared<PreviewRendererCaptureState>(this);
|
||||
SetState(PreviewRenderer::State::IdleState);
|
||||
m_state.reset(new PreviewRendererIdleState(this));
|
||||
}
|
||||
|
||||
PreviewRenderer::~PreviewRenderer()
|
||||
{
|
||||
PreviewerFeatureProcessorProviderBus::Handler::BusDisconnect();
|
||||
|
||||
SetState(PreviewRenderer::State::None);
|
||||
m_state.reset();
|
||||
|
||||
m_currentCaptureRequest = {};
|
||||
m_captureRequestQueue = {};
|
||||
|
||||
@@ -120,28 +118,6 @@ namespace AtomToolsFramework
|
||||
return m_entityContext->GetContextId();
|
||||
}
|
||||
|
||||
void PreviewRenderer::SetState(State state)
|
||||
{
|
||||
auto stepItr = m_states.find(m_currentState);
|
||||
if (stepItr != m_states.end())
|
||||
{
|
||||
stepItr->second->Stop();
|
||||
}
|
||||
|
||||
m_currentState = state;
|
||||
|
||||
stepItr = m_states.find(m_currentState);
|
||||
if (stepItr != m_states.end())
|
||||
{
|
||||
stepItr->second->Start();
|
||||
}
|
||||
}
|
||||
|
||||
PreviewRenderer::State PreviewRenderer::GetState() const
|
||||
{
|
||||
return m_currentState;
|
||||
}
|
||||
|
||||
void PreviewRenderer::ProcessCaptureRequests()
|
||||
{
|
||||
if (!m_captureRequestQueue.empty())
|
||||
@@ -150,19 +126,22 @@ namespace AtomToolsFramework
|
||||
m_currentCaptureRequest = m_captureRequestQueue.front();
|
||||
m_captureRequestQueue.pop();
|
||||
|
||||
SetState(PreviewRenderer::State::LoadState);
|
||||
m_state.reset();
|
||||
m_state.reset(new PreviewRendererLoadState(this));
|
||||
}
|
||||
}
|
||||
|
||||
void PreviewRenderer::CancelCaptureRequest()
|
||||
{
|
||||
m_currentCaptureRequest.m_captureFailedCallback();
|
||||
SetState(PreviewRenderer::State::IdleState);
|
||||
m_state.reset();
|
||||
m_state.reset(new PreviewRendererIdleState(this));
|
||||
}
|
||||
|
||||
void PreviewRenderer::CompleteCaptureRequest()
|
||||
{
|
||||
SetState(PreviewRenderer::State::IdleState);
|
||||
m_state.reset();
|
||||
m_state.reset(new PreviewRendererIdleState(this));
|
||||
}
|
||||
|
||||
void PreviewRenderer::LoadContent()
|
||||
@@ -174,7 +153,8 @@ namespace AtomToolsFramework
|
||||
{
|
||||
if (m_currentCaptureRequest.m_content->IsReady())
|
||||
{
|
||||
SetState(PreviewRenderer::State::CaptureState);
|
||||
m_state.reset();
|
||||
m_state.reset(new PreviewRendererCaptureState(this));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+6
-15
@@ -14,32 +14,23 @@ namespace AtomToolsFramework
|
||||
PreviewRendererCaptureState::PreviewRendererCaptureState(PreviewRenderer* renderer)
|
||||
: PreviewRendererState(renderer)
|
||||
{
|
||||
}
|
||||
|
||||
void PreviewRendererCaptureState::Start()
|
||||
{
|
||||
m_ticksToCapture = 1;
|
||||
m_renderer->PoseContent();
|
||||
AZ::TickBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
void PreviewRendererCaptureState::Stop()
|
||||
PreviewRendererCaptureState::~PreviewRendererCaptureState()
|
||||
{
|
||||
m_renderer->EndCapture();
|
||||
AZ::TickBus::Handler::BusDisconnect();
|
||||
AZ::Render::FrameCaptureNotificationBus::Handler::BusDisconnect();
|
||||
AZ::TickBus::Handler::BusDisconnect();
|
||||
m_renderer->EndCapture();
|
||||
}
|
||||
|
||||
void PreviewRendererCaptureState::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time)
|
||||
{
|
||||
if (m_ticksToCapture-- <= 0)
|
||||
if ((m_ticksToCapture-- <= 0) && m_renderer->StartCapture())
|
||||
{
|
||||
// Reset the capture flag if the capture request was successful. Otherwise try capture it again next tick.
|
||||
if (m_renderer->StartCapture())
|
||||
{
|
||||
AZ::Render::FrameCaptureNotificationBus::Handler::BusConnect();
|
||||
AZ::TickBus::Handler::BusDisconnect();
|
||||
}
|
||||
AZ::Render::FrameCaptureNotificationBus::Handler::BusConnect();
|
||||
AZ::TickBus::Handler::BusDisconnect();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-4
@@ -22,9 +22,7 @@ namespace AtomToolsFramework
|
||||
{
|
||||
public:
|
||||
PreviewRendererCaptureState(PreviewRenderer* renderer);
|
||||
|
||||
void Start() override;
|
||||
void Stop() override;
|
||||
~PreviewRendererCaptureState();
|
||||
|
||||
private:
|
||||
//! AZ::TickBus::Handler interface overrides...
|
||||
@@ -34,6 +32,6 @@ namespace AtomToolsFramework
|
||||
void OnCaptureFinished(AZ::Render::FrameCaptureResult result, const AZStd::string& info) override;
|
||||
|
||||
//! This is necessary to suspend capture to allow a frame for Material and Mesh components to assign materials
|
||||
int m_ticksToCapture = 0;
|
||||
int m_ticksToCapture = 1;
|
||||
};
|
||||
} // namespace AtomToolsFramework
|
||||
|
||||
+1
-5
@@ -13,15 +13,11 @@ namespace AtomToolsFramework
|
||||
{
|
||||
PreviewRendererIdleState::PreviewRendererIdleState(PreviewRenderer* renderer)
|
||||
: PreviewRendererState(renderer)
|
||||
{
|
||||
}
|
||||
|
||||
void PreviewRendererIdleState::Start()
|
||||
{
|
||||
AZ::TickBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
void PreviewRendererIdleState::Stop()
|
||||
PreviewRendererIdleState::~PreviewRendererIdleState()
|
||||
{
|
||||
AZ::TickBus::Handler::BusDisconnect();
|
||||
}
|
||||
|
||||
+1
-3
@@ -20,9 +20,7 @@ namespace AtomToolsFramework
|
||||
{
|
||||
public:
|
||||
PreviewRendererIdleState(PreviewRenderer* renderer);
|
||||
|
||||
void Start() override;
|
||||
void Stop() override;
|
||||
~PreviewRendererIdleState();
|
||||
|
||||
private:
|
||||
//! AZ::TickBus::Handler interface overrides...
|
||||
|
||||
+5
-12
@@ -13,31 +13,24 @@ namespace AtomToolsFramework
|
||||
{
|
||||
PreviewRendererLoadState::PreviewRendererLoadState(PreviewRenderer* renderer)
|
||||
: PreviewRendererState(renderer)
|
||||
{
|
||||
}
|
||||
|
||||
void PreviewRendererLoadState::Start()
|
||||
{
|
||||
m_renderer->LoadContent();
|
||||
m_timeRemainingS = TimeOutS;
|
||||
AZ::TickBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
void PreviewRendererLoadState::Stop()
|
||||
PreviewRendererLoadState::~PreviewRendererLoadState()
|
||||
{
|
||||
AZ::TickBus::Handler::BusDisconnect();
|
||||
}
|
||||
|
||||
void PreviewRendererLoadState::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time)
|
||||
{
|
||||
m_timeRemainingS -= deltaTime;
|
||||
if (m_timeRemainingS > 0.0f)
|
||||
{
|
||||
m_renderer->UpdateLoadContent();
|
||||
}
|
||||
else
|
||||
if ((m_timeRemainingS += deltaTime) > TimeOutS)
|
||||
{
|
||||
m_renderer->CancelLoadContent();
|
||||
return;
|
||||
}
|
||||
|
||||
m_renderer->UpdateLoadContent();
|
||||
}
|
||||
} // namespace AtomToolsFramework
|
||||
|
||||
+2
-4
@@ -20,15 +20,13 @@ namespace AtomToolsFramework
|
||||
{
|
||||
public:
|
||||
PreviewRendererLoadState(PreviewRenderer* renderer);
|
||||
|
||||
void Start() override;
|
||||
void Stop() override;
|
||||
~PreviewRendererLoadState();
|
||||
|
||||
private:
|
||||
//! AZ::TickBus::Handler interface overrides...
|
||||
void OnTick(float deltaTime, AZ::ScriptTimePoint time) override;
|
||||
|
||||
static constexpr float TimeOutS = 5.0f;
|
||||
float m_timeRemainingS = TimeOutS;
|
||||
float m_timeRemainingS = 0.0f;
|
||||
};
|
||||
} // namespace AtomToolsFramework
|
||||
|
||||
Reference in New Issue
Block a user