From f038dff384c8eba3646c336a78de3a208406dec6 Mon Sep 17 00:00:00 2001 From: Nomango Date: Mon, 14 Oct 2019 10:43:11 +0800 Subject: [PATCH] Add stage stack --- src/kiwano/base/Director.cpp | 71 ++++++++++++++++++++-------- src/kiwano/base/Director.h | 20 +++++--- src/kiwano/core/core.h | 4 ++ src/kiwano/renderer/RenderTarget.cpp | 8 ++++ src/kiwano/renderer/Renderer.h | 3 +- 5 files changed, 76 insertions(+), 30 deletions(-) diff --git a/src/kiwano/base/Director.cpp b/src/kiwano/base/Director.cpp index d8614501..ac6d5ab1 100644 --- a/src/kiwano/base/Director.cpp +++ b/src/kiwano/base/Director.cpp @@ -36,19 +36,14 @@ namespace kiwano { } - void Director::EnterStage(StagePtr stage) + void Director::EnterStage(StagePtr stage, TransitionPtr transition) { KGE_ASSERT(stage && "Director::EnterStage failed, NULL pointer exception"); - if (curr_stage_ == stage || next_stage_ == stage) + if (current_stage_ == stage || next_stage_ == stage) return; next_stage_ = stage; - } - - void Director::EnterStage(StagePtr stage, TransitionPtr transition) - { - EnterStage(stage); if (transition && next_stage_) { @@ -57,13 +52,44 @@ namespace kiwano transition_->Stop(); } transition_ = transition; - transition_->Init(curr_stage_, next_stage_); + transition_->Init(current_stage_, next_stage_); + } + } + + void Director::PushStage(StagePtr stage, TransitionPtr transition) + { + EnterStage(stage, transition); + + if (current_stage_) + { + stages_.push(current_stage_); + } + } + + void Director::PopStage(TransitionPtr transition) + { + KGE_ASSERT(!stages_.empty() && "Director::PopStage failed, calling pop() on empty stage stack"); + + if (!stages_.empty()) + { + next_stage_ = stages_.top(); + stages_.pop(); + } + + if (transition && next_stage_) + { + if (transition_) + { + transition_->Stop(); + } + transition_ = transition; + transition_->Init(current_stage_, next_stage_); } } StagePtr Director::GetCurrentStage() { - return curr_stage_; + return current_stage_; } void Director::SetRenderBorderEnabled(bool enabled) @@ -86,7 +112,10 @@ namespace kiwano void Director::ClearStages() { - curr_stage_.reset(); + while (!stages_.empty()) + stages_.pop(); + + current_stage_.reset(); next_stage_.reset(); debug_actor_.reset(); transition_.reset(); @@ -104,19 +133,19 @@ namespace kiwano if (next_stage_ && !transition_) { - if (curr_stage_) + if (current_stage_) { - curr_stage_->OnExit(); + current_stage_->OnExit(); } next_stage_->OnEnter(); - curr_stage_ = next_stage_; + current_stage_ = next_stage_; next_stage_ = nullptr; } - if (curr_stage_) - curr_stage_->Update(dt); + if (current_stage_) + current_stage_->Update(dt); if (next_stage_) next_stage_->Update(dt); @@ -131,17 +160,17 @@ namespace kiwano { transition_->Render(rt); } - else if (curr_stage_) + else if (current_stage_) { - curr_stage_->Render(rt); + current_stage_->Render(rt); } if (render_border_enabled_) { rt->SetOpacity(1.f); - if (curr_stage_) + if (current_stage_) { - curr_stage_->RenderBorder(rt); + current_stage_->RenderBorder(rt); } } @@ -156,8 +185,8 @@ namespace kiwano if (debug_actor_) debug_actor_->Dispatch(evt); - if (curr_stage_) - curr_stage_->Dispatch(evt); + if (current_stage_) + current_stage_->Dispatch(evt); } } diff --git a/src/kiwano/base/Director.h b/src/kiwano/base/Director.h index 7f82d541..56ca957a 100644 --- a/src/kiwano/base/Director.h +++ b/src/kiwano/base/Director.h @@ -19,7 +19,6 @@ // THE SOFTWARE. #pragma once -#include #include #include @@ -37,13 +36,19 @@ namespace kiwano public: // 切换舞台 void EnterStage( - StagePtr stage /* 舞台 */ + StagePtr stage, /* 舞台 */ + TransitionPtr transition = nullptr /* 过渡动画 */ ); - // 切换舞台 - void EnterStage( - StagePtr stage, /* 舞台 */ - TransitionPtr transition /* 过渡动画 */ + // 舞台压栈 + void PushStage( + StagePtr stage, /* 舞台 */ + TransitionPtr transition = nullptr /* 过渡动画 */ + ); + + // 舞台出栈 + void PopStage( + TransitionPtr transition = nullptr /* 过渡动画 */ ); // 获取当前舞台 @@ -76,7 +81,8 @@ namespace kiwano protected: bool render_border_enabled_; - StagePtr curr_stage_; + Stack stages_; + StagePtr current_stage_; StagePtr next_stage_; ActorPtr debug_actor_; TransitionPtr transition_; diff --git a/src/kiwano/core/core.h b/src/kiwano/core/core.h index 11a06e12..00b9a851 100644 --- a/src/kiwano/core/core.h +++ b/src/kiwano/core/core.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -61,6 +62,9 @@ namespace kiwano template using UnorderedSet = std::unordered_set<_Ty, _Args...>; + template + using Stack = std::stack<_Ty, _Args...>; + template using Map = std::map<_Kty, _Ty, _Args...>; diff --git a/src/kiwano/renderer/RenderTarget.cpp b/src/kiwano/renderer/RenderTarget.cpp index 43f3fde4..fddf7b0c 100644 --- a/src/kiwano/renderer/RenderTarget.cpp +++ b/src/kiwano/renderer/RenderTarget.cpp @@ -150,6 +150,8 @@ namespace kiwano geometry.GetGeometry().get(), current_brush_.get() ); + + IncreasePrimitivesCount(); } ThrowIfFailed(hr); @@ -217,6 +219,8 @@ namespace kiwano DX::ConvertToRectF(rect), current_brush_.get() ); + + IncreasePrimitivesCount(); } ThrowIfFailed(hr); @@ -267,6 +271,8 @@ namespace kiwano ), current_brush_.get() ); + + IncreasePrimitivesCount(); } ThrowIfFailed(hr); @@ -317,6 +323,8 @@ namespace kiwano ), current_brush_.get() ); + + IncreasePrimitivesCount(); } ThrowIfFailed(hr); diff --git a/src/kiwano/renderer/Renderer.h b/src/kiwano/renderer/Renderer.h index 7a6e6a79..a613ac99 100644 --- a/src/kiwano/renderer/Renderer.h +++ b/src/kiwano/renderer/Renderer.h @@ -25,7 +25,7 @@ #include #if defined(KGE_USE_DIRECTX10) -# include "D3D10DeviceResources.h" +# include "win32/D3D10DeviceResources.h" #else # include "win32/D3D11DeviceResources.h" #endif @@ -72,7 +72,6 @@ namespace kiwano bool enabled ); - public: void CreateTexture( Texture& texture, String const& file_path