Implemented a custom physics engine #316
|
@ -13,11 +13,13 @@ constexpr SHEventIdentifier SH_COMPONENT_REMOVED_EVENT { 4 };
|
|||
constexpr SHEventIdentifier SH_SCENEGRAPH_CHANGE_PARENT_EVENT { 5 };
|
||||
constexpr SHEventIdentifier SH_SCENEGRAPH_ADD_CHILD_EVENT { 6 };
|
||||
constexpr SHEventIdentifier SH_SCENEGRAPH_REMOVE_CHILD_EVENT { 7 };
|
||||
constexpr SHEventIdentifier SH_SCENE_ON_INIT_EVENT { 8 };
|
||||
constexpr SHEventIdentifier SH_SCENE_ON_EXIT_EVENT { 9 };
|
||||
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_ADDED_EVENT { 10 };
|
||||
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_REMOVED_EVENT { 11 };
|
||||
constexpr SHEventIdentifier SH_EDITOR_ON_PLAY_EVENT { 12 };
|
||||
constexpr SHEventIdentifier SH_EDITOR_ON_PAUSE_EVENT { 13 };
|
||||
constexpr SHEventIdentifier SH_EDITOR_ON_STOP_EVENT { 14 };
|
||||
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_ADDED_EVENT { 8 };
|
||||
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_REMOVED_EVENT { 9 };
|
||||
constexpr SHEventIdentifier SH_EDITOR_ON_PLAY_EVENT { 10 };
|
||||
constexpr SHEventIdentifier SH_EDITOR_ON_PAUSE_EVENT { 11 };
|
||||
constexpr SHEventIdentifier SH_EDITOR_ON_STOP_EVENT { 12 };
|
||||
constexpr SHEventIdentifier SH_SCENE_INIT_PRE { 13 };
|
||||
constexpr SHEventIdentifier SH_SCENE_INIT_POST { 14 };
|
||||
constexpr SHEventIdentifier SH_SCENE_EXIT_PRE { 15 };
|
||||
constexpr SHEventIdentifier SH_SCENE_EXIT_POST { 16 };
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
// Project Headers
|
||||
#include "SHSceneNode.h"
|
||||
#include "Assets/SHAssetMacros.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -38,14 +39,10 @@ namespace SHADE
|
|||
SHSceneNode* childRemoved = nullptr;
|
||||
};
|
||||
|
||||
struct SHSceneInitEvent
|
||||
{
|
||||
uint32_t sceneID = std::numeric_limits<uint32_t>::max();
|
||||
};
|
||||
|
||||
struct SHSceneExitEvent
|
||||
struct SHSceneInitExitEvent
|
||||
{
|
||||
uint32_t sceneID = std::numeric_limits<uint32_t>::max();
|
||||
AssetID sceneAssetID;
|
||||
};
|
||||
|
||||
} // namespace SHADE
|
|
@ -204,7 +204,24 @@ namespace SHADE
|
|||
}
|
||||
////////////////////////////////////////
|
||||
|
||||
return NODE_ITER->second->IsActive();
|
||||
// Recurse up the tree until the root. If any parent is inactive, this node is inactive in the hierarchy.
|
||||
const SHSceneNode* PARENT_NODE = NODE_ITER->second->parent;
|
||||
|
||||
while (PARENT_NODE->GetEntityID() != root->GetEntityID())
|
||||
{
|
||||
if (!PARENT_NODE->IsActive())
|
||||
return false;
|
||||
|
||||
if (!PARENT_NODE->parent)
|
||||
{
|
||||
SHLOGV_ERROR("Entity {}'s node that is not the root has no parent!", PARENT_NODE->GetEntityID())
|
||||
return false;
|
||||
}
|
||||
|
||||
PARENT_NODE = PARENT_NODE->parent;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
//#include "Rendering/Window/SHRenderingWindow.h"
|
||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||
#include "SHSceneEvents.h"
|
||||
#include "Events/SHEventManager.hpp"
|
||||
//#include "FRC/SHFrameRateController.h"
|
||||
//#include "ECS_Base/System/SHApplication.h"
|
||||
#include "SHSceneEvents.h"
|
||||
|
@ -55,11 +57,17 @@ namespace SHADE
|
|||
{
|
||||
if (currentScene)
|
||||
{
|
||||
SHSceneInitExitEvent exitEvent;
|
||||
exitEvent.sceneAssetID = currentScene->sceneAssetID;
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(exitEvent, SH_SCENE_EXIT_PRE);
|
||||
|
||||
currentScene->Free();
|
||||
SHEventManager::BroadcastEvent<SHSceneExitEvent>(SHSceneExitEvent{ currentSceneID }, SH_SCENE_ON_EXIT_EVENT);
|
||||
|
||||
currentScene->Unload();
|
||||
SHEntityManager::DestroyAllEntity();
|
||||
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(exitEvent, SH_SCENE_EXIT_POST);
|
||||
delete currentScene;
|
||||
}
|
||||
if (!prevSceneReload)
|
||||
|
@ -84,16 +92,25 @@ namespace SHADE
|
|||
nextSceneID = UINT32_MAX;
|
||||
if (currentScene != nullptr)
|
||||
{
|
||||
currentScene->Load();
|
||||
currentScene->Init();
|
||||
|
||||
SHEventManager::BroadcastEvent<SHSceneInitEvent>(SHSceneInitEvent{ currentSceneID }, SH_SCENE_ON_INIT_EVENT);
|
||||
currentScene->Load();
|
||||
|
||||
SHSceneInitExitEvent initEvent;
|
||||
initEvent.sceneAssetID = currentScene->sceneAssetID;
|
||||
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(initEvent, SH_SCENE_INIT_PRE);
|
||||
currentScene->Init();
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(initEvent, SH_SCENE_INIT_POST);
|
||||
}
|
||||
}
|
||||
else // restarting scene
|
||||
{
|
||||
nextSceneID = UINT32_MAX;
|
||||
|
||||
SHSceneInitExitEvent exitEvent;
|
||||
exitEvent.sceneAssetID = currentScene->sceneAssetID;
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(exitEvent, SH_SCENE_EXIT_PRE);
|
||||
|
||||
currentScene->Free();
|
||||
SHEventManager::BroadcastEvent<SHSceneExitEvent>(SHSceneExitEvent{ currentSceneID }, SH_SCENE_ON_EXIT_EVENT);
|
||||
|
||||
|
@ -102,14 +119,23 @@ namespace SHADE
|
|||
cleanReload = false;
|
||||
currentScene->Unload();
|
||||
SHEntityManager::DestroyAllEntity();
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(exitEvent, SH_SCENE_EXIT_POST);
|
||||
currentScene->sceneName = newSceneName;
|
||||
currentScene->Load();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
SHEntityManager::DestroyAllEntity();
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(exitEvent, SH_SCENE_EXIT_POST);
|
||||
}
|
||||
|
||||
SHSceneInitExitEvent initEvent;
|
||||
initEvent.sceneAssetID = currentScene->sceneAssetID;
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(initEvent, SH_SCENE_INIT_PRE);
|
||||
|
||||
currentScene->Init();
|
||||
SHEventManager::BroadcastEvent<SHSceneInitEvent>(SHSceneInitEvent{ currentSceneID }, SH_SCENE_ON_INIT_EVENT);
|
||||
SHEventManager::BroadcastEvent<SHSceneInitExitEvent>(initEvent, SH_SCENE_INIT_POST);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -133,11 +133,6 @@ namespace SHADE
|
|||
void SHSceneNode::SetActive(bool newActiveState) noexcept
|
||||
{
|
||||
active = newActiveState;
|
||||
|
||||
for (auto* child : children)
|
||||
{
|
||||
child->SetActive(newActiveState);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace SHADE
|
Loading…
Reference in New Issue