Merge remote-tracking branch 'origin/main' into SP3-1-Rendering
This commit is contained in:
commit
d432822608
|
@ -30,13 +30,14 @@ project "SHADE_Application"
|
||||||
|
|
||||||
externalincludedirs
|
externalincludedirs
|
||||||
{
|
{
|
||||||
"%{IncludeDir.spdlog}/include",
|
"%{IncludeDir.RTTR}\\include",
|
||||||
"%{IncludeDir.VULKAN}/include",
|
|
||||||
"%{IncludeDir.VMA}/include",
|
|
||||||
"%{IncludeDir.VULKAN}/Source/SPIRV-Reflect",
|
|
||||||
"%{IncludeDir.tinyddsloader}",
|
|
||||||
"%{IncludeDir.fmod}/include",
|
"%{IncludeDir.fmod}/include",
|
||||||
"%{IncludeDir.RTTR}\\include"
|
"%{IncludeDir.VULKAN}/Source/SPIRV-Reflect",
|
||||||
|
"%{IncludeDir.VMA}/include",
|
||||||
|
"%{IncludeDir.VULKAN}/include",
|
||||||
|
"%{IncludeDir.spdlog}/include",
|
||||||
|
"%{IncludeDir.tinyddsloader}",
|
||||||
|
"%{IncludeDir.reactphysics3d}\\include"
|
||||||
}
|
}
|
||||||
|
|
||||||
externalwarnings "Off"
|
externalwarnings "Off"
|
||||||
|
@ -57,7 +58,7 @@ project "SHADE_Application"
|
||||||
libdirs
|
libdirs
|
||||||
{
|
{
|
||||||
"%{IncludeDir.spdlog}/lib",
|
"%{IncludeDir.spdlog}/lib",
|
||||||
"%{IncludeDir.SDL}/lib",
|
"%{IncludeDir.SDL}/lib"
|
||||||
}
|
}
|
||||||
|
|
||||||
defines
|
defines
|
||||||
|
@ -67,9 +68,16 @@ project "SHADE_Application"
|
||||||
|
|
||||||
disablewarnings
|
disablewarnings
|
||||||
{
|
{
|
||||||
"4251"
|
"4251",
|
||||||
|
"26812",
|
||||||
|
"26439",
|
||||||
|
"26451",
|
||||||
|
"26437",
|
||||||
|
"4275"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
linkoptions { "-IGNORE:4006" }
|
||||||
|
|
||||||
warnings 'Extra'
|
warnings 'Extra'
|
||||||
|
|
||||||
filter "configurations:Debug"
|
filter "configurations:Debug"
|
||||||
|
|
|
@ -14,21 +14,29 @@
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <ratio>
|
#include <ratio>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#define SDL_HINT_VIDEO_FOREIGN_WINDOW_VULKAN 1
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
#include "Scripting/SHScriptEngine.h"
|
|
||||||
#include "Graphics/MiddleEnd/Meshes/SHPrimitiveGenerator.h"
|
#include "Graphics/MiddleEnd/Meshes/SHPrimitiveGenerator.h"
|
||||||
|
|
||||||
|
// Managers
|
||||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
|
||||||
#include "Scene/SHSceneManager.h"
|
#include "Scene/SHSceneManager.h"
|
||||||
|
|
||||||
|
// Systems
|
||||||
|
#include "Scripting/SHScriptEngine.h"
|
||||||
|
#include "Physics/SHPhysicsSystem.h"
|
||||||
#include "Math/Transform/SHTransformSystem.h"
|
#include "Math/Transform/SHTransformSystem.h"
|
||||||
#include "Input/SHInputManagerSystem.h"
|
#include "Input/SHInputManager.h"
|
||||||
#include "FRC/SHFramerateController.h"
|
#include "FRC/SHFramerateController.h"
|
||||||
//#include "AudioSystem/SHAudioSystem.h"
|
#include "AudioSystem/SHAudioSystem.h"
|
||||||
|
|
||||||
|
// Components
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||||
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
|
|
||||||
#include "Scenes/SBTestScene.h"
|
#include "Scenes/SBTestScene.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
|
||||||
|
@ -55,11 +63,10 @@ namespace Sandbox
|
||||||
// Create Systems
|
// Create Systems
|
||||||
SHADE::SHSystemManager::CreateSystem<SHADE::SHGraphicsSystem>();
|
SHADE::SHSystemManager::CreateSystem<SHADE::SHGraphicsSystem>();
|
||||||
SHADE::SHSystemManager::CreateSystem<SHADE::SHScriptEngine>();
|
SHADE::SHSystemManager::CreateSystem<SHADE::SHScriptEngine>();
|
||||||
// TODO(Diren): Create Physics System here
|
SHADE::SHSystemManager::CreateSystem<SHADE::SHPhysicsSystem>();
|
||||||
SHADE::SHSystemManager::CreateSystem<SHADE::SHTransformSystem>();
|
SHADE::SHSystemManager::CreateSystem<SHADE::SHTransformSystem>();
|
||||||
SHADE::SHGraphicsSystem* graphicsSystem = static_cast<SHADE::SHGraphicsSystem*>(SHADE::SHSystemManager::GetSystem<SHADE::SHGraphicsSystem>());
|
SHADE::SHGraphicsSystem* graphicsSystem = static_cast<SHADE::SHGraphicsSystem*>(SHADE::SHSystemManager::GetSystem<SHADE::SHGraphicsSystem>());
|
||||||
SHADE::SHSystemManager::CreateSystem<SHADE::SHInputManagerSystem>();
|
SHADE::SHSystemManager::CreateSystem<SHADE::SHAudioSystem>();
|
||||||
//SHADE::SHSystemManager::CreateSystem<SHADE::SHAudioSystem>();
|
|
||||||
|
|
||||||
// Create Routines
|
// Create Routines
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::FrameSetUpRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::FrameSetUpRoutine>();
|
||||||
|
@ -67,20 +74,21 @@ namespace Sandbox
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::LateUpdateRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::LateUpdateRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::FrameCleanUpRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHScriptEngine, SHADE::SHScriptEngine::FrameCleanUpRoutine>();
|
||||||
|
|
||||||
// TODO(Diren): Register Physics System & Routines here
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHPhysicsSystem, SHADE::SHPhysicsSystem::PhysicsPreUpdate>();
|
||||||
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHPhysicsSystem, SHADE::SHPhysicsSystem::PhysicsFixedUpdate>();
|
||||||
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHPhysicsSystem, SHADE::SHPhysicsSystem::PhysicsPostUpdate>();
|
||||||
|
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHTransformSystem, SHADE::SHTransformSystem::TransformUpdateRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHTransformSystem, SHADE::SHTransformSystem::TransformUpdateRoutine>();
|
||||||
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHTransformComponent>();
|
|
||||||
|
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::BatcherDispatcherRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::BatcherDispatcherRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::BeginRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::BeginRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::RenderRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::RenderRoutine>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::EndRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHGraphicsSystem, SHADE::SHGraphicsSystem::EndRoutine>();
|
||||||
|
|
||||||
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHRenderable>();
|
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHRigidBodyComponent>();
|
||||||
|
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHColliderComponent>();
|
||||||
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHTransformComponent>();
|
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHTransformComponent>();
|
||||||
|
SHADE::SHComponentManager::CreateComponentSparseSet<SHADE::SHRenderable>();
|
||||||
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHInputManagerSystem, SHADE::SHInputManagerSystem::InputManagerRoutine>();
|
|
||||||
|
|
||||||
//TODO: REMOVE AFTER PRESENTATION
|
//TODO: REMOVE AFTER PRESENTATION
|
||||||
//SHADE::SHAssetManager::LoadDataTemp("../../Assets/racoon.gltf");
|
//SHADE::SHAssetManager::LoadDataTemp("../../Assets/racoon.gltf");
|
||||||
|
@ -95,7 +103,7 @@ namespace Sandbox
|
||||||
auto id2 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
auto id2 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||||
auto id3 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
auto id3 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||||
|
|
||||||
//SHADE::SHSystemManager::RegisterRoutine<SHADE::SHAudioSystem, SHADE::SHAudioSystem::AudioRoutine>();
|
SHADE::SHSystemManager::RegisterRoutine<SHADE::SHAudioSystem, SHADE::SHAudioSystem::AudioRoutine>();
|
||||||
|
|
||||||
// Set up graphics system and windows
|
// Set up graphics system and windows
|
||||||
graphicsSystem->SetWindow(&window);
|
graphicsSystem->SetWindow(&window);
|
||||||
|
@ -121,6 +129,7 @@ namespace Sandbox
|
||||||
while (!window.WindowShouldClose())
|
while (!window.WindowShouldClose())
|
||||||
{
|
{
|
||||||
SHFrameRateController::UpdateFRC();
|
SHFrameRateController::UpdateFRC();
|
||||||
|
SHInputManager::UpdateInput(SHFrameRateController::GetRawDeltaTime());
|
||||||
SHSceneManager::UpdateSceneManager();
|
SHSceneManager::UpdateSceneManager();
|
||||||
SHSceneManager::SceneUpdate(1/60.0f);
|
SHSceneManager::SceneUpdate(1/60.0f);
|
||||||
//#ifdef SHEDITOR
|
//#ifdef SHEDITOR
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include "Scripting/SHScriptEngine.h"
|
#include "Scripting/SHScriptEngine.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||||
|
#include "Physics/Components/SHRigidBodyComponent.h"
|
||||||
|
#include "Physics/Components/SHColliderComponent.h"
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
|
||||||
|
@ -75,34 +77,35 @@ namespace Sandbox
|
||||||
customMat->SetProperty("data.alpha", 0.1f);
|
customMat->SetProperty("data.alpha", 0.1f);
|
||||||
|
|
||||||
// Create Stress Test Objects
|
// Create Stress Test Objects
|
||||||
static const SHVec3 TEST_OBJ_SCALE = { 0.05f, 0.05f, 0.05f };
|
static const SHVec3 TEST_OBJ_SCALE = SHVec3::One * 0.5f;
|
||||||
constexpr int NUM_ROWS = 10;
|
constexpr int NUM_ROWS = 10;
|
||||||
constexpr int NUM_COLS = 10;
|
constexpr int NUM_COLS = 10;
|
||||||
static const SHVec3 TEST_OBJ_SPACING = { 0.05f, 0.05f, 0.05f };
|
static const SHVec3 TEST_OBJ_SPACING = { 0.1f, 0.1f, 0.1f };
|
||||||
static const SHVec3 TEST_OBJ_START_POS = { -(NUM_COLS / 2 * TEST_OBJ_SPACING.x) + 1.0f, -2.0f, -1.0f };
|
static const SHVec3 TEST_OBJ_START_POS = { -(NUM_COLS / 2 * TEST_OBJ_SPACING.x) + 1.0f, -2.0f, -1.0f };
|
||||||
|
|
||||||
for (int y = 0; y < NUM_ROWS; ++y)
|
for (int y = 0; y < NUM_ROWS; ++y)
|
||||||
for (int x = 0; x < NUM_COLS; ++x)
|
for (int x = 0; x < NUM_COLS; ++x)
|
||||||
{
|
{
|
||||||
auto entity = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
auto entity = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent, SHRigidBodyComponent, SHColliderComponent>();
|
||||||
auto& renderable = *SHComponentManager::GetComponent_s<SHRenderable>(entity);
|
auto& renderable = *SHComponentManager::GetComponent_s<SHRenderable>(entity);
|
||||||
auto& transform = *SHComponentManager::GetComponent_s<SHTransformComponent>(entity);
|
auto& transform = *SHComponentManager::GetComponent_s<SHTransformComponent>(entity);
|
||||||
|
auto& collider = *SHComponentManager::GetComponent_s<SHColliderComponent>(entity);
|
||||||
|
|
||||||
renderable.Mesh = handles.front();
|
//renderable.Mesh = handles.front();
|
||||||
|
renderable.Mesh = CUBE_MESH;
|
||||||
renderable.SetMaterial(customMat);
|
renderable.SetMaterial(customMat);
|
||||||
|
|
||||||
if (y == 50)
|
if (y == 50)
|
||||||
renderable.GetModifiableMaterial()->SetProperty("data.color", SHVec4(1.0f, 0.0f, 0.0f, 1.0f));
|
renderable.GetModifiableMaterial()->SetProperty("data.color", SHVec4(1.0f, 0.0f, 0.0f, 1.0f));
|
||||||
|
|
||||||
//Set initial positions
|
//Set initial positions
|
||||||
transform.SetWorldPosition(TEST_OBJ_START_POS + SHVec3{
|
transform.SetWorldPosition(TEST_OBJ_START_POS + SHVec3{ x * TEST_OBJ_SPACING.x, y * TEST_OBJ_SPACING.y, SHMath::GenerateRandomNumber(-3.5f, -5.0f)});
|
||||||
x * TEST_OBJ_SPACING.x,
|
|
||||||
y * TEST_OBJ_SPACING.y,
|
|
||||||
0.0f
|
|
||||||
});
|
|
||||||
//transform.SetWorldPosition({-1.0f, -1.0f, -1.0f});
|
//transform.SetWorldPosition({-1.0f, -1.0f, -1.0f});
|
||||||
//transform.SetWorldRotation(3.14159265f * 1.5f, -3.14159265f / 2.0f, 0.0f);
|
transform.SetWorldRotation(SHMath::GenerateRandomNumber(), SHMath::GenerateRandomNumber(), SHMath::GenerateRandomNumber());
|
||||||
transform.SetLocalScale(TEST_OBJ_SCALE);
|
transform.SetWorldScale(TEST_OBJ_SCALE);
|
||||||
|
|
||||||
|
auto* box = collider.AddBoundingBox();
|
||||||
|
box->SetHalfExtents(transform.GetWorldScale() * 0.5f);
|
||||||
|
|
||||||
stressTestObjects.emplace_back(entity);
|
stressTestObjects.emplace_back(entity);
|
||||||
}
|
}
|
||||||
|
@ -120,22 +123,31 @@ namespace Sandbox
|
||||||
transform.SetWorldPosition({ -3.0f, -1.0f, -1.0f });
|
transform.SetWorldPosition({ -3.0f, -1.0f, -1.0f });
|
||||||
transform.SetLocalScale({ 5.0f, 5.0f, 5.0f });
|
transform.SetLocalScale({ 5.0f, 5.0f, 5.0f });
|
||||||
|
|
||||||
//auto entity = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
auto floor = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent, SHRigidBodyComponent, SHColliderComponent>();
|
||||||
//auto& renderable = *SHComponentManager::GetComponent_s<SHRenderable>(entity);
|
auto& floorRenderable = *SHComponentManager::GetComponent_s<SHRenderable>(floor);
|
||||||
//auto& transform = *SHComponentManager::GetComponent_s<SHTransformComponent>(entity);
|
auto& floorTransform = *SHComponentManager::GetComponent_s<SHTransformComponent>(floor);
|
||||||
|
auto& floorRigidBody = *SHComponentManager::GetComponent_s<SHRigidBodyComponent>(floor);
|
||||||
|
auto& floorCollider = *SHComponentManager::GetComponent_s<SHColliderComponent>(floor);
|
||||||
|
|
||||||
//renderable.Mesh = handles.back();
|
floorRenderable.Mesh = CUBE_MESH;
|
||||||
//renderable.SetMaterial(customMat);
|
floorRenderable.SetMaterial(customMat);
|
||||||
|
floorRenderable.GetModifiableMaterial()->SetProperty("data.color", SHVec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
|
|
||||||
//transform.SetLocalScale(TEST_OBJ_SCALE);
|
floorTransform.SetWorldScale({7.5f, 0.5f, 7.5});
|
||||||
//transform.SetWorldPosition({-1.0f, -1.0f, -1.0f});
|
floorTransform.SetWorldPosition({0.0f, -3.0f, -5.0f});
|
||||||
|
|
||||||
|
floorRigidBody.SetType(SHRigidBodyComponent::Type::STATIC);
|
||||||
|
|
||||||
|
auto* floorBox = floorCollider.AddBoundingBox();
|
||||||
|
floorBox->SetHalfExtents(floorTransform.GetWorldScale() * 0.5f);
|
||||||
|
|
||||||
// Create blank entity with a script
|
// Create blank entity with a script
|
||||||
//testObj = SHADE::SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
//testObj = SHADE::SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
||||||
//auto& testObjRenderable = *SHComponentManager::GetComponent_s<SHRenderable>(testObj);
|
//auto& testObjRenderable = *SHComponentManager::GetComponent<SHRenderable>(testObj);
|
||||||
//testObjRenderable.Mesh = CUBE_MESH;
|
//testObjRenderable.Mesh = CUBE_MESH;
|
||||||
//testObjRenderable.SetMaterial(matInst);
|
//testObjRenderable.SetMaterial(matInst);
|
||||||
|
|
||||||
|
|
||||||
SHADE::SHScriptEngine* scriptEngine = static_cast<SHADE::SHScriptEngine*>(SHADE::SHSystemManager::GetSystem<SHADE::SHScriptEngine>());
|
SHADE::SHScriptEngine* scriptEngine = static_cast<SHADE::SHScriptEngine*>(SHADE::SHSystemManager::GetSystem<SHADE::SHScriptEngine>());
|
||||||
scriptEngine->AddScript(raccoonSpin, "RaccoonSpin");
|
scriptEngine->AddScript(raccoonSpin, "RaccoonSpin");
|
||||||
|
|
||||||
|
@ -186,8 +198,4 @@ namespace Sandbox
|
||||||
{
|
{
|
||||||
//SHSerialization::SerializeScene("resources/scenes/Scene01.SHADE");
|
//SHSerialization::SerializeScene("resources/scenes/Scene01.SHADE");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ project "SHADE_Engine"
|
||||||
"%{IncludeDir.RTTR}/lib",
|
"%{IncludeDir.RTTR}/lib",
|
||||||
"%{IncludeDir.SDL}/lib",
|
"%{IncludeDir.SDL}/lib",
|
||||||
"%{IncludeDir.spdlog}/lib",
|
"%{IncludeDir.spdlog}/lib",
|
||||||
"%{IncludeDir.fmod}/lib",
|
"%{IncludeDir.fmod}/lib"
|
||||||
}
|
}
|
||||||
|
|
||||||
links
|
links
|
||||||
|
@ -76,9 +76,16 @@ project "SHADE_Engine"
|
||||||
|
|
||||||
disablewarnings
|
disablewarnings
|
||||||
{
|
{
|
||||||
"4251"
|
"4251",
|
||||||
|
"26812",
|
||||||
|
"26439",
|
||||||
|
"26451",
|
||||||
|
"26437",
|
||||||
|
"4275"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
linkoptions { "-IGNORE:4006" }
|
||||||
|
|
||||||
defines
|
defines
|
||||||
{
|
{
|
||||||
"_LIB",
|
"_LIB",
|
||||||
|
|
|
@ -17,7 +17,8 @@ namespace SHADE
|
||||||
SHTexture::PixelChannel const * pixelData;
|
SHTexture::PixelChannel const * pixelData;
|
||||||
|
|
||||||
SHTextureAsset()
|
SHTextureAsset()
|
||||||
: numBytes{ 0 },
|
: compiled{ false },
|
||||||
|
numBytes{ 0 },
|
||||||
width{ 0 },
|
width{ 0 },
|
||||||
height{ 0 },
|
height{ 0 },
|
||||||
format{ SHTexture::TextureFormat::eUndefined },
|
format{ SHTexture::TextureFormat::eUndefined },
|
||||||
|
@ -25,7 +26,8 @@ namespace SHADE
|
||||||
{}
|
{}
|
||||||
|
|
||||||
SHTextureAsset(SHTextureAsset const& rhs)
|
SHTextureAsset(SHTextureAsset const& rhs)
|
||||||
: numBytes{ rhs.numBytes },
|
: compiled{ false },
|
||||||
|
numBytes{ rhs.numBytes },
|
||||||
width{ rhs.width },
|
width{ rhs.width },
|
||||||
height{ rhs.height },
|
height{ rhs.height },
|
||||||
format{ rhs.format },
|
format{ rhs.format },
|
||||||
|
|
|
@ -91,8 +91,8 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.header.vertexCount = result.vertexPosition.size();
|
result.header.vertexCount = static_cast<uint32_t>(result.vertexPosition.size());
|
||||||
result.header.indexCount = result.indices.size();
|
result.header.indexCount = static_cast<uint32_t>(result.indices.size());
|
||||||
result.header.meshName = mesh.mName.C_Str();
|
result.header.meshName = mesh.mName.C_Str();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -83,10 +83,10 @@ namespace SHADE
|
||||||
|
|
||||||
std::vector<uint32_t> mipOff(file.GetMipCount());
|
std::vector<uint32_t> mipOff(file.GetMipCount());
|
||||||
|
|
||||||
for (auto i{0}; i < file.GetMipCount(); ++i)
|
for (size_t i{0}; i < file.GetMipCount(); ++i)
|
||||||
{
|
{
|
||||||
mipOff[i] = totalBytes;
|
mipOff[i] = static_cast<uint32_t>(totalBytes);
|
||||||
totalBytes += file.GetImageData(i, 0)->m_memSlicePitch;
|
totalBytes += file.GetImageData(static_cast<uint32_t>(i), 0)->m_memSlicePitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHTexture::PixelChannel* pixel = new SHTexture::PixelChannel[totalBytes];
|
SHTexture::PixelChannel* pixel = new SHTexture::PixelChannel[totalBytes];
|
||||||
|
@ -94,7 +94,7 @@ namespace SHADE
|
||||||
//pixel = std::move(reinterpret_cast<SHTexture::PixelChannel const*>(file.GetDDSData()));
|
//pixel = std::move(reinterpret_cast<SHTexture::PixelChannel const*>(file.GetDDSData()));
|
||||||
|
|
||||||
asset.compiled = false;
|
asset.compiled = false;
|
||||||
asset.numBytes = totalBytes;
|
asset.numBytes = static_cast<uint32_t>(totalBytes);
|
||||||
asset.width = file.GetWidth();
|
asset.width = file.GetWidth();
|
||||||
asset.height = file.GetHeight();
|
asset.height = file.GetHeight();
|
||||||
asset.format = ddsLoaderToVkFormat(file.GetFormat(), true);
|
asset.format = ddsLoaderToVkFormat(file.GetFormat(), true);
|
||||||
|
|
|
@ -72,12 +72,13 @@ namespace SHADE
|
||||||
|
|
||||||
AssetType type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string().c_str());
|
AssetType type = SHAssetMetaHandler::GetTypeFromExtension(path.extension().string().c_str());
|
||||||
std::string folder;
|
std::string folder;
|
||||||
switch (type)
|
//TODO Implement asset type generation
|
||||||
{
|
//switch (type)
|
||||||
default:
|
//{
|
||||||
//TODO:ASSERT UNSUPPORTED FILE TYPE
|
//default:
|
||||||
return std::filesystem::path();
|
// //TODO:ASSERT UNSUPPORTED FILE TYPE
|
||||||
}
|
// return std::filesystem::path();
|
||||||
|
//}
|
||||||
|
|
||||||
return std::filesystem::path(ASSET_ROOT + folder + path.filename().string());
|
return std::filesystem::path(ASSET_ROOT + folder + path.filename().string());
|
||||||
}
|
}
|
||||||
|
@ -108,12 +109,13 @@ namespace SHADE
|
||||||
meta.type = type;
|
meta.type = type;
|
||||||
|
|
||||||
std::string folder;
|
std::string folder;
|
||||||
switch (type)
|
//TODO implement folder choosing
|
||||||
{
|
//switch (type)
|
||||||
default:
|
//{
|
||||||
folder = "";
|
//default:
|
||||||
break;
|
// folder = "";
|
||||||
}
|
// break;
|
||||||
|
//}
|
||||||
AssetPath path{ ASSET_ROOT + folder + name + SHAssetMetaHandler::GetExtensionFromType(type) };
|
AssetPath path{ ASSET_ROOT + folder + name + SHAssetMetaHandler::GetExtensionFromType(type) };
|
||||||
|
|
||||||
SHAssetMetaHandler::WriteMetaData(meta);
|
SHAssetMetaHandler::WriteMetaData(meta);
|
||||||
|
|
|
@ -122,7 +122,7 @@ namespace SHADE
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
void;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
metaFile.close();
|
metaFile.close();
|
||||||
|
|
|
@ -90,11 +90,11 @@ namespace SHADE
|
||||||
//PlayEventOnce("event:/SFX/Dawn/Dawn_Attack");
|
//PlayEventOnce("event:/SFX/Dawn/Dawn_Attack");
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHADE::SHAudioSystem::Run(float dt)
|
void SHADE::SHAudioSystem::Run(double dt)
|
||||||
{
|
{
|
||||||
static_cast<void>(dt);
|
static_cast<void>(dt);
|
||||||
if (GetKeyState(VK_SPACE) & 0x8000)
|
//if (GetKeyState(VK_SPACE) & 0x8000)
|
||||||
PlayEventOnce("event:/Characters/sfx_footsteps_raccoon");
|
// PlayEventOnce("event:/Characters/sfx_footsteps_raccoon");
|
||||||
|
|
||||||
fmodStudioSystem->update();
|
fmodStudioSystem->update();
|
||||||
if (!denseListener->empty())
|
if (!denseListener->empty())
|
||||||
|
@ -417,7 +417,7 @@ namespace SHADE
|
||||||
int instanceCount = 0;
|
int instanceCount = 0;
|
||||||
event.second->getInstanceCount(&instanceCount);
|
event.second->getInstanceCount(&instanceCount);
|
||||||
std::vector<FMOD::Studio::EventInstance*> instances(instanceCount);
|
std::vector<FMOD::Studio::EventInstance*> instances(instanceCount);
|
||||||
event.second->getInstanceList(instances.data(), instances.size(), &instanceCount);
|
event.second->getInstanceList(instances.data(), static_cast<int>(instances.size()), &instanceCount);
|
||||||
for (auto const& instance : instances)
|
for (auto const& instance : instances)
|
||||||
{
|
{
|
||||||
instance->setPaused(pause);
|
instance->setPaused(pause);
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace SHADE
|
||||||
~SHAudioSystem();
|
~SHAudioSystem();
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
void Run(float dt);
|
void Run(double dt);
|
||||||
class SH_API AudioRoutine final : public SHSystemRoutine
|
class SH_API AudioRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -8,23 +8,19 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
class SHFixedSystemRoutine: public SHSystemRoutine
|
class SHFixedSystemRoutine: public SHSystemRoutine
|
||||||
{
|
{
|
||||||
private:
|
protected:
|
||||||
double accumulatedTime;
|
double accumulatedTime;
|
||||||
double fixedTimeStep;
|
double fixedTimeStep;
|
||||||
|
|
||||||
protected:
|
|
||||||
SHFixedSystemRoutine(double timeStep = DEFAULT_FIXED_STEP, std::string routineName = "Default Fixed Routine Name", bool editorPause = false)
|
SHFixedSystemRoutine(double timeStep = DEFAULT_FIXED_STEP, std::string routineName = "Default Fixed Routine Name", bool editorPause = false)
|
||||||
:SHSystemRoutine(routineName, editorPause), accumulatedTime(0.0), fixedTimeStep(timeStep){}
|
:SHSystemRoutine(routineName, editorPause), accumulatedTime(0.0), fixedTimeStep(timeStep){}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~SHFixedSystemRoutine() = default;
|
~SHFixedSystemRoutine() = default;
|
||||||
|
|
||||||
virtual void Execute(double dt) noexcept;
|
virtual void Execute(double dt) noexcept override;
|
||||||
|
|
||||||
virtual void FixedExecute(double dt) noexcept {};
|
|
||||||
|
|
||||||
|
virtual void FixedExecute(double dt) noexcept {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,7 @@ namespace SHADE
|
||||||
|
|
||||||
auto* entity = SHEntityManager::GetEntityByID(currentNode->GetEntityID());
|
auto* entity = SHEntityManager::GetEntityByID(currentNode->GetEntityID());
|
||||||
//Draw Node
|
//Draw Node
|
||||||
bool isNodeOpen = ImGui::TreeNodeEx((void*)eid, nodeFlags, "%u: %s", EntityHandleGenerator::GetIndex(eid), entity->name.c_str());
|
bool isNodeOpen = ImGui::TreeNodeEx(reinterpret_cast<void*>(entity), nodeFlags, "%u: %s", EntityHandleGenerator::GetIndex(eid), entity->name.c_str());
|
||||||
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
||||||
|
|
||||||
//Check For Begin Drag
|
//Check For Begin Drag
|
||||||
|
|
|
@ -45,6 +45,12 @@ namespace SHADE
|
||||||
SHEditorWindow::Update();
|
SHEditorWindow::Update();
|
||||||
if (Begin())
|
if (Begin())
|
||||||
{
|
{
|
||||||
|
if (ImGui::Button("AUDIO"))
|
||||||
|
{
|
||||||
|
auto audioSystem = SHSystemManager::GetSystem<SHADE::SHAudioSystem>();
|
||||||
|
audioSystem->PlayEventOnce("event:/Characters/sfx_footsteps_raccoon");
|
||||||
|
}
|
||||||
|
|
||||||
if (!SHEditor::selectedEntities.empty())
|
if (!SHEditor::selectedEntities.empty())
|
||||||
{
|
{
|
||||||
EntityID const& eid = SHEditor::selectedEntities[0];
|
EntityID const& eid = SHEditor::selectedEntities[0];
|
||||||
|
|
|
@ -843,7 +843,7 @@
|
||||||
#define ICON_MD_FLIP_TO_FRONT "\xee\xa2\x83" // U+e883
|
#define ICON_MD_FLIP_TO_FRONT "\xee\xa2\x83" // U+e883
|
||||||
#define ICON_MD_FLOOD "\xee\xaf\xa6" // U+ebe6
|
#define ICON_MD_FLOOD "\xee\xaf\xa6" // U+ebe6
|
||||||
#define ICON_MD_FLOURESCENT "\xee\xb0\xb1" // U+ec31
|
#define ICON_MD_FLOURESCENT "\xee\xb0\xb1" // U+ec31
|
||||||
#define ICON_MD_FLOURESCENT "\xef\x80\x8d" // U+f00d
|
#define ICON_MD_FLOURESCENT2 "\xef\x80\x8d" // U+f00d
|
||||||
#define ICON_MD_FLUORESCENT "\xee\xb0\xb1" // U+ec31
|
#define ICON_MD_FLUORESCENT "\xee\xb0\xb1" // U+ec31
|
||||||
#define ICON_MD_FLUTTER_DASH "\xee\x80\x8b" // U+e00b
|
#define ICON_MD_FLUTTER_DASH "\xee\x80\x8b" // U+e00b
|
||||||
#define ICON_MD_FMD_BAD "\xef\x80\x8e" // U+f00e
|
#define ICON_MD_FMD_BAD "\xef\x80\x8e" // U+f00e
|
||||||
|
|
|
@ -327,7 +327,7 @@ namespace SHADE
|
||||||
ImGui::PushID(fieldLabel.c_str());
|
ImGui::PushID(fieldLabel.c_str());
|
||||||
ImGui::Text(fieldLabel.c_str()); ImGui::SameLine();
|
ImGui::Text(fieldLabel.c_str()); ImGui::SameLine();
|
||||||
|
|
||||||
if (edited = ImGui::Combo("##Combo", &selected, list.data(), list.size()))
|
if (edited = ImGui::Combo("##Combo", &selected, list.data(), static_cast<int>(list.size())))
|
||||||
{
|
{
|
||||||
SHCommandManager::PerformCommand(std::reinterpret_pointer_cast<SHBaseCommand>(std::make_shared<SHCommand<int>>(get(), selected, set)), false);
|
SHCommandManager::PerformCommand(std::reinterpret_pointer_cast<SHBaseCommand>(std::make_shared<SHCommand<int>>(get(), selected, set)), false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
#include "SHFileSystem.h"
|
#include "SHFileSystem.h"
|
||||||
#include "fileapi.h"
|
#include "fileapi.h"
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <cassert>
|
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -28,7 +27,10 @@ namespace SHADE
|
||||||
|
|
||||||
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
||||||
|
|
||||||
assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
|
if (count >= FOLDER_MAX_COUNT)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Max subfolder reached: {}\n", name);
|
||||||
|
}
|
||||||
|
|
||||||
auto const location = static_cast<FolderLocation>(count);
|
auto const location = static_cast<FolderLocation>(count);
|
||||||
|
|
||||||
|
@ -37,7 +39,10 @@ namespace SHADE
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(folders.contains(here), "Folder creation location does not exist/invalid\n");
|
if (!folders.contains(here))
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Folder creation location does not exist/invalid: {}\n", here);
|
||||||
|
}
|
||||||
|
|
||||||
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
||||||
|
|
||||||
|
@ -45,7 +50,11 @@ namespace SHADE
|
||||||
location <<= FOLDER_BIT_ALLOCATE;
|
location <<= FOLDER_BIT_ALLOCATE;
|
||||||
location |= count;
|
location |= count;
|
||||||
|
|
||||||
assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
|
if (count >= FOLDER_MAX_COUNT)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Max subfolder reached: {}\n", name);
|
||||||
|
}
|
||||||
|
|
||||||
CreateFolder(folders[0]->path, here, location, name);
|
CreateFolder(folders[0]->path, here, location, name);
|
||||||
|
|
||||||
return location;
|
return location;
|
||||||
|
@ -53,7 +62,10 @@ namespace SHADE
|
||||||
|
|
||||||
bool SHFileSystem::DeleteFolder(FolderPointer location) noexcept
|
bool SHFileSystem::DeleteFolder(FolderPointer location) noexcept
|
||||||
{
|
{
|
||||||
assert(folders.contains(location->id), "Delete target does not exist/invalid.\n");
|
if (!folders.contains(location->id))
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Delete target does not exist/invalid: {}\n", location->name);
|
||||||
|
}
|
||||||
|
|
||||||
for (auto const& subFolder : folders[location->id]->subFolders)
|
for (auto const& subFolder : folders[location->id]->subFolders)
|
||||||
{
|
{
|
||||||
|
@ -116,10 +128,11 @@ namespace SHADE
|
||||||
|
|
||||||
FolderPointer SHFileSystem::CreateFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept
|
FolderPointer SHFileSystem::CreateFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept
|
||||||
{
|
{
|
||||||
assert(
|
|
||||||
CreateDirectoryA(path.c_str(), nullptr),
|
if (!CreateDirectoryA(path.c_str(), nullptr))
|
||||||
"Failed to create folder\n"
|
{
|
||||||
);
|
SHLOG_ERROR("Failed to create folder: {}\n", path);
|
||||||
|
}
|
||||||
|
|
||||||
folders[location] = std::make_unique<SHFolder>(location, name);
|
folders[location] = std::make_unique<SHFolder>(location, name);
|
||||||
folders[location]->path = path;
|
folders[location]->path = path;
|
||||||
|
|
|
@ -37,7 +37,7 @@ namespace SHADE
|
||||||
class SHVkDescriptorSetLayout;
|
class SHVkDescriptorSetLayout;
|
||||||
class SHVkDescriptorSetGroup;
|
class SHVkDescriptorSetGroup;
|
||||||
class SHVkSampler;
|
class SHVkSampler;
|
||||||
class SHTextureAsset;
|
struct SHTextureAsset;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Type Definitions */
|
/* Type Definitions */
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "SHWindowMap.h"
|
#include "SHWindowMap.h"
|
||||||
#include "SHWindow.h"
|
#include "SHWindow.h"
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
#include "Input/SHInputManagerSystem.h"
|
#include "Input/SHInputManager.h"
|
||||||
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -356,10 +356,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
{
|
{
|
||||||
if (auto im = SHSystemManager::GetSystem<SHInputManagerSystem>())
|
SHInputManager::PollWheelVerticalDelta(wparam);
|
||||||
{
|
|
||||||
im->PollWheelVerticalDelta(wparam);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* \file SHInputManagerSystem.cpp
|
* \file SHInputManager.cpp
|
||||||
* \author Ryan Wang Nian Jing
|
* \author Ryan Wang Nian Jing
|
||||||
* \brief Definition of input manager.
|
* \brief Definition of input manager.
|
||||||
* Handles input from keyboard and mouse. Soon to include controller.
|
* Handles input from keyboard and mouse. Soon to include controller.
|
||||||
|
@ -11,7 +11,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <SHpch.h>
|
#include <SHpch.h>
|
||||||
#include "SHInputManagerSystem.h"
|
#include "SHInputManager.h"
|
||||||
|
#include "../Tools/SHException.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -19,61 +20,34 @@ namespace SHADE
|
||||||
/* Static defines */
|
/* Static defines */
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
unsigned SHInputManagerSystem::keyCount = 0;
|
unsigned SHInputManager::keyCount = 0;
|
||||||
bool SHInputManagerSystem::keys[MAX_KEYS];
|
bool SHInputManager::keys[MAX_KEYS];
|
||||||
bool SHInputManagerSystem::keysLast[MAX_KEYS];
|
bool SHInputManager::keysLast[MAX_KEYS];
|
||||||
double SHInputManagerSystem::keysHeldTime[MAX_KEYS];
|
double SHInputManager::keysHeldTime[MAX_KEYS];
|
||||||
double SHInputManagerSystem::keysReleasedTime[MAX_KEYS];
|
double SHInputManager::keysReleasedTime[MAX_KEYS];
|
||||||
|
|
||||||
unsigned SHInputManagerSystem::keyToggleCount = 0;
|
unsigned SHInputManager::keyToggleCount = 0;
|
||||||
bool SHInputManagerSystem::keysToggle[MAX_KEYS];
|
bool SHInputManager::keysToggle[MAX_KEYS];
|
||||||
bool SHInputManagerSystem::keysToggleLast[MAX_KEYS];
|
bool SHInputManager::keysToggleLast[MAX_KEYS];
|
||||||
double SHInputManagerSystem::keysToggleOnTime[MAX_KEYS];
|
double SHInputManager::keysToggleOnTime[MAX_KEYS];
|
||||||
double SHInputManagerSystem::keysToggleOffTime[MAX_KEYS];
|
double SHInputManager::keysToggleOffTime[MAX_KEYS];
|
||||||
|
|
||||||
int SHInputManagerSystem::mouseScreenX = 0;
|
int SHInputManager::mouseScreenX = 0;
|
||||||
int SHInputManagerSystem::mouseScreenY = 0;
|
int SHInputManager::mouseScreenY = 0;
|
||||||
int SHInputManagerSystem::mouseScreenXLast = 0;
|
int SHInputManager::mouseScreenXLast = 0;
|
||||||
int SHInputManagerSystem::mouseScreenYLast = 0;
|
int SHInputManager::mouseScreenYLast = 0;
|
||||||
double SHInputManagerSystem::mouseVelocityX = 0;
|
double SHInputManager::mouseVelocityX = 0;
|
||||||
double SHInputManagerSystem::mouseVelocityY = 0;
|
double SHInputManager::mouseVelocityY = 0;
|
||||||
int SHInputManagerSystem::mouseWheelVerticalDelta = 0;
|
int SHInputManager::mouseWheelVerticalDelta = 0;
|
||||||
int SHInputManagerSystem::mouseWheelVerticalDeltaPoll = 0;
|
int SHInputManager::mouseWheelVerticalDeltaPoll = 0;
|
||||||
|
|
||||||
void SHInputManagerSystem::Init()
|
void SHInputManager::UpdateInput(double dt) noexcept
|
||||||
{
|
|
||||||
keyCount = 0;
|
|
||||||
SecureZeroMemory(keys, sizeof(keys));
|
|
||||||
SecureZeroMemory(keysLast, sizeof(keysLast));
|
|
||||||
SecureZeroMemory(keysHeldTime, sizeof(keysHeldTime));
|
|
||||||
SecureZeroMemory(keysReleasedTime, sizeof(keysReleasedTime));
|
|
||||||
|
|
||||||
keyToggleCount = 0;
|
|
||||||
SecureZeroMemory(keysToggle, sizeof(keysToggle));
|
|
||||||
SecureZeroMemory(keysToggleLast, sizeof(keysToggleLast));
|
|
||||||
SecureZeroMemory(keysToggleOnTime, sizeof(keysToggleOnTime));
|
|
||||||
SecureZeroMemory(keysToggleOffTime, sizeof(keysToggleOffTime));
|
|
||||||
|
|
||||||
mouseScreenX = 0;
|
|
||||||
mouseScreenY = 0;
|
|
||||||
mouseScreenXLast = 0;
|
|
||||||
mouseScreenYLast = 0;
|
|
||||||
mouseWheelVerticalDelta = 0;
|
|
||||||
mouseWheelVerticalDeltaPoll = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHInputManagerSystem::Exit()
|
|
||||||
{
|
|
||||||
//No dynamically allocated memory. Nothing to do here.
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHInputManagerSystem::InputManagerRoutine::
|
|
||||||
FixedExecute(double dt) noexcept
|
|
||||||
{
|
{
|
||||||
//Keyboard and Mouse Buttons////////////////////////////////////////////////
|
//Keyboard and Mouse Buttons////////////////////////////////////////////////
|
||||||
//Poll
|
//Poll
|
||||||
unsigned char keyboardState[MAX_KEYS];
|
unsigned char keyboardState[MAX_KEYS];
|
||||||
GetKeyboardState(keyboardState);
|
//if (GetKeyboardState(keyboardState) == false) return;
|
||||||
|
SHASSERT(GetKeyboardState(keyboardState), "SHInputManager:GetKeyboardState() failed ({})", GetLastError());
|
||||||
keyCount = 0;
|
keyCount = 0;
|
||||||
keyToggleCount = 0;
|
keyToggleCount = 0;
|
||||||
for (size_t i = 0; i < MAX_KEYS; ++i)
|
for (size_t i = 0; i < MAX_KEYS; ++i)
|
||||||
|
@ -138,13 +112,17 @@ namespace SHADE
|
||||||
mouseScreenX = p.x;
|
mouseScreenX = p.x;
|
||||||
mouseScreenY = p.y;
|
mouseScreenY = p.y;
|
||||||
|
|
||||||
|
//Velocity
|
||||||
|
mouseVelocityX = static_cast<double>(mouseScreenX - mouseScreenXLast) / dt;
|
||||||
|
mouseVelocityY = static_cast<double>(mouseScreenY - mouseScreenYLast) / dt;
|
||||||
|
|
||||||
//Mouse wheel vertical delta updating
|
//Mouse wheel vertical delta updating
|
||||||
mouseWheelVerticalDelta = 0;
|
mouseWheelVerticalDelta = 0;
|
||||||
mouseWheelVerticalDelta = mouseWheelVerticalDeltaPoll;
|
mouseWheelVerticalDelta = mouseWheelVerticalDeltaPoll;
|
||||||
mouseWheelVerticalDeltaPoll = 0;
|
mouseWheelVerticalDeltaPoll = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHInputManagerSystem::AnyKeyDown(SH_KEYCODE* firstDetected) noexcept
|
bool SHInputManager::AnyKeyDown(SH_KEYCODE* firstDetected) noexcept
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < MAX_KEYS; ++i)
|
for (size_t i = 0; i < MAX_KEYS; ++i)
|
||||||
{
|
{
|
||||||
|
@ -157,7 +135,7 @@ namespace SHADE
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHInputManagerSystem::AnyKey(SH_KEYCODE* firstDetected) noexcept
|
bool SHInputManager::AnyKey(SH_KEYCODE* firstDetected) noexcept
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < MAX_KEYS; ++i)
|
for (size_t i = 0; i < MAX_KEYS; ++i)
|
||||||
{
|
{
|
||||||
|
@ -170,7 +148,7 @@ namespace SHADE
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHInputManagerSystem::AnyKeyUp(SH_KEYCODE* firstDetected) noexcept
|
bool SHInputManager::AnyKeyUp(SH_KEYCODE* firstDetected) noexcept
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < MAX_KEYS; ++i)
|
for (size_t i = 0; i < MAX_KEYS; ++i)
|
||||||
{
|
{
|
|
@ -1,5 +1,5 @@
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* \file SHInputManagerSystem.h
|
* \file SHInputManager.h
|
||||||
* \author Ryan Wang Nian Jing
|
* \author Ryan Wang Nian Jing
|
||||||
* \brief Declaration of input manager.
|
* \brief Declaration of input manager.
|
||||||
* Handles input from keyboard and mouse. Soon to include controller.
|
* Handles input from keyboard and mouse. Soon to include controller.
|
||||||
|
@ -13,19 +13,12 @@
|
||||||
//#include <Xinput.h>
|
//#include <Xinput.h>
|
||||||
//#include "../../SHADE_Managed/src/SHpch.h"
|
//#include "../../SHADE_Managed/src/SHpch.h"
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
#include "ECS_Base/System/SHSystem.h"
|
|
||||||
#include "ECS_Base/System/SHFixedSystemRoutine.h"
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
class SH_API SHInputManagerSystem : public SHSystem
|
class SH_API SHInputManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
class SH_API InputManagerRoutine : public SHFixedSystemRoutine
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual void FixedExecute(double dt) noexcept override final;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
|
@ -276,23 +269,21 @@ namespace SHADE
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
//Updates current state of the input, with dt to be fetched from FRC
|
||||||
|
//TODO should dt be fixed or variable?
|
||||||
|
static void UpdateInput(double dt) noexcept;
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
/* Constructors & Destructor */
|
/* Constructors & Destructor */
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
SHInputManagerSystem() noexcept = default;
|
SHInputManager() noexcept = default;
|
||||||
~SHInputManagerSystem() noexcept = default;
|
~SHInputManager() noexcept = default;
|
||||||
|
|
||||||
SHInputManagerSystem(const SHInputManagerSystem&) = delete;
|
SHInputManager(const SHInputManager&) = delete;
|
||||||
SHInputManagerSystem(SHInputManagerSystem&&) = delete;
|
SHInputManager(SHInputManager&&) = delete;
|
||||||
|
|
||||||
SHInputManagerSystem& operator= (const SHInputManagerSystem&) = delete;
|
SHInputManager& operator= (const SHInputManager&) = delete;
|
||||||
SHInputManagerSystem& operator= (SHInputManagerSystem&&) = delete;
|
SHInputManager& operator= (SHInputManager&&) = delete;
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
/* SHSystem Overrides */
|
|
||||||
/*------------------------------------------------------------------------*/
|
|
||||||
virtual void Init() override final;
|
|
||||||
virtual void Exit() override final;
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
/* Member Functions */
|
/* Member Functions */
|
||||||
|
@ -417,8 +408,8 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
POINT p{ mouseScreenX, mouseScreenY };
|
POINT p{ mouseScreenX, mouseScreenY };
|
||||||
ScreenToClient(GetActiveWindow(), &p);
|
ScreenToClient(GetActiveWindow(), &p);
|
||||||
if (x) *x = mouseScreenX;
|
if (x) *x = p.x;
|
||||||
if (y) *y = mouseScreenY;
|
if (y) *y = p.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get the mouse velocity
|
//Get the mouse velocity
|
|
@ -21,7 +21,7 @@ namespace SHADE
|
||||||
/* Constructors & Destructor Definitions */
|
/* Constructors & Destructor Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SHBoundingBox::SHBoundingBox(const SHVec3& c, SHVec3& hE) noexcept
|
SHBoundingBox::SHBoundingBox(const SHVec3& c, const SHVec3& hE) noexcept
|
||||||
: SHShape {}
|
: SHShape {}
|
||||||
, center { c }
|
, center { c }
|
||||||
, halfExtents { hE }
|
, halfExtents { hE }
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <DirectXCollision.h>
|
||||||
|
|
||||||
// Project Headers
|
// Project Headers
|
||||||
#include "SHShape.h"
|
#include "SHShape.h"
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
|
@ -20,6 +22,7 @@ namespace SHADE
|
||||||
/* Type Definitions */
|
/* Type Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// TODO(Diren): Use DirectX BoundingBox instead of custom
|
||||||
class SH_API SHBoundingBox : public SHShape
|
class SH_API SHBoundingBox : public SHShape
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -27,7 +30,7 @@ namespace SHADE
|
||||||
/* Constructors & Destructor */
|
/* Constructors & Destructor */
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SHBoundingBox (const SHVec3& center, SHVec3& halfExtents) noexcept;
|
SHBoundingBox (const SHVec3& center, const SHVec3& halfExtents) noexcept;
|
||||||
SHBoundingBox (const SHVec3* vertices, size_t numVertices) noexcept;
|
SHBoundingBox (const SHVec3* vertices, size_t numVertices) noexcept;
|
||||||
SHBoundingBox (const SHBoundingBox* boxes, size_t numBoxes) noexcept;
|
SHBoundingBox (const SHBoundingBox* boxes, size_t numBoxes) noexcept;
|
||||||
|
|
||||||
|
|
|
@ -23,4 +23,14 @@ namespace SHADE
|
||||||
: type { Type::NONE }
|
: type { Type::NONE }
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHShape::Type SHShape::GetType() const
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace SHADE
|
} // namespace SHADE
|
|
@ -30,7 +30,9 @@ namespace SHADE
|
||||||
enum class Type
|
enum class Type
|
||||||
{
|
{
|
||||||
BOUNDING_BOX
|
BOUNDING_BOX
|
||||||
, RAY
|
, SPHERE
|
||||||
|
, CAPSULE
|
||||||
|
, CONVEX_HULL
|
||||||
, TRIANGLE
|
, TRIANGLE
|
||||||
|
|
||||||
, COUNT
|
, COUNT
|
||||||
|
|
|
@ -103,6 +103,9 @@ namespace SHADE
|
||||||
template <IsArithmetic T>
|
template <IsArithmetic T>
|
||||||
T SHMath::GenerateRandomNumber(T lowerBound, T upperBound)
|
T SHMath::GenerateRandomNumber(T lowerBound, T upperBound)
|
||||||
{
|
{
|
||||||
|
if (lowerBound > upperBound)
|
||||||
|
std::swap(lowerBound, upperBound);
|
||||||
|
|
||||||
if constexpr (IsIntegral<T>)
|
if constexpr (IsIntegral<T>)
|
||||||
{
|
{
|
||||||
std::uniform_int_distribution<T> distribution(lowerBound, upperBound);
|
std::uniform_int_distribution<T> distribution(lowerBound, upperBound);
|
||||||
|
@ -120,7 +123,7 @@ namespace SHADE
|
||||||
bool SHMath::CompareFloat(T lhs, T rhs, T absTolerance, T relTolerance)
|
bool SHMath::CompareFloat(T lhs, T rhs, T absTolerance, T relTolerance)
|
||||||
{
|
{
|
||||||
const T RTOL = relTolerance * Max(std::fabs(lhs), std::fabs(rhs));
|
const T RTOL = relTolerance * Max(std::fabs(lhs), std::fabs(rhs));
|
||||||
return std::fabs(lhs - rhs) <= MAX(absTolerance, RTOL);
|
return std::fabs(lhs - rhs) <= Max(absTolerance, RTOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace SHADE
|
} // namespace SHADE
|
|
@ -15,6 +15,7 @@
|
||||||
// Project Headers
|
// Project Headers
|
||||||
#include "Vector/SHVec3.h"
|
#include "Vector/SHVec3.h"
|
||||||
#include "SHMatrix.h"
|
#include "SHMatrix.h"
|
||||||
|
#include "SHMathHelpers.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/SHLogger.h"
|
||||||
|
|
||||||
using namespace DirectX;
|
using namespace DirectX;
|
||||||
|
@ -249,9 +250,30 @@ namespace SHADE
|
||||||
|
|
||||||
SHVec3 SHQuaternion::ToEuler() const noexcept
|
SHVec3 SHQuaternion::ToEuler() const noexcept
|
||||||
{
|
{
|
||||||
// TODO (Diren)
|
const float xx = x * x;
|
||||||
|
const float yy = y * y;
|
||||||
|
const float zz = z * z;
|
||||||
|
|
||||||
return SHVec3::Zero;
|
const float m31 = 2.f * x * z + 2.f * y * w;
|
||||||
|
const float m32 = 2.f * y * z - 2.f * x * w;
|
||||||
|
const float m33 = 1.f - 2.f * xx - 2.f * yy;
|
||||||
|
|
||||||
|
const float cy = sqrtf(m33 * m33 + m31 * m31);
|
||||||
|
const float cx = atan2f(-m32, cy);
|
||||||
|
if (cy > 16.0f * SHMath::EPSILON)
|
||||||
|
{
|
||||||
|
const float m12 = 2.f * x * y + 2.f * z * w;
|
||||||
|
const float m22 = 1.f - 2.f * xx - 2.f * zz;
|
||||||
|
|
||||||
|
return SHVec3(cx, atan2f(m31, m33), atan2f(m12, m22));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const float m11 = 1.f - 2.f * yy - 2.f * zz;
|
||||||
|
const float m21 = 2.f * x * y - 2.f * z * w;
|
||||||
|
|
||||||
|
return SHVec3(cx, 0.f, atan2f(-m21, m11));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string SHQuaternion::ToString() const noexcept
|
std::string SHQuaternion::ToString() const noexcept
|
||||||
|
|
|
@ -24,43 +24,6 @@ namespace SHADE
|
||||||
, dirty { true }
|
, dirty { true }
|
||||||
{}
|
{}
|
||||||
|
|
||||||
SHTransformComponent::SHTransformComponent(const SHTransformComponent& rhs) noexcept
|
|
||||||
: SHComponent {}
|
|
||||||
, dirty { true }
|
|
||||||
, local { rhs.local }
|
|
||||||
, world { rhs.world }
|
|
||||||
{}
|
|
||||||
|
|
||||||
SHTransformComponent::SHTransformComponent(SHTransformComponent&& rhs) noexcept
|
|
||||||
: SHComponent {}
|
|
||||||
, dirty { true }
|
|
||||||
, local { std::move(rhs.local) }
|
|
||||||
, world { std::move(rhs.world) }
|
|
||||||
{}
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
/* Operator Overload Definitions */
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
SHTransformComponent& SHTransformComponent::operator=(const SHTransformComponent& rhs) noexcept
|
|
||||||
{
|
|
||||||
dirty = true;
|
|
||||||
local = rhs.local;
|
|
||||||
world = rhs.world;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
SHTransformComponent& SHTransformComponent::operator=(SHTransformComponent&& rhs) noexcept
|
|
||||||
{
|
|
||||||
dirty = true;
|
|
||||||
local = std::move(rhs.local);
|
|
||||||
world = std::move(rhs.world);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
/* Getter Function Definitions */
|
/* Getter Function Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
#include <rttr/registration>
|
#include <rttr/registration>
|
||||||
|
|
||||||
// Project Headers
|
// Project Headers
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
#include "ECS_Base/Components/SHComponent.h"
|
#include "ECS_Base/Components/SHComponent.h"
|
||||||
|
@ -41,15 +42,15 @@ namespace SHADE
|
||||||
~SHTransformComponent () override = default;
|
~SHTransformComponent () override = default;
|
||||||
|
|
||||||
SHTransformComponent () noexcept;
|
SHTransformComponent () noexcept;
|
||||||
SHTransformComponent (const SHTransformComponent& rhs) noexcept;
|
SHTransformComponent (const SHTransformComponent& rhs) noexcept = default;
|
||||||
SHTransformComponent (SHTransformComponent&& rhs) noexcept;
|
SHTransformComponent (SHTransformComponent&& rhs) noexcept = default;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Operator Overloads */
|
/* Operator Overloads */
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SHTransformComponent& operator=(const SHTransformComponent& rhs) noexcept;
|
SHTransformComponent& operator=(const SHTransformComponent& rhs) noexcept = default;
|
||||||
SHTransformComponent& operator=(SHTransformComponent&& rhs) noexcept;
|
SHTransformComponent& operator=(SHTransformComponent&& rhs) noexcept = default;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Getter Functions */
|
/* Getter Functions */
|
||||||
|
|
|
@ -0,0 +1,149 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHColliderComponent.cpp
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Implementation for a Collider Component.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#include <SHpch.h>
|
||||||
|
|
||||||
|
// Primary Header
|
||||||
|
#include "SHColliderComponent.h"
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
#include "Physics/SHPhysicsSystem.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHColliderComponent::SHColliderComponent() noexcept
|
||||||
|
: system { nullptr }
|
||||||
|
{}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
const SHVec3& SHColliderComponent::GetPosition() const noexcept
|
||||||
|
{
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHQuaternion& SHColliderComponent::GetOrientation() const noexcept
|
||||||
|
{
|
||||||
|
return orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHVec3 SHColliderComponent::GetRotation() const noexcept
|
||||||
|
{
|
||||||
|
return orientation.ToEuler();
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHColliderComponent::Colliders& SHColliderComponent::GetColliders() const noexcept
|
||||||
|
{
|
||||||
|
return colliders;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHCollider& SHColliderComponent::GetCollider(int index)
|
||||||
|
{
|
||||||
|
if (index < 0 || static_cast<size_t>(index) >= colliders.size())
|
||||||
|
throw std::invalid_argument("Out-of-range access!");
|
||||||
|
|
||||||
|
return colliders[index].first;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Public Function Member Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SHColliderComponent::OnCreate()
|
||||||
|
{
|
||||||
|
system = SHSystemManager::GetSystem<SHPhysicsSystem>();
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, Collider Component not added!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
system->AddCollider(GetEID());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHColliderComponent::OnDestroy()
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to remove Collider component!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
system->RemoveCollider(GetEID());
|
||||||
|
}
|
||||||
|
|
||||||
|
SHBoundingBox* SHColliderComponent::AddBoundingBox() noexcept
|
||||||
|
{
|
||||||
|
const auto TYPE = SHCollider::Type::BOX;
|
||||||
|
|
||||||
|
const auto BOX_PAIR = std::make_pair(SHCollider{TYPE}, true);
|
||||||
|
auto& collider = colliders.emplace_back(BOX_PAIR).first;
|
||||||
|
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to add Box Collider!")
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics System
|
||||||
|
system->AddCollisionShape(GetEID(), collider.GetShape());
|
||||||
|
|
||||||
|
return reinterpret_cast<SHBoundingBox*>(collider.GetShape());
|
||||||
|
}
|
||||||
|
|
||||||
|
//void SHColliderComponent::AddSphere() noexcept
|
||||||
|
//{
|
||||||
|
// const auto TYPE = SHCollider::Type::SPHERE;
|
||||||
|
|
||||||
|
// if (!system)
|
||||||
|
// {
|
||||||
|
// SHLOG_ERROR("Physics system does not exist, unable to add Sphere Collider!")
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Notify Physics System
|
||||||
|
//}
|
||||||
|
|
||||||
|
void SHColliderComponent::RemoveCollider(int index)
|
||||||
|
{
|
||||||
|
if (index < 0 || static_cast<size_t>(index) >= colliders.size())
|
||||||
|
throw std::invalid_argument("Out-of-range access!");
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
auto it = colliders.begin();
|
||||||
|
for (; it != colliders.end(); ++it)
|
||||||
|
{
|
||||||
|
if (idx == index)
|
||||||
|
break;
|
||||||
|
|
||||||
|
++idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
it = colliders.erase(it);
|
||||||
|
|
||||||
|
// Notify Physics System
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to remove Collider!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
system->RemoveCollisionShape(GetEID(), index);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace SHADE
|
|
@ -0,0 +1,96 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHColliderComponent.h
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Interface for a Collider Component.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <rttr/registration>
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "ECS_Base/Components/SHComponent.h"
|
||||||
|
#include "Physics/SHCollider.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class SH_API SHColliderComponent : public SHComponent
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Friends */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
friend class SHPhysicsSystem;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
using ColliderDirtyPair = std::pair<SHCollider, bool>;
|
||||||
|
using Colliders = std::vector<ColliderDirtyPair>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHColliderComponent () noexcept;
|
||||||
|
SHColliderComponent (const SHColliderComponent& rhs) noexcept = default;
|
||||||
|
SHColliderComponent (SHColliderComponent&& rhs) noexcept = default;
|
||||||
|
~SHColliderComponent () override = default;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Operator Overloads */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHColliderComponent& operator=(const SHColliderComponent& rhs) noexcept = default;
|
||||||
|
SHColliderComponent& operator=(SHColliderComponent&& rhs) noexcept = default;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
[[nodiscard]] bool HasChanged () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] const SHVec3& GetPosition () const noexcept;
|
||||||
|
[[nodiscard]] const SHQuaternion& GetOrientation () const noexcept;
|
||||||
|
[[nodiscard]] SHVec3 GetRotation () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] const Colliders& GetColliders () const noexcept;
|
||||||
|
[[nodiscard]] SHCollider& GetCollider (int index);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void OnCreate () override;
|
||||||
|
void OnDestroy () override;
|
||||||
|
|
||||||
|
SHBoundingBox* AddBoundingBox () noexcept;
|
||||||
|
|
||||||
|
void RemoveCollider (int index);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Data Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHPhysicsSystem* system;
|
||||||
|
|
||||||
|
SHVec3 position;
|
||||||
|
SHQuaternion orientation;
|
||||||
|
Colliders colliders;
|
||||||
|
|
||||||
|
};
|
||||||
|
} // namespace SHADE
|
|
@ -0,0 +1,406 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHRigidBodyComponent.cpp
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Implementation for a Rigidbody Component.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#include <SHpch.h>
|
||||||
|
|
||||||
|
// Primary Header
|
||||||
|
#include "SHRigidBodyComponent.h"
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
#include "Physics/SHPhysicsSystem.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHRigidBodyComponent::SHRigidBodyComponent() noexcept
|
||||||
|
: type { Type::DYNAMIC }
|
||||||
|
, flags { 0 }
|
||||||
|
, dirtyFlags { 0 }
|
||||||
|
, interpolate { true }
|
||||||
|
, system { nullptr }
|
||||||
|
, mass { 1.0f }
|
||||||
|
, drag { 0.01f }
|
||||||
|
, angularDrag { 0.01f }
|
||||||
|
|
||||||
|
{
|
||||||
|
// Set default flags: Gravity & Sleeping enabled
|
||||||
|
flags |= 1U << 0;
|
||||||
|
flags |= 1U << 1;
|
||||||
|
|
||||||
|
// Set all dirty flags to true
|
||||||
|
dirtyFlags = 1023;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::IsGravityEnabled() const noexcept
|
||||||
|
{
|
||||||
|
return flags & (1U << 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::IsAllowedToSleep() const noexcept
|
||||||
|
{
|
||||||
|
return flags & (1U << 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::IsInterpolating() const noexcept
|
||||||
|
{
|
||||||
|
return interpolate;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHRigidBodyComponent::Type SHRigidBodyComponent::GetType() const noexcept
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
float SHRigidBodyComponent::GetMass() const noexcept
|
||||||
|
{
|
||||||
|
return mass;
|
||||||
|
}
|
||||||
|
|
||||||
|
float SHRigidBodyComponent::GetDrag() const noexcept
|
||||||
|
{
|
||||||
|
return drag;
|
||||||
|
}
|
||||||
|
|
||||||
|
float SHRigidBodyComponent::GetAngularDrag() const noexcept
|
||||||
|
{
|
||||||
|
return angularDrag;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::GetFreezePositionX() const noexcept
|
||||||
|
{
|
||||||
|
return flags & (1U << 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::GetFreezePositionY() const noexcept
|
||||||
|
{
|
||||||
|
return flags & (1U << 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::GetFreezePositionZ() const noexcept
|
||||||
|
{
|
||||||
|
return flags & (1U << 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::GetFreezeRotationX() const noexcept
|
||||||
|
{
|
||||||
|
return flags & (1U << 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::GetFreezeRotationY() const noexcept
|
||||||
|
{
|
||||||
|
return flags & (1U << 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHRigidBodyComponent::GetFreezeRotationZ() const noexcept
|
||||||
|
{
|
||||||
|
return flags & (1U << 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHRigidBodyComponent::GetForce() const noexcept
|
||||||
|
{
|
||||||
|
return force;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHRigidBodyComponent::GetTorque() const noexcept
|
||||||
|
{
|
||||||
|
return torque;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHRigidBodyComponent::GetLinearVelocity() const noexcept
|
||||||
|
{
|
||||||
|
return linearVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHRigidBodyComponent::GetAngularVelocity() const noexcept
|
||||||
|
{
|
||||||
|
return angularVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHRigidBodyComponent::GetPosition() const noexcept
|
||||||
|
{
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHQuaternion& SHRigidBodyComponent::GetOrientation() const noexcept
|
||||||
|
{
|
||||||
|
return orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHVec3 SHRigidBodyComponent::GetRotation() const noexcept
|
||||||
|
{
|
||||||
|
return orientation.ToEuler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Setter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetType(Type newType) noexcept
|
||||||
|
{
|
||||||
|
if (type == newType)
|
||||||
|
return;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << 4;
|
||||||
|
type = newType;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetGravityEnabled(bool enableGravity) noexcept
|
||||||
|
{
|
||||||
|
constexpr int FLAG_POS = 0;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << FLAG_POS;
|
||||||
|
enableGravity ? flags |= (1U << FLAG_POS) : flags &= ~(1U << FLAG_POS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetIsAllowedToSleep(bool isAllowedToSleep) noexcept
|
||||||
|
{
|
||||||
|
constexpr int FLAG_POS = 1;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << 1;
|
||||||
|
isAllowedToSleep ? flags |= (1U << FLAG_POS) : flags &= ~(1U << FLAG_POS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetFreezePositionX(bool freezePositionX) noexcept
|
||||||
|
{
|
||||||
|
constexpr int FLAG_POS = 2;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << 2;
|
||||||
|
freezePositionX ? flags |= (1U << FLAG_POS) : flags &= ~(1U << FLAG_POS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetFreezePositionY(bool freezePositionY) noexcept
|
||||||
|
{
|
||||||
|
constexpr int FLAG_POS = 3;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << 2;
|
||||||
|
freezePositionY ? flags |= (1U << FLAG_POS) : flags &= ~(1U << FLAG_POS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetFreezePositionZ(bool freezePositionZ) noexcept
|
||||||
|
{
|
||||||
|
constexpr int FLAG_POS = 4;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << 2;
|
||||||
|
freezePositionZ ? flags |= (1U << FLAG_POS) : flags &= ~(1U << FLAG_POS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetFreezeRotationX(bool freezeRotationX) noexcept
|
||||||
|
{
|
||||||
|
constexpr int FLAG_POS = 5;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << 3;
|
||||||
|
freezeRotationX ? flags |= (1U << FLAG_POS) : flags &= ~(1U << FLAG_POS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetFreezeRotationY(bool freezeRotationY) noexcept
|
||||||
|
{
|
||||||
|
constexpr int FLAG_POS = 6;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << 3;
|
||||||
|
freezeRotationY ? flags |= (1U << FLAG_POS) : flags &= ~(1U << FLAG_POS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetFreezeRotationZ(bool freezeRotationZ) noexcept
|
||||||
|
{
|
||||||
|
constexpr int FLAG_POS = 7;
|
||||||
|
|
||||||
|
dirtyFlags |= 1U << 3;
|
||||||
|
freezeRotationZ ? flags |= (1U << FLAG_POS) : flags &= ~(1U << FLAG_POS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetInterpolate(bool allowInterpolation) noexcept
|
||||||
|
{
|
||||||
|
interpolate = allowInterpolation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetMass(float newMass) noexcept
|
||||||
|
{
|
||||||
|
dirtyFlags |= 1U << 5;
|
||||||
|
mass = newMass;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetDrag(float newDrag) noexcept
|
||||||
|
{
|
||||||
|
dirtyFlags |= 1U << 6;
|
||||||
|
drag = newDrag;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetAngularDrag(float newAngularDrag) noexcept
|
||||||
|
{
|
||||||
|
dirtyFlags |= 1U << 7;
|
||||||
|
angularDrag = newAngularDrag;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetLinearVelocity(const SHVec3& newLinearVelocity) noexcept
|
||||||
|
{
|
||||||
|
dirtyFlags |= 1U << 8;
|
||||||
|
linearVelocity = newLinearVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::SetAngularVelocity(const SHVec3& newAngularVelocity) noexcept
|
||||||
|
{
|
||||||
|
dirtyFlags |= 1U << 9;
|
||||||
|
angularVelocity = newAngularVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Public Function Member Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::OnCreate()
|
||||||
|
{
|
||||||
|
system = SHSystemManager::GetSystem<SHPhysicsSystem>();
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, Rigid Body Component not added!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics System
|
||||||
|
system->AddRigidBody(GetEID());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::OnDestroy()
|
||||||
|
{
|
||||||
|
// Notify Physics System
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to remove Rigid Body Component!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
system->RemoveRigidBody(GetEID());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::AddForce(const SHVec3& force) const noexcept
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to Add Force to a body!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics Systems
|
||||||
|
system->AddForce(GetEID(), force);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::AddForceAtLocalPos(const SHVec3& force, const SHVec3& localPos) const noexcept
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to Add Force to a body!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics Systems
|
||||||
|
system->AddForceAtLocalPos(GetEID(), force, localPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::AddForceAtWorldPos(const SHVec3& force, const SHVec3& worldPos) const noexcept
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to Add Force to a body!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics Systems
|
||||||
|
system->AddForceAtWorldPos(GetEID(), force, worldPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::AddRelativeForce(const SHVec3& relativeForce) const noexcept
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to Add Force to a body!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics Systems
|
||||||
|
system->AddRelativeForce(GetEID(), force);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::AddRelativeForceAtLocalPos(const SHVec3& relativeForce, const SHVec3& localPos) const noexcept
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to Add Force to a body!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics Systems
|
||||||
|
system->AddRelativeForceAtLocalPos(GetEID(), force, localPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::AddRelativeForceAtWorldPos(const SHVec3& relativeForce, const SHVec3& worldPos) const noexcept
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to Add Force to a body!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics Systems
|
||||||
|
system->AddRelativeForceAtWorldPos(GetEID(), force, worldPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::AddTorque(const SHVec3& torque) const noexcept
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to Add Force to a body!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics Systems
|
||||||
|
system->AddTorque(GetEID(), torque);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHRigidBodyComponent::AddRelativeTorque(const SHVec3& relativeTorque) const noexcept
|
||||||
|
{
|
||||||
|
if (!system)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Physics system does not exist, unable to Add Force to a body!")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify Physics Systems
|
||||||
|
system->AddRelativeTorque(GetEID(), relativeTorque);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace SHADE
|
||||||
|
|
||||||
|
RTTR_REGISTRATION
|
||||||
|
{
|
||||||
|
using namespace SHADE;
|
||||||
|
using namespace rttr;
|
||||||
|
|
||||||
|
registration::class_<SHRigidBodyComponent>("RigidBody Component")
|
||||||
|
.property("Type" , &SHRigidBodyComponent::GetType , &SHRigidBodyComponent::SetType )
|
||||||
|
.property("Mass" , &SHRigidBodyComponent::GetMass , &SHRigidBodyComponent::SetMass )
|
||||||
|
.property("Drag" , &SHRigidBodyComponent::GetDrag , &SHRigidBodyComponent::SetDrag )
|
||||||
|
.property("Angular Drag" , &SHRigidBodyComponent::GetAngularDrag , &SHRigidBodyComponent::SetAngularDrag )
|
||||||
|
.property("Use Gravity" , &SHRigidBodyComponent::IsGravityEnabled , &SHRigidBodyComponent::SetGravityEnabled )
|
||||||
|
.property("Interpolate" , &SHRigidBodyComponent::IsInterpolating , &SHRigidBodyComponent::SetInterpolate )
|
||||||
|
.property("Freeze Position X" , &SHRigidBodyComponent::GetFreezePositionX , &SHRigidBodyComponent::SetFreezePositionX )
|
||||||
|
.property("Freeze Position Y" , &SHRigidBodyComponent::GetFreezePositionY , &SHRigidBodyComponent::SetFreezePositionY )
|
||||||
|
.property("Freeze Position Z" , &SHRigidBodyComponent::GetFreezePositionZ , &SHRigidBodyComponent::SetFreezePositionZ )
|
||||||
|
.property("Freeze Rotation X" , &SHRigidBodyComponent::GetFreezeRotationX , &SHRigidBodyComponent::SetFreezeRotationX )
|
||||||
|
.property("Freeze Rotation Y" , &SHRigidBodyComponent::GetFreezeRotationY , &SHRigidBodyComponent::SetFreezeRotationY )
|
||||||
|
.property("Freeze Rotation Z" , &SHRigidBodyComponent::GetFreezeRotationZ , &SHRigidBodyComponent::SetFreezeRotationZ );
|
||||||
|
}
|
|
@ -0,0 +1,171 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHRigidBodyComponent.h
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Interface for a Rigidbody Component.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <rttr/registration>
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "ECS_Base/Components/SHComponent.h"
|
||||||
|
#include "Physics/SHPhysicsObject.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class SH_API SHRigidBodyComponent : public SHComponent
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Friends */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
friend class SHPhysicsSystem;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
enum class Type
|
||||||
|
{
|
||||||
|
STATIC
|
||||||
|
, KINEMATIC
|
||||||
|
, DYNAMIC
|
||||||
|
|
||||||
|
, COUNT
|
||||||
|
};
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHRigidBodyComponent () noexcept;
|
||||||
|
SHRigidBodyComponent (const SHRigidBodyComponent& rhs) noexcept = default;
|
||||||
|
SHRigidBodyComponent (SHRigidBodyComponent&& rhs) noexcept = default;
|
||||||
|
~SHRigidBodyComponent () override = default;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Operator Overloads */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHRigidBodyComponent& operator=(const SHRigidBodyComponent& rhs) noexcept = default;
|
||||||
|
SHRigidBodyComponent& operator=(SHRigidBodyComponent&& rhs) noexcept = default;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
[[nodiscard]] bool IsGravityEnabled () const noexcept;
|
||||||
|
[[nodiscard]] bool IsAllowedToSleep () const noexcept;
|
||||||
|
[[nodiscard]] bool IsInterpolating () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] Type GetType () const noexcept;
|
||||||
|
[[nodiscard]] float GetMass () const noexcept;
|
||||||
|
[[nodiscard]] float GetDrag () const noexcept;
|
||||||
|
[[nodiscard]] float GetAngularDrag () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] bool GetFreezePositionX () const noexcept;
|
||||||
|
[[nodiscard]] bool GetFreezePositionY () const noexcept;
|
||||||
|
[[nodiscard]] bool GetFreezePositionZ () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] bool GetFreezeRotationX () const noexcept;
|
||||||
|
[[nodiscard]] bool GetFreezeRotationY () const noexcept;
|
||||||
|
[[nodiscard]] bool GetFreezeRotationZ () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] const SHVec3& GetForce () const noexcept;
|
||||||
|
[[nodiscard]] const SHVec3& GetTorque () const noexcept;
|
||||||
|
[[nodiscard]] const SHVec3& GetLinearVelocity () const noexcept;
|
||||||
|
[[nodiscard]] const SHVec3& GetAngularVelocity () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] const SHVec3& GetPosition () const noexcept;
|
||||||
|
[[nodiscard]] const SHQuaternion& GetOrientation () const noexcept;
|
||||||
|
[[nodiscard]] SHVec3 GetRotation () const noexcept;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Setter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SetType (Type newType) noexcept;
|
||||||
|
|
||||||
|
void SetGravityEnabled (bool enableGravity) noexcept;
|
||||||
|
void SetIsAllowedToSleep(bool isAllowedToSleep) noexcept;
|
||||||
|
void SetFreezePositionX (bool freezePositionX) noexcept;
|
||||||
|
void SetFreezePositionY (bool freezePositionY) noexcept;
|
||||||
|
void SetFreezePositionZ (bool freezePositionZ) noexcept;
|
||||||
|
void SetFreezeRotationX (bool freezeRotationX) noexcept;
|
||||||
|
void SetFreezeRotationY (bool freezeRotationY) noexcept;
|
||||||
|
void SetFreezeRotationZ (bool freezeRotationZ) noexcept;
|
||||||
|
void SetInterpolate (bool allowInterpolation) noexcept;
|
||||||
|
|
||||||
|
void SetMass (float newMass) noexcept;
|
||||||
|
void SetDrag (float newDrag) noexcept;
|
||||||
|
void SetAngularDrag (float newAngularDrag) noexcept;
|
||||||
|
|
||||||
|
void SetLinearVelocity (const SHVec3& newLinearVelocity) noexcept;
|
||||||
|
void SetAngularVelocity (const SHVec3& newAngularVelocity) noexcept;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void OnCreate () override;
|
||||||
|
void OnDestroy () override;
|
||||||
|
|
||||||
|
void AddForce (const SHVec3& force) const noexcept;
|
||||||
|
void AddForceAtLocalPos (const SHVec3& force, const SHVec3& localPos) const noexcept;
|
||||||
|
void AddForceAtWorldPos (const SHVec3& force, const SHVec3& worldPos) const noexcept;
|
||||||
|
|
||||||
|
void AddRelativeForce (const SHVec3& relativeForce) const noexcept;
|
||||||
|
void AddRelativeForceAtLocalPos (const SHVec3& relativeForce, const SHVec3& localPos) const noexcept;
|
||||||
|
void AddRelativeForceAtWorldPos (const SHVec3& relativeForce, const SHVec3& worldPos) const noexcept;
|
||||||
|
|
||||||
|
void AddTorque (const SHVec3& torque) const noexcept;
|
||||||
|
void AddRelativeTorque (const SHVec3& relativeTorque) const noexcept;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Data Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
Type type;
|
||||||
|
|
||||||
|
// rX rY rZ pX pY pZ slp g
|
||||||
|
uint8_t flags;
|
||||||
|
// 0 0 0 0 0 0 aV lV aD d m t ag lc slp g
|
||||||
|
uint16_t dirtyFlags;
|
||||||
|
bool interpolate;
|
||||||
|
|
||||||
|
SHPhysicsSystem* system;
|
||||||
|
|
||||||
|
float mass;
|
||||||
|
float drag;
|
||||||
|
float angularDrag;
|
||||||
|
|
||||||
|
SHVec3 force;
|
||||||
|
SHVec3 linearVelocity;
|
||||||
|
|
||||||
|
SHVec3 torque;
|
||||||
|
SHVec3 angularVelocity;
|
||||||
|
|
||||||
|
// TODO(Diren): Once quaternions have replaced euler angles in transforms, store it for the rigidbody.
|
||||||
|
|
||||||
|
SHVec3 position;
|
||||||
|
SHQuaternion orientation;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
RTTR_ENABLE()
|
||||||
|
};
|
||||||
|
} // namespace SHADE
|
|
@ -0,0 +1,215 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHCollider.cpp
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Implementation for a Collider.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#include <SHpch.h>
|
||||||
|
|
||||||
|
// Primary Header
|
||||||
|
#include "SHCollider.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHCollider::SHCollider(Type colliderType)
|
||||||
|
: type { colliderType }
|
||||||
|
, isTrigger { false }
|
||||||
|
, dirty { true }
|
||||||
|
, shape { nullptr }
|
||||||
|
{
|
||||||
|
CreateShape();
|
||||||
|
}
|
||||||
|
|
||||||
|
SHCollider::SHCollider(const SHCollider& rhs) noexcept
|
||||||
|
: type { rhs.type}
|
||||||
|
, isTrigger { rhs.isTrigger }
|
||||||
|
, dirty { true }
|
||||||
|
, shape { nullptr }
|
||||||
|
{
|
||||||
|
CreateShape();
|
||||||
|
|
||||||
|
// TODO(Diren): Copy transform data over
|
||||||
|
}
|
||||||
|
|
||||||
|
SHCollider::SHCollider(SHCollider&& rhs) noexcept
|
||||||
|
: type { rhs.type}
|
||||||
|
, isTrigger { rhs.isTrigger }
|
||||||
|
, dirty { true }
|
||||||
|
, shape { nullptr }
|
||||||
|
{
|
||||||
|
CreateShape();
|
||||||
|
|
||||||
|
// TODO(Diren): Copy transform data over
|
||||||
|
}
|
||||||
|
|
||||||
|
SHCollider::~SHCollider() noexcept
|
||||||
|
{
|
||||||
|
delete shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Operator Overload Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHCollider& SHCollider::operator=(const SHCollider& rhs) noexcept
|
||||||
|
{
|
||||||
|
type = rhs.type;
|
||||||
|
isTrigger = rhs.isTrigger;
|
||||||
|
dirty = true;
|
||||||
|
|
||||||
|
CreateShape();
|
||||||
|
|
||||||
|
// TODO(Diren): Copy transform data over
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHCollider& SHCollider::operator=(SHCollider&& rhs) noexcept
|
||||||
|
{
|
||||||
|
type = rhs.type;
|
||||||
|
isTrigger = rhs.isTrigger;
|
||||||
|
dirty = true;
|
||||||
|
|
||||||
|
CreateShape();
|
||||||
|
|
||||||
|
// TODO(Diren): Copy transform data over
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
bool SHCollider::HasChanged() const noexcept
|
||||||
|
{
|
||||||
|
return dirty;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHCollider::IsTrigger() const noexcept
|
||||||
|
{
|
||||||
|
return isTrigger;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHCollider::Type SHCollider::GetType() const noexcept
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHShape* SHCollider::GetShape() const noexcept
|
||||||
|
{
|
||||||
|
return shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
float SHCollider::GetFriction() const noexcept
|
||||||
|
{
|
||||||
|
// TODO(Diren): Fix after implementing materials
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
float SHCollider::GetBounciness() const noexcept
|
||||||
|
{
|
||||||
|
// TODO(Diren): Fix after implementing materials
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
float SHCollider::GetDensity() const noexcept
|
||||||
|
{
|
||||||
|
// TODO(Diren): Fix after implementing materials
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHVec3 SHCollider::GetPosition() const noexcept
|
||||||
|
{
|
||||||
|
// TODO(Diren): Fix after linking transform data
|
||||||
|
return SHVec3::Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHCollider::GetPositionOffset() const noexcept
|
||||||
|
{
|
||||||
|
return positionOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHQuaternion SHCollider::GetOrientation() const noexcept
|
||||||
|
{
|
||||||
|
// TODO(Diren): Fix after linking transform data
|
||||||
|
return SHQuaternion::Identity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Setter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SHCollider::SetType(Type newType) noexcept
|
||||||
|
{
|
||||||
|
if (type == newType)
|
||||||
|
return;
|
||||||
|
|
||||||
|
dirty = true;
|
||||||
|
|
||||||
|
type = newType;
|
||||||
|
CreateShape();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCollider::SetIsTrigger(bool trigger) noexcept
|
||||||
|
{
|
||||||
|
dirty = true;
|
||||||
|
isTrigger = trigger;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCollider::SetFriction(float friction) noexcept
|
||||||
|
{
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCollider::SetBounciness(float bounciness) noexcept
|
||||||
|
{
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCollider::SetDensity(float density) noexcept
|
||||||
|
{
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCollider::SetPositionOffset(const SHVec3& posOffset) noexcept
|
||||||
|
{
|
||||||
|
dirty = true;
|
||||||
|
positionOffset = posOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Private Member Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SHCollider::CreateShape()
|
||||||
|
{
|
||||||
|
// Remove current shape
|
||||||
|
delete shape;
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case Type::BOX: CreateBoundingBox(); break;
|
||||||
|
case Type::SPHERE: CreateSphere(); break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCollider::CreateBoundingBox()
|
||||||
|
{
|
||||||
|
shape = new SHBoundingBox{ SHVec3::Zero, SHVec3::One };
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCollider::CreateSphere()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace SHADE
|
|
@ -0,0 +1,108 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHCollider.h
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Interface for a Collider.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "Math/Geometry/SHBoundingBox.h"
|
||||||
|
#include "Math/SHQuaternion.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class SH_API SHCollider
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
enum class Type
|
||||||
|
{
|
||||||
|
BOX
|
||||||
|
, SPHERE
|
||||||
|
, CAPSULE
|
||||||
|
, CONVEX_HULL
|
||||||
|
, CONVEX_MESH
|
||||||
|
};
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHCollider (Type colliderType);
|
||||||
|
|
||||||
|
SHCollider (const SHCollider& rhs) noexcept;
|
||||||
|
SHCollider (SHCollider&& rhs) noexcept;
|
||||||
|
~SHCollider () noexcept;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Operator Overloads */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHCollider& operator=(const SHCollider& rhs) noexcept;
|
||||||
|
SHCollider& operator=(SHCollider&& rhs) noexcept;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
[[nodiscard]] bool HasChanged () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] bool IsTrigger () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] Type GetType () const noexcept;
|
||||||
|
[[nodiscard]] SHShape* GetShape () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] float GetFriction () const noexcept;
|
||||||
|
[[nodiscard]] float GetBounciness () const noexcept;
|
||||||
|
[[nodiscard]] float GetDensity () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] SHVec3 GetPosition () const noexcept;
|
||||||
|
[[nodiscard]] const SHVec3& GetPositionOffset () const noexcept;
|
||||||
|
[[nodiscard]] SHQuaternion GetOrientation () const noexcept;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Setter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SetType (Type newType) noexcept;
|
||||||
|
|
||||||
|
void SetIsTrigger (bool isTrigger) noexcept;
|
||||||
|
void SetFriction (float friction) noexcept;
|
||||||
|
void SetBounciness (float bounciness) noexcept;
|
||||||
|
void SetDensity (float density) noexcept;
|
||||||
|
|
||||||
|
void SetPositionOffset (const SHVec3& positionOffset) noexcept;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Data Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
Type type;
|
||||||
|
bool isTrigger;
|
||||||
|
bool dirty;
|
||||||
|
SHShape* shape;
|
||||||
|
SHVec3 positionOffset;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void CreateShape ();
|
||||||
|
void CreateBoundingBox ();
|
||||||
|
void CreateSphere ();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace SHADE
|
|
@ -0,0 +1,121 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHPhysicsObject.cpp
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Implementation for a Physics Object.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#include <SHpch.h>
|
||||||
|
|
||||||
|
// Primary Header
|
||||||
|
#include "SHPhysicsObject.h"
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
#include "SHPhysicsSystem.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHPhysicsObject::SHPhysicsObject() noexcept
|
||||||
|
: entityID { MAX_EID }
|
||||||
|
, isRigidBody { false }
|
||||||
|
, hasColliders{ false }
|
||||||
|
, rp3dBody { nullptr }
|
||||||
|
{}
|
||||||
|
|
||||||
|
SHPhysicsObject::~SHPhysicsObject() noexcept
|
||||||
|
{
|
||||||
|
rp3dBody = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHVec3 SHPhysicsObject::GetPosition() const noexcept
|
||||||
|
{
|
||||||
|
SHVec3 result;
|
||||||
|
|
||||||
|
if (rp3dBody)
|
||||||
|
{
|
||||||
|
const auto& RP3D_RESULT = rp3dBody->getTransform().getPosition();
|
||||||
|
result = SHVec3{ RP3D_RESULT.x, RP3D_RESULT.y, RP3D_RESULT.z };
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHQuaternion SHPhysicsObject::GetOrientation() const noexcept
|
||||||
|
{
|
||||||
|
SHQuaternion result;
|
||||||
|
|
||||||
|
if (rp3dBody)
|
||||||
|
{
|
||||||
|
const auto& RP3D_RESULT = rp3dBody->getTransform().getOrientation();
|
||||||
|
result = SHQuaternion{ RP3D_RESULT.x, RP3D_RESULT.y, RP3D_RESULT.z, RP3D_RESULT.w };
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHVec3 SHPhysicsObject::GetRotation() const noexcept
|
||||||
|
{
|
||||||
|
SHVec3 result;
|
||||||
|
|
||||||
|
if (rp3dBody)
|
||||||
|
{
|
||||||
|
const auto& RP3D_RESULT = rp3dBody->getTransform().getOrientation();
|
||||||
|
result = SHQuaternion{ RP3D_RESULT.x, RP3D_RESULT.y, RP3D_RESULT.z, RP3D_RESULT.w }.ToEuler();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Setter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SHPhysicsObject::SetPosition(const SHVec3& position) noexcept
|
||||||
|
{
|
||||||
|
const rp3d::Vector3 RP3D_POS { position.x, position.y, position.z };
|
||||||
|
|
||||||
|
rp3d::Transform rp3dTF;
|
||||||
|
rp3dTF.setPosition(RP3D_POS);
|
||||||
|
rp3dTF.setOrientation(rp3dBody->getTransform().getOrientation());
|
||||||
|
|
||||||
|
rp3dBody->setTransform(rp3dTF);
|
||||||
|
prevTransform = rp3dTF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsObject::SetOrientation(const SHQuaternion& orientation) noexcept
|
||||||
|
{
|
||||||
|
const rp3d::Quaternion RP3D_ORIENTATION { orientation.x, orientation.y, orientation.z, orientation.w };
|
||||||
|
|
||||||
|
rp3d::Transform rp3dTF;
|
||||||
|
rp3dTF.setPosition(rp3dBody->getTransform().getPosition());
|
||||||
|
rp3dTF.setOrientation(RP3D_ORIENTATION);
|
||||||
|
|
||||||
|
rp3dBody->setTransform(rp3dTF);
|
||||||
|
prevTransform = rp3dTF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsObject::SetRotation(const SHVec3& rotation) noexcept
|
||||||
|
{
|
||||||
|
const rp3d::Quaternion RP3D_ORIENTATION = rp3d::Quaternion::fromEulerAngles( rotation.x, rotation.y, rotation.z );
|
||||||
|
|
||||||
|
rp3d::Transform rp3dTF;
|
||||||
|
rp3dTF.setPosition(rp3dBody->getTransform().getPosition());
|
||||||
|
rp3dTF.setOrientation(RP3D_ORIENTATION);
|
||||||
|
|
||||||
|
rp3dBody->setTransform(rp3dTF);
|
||||||
|
prevTransform = rp3dTF;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace SHADE
|
|
@ -0,0 +1,89 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHPhysicsObject.h
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Interface for a Physics Object.
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <reactphysics3d/reactphysics3d.h>
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "Math/Vector/SHVec3.h"
|
||||||
|
#include "Math/SHQuaternion.h"
|
||||||
|
#include "ECS_Base/Entity/SHEntity.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class SH_API SHPhysicsObject
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Friends */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
friend class SHPhysicsSystem;
|
||||||
|
friend class SHRigidBodyComponent;
|
||||||
|
friend class SHColliderComponent;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHPhysicsObject () noexcept;
|
||||||
|
SHPhysicsObject (const SHPhysicsObject& rhs) noexcept = default;
|
||||||
|
SHPhysicsObject (SHPhysicsObject&& rhs) noexcept = default;
|
||||||
|
virtual ~SHPhysicsObject () noexcept;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Operator Overloads */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHPhysicsObject& operator=(const SHPhysicsObject& rhs) noexcept = default;
|
||||||
|
SHPhysicsObject& operator=(SHPhysicsObject&& rhs) noexcept = default;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
[[nodiscard]] SHVec3 GetPosition () const noexcept;
|
||||||
|
[[nodiscard]] SHQuaternion GetOrientation () const noexcept;
|
||||||
|
[[nodiscard]] SHVec3 GetRotation () const noexcept;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Setter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SetPosition (const SHVec3& position) noexcept;
|
||||||
|
void SetOrientation (const SHQuaternion& orientation) noexcept;
|
||||||
|
void SetRotation (const SHVec3& rotation) noexcept;
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Data Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
EntityID entityID;
|
||||||
|
bool isRigidBody;
|
||||||
|
bool hasColliders;
|
||||||
|
|
||||||
|
rp3d::CollisionBody* rp3dBody; // Can be either a collision body or a rigid body
|
||||||
|
rp3d::Transform prevTransform; // Cached transform for interpolation
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
} // namespace SHADE
|
|
@ -0,0 +1,747 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHPhysicsSystem.cpp
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Implementation for the Physics System
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#include <SHpch.h>
|
||||||
|
|
||||||
|
// Primary Header
|
||||||
|
#include "SHPhysicsSystem.h"
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
|
#include "Scene/SHSceneManager.h"
|
||||||
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHPhysicsSystem::SHPhysicsSystem()
|
||||||
|
: worldUpdated { false }
|
||||||
|
, interpolationFactor { 0.0 }
|
||||||
|
, fixedDT { 60.0 }
|
||||||
|
, world { nullptr }
|
||||||
|
{}
|
||||||
|
|
||||||
|
SHPhysicsSystem::PhysicsPreUpdate::PhysicsPreUpdate()
|
||||||
|
: SHSystemRoutine { "Physics PreUpdate", true }
|
||||||
|
{}
|
||||||
|
|
||||||
|
SHPhysicsSystem::PhysicsFixedUpdate::PhysicsFixedUpdate()
|
||||||
|
: SHFixedSystemRoutine { DEFAULT_FIXED_STEP, "Physics FixedUpdate", false }
|
||||||
|
{}
|
||||||
|
|
||||||
|
SHPhysicsSystem::PhysicsPostUpdate::PhysicsPostUpdate()
|
||||||
|
: SHSystemRoutine { "Physics PostUpdate", false }
|
||||||
|
{}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
double SHPhysicsSystem::GetFixedDT() const noexcept
|
||||||
|
{
|
||||||
|
return fixedDT;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHPhysicsSystem::IsSleepingEnabled() const noexcept
|
||||||
|
{
|
||||||
|
if (world)
|
||||||
|
return world->isSleepingEnabled();
|
||||||
|
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHVec3 SHPhysicsSystem::GetWorldGravity() const noexcept
|
||||||
|
{
|
||||||
|
SHVec3 result;
|
||||||
|
|
||||||
|
if (world)
|
||||||
|
{
|
||||||
|
const auto RP3D_GRAVITY = world->getGravity();
|
||||||
|
result.x = RP3D_GRAVITY.x;
|
||||||
|
result.y = RP3D_GRAVITY.y;
|
||||||
|
result.z = RP3D_GRAVITY.z;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t SHPhysicsSystem::GetNumberVelocityIterations() const noexcept
|
||||||
|
{
|
||||||
|
if (world)
|
||||||
|
return world->getNbIterationsVelocitySolver();
|
||||||
|
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t SHPhysicsSystem::GetNumberPositionIterations() const noexcept
|
||||||
|
{
|
||||||
|
if (world)
|
||||||
|
return world->getNbIterationsPositionSolver();
|
||||||
|
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Setter Function Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SetFixedDT(double fixedUpdateRate) noexcept
|
||||||
|
{
|
||||||
|
fixedDT = fixedUpdateRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SetWorldGravity(const SHVec3& gravity) const noexcept
|
||||||
|
{
|
||||||
|
if (world)
|
||||||
|
{
|
||||||
|
const rp3d::Vector3 G { gravity.x, gravity.y, gravity.z };
|
||||||
|
world->setGravity(G);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SetNumberVelocityIterations(uint16_t numVelIterations) const noexcept
|
||||||
|
{
|
||||||
|
if (world)
|
||||||
|
{
|
||||||
|
world->setNbIterationsVelocitySolver(numVelIterations);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SetNumberPositionIterations(uint16_t numPosIterations) const noexcept
|
||||||
|
{
|
||||||
|
if (world)
|
||||||
|
{
|
||||||
|
world->setNbIterationsPositionSolver(numPosIterations);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SetSleepingEnabled(bool enableSleeping) const noexcept
|
||||||
|
{
|
||||||
|
if (world)
|
||||||
|
{
|
||||||
|
world->enableSleeping(enableSleeping);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SetWorldSettings(const WorldSettings& settings) const noexcept
|
||||||
|
{
|
||||||
|
if (world)
|
||||||
|
{
|
||||||
|
const rp3d::Vector3 G { settings.gravity.x, settings.gravity.y, settings.gravity.z };
|
||||||
|
world->setGravity(G);
|
||||||
|
world->setNbIterationsVelocitySolver(settings.numVelocitySolverIterations);
|
||||||
|
world->setNbIterationsPositionSolver(settings.numPositionSolverIterations);
|
||||||
|
world->enableSleeping(settings.sleepingEnabled);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLOGV_WARNING("No physics world has been initialised!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Public Function Member Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SHPhysicsSystem::Init()
|
||||||
|
{
|
||||||
|
using namespace rp3d;
|
||||||
|
|
||||||
|
// Create a physics world with the default settings
|
||||||
|
PhysicsWorld::WorldSettings settings;
|
||||||
|
settings.gravity = Vector3{ 0.0f, -9.81f, 0.0f };
|
||||||
|
settings.isSleepingEnabled = true;
|
||||||
|
settings.defaultVelocitySolverNbIterations = 8;
|
||||||
|
settings.defaultPositionSolverNbIterations = 3;
|
||||||
|
settings.defaultFrictionCoefficient = 0.4f;
|
||||||
|
settings.defaultBounciness = 0.0f;
|
||||||
|
|
||||||
|
world = factory.createPhysicsWorld(settings);
|
||||||
|
|
||||||
|
// Set up solvers
|
||||||
|
world->setContactsPositionCorrectionTechnique(rp3d::ContactsPositionCorrectionTechnique::SPLIT_IMPULSES);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::Exit()
|
||||||
|
{
|
||||||
|
factory.destroyPhysicsWorld(world);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddRigidBody(EntityID entityID) noexcept
|
||||||
|
{
|
||||||
|
#ifdef _DEBUG
|
||||||
|
SHLOG_INFO("Adding a Rigidbody to the Physics World.")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Check if entity is already a physics object
|
||||||
|
auto* physicsObject = GetPhysicsObject(entityID);
|
||||||
|
if (!physicsObject)
|
||||||
|
{
|
||||||
|
physicsObject = &(map.emplace(entityID, SHPhysicsObject{}).first->second);
|
||||||
|
physicsObject->entityID = entityID;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get entity transform
|
||||||
|
auto const* SHADE_TF = SHComponentManager::GetComponent_s<SHTransformComponent>(entityID);
|
||||||
|
|
||||||
|
// Possibly redundant
|
||||||
|
if (!SHADE_TF)
|
||||||
|
{
|
||||||
|
SHComponentManager::AddComponent<SHTransformComponent>(entityID);
|
||||||
|
SHADE_TF = SHComponentManager::GetComponent<SHTransformComponent>(entityID);
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHADE_POS = SHADE_TF->GetWorldPosition();
|
||||||
|
const SHVec3& SHADE_ROT = SHADE_TF->GetWorldRotation();
|
||||||
|
|
||||||
|
const rp3d::Vector3 RP3D_POS { SHADE_POS.x, SHADE_POS.y, SHADE_POS.z };
|
||||||
|
const rp3d::Quaternion RP3D_ROT = rp3d::Quaternion::fromEulerAngles( SHADE_ROT.x, SHADE_ROT.y, SHADE_ROT.z );
|
||||||
|
|
||||||
|
const rp3d::Transform RP3D_TF { RP3D_POS, RP3D_ROT };
|
||||||
|
|
||||||
|
// If collider already exists
|
||||||
|
if (physicsObject->hasColliders)
|
||||||
|
world->destroyCollisionBody(physicsObject->rp3dBody);
|
||||||
|
|
||||||
|
physicsObject->rp3dBody = world->createRigidBody(RP3D_TF);
|
||||||
|
physicsObject->isRigidBody = true;
|
||||||
|
|
||||||
|
// Recreate colliders
|
||||||
|
if (physicsObject->hasColliders)
|
||||||
|
{
|
||||||
|
const auto& COLLIDERS = SHComponentManager::GetComponent<SHColliderComponent>(entityID)->GetColliders();
|
||||||
|
for (const auto& collider : COLLIDERS | std::views::keys)
|
||||||
|
{
|
||||||
|
switch (collider.GetType())
|
||||||
|
{
|
||||||
|
case SHCollider::Type::BOX:
|
||||||
|
{
|
||||||
|
SHBoundingBox* box = reinterpret_cast<SHBoundingBox*>(collider.GetShape());
|
||||||
|
const SHVec3& SHADE_EXTENTS = box->GetHalfExtents();
|
||||||
|
|
||||||
|
rp3d::Vector3 RP3D_EXTENTS { SHADE_EXTENTS.x, SHADE_EXTENTS.y, SHADE_EXTENTS.z };
|
||||||
|
rp3d::BoxShape* newBox = factory.createBoxShape(RP3D_EXTENTS);
|
||||||
|
|
||||||
|
// TODO(Diren): Handle offsets
|
||||||
|
physicsObject->rp3dBody->addCollider(newBox, RP3D_TF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SHCollider::Type::SPHERE:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// TODO(Diren): Add more collider shapes
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddCollider(EntityID entityID) noexcept
|
||||||
|
{
|
||||||
|
#ifdef _DEBUG
|
||||||
|
SHLOG_INFO("Adding a Collider to the Physics World.")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Check if entity is already a physics object
|
||||||
|
auto* physicsObject = GetPhysicsObject(entityID);
|
||||||
|
if (!physicsObject)
|
||||||
|
{
|
||||||
|
physicsObject = &(map.emplace(entityID, SHPhysicsObject{}).first->second);
|
||||||
|
physicsObject->entityID = entityID;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get entity transform
|
||||||
|
auto const* SHADE_TF = SHComponentManager::GetComponent_s<SHTransformComponent>(entityID);
|
||||||
|
|
||||||
|
// Possibly redundant
|
||||||
|
if (!SHADE_TF)
|
||||||
|
{
|
||||||
|
SHComponentManager::AddComponent<SHTransformComponent>(entityID);
|
||||||
|
SHADE_TF = SHComponentManager::GetComponent<SHTransformComponent>(entityID);
|
||||||
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHADE_POS = SHADE_TF->GetWorldPosition();
|
||||||
|
const SHVec3& SHADE_ROT = SHADE_TF->GetWorldRotation();
|
||||||
|
|
||||||
|
const rp3d::Vector3 RP3D_POS { SHADE_POS.x, SHADE_POS.y, SHADE_POS.z };
|
||||||
|
const rp3d::Quaternion RP3D_ROT = rp3d::Quaternion::fromEulerAngles( SHADE_ROT.x, SHADE_ROT.y, SHADE_ROT.z );
|
||||||
|
|
||||||
|
const rp3d::Transform RP3D_TF { RP3D_POS, RP3D_ROT };
|
||||||
|
|
||||||
|
// No rb
|
||||||
|
if (!physicsObject->isRigidBody)
|
||||||
|
physicsObject->rp3dBody = world->createCollisionBody(RP3D_TF);
|
||||||
|
|
||||||
|
const auto& COLLIDERS = SHComponentManager::GetComponent<SHColliderComponent>(entityID)->GetColliders();
|
||||||
|
for (const auto& collider : COLLIDERS | std::views::keys)
|
||||||
|
{
|
||||||
|
switch (collider.GetType())
|
||||||
|
{
|
||||||
|
case SHCollider::Type::BOX:
|
||||||
|
{
|
||||||
|
SHBoundingBox* box = reinterpret_cast<SHBoundingBox*>(collider.GetShape());
|
||||||
|
const SHVec3& SHADE_EXTENTS = box->GetHalfExtents();
|
||||||
|
|
||||||
|
rp3d::Vector3 RP3D_EXTENTS { SHADE_EXTENTS.x, SHADE_EXTENTS.y, SHADE_EXTENTS.z };
|
||||||
|
rp3d::BoxShape* newBox = factory.createBoxShape(RP3D_EXTENTS);
|
||||||
|
|
||||||
|
// TODO(Diren): Handle offsets
|
||||||
|
physicsObject->rp3dBody->addCollider(newBox, RP3D_TF);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SHCollider::Type::SPHERE:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// TODO(Diren): Add more collider shapes
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
physicsObject->hasColliders = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::RemoveRigidBody(EntityID entityID) noexcept
|
||||||
|
{
|
||||||
|
#ifdef _DEBUG
|
||||||
|
SHLOG_INFO("Removing a Rigidbody from the Physics World.")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::RemoveCollider(EntityID entityID) noexcept
|
||||||
|
{
|
||||||
|
#ifdef _DEBUG
|
||||||
|
SHLOG_INFO("Removing a Collider from the Physics World.")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddForce(EntityID entityID, const SHVec3& force) const noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddForceAtLocalPos(EntityID entityID, const SHVec3& force, const SHVec3& localPos) const noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddForceAtWorldPos(EntityID entityID, const SHVec3& force, const SHVec3& worldPos) const noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddRelativeForce(EntityID entityID, const SHVec3& relativeForce) const noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddRelativeForceAtLocalPos(EntityID entityID, const SHVec3& relativeForce, const SHVec3& localPos) const noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddRelativeForceAtWorldPos(EntityID entityID, const SHVec3& relativeForce, const SHVec3& worldPos) const noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddTorque(EntityID entityID, const SHVec3& torque) const noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddRelativeTorque(EntityID entityID, const SHVec3& relativeTorque) const noexcept
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::AddCollisionShape(EntityID entityID, SHShape* shape)
|
||||||
|
{
|
||||||
|
auto* physicsObject = GetPhysicsObject(entityID);
|
||||||
|
|
||||||
|
switch (shape->GetType())
|
||||||
|
{
|
||||||
|
case SHShape::Type::BOUNDING_BOX:
|
||||||
|
{
|
||||||
|
auto* box = reinterpret_cast<SHBoundingBox*>(shape);
|
||||||
|
const SHVec3& SHADE_EXTENTS = box->GetHalfExtents();
|
||||||
|
|
||||||
|
rp3d::Vector3 RP3D_EXTENTS { SHADE_EXTENTS.x, SHADE_EXTENTS.y, SHADE_EXTENTS.z };
|
||||||
|
rp3d::BoxShape* newBox = factory.createBoxShape(RP3D_EXTENTS);
|
||||||
|
|
||||||
|
// TODO(Diren): Handle offsets
|
||||||
|
|
||||||
|
rp3d::Transform tf = rp3d::Transform::identity();
|
||||||
|
physicsObject->rp3dBody->addCollider(newBox, tf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SHShape::Type::SPHERE:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// TODO(Diren): Add more collider shapes
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::RemoveCollisionShape(EntityID entityID, int index)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::PhysicsPreUpdate::Execute(double) noexcept
|
||||||
|
{
|
||||||
|
auto* system = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||||
|
|
||||||
|
// Update bodies and colliders if component is dirty
|
||||||
|
system->SyncRigidBodyComponents(SHComponentManager::GetDense<SHRigidBodyComponent>());
|
||||||
|
system->SyncColliderComponents(SHComponentManager::GetDense<SHColliderComponent>());
|
||||||
|
|
||||||
|
// Sync transforms
|
||||||
|
for (auto& physicsObject : system->map | std::views::values)
|
||||||
|
{
|
||||||
|
const auto* TF = SHComponentManager::GetComponent<SHTransformComponent>(physicsObject.entityID);
|
||||||
|
if (TF->HasChanged())
|
||||||
|
{
|
||||||
|
physicsObject.SetPosition(TF->GetWorldPosition());
|
||||||
|
physicsObject.SetRotation(TF->GetWorldRotation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::PhysicsFixedUpdate::Execute(double dt) noexcept
|
||||||
|
{
|
||||||
|
auto* system = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||||
|
fixedTimeStep = 1.0 / system->fixedDT;
|
||||||
|
accumulatedTime += dt;
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
while (accumulatedTime > fixedTimeStep)
|
||||||
|
{
|
||||||
|
system->world->update(static_cast<rp3d::decimal>(fixedTimeStep));
|
||||||
|
|
||||||
|
accumulatedTime -= fixedTimeStep;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
stats.numSteps = count;
|
||||||
|
system->worldUpdated = count > 0;
|
||||||
|
|
||||||
|
system->interpolationFactor = accumulatedTime / fixedTimeStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::PhysicsPostUpdate::Execute(double) noexcept
|
||||||
|
{
|
||||||
|
auto* system = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||||
|
|
||||||
|
// Interpolate transforms for rendering
|
||||||
|
if (system->worldUpdated)
|
||||||
|
{
|
||||||
|
system->SyncTransforms();
|
||||||
|
// TODO(Diren): Handle trigger messages for scripting
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Private Function Member Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHPhysicsObject* SHPhysicsSystem::GetPhysicsObject(EntityID entityID) noexcept
|
||||||
|
{
|
||||||
|
const auto it = map.find(entityID);
|
||||||
|
if (it == map.end())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Entity {} is not in the physics system!", entityID)
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &(it->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SyncRigidBodyComponents(std::vector<SHRigidBodyComponent>& denseArray) noexcept
|
||||||
|
{
|
||||||
|
if (denseArray.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (auto& comp : denseArray)
|
||||||
|
{
|
||||||
|
const EntityID ENTITY_ID = comp.GetEID();
|
||||||
|
|
||||||
|
// Get physicsObject
|
||||||
|
auto const* physicsObject = GetPhysicsObject(ENTITY_ID);
|
||||||
|
|
||||||
|
const bool RP3D_ACTIVE = physicsObject->rp3dBody->isActive();
|
||||||
|
// TODO(Diren): Check if active in hierarchy
|
||||||
|
const bool COMPONENT_ACTIVE = comp.isActive;
|
||||||
|
|
||||||
|
if (RP3D_ACTIVE != COMPONENT_ACTIVE)
|
||||||
|
physicsObject->rp3dBody->setIsActive(COMPONENT_ACTIVE);
|
||||||
|
|
||||||
|
if (!COMPONENT_ACTIVE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (comp.dirtyFlags > 0)
|
||||||
|
{
|
||||||
|
SyncRigidBody(physicsObject, &comp);
|
||||||
|
comp.dirtyFlags = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SyncColliderComponents(std::vector<SHColliderComponent>& denseArray) noexcept
|
||||||
|
{
|
||||||
|
if (denseArray.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (auto& comp : denseArray)
|
||||||
|
{
|
||||||
|
const EntityID ENTITY_ID = comp.GetEID();
|
||||||
|
|
||||||
|
// Get physicsObject
|
||||||
|
auto const* physicsObject = GetPhysicsObject(ENTITY_ID);
|
||||||
|
|
||||||
|
const bool RP3D_ACTIVE = physicsObject->rp3dBody->isActive();
|
||||||
|
// TODO(Diren): Check if active in hierarchy
|
||||||
|
const bool COMPONENT_ACTIVE = comp.isActive;
|
||||||
|
|
||||||
|
if (RP3D_ACTIVE != COMPONENT_ACTIVE)
|
||||||
|
physicsObject->rp3dBody->setIsActive(COMPONENT_ACTIVE);
|
||||||
|
|
||||||
|
if (!COMPONENT_ACTIVE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SyncCollider(physicsObject, &comp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SyncTransforms() noexcept
|
||||||
|
{
|
||||||
|
for (auto& pair : map)
|
||||||
|
{
|
||||||
|
const EntityID ENTITY_ID = pair.first;
|
||||||
|
SHPhysicsObject& physicsObject = pair.second;
|
||||||
|
|
||||||
|
rp3d::Vector3 rp3dPos;
|
||||||
|
rp3d::Quaternion rp3dRot;
|
||||||
|
|
||||||
|
const rp3d::Transform CURRENT_TF = physicsObject.rp3dBody->getTransform();
|
||||||
|
|
||||||
|
// Check if transform should be interpolated
|
||||||
|
|
||||||
|
if (physicsObject.isRigidBody)
|
||||||
|
{
|
||||||
|
auto const* rbComponent = SHComponentManager::GetComponent<SHRigidBodyComponent>(ENTITY_ID);
|
||||||
|
if (rbComponent->GetType() == SHRigidBodyComponent::Type::STATIC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (rbComponent->IsInterpolating())
|
||||||
|
{
|
||||||
|
const rp3d::Transform PREV_TF = physicsObject.prevTransform;
|
||||||
|
const rp3d::Transform INTERPOLATED_TF = rp3d::Transform::interpolateTransforms(PREV_TF, CURRENT_TF, static_cast<rp3d::decimal>(interpolationFactor));
|
||||||
|
|
||||||
|
|
||||||
|
rp3dPos = INTERPOLATED_TF.getPosition();
|
||||||
|
rp3dRot = INTERPOLATED_TF.getOrientation();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rp3dPos = CURRENT_TF.getPosition();
|
||||||
|
rp3dRot = CURRENT_TF.getOrientation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rp3dPos = CURRENT_TF.getPosition();
|
||||||
|
rp3dRot = CURRENT_TF.getOrientation();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert RP3D Transform to SHADE
|
||||||
|
const SHVec3 SHADE_POS = SHVec3{ rp3dPos.x, rp3dPos.y, rp3dPos.z };
|
||||||
|
const SHVec3 SHADE_ROT = SHQuaternion{ rp3dRot.x, rp3dRot.y, rp3dRot.z, rp3dRot.w }.ToEuler();
|
||||||
|
|
||||||
|
auto* tfComponent = SHComponentManager::GetComponent<SHTransformComponent>(ENTITY_ID);
|
||||||
|
tfComponent->SetWorldPosition(SHADE_POS);
|
||||||
|
tfComponent->SetWorldRotation(SHADE_ROT);
|
||||||
|
|
||||||
|
// Cache transforms
|
||||||
|
physicsObject.prevTransform = CURRENT_TF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SyncRigidBody(SHPhysicsObject const* physicsObject, const SHRigidBodyComponent* comp) noexcept
|
||||||
|
{
|
||||||
|
auto* rigidBody = reinterpret_cast<rp3d::RigidBody*>(physicsObject->rp3dBody);
|
||||||
|
|
||||||
|
const uint16_t RB_FLAGS = comp->dirtyFlags;
|
||||||
|
const size_t NUM_FLAGS = sizeof(RB_FLAGS) * 8U;
|
||||||
|
for (size_t i = 0; i < NUM_FLAGS; ++i)
|
||||||
|
{
|
||||||
|
// Check if current dirty flag has been set to true
|
||||||
|
if (RB_FLAGS & 1U << i)
|
||||||
|
{
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case 0: // Gravity
|
||||||
|
{
|
||||||
|
rigidBody->enableGravity(comp->IsGravityEnabled());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1: // Sleeping
|
||||||
|
{
|
||||||
|
rigidBody->setIsAllowedToSleep(comp->IsAllowedToSleep());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: // Linear Constraints
|
||||||
|
{
|
||||||
|
SetRP3DLinearConstraints(rigidBody, comp->flags);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3: // Angular Constraints
|
||||||
|
{
|
||||||
|
SetRP3DAngularConstraints(rigidBody, comp->flags);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 4: // Type
|
||||||
|
{
|
||||||
|
rigidBody->setType(static_cast<rp3d::BodyType>(comp->GetType()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 5: // Mass
|
||||||
|
{
|
||||||
|
rigidBody->setMass(comp->GetMass());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 6: // Drag
|
||||||
|
{
|
||||||
|
rigidBody->setLinearDamping(comp->GetDrag());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 7: // Angular Drag
|
||||||
|
{
|
||||||
|
rigidBody->setAngularDamping(comp->GetAngularDrag());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 8: // Linear Velocity
|
||||||
|
{
|
||||||
|
const SHVec3& SHADE_VEL = comp->GetLinearVelocity();
|
||||||
|
rp3d::Vector3 RP3D_VEL { SHADE_VEL.x, SHADE_VEL.y, SHADE_VEL.z };
|
||||||
|
|
||||||
|
rigidBody->setLinearVelocity(RP3D_VEL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 9: // Angular Velocity
|
||||||
|
{
|
||||||
|
const SHVec3& SHADE_VEL = comp->GetAngularVelocity();
|
||||||
|
rp3d::Vector3 RP3D_VEL { SHADE_VEL.x, SHADE_VEL.y, SHADE_VEL.z };
|
||||||
|
|
||||||
|
rigidBody->setAngularVelocity(RP3D_VEL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SetRP3DLinearConstraints(rp3d::RigidBody const* rp3dRigidBody, uint8_t rbFlags) noexcept
|
||||||
|
{
|
||||||
|
const rp3d::Vector3 CONSTRAINTS
|
||||||
|
{
|
||||||
|
rbFlags & 1U << 2 ? 0.0f : 1.0f,
|
||||||
|
rbFlags & 1U << 3 ? 0.0f : 1.0f,
|
||||||
|
rbFlags & 1U << 4 ? 0.0f : 1.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
rp3dRigidBody->setLinearLockAxisFactor(CONSTRAINTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SetRP3DAngularConstraints(rp3d::RigidBody const* rp3dRigidBody, uint8_t rbFlags) noexcept
|
||||||
|
{
|
||||||
|
const rp3d::Vector3 CONSTRAINTS
|
||||||
|
{
|
||||||
|
rbFlags & 1U << 5 ? 0.0f : 1.0f,
|
||||||
|
rbFlags & 1U << 6 ? 0.0f : 1.0f,
|
||||||
|
rbFlags & 1U << 7 ? 0.0f : 1.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
rp3dRigidBody->setAngularLockAxisFactor(CONSTRAINTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPhysicsSystem::SyncCollider(SHPhysicsObject const* physicsObject, SHColliderComponent* comp) noexcept
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
for (auto& [collider, dirty] : comp->colliders)
|
||||||
|
{
|
||||||
|
if (!dirty)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (collider.GetType())
|
||||||
|
{
|
||||||
|
case SHCollider::Type::BOX:
|
||||||
|
{
|
||||||
|
SHBoundingBox* box = reinterpret_cast<SHBoundingBox*>(collider.GetShape());
|
||||||
|
const SHVec3& SHADE_EXTENTS = box->GetHalfExtents();
|
||||||
|
|
||||||
|
rp3d::Vector3 RP3D_EXTENTS { SHADE_EXTENTS.x, SHADE_EXTENTS.y, SHADE_EXTENTS.z };
|
||||||
|
|
||||||
|
auto* rp3dBoxShape = reinterpret_cast<rp3d::BoxShape*>(physicsObject->rp3dBody->getCollider(index)->getCollisionShape());
|
||||||
|
rp3dBoxShape->setHalfExtents(RP3D_EXTENTS);
|
||||||
|
|
||||||
|
if (rp3dBoxShape)
|
||||||
|
{
|
||||||
|
SHLOG_INFO("Updating box things")
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SHCollider::Type::SPHERE:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
dirty = false;
|
||||||
|
++index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace SHADE
|
|
@ -0,0 +1,203 @@
|
||||||
|
/****************************************************************************************
|
||||||
|
* \file SHPhysicsSystem.h
|
||||||
|
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||||
|
* \brief Interface for the Physics System
|
||||||
|
*
|
||||||
|
* \copyright Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
****************************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include <reactphysics3d/reactphysics3d.h>
|
||||||
|
|
||||||
|
// Project Headers
|
||||||
|
#include "SHPhysicsObject.h"
|
||||||
|
#include "Components/SHRigidBodyComponent.h"
|
||||||
|
#include "Components/SHColliderComponent.h"
|
||||||
|
|
||||||
|
#include "Scene/SHSceneGraph.h"
|
||||||
|
#include "ECS_Base/System/SHSystemRoutine.h"
|
||||||
|
#include "ECS_Base/System/SHFixedSystemRoutine.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class SH_API SHPhysicsSystem : public SHSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
struct WorldSettings
|
||||||
|
{
|
||||||
|
SHVec3 gravity;
|
||||||
|
uint16_t numVelocitySolverIterations;
|
||||||
|
uint16_t numPositionSolverIterations;
|
||||||
|
bool sleepingEnabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SHPhysicsSystem();
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Getter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
[[nodiscard]] double GetFixedDT () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] bool IsSleepingEnabled () const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]] SHVec3 GetWorldGravity () const noexcept;
|
||||||
|
[[nodiscard]] uint16_t GetNumberVelocityIterations () const noexcept;
|
||||||
|
[[nodiscard]] uint16_t GetNumberPositionIterations () const noexcept;
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Setter Functions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SetFixedDT (double fixedUpdateRate) noexcept;
|
||||||
|
void SetWorldGravity (const SHVec3& gravity) const noexcept;
|
||||||
|
void SetNumberVelocityIterations (uint16_t numVelIterations) const noexcept;
|
||||||
|
void SetNumberPositionIterations (uint16_t numPosIterations) const noexcept;
|
||||||
|
void SetSleepingEnabled (bool enableSleeping) const noexcept;
|
||||||
|
|
||||||
|
void SetWorldSettings (const WorldSettings& settings) const noexcept;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void Init () override;
|
||||||
|
void Exit () override;
|
||||||
|
|
||||||
|
void AddRigidBody (EntityID entityID) noexcept;
|
||||||
|
void AddCollider (EntityID entityID) noexcept;
|
||||||
|
void RemoveRigidBody (EntityID entityID) noexcept;
|
||||||
|
void RemoveCollider (EntityID entityID) noexcept;
|
||||||
|
|
||||||
|
void AddForce (EntityID entityID, const SHVec3& force) const noexcept;
|
||||||
|
void AddForceAtLocalPos (EntityID entityID, const SHVec3& force, const SHVec3& localPos) const noexcept;
|
||||||
|
void AddForceAtWorldPos (EntityID entityID, const SHVec3& force, const SHVec3& worldPos) const noexcept;
|
||||||
|
|
||||||
|
void AddRelativeForce (EntityID entityID, const SHVec3& relativeForce) const noexcept;
|
||||||
|
void AddRelativeForceAtLocalPos (EntityID entityID, const SHVec3& relativeForce, const SHVec3& localPos) const noexcept;
|
||||||
|
void AddRelativeForceAtWorldPos (EntityID entityID, const SHVec3& relativeForce, const SHVec3& worldPos) const noexcept;
|
||||||
|
|
||||||
|
void AddTorque (EntityID entityID, const SHVec3& torque) const noexcept;
|
||||||
|
void AddRelativeTorque (EntityID entityID, const SHVec3& relativeTorque) const noexcept;
|
||||||
|
|
||||||
|
void AddCollisionShape (EntityID entityID, SHShape* shape);
|
||||||
|
void RemoveCollisionShape (EntityID entityID, int index);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* System Routines */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Synchronises RP3D with SHADE
|
||||||
|
*/
|
||||||
|
class SH_API PhysicsPreUpdate : public SHSystemRoutine
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor */
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
PhysicsPreUpdate();
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void Execute(double dt) noexcept override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SH_API PhysicsFixedUpdate : public SHFixedSystemRoutine
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor */
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
PhysicsFixedUpdate();
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void Execute (double dt) noexcept override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SH_API PhysicsPostUpdate : public SHSystemRoutine
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
/* Constructors & Destructor */
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
PhysicsPostUpdate();
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*-------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void Execute(double dt) noexcept override;
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Type Definitions */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
using EntityObjectMap = std::unordered_map<EntityID, SHPhysicsObject>;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Data Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// TODO(Diren): Store interpFactor
|
||||||
|
|
||||||
|
bool worldUpdated;
|
||||||
|
|
||||||
|
double interpolationFactor;
|
||||||
|
double fixedDT;
|
||||||
|
rp3d::PhysicsWorld* world;
|
||||||
|
|
||||||
|
rp3d::PhysicsCommon factory;
|
||||||
|
EntityObjectMap map;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Function Members */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
SHPhysicsObject* GetPhysicsObject (EntityID entityID) noexcept;
|
||||||
|
|
||||||
|
void SyncRigidBodyComponents (std::vector<SHRigidBodyComponent>& denseArray) noexcept;
|
||||||
|
void SyncColliderComponents (std::vector<SHColliderComponent>& denseArray) noexcept;
|
||||||
|
void SyncTransforms () noexcept;
|
||||||
|
// TODO(Diren): Trigger handling
|
||||||
|
|
||||||
|
static void SyncRigidBody (SHPhysicsObject const* physicsObject, const SHRigidBodyComponent* comp) noexcept;
|
||||||
|
static void SetRP3DLinearConstraints (rp3d::RigidBody const* rp3dRigidBody, uint8_t rbFlags) noexcept;
|
||||||
|
static void SetRP3DAngularConstraints (rp3d::RigidBody const* rp3dRigidBody, uint8_t rbFlags) noexcept;
|
||||||
|
|
||||||
|
static void SyncCollider (SHPhysicsObject const* physicsObject, SHColliderComponent* comp) noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace SHADE
|
|
@ -38,3 +38,4 @@
|
||||||
|
|
||||||
#include "Common/SHCommonTypes.h"
|
#include "Common/SHCommonTypes.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/SHLogger.h"
|
||||||
|
#include "Tools/SHException.h"
|
||||||
|
|
|
@ -75,10 +75,13 @@ namespace SHADE
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
#define SHASSERT(cond, msg) \
|
#define SHASSERT(cond, msg) \
|
||||||
if (!(cond)) \
|
if (!(cond)) \
|
||||||
{ \
|
{ \
|
||||||
SHLOGV_CRITICAL(msg) \
|
SHLOGV_CRITICAL(msg) \
|
||||||
std::abort(); \
|
std::abort(); \
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
#define SHASSERT(cond, msg) { }
|
||||||
|
#endif
|
||||||
|
|
|
@ -61,6 +61,12 @@ project "SHADE_Managed"
|
||||||
"MultiProcessorCompile"
|
"MultiProcessorCompile"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
disablewarnings
|
||||||
|
{
|
||||||
|
"4275"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
dependson
|
dependson
|
||||||
{
|
{
|
||||||
"yaml-cpp",
|
"yaml-cpp",
|
||||||
|
|
Loading…
Reference in New Issue