| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #include "BsPlayInEditorManager.h"
- #include "BsScriptGameObjectManager.h"
- #include "BsTime.h"
- #include "BsSceneManager.h"
- #include "BsSceneObject.h"
- namespace BansheeEngine
- {
- PlayInEditorManager::PlayInEditorManager()
- :mState(PlayInEditorState::Stopped), mNextState(PlayInEditorState::Stopped),
- mFrameStepActive(false), mScheduledStateChange(false), mPausableTime(0.0f)
- { }
- void PlayInEditorManager::setState(PlayInEditorState state)
- {
- // Delay state change to next frame as this method could be called in middle of object update, in which case
- // part of the objects before this call would receive different state than other objects.
- mScheduledStateChange = true;
- mNextState = state;
- }
- void PlayInEditorManager::setStateImmediate(PlayInEditorState state)
- {
- if (mState == state)
- return;
- PlayInEditorState oldState = mState;
- mState = state;
- switch (state)
- {
- case PlayInEditorState::Stopped:
- {
- mFrameStepActive = false;
- mPausableTime = 0.0f;
- mSavedScene->_instantiate();
- gSceneManager()._setRootNode(mSavedScene);
- mSavedScene = nullptr;
- }
- break;
- case PlayInEditorState::Playing:
- {
- if (oldState == PlayInEditorState::Paused)
- {
- ScriptGameObjectManager::instance().sendComponentInitializeEvents();
- }
- else // Was stopped
- {
- mSavedScene = SceneManager::instance().getRootNode()->clone(false);
- ScriptGameObjectManager::instance().sendComponentInitializeEvents();
- }
- }
- break;
- case PlayInEditorState::Paused:
- {
- mFrameStepActive = false;
- if (oldState == PlayInEditorState::Stopped)
- {
- mSavedScene = SceneManager::instance().getRootNode()->clone(false);
- ScriptGameObjectManager::instance().sendComponentInitializeEvents();
- }
- }
- break;
- default:
- break;
- }
- }
- void PlayInEditorManager::frameStep()
- {
- switch (mState)
- {
- case PlayInEditorState::Stopped:
- case PlayInEditorState::Paused:
- setState(PlayInEditorState::Playing);
- break;
- }
- mFrameStepActive = true;
- }
- void PlayInEditorManager::update()
- {
- if (mState == PlayInEditorState::Playing)
- mPausableTime += gTime().getFrameDelta();
- if (mScheduledStateChange)
- {
- setStateImmediate(mNextState);
- mScheduledStateChange = false;
- }
- if (mFrameStepActive)
- {
- setState(PlayInEditorState::Paused);
- mFrameStepActive = false;
- }
- }
- }
|