SP3-16 Slight rework to SHColour for compatibility #159
Binary file not shown.
|
@ -1,3 +1,3 @@
|
|||
Name: DeferredComposite_CS
|
||||
ID: 42814284
|
||||
ID: 45072428
|
||||
Type: 2
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,3 +1,3 @@
|
|||
Name: TestCube_FS
|
||||
ID: 37450402
|
||||
ID: 46377769
|
||||
Type: 2
|
||||
|
|
Binary file not shown.
|
@ -1,3 +1,3 @@
|
|||
Name: TestCube_VS
|
||||
ID: 41688429
|
||||
ID: 39210065
|
||||
Type: 2
|
||||
|
|
|
@ -108,13 +108,10 @@ namespace Sandbox
|
|||
SHComponentManager::CreateComponentSparseSet<SHColliderComponent>();
|
||||
SHComponentManager::CreateComponentSparseSet<SHTransformComponent>();
|
||||
SHComponentManager::CreateComponentSparseSet<SHRenderable>();
|
||||
SHComponentManager::CreateComponentSparseSet<SHCameraComponent>();
|
||||
//SHComponentManager::CreateComponentSparseSet<SHCameraComponent>();
|
||||
|
||||
SHAssetManager::Load();
|
||||
|
||||
auto id = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||
auto id2 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||
auto id3 = SHFamilyID<SHSystem>::GetID<SHGraphicsSystem>();
|
||||
|
||||
SHSystemManager::RegisterRoutine<SHAudioSystem, SHAudioSystem::AudioRoutine>();
|
||||
|
||||
|
|
|
@ -128,7 +128,6 @@ namespace Sandbox
|
|||
floorRigidBody.SetType(SHRigidBodyComponent::Type::STATIC);
|
||||
|
||||
auto* floorBox = floorCollider.AddBoundingBox();
|
||||
floorBox->SetHalfExtents(floorTransform.GetWorldScale() * 0.5f);
|
||||
|
||||
// Create blank entity with a script
|
||||
//testObj = SHADE::SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*****************************************************************************/
|
||||
#pragma once
|
||||
|
||||
#include <vulkan/vulkan.hpp>
|
||||
#include "SHAssetData.h"
|
||||
#include "SH_API.h"
|
||||
#include <vector>
|
||||
|
@ -17,12 +18,14 @@
|
|||
|
||||
namespace SHADE
|
||||
{
|
||||
//! Tighter control over types of shaders. Maps directly to their
|
||||
//! equivalent vk::ShaderStageFlagBits.
|
||||
enum class SH_SHADER_TYPE : uint8_t
|
||||
{
|
||||
VERTEX,
|
||||
FRAGMENT,
|
||||
COMPUTE,
|
||||
INAVLID_TYPE
|
||||
VERTEX = static_cast<uint8_t>(vk::ShaderStageFlagBits::eVertex),
|
||||
FRAGMENT = static_cast<uint8_t>(vk::ShaderStageFlagBits::eFragment),
|
||||
COMPUTE = static_cast<uint8_t>(vk::ShaderStageFlagBits::eCompute),
|
||||
INAVLID_TYPE = std::numeric_limits<uint8_t>::max()
|
||||
};
|
||||
|
||||
struct SH_API SHShaderAsset : SHAssetData
|
||||
|
|
|
@ -19,144 +19,145 @@
|
|||
|
||||
namespace SHADE
|
||||
{
|
||||
std::string SHShaderSourceCompiler::CompileShaderSourceToBinary(AssetPath path, SHShaderAsset const& data) noexcept
|
||||
{
|
||||
std::string newPath{ path.string() };
|
||||
std::string SHShaderSourceCompiler::CompileShaderSourceToBinary(AssetPath path, SHShaderAsset const& data) noexcept
|
||||
{
|
||||
std::string newPath{ path.string() };
|
||||
newPath = newPath.substr(0, newPath.find_last_of('.'));
|
||||
newPath += SHADER_BUILT_IN_EXTENSION.data();
|
||||
|
||||
std::ofstream file{ newPath, std::ios::binary | std::ios::out | std::ios::trunc };
|
||||
std::ofstream file{ newPath, std::ios::binary | std::ios::out | std::ios::trunc };
|
||||
|
||||
file.write(
|
||||
reinterpret_cast<char const*>(& data.shaderType), sizeof(uint8_t)
|
||||
);
|
||||
file.write(
|
||||
reinterpret_cast<char const*>(& data.shaderType), sizeof(uint8_t)
|
||||
);
|
||||
|
||||
size_t const byteCount = sizeof(uint32_t) * data.spirvBinary.size();
|
||||
size_t const byteCount = sizeof(uint32_t) * data.spirvBinary.size();
|
||||
|
||||
file.write(
|
||||
reinterpret_cast<char const*>(&byteCount), sizeof(size_t)
|
||||
);
|
||||
file.write(
|
||||
reinterpret_cast<char const*>(&byteCount), sizeof(size_t)
|
||||
);
|
||||
|
||||
file.write(
|
||||
reinterpret_cast<char const*>(data.spirvBinary.data()), byteCount
|
||||
);
|
||||
file.write(
|
||||
reinterpret_cast<char const*>(data.spirvBinary.data()), byteCount
|
||||
);
|
||||
|
||||
file.close();
|
||||
file.close();
|
||||
|
||||
return newPath;
|
||||
}
|
||||
return newPath;
|
||||
}
|
||||
|
||||
SHShaderAsset const* SHShaderSourceCompiler::CompileShaderSourceToMemory(std::string const& data, std::string const& name, SH_SHADER_TYPE type) noexcept
|
||||
{
|
||||
// shaderc compiler
|
||||
shaderc::Compiler compiler;
|
||||
shaderc::CompileOptions options;
|
||||
SHShaderAsset const* SHShaderSourceCompiler::CompileShaderSourceToMemory(std::string const& data, std::string const& name, SH_SHADER_TYPE type) noexcept
|
||||
{
|
||||
// shaderc compiler
|
||||
shaderc::Compiler compiler;
|
||||
shaderc::CompileOptions options;
|
||||
|
||||
options.AddMacroDefinition("MY_DEFINE", "1");
|
||||
options.AddMacroDefinition("MY_DEFINE", "1");
|
||||
|
||||
//TODO: Check if we need optimisation levels when compiling into spirv
|
||||
// Set optimization levels
|
||||
//if (opLevel != shaderc_optimization_level_zero)
|
||||
// options.SetOptimizationLevel(opLevel);
|
||||
//TODO: Check if we need optimisation levels when compiling into spirv
|
||||
// Set optimization levels
|
||||
//if (opLevel != shaderc_optimization_level_zero)
|
||||
// options.SetOptimizationLevel(opLevel);
|
||||
|
||||
// Attempt to get the shaderc equivalent shader stage
|
||||
shaderc_shader_kind shaderKind;
|
||||
switch (type)
|
||||
{
|
||||
case SH_SHADER_TYPE::VERTEX:
|
||||
shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader;
|
||||
break;
|
||||
case SH_SHADER_TYPE::FRAGMENT:
|
||||
shaderKind = shaderc_shader_kind::shaderc_glsl_fragment_shader;
|
||||
break;
|
||||
case SH_SHADER_TYPE::COMPUTE:
|
||||
shaderKind = shaderc_shader_kind::shaderc_glsl_compute_shader;
|
||||
break;
|
||||
default:
|
||||
shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader;
|
||||
break;
|
||||
}
|
||||
// Attempt to get the shaderc equivalent shader stage
|
||||
shaderc_shader_kind shaderKind;
|
||||
switch (type)
|
||||
{
|
||||
case SH_SHADER_TYPE::VERTEX:
|
||||
shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader;
|
||||
break;
|
||||
case SH_SHADER_TYPE::FRAGMENT:
|
||||
shaderKind = shaderc_shader_kind::shaderc_glsl_fragment_shader;
|
||||
break;
|
||||
case SH_SHADER_TYPE::COMPUTE:
|
||||
shaderKind = shaderc_shader_kind::shaderc_glsl_compute_shader;
|
||||
break;
|
||||
default:
|
||||
shaderKind = shaderc_shader_kind::shaderc_glsl_vertex_shader;
|
||||
break;
|
||||
}
|
||||
|
||||
// Compile the shader and get the result
|
||||
shaderc::SpvCompilationResult compileResult = compiler.CompileGlslToSpv(data, shaderKind, name.c_str(), options);
|
||||
// Compile the shader and get the result
|
||||
shaderc::SpvCompilationResult compileResult = compiler.CompileGlslToSpv(data, shaderKind, name.c_str(), options);
|
||||
|
||||
if (compileResult.GetCompilationStatus() != shaderc_compilation_status_success)
|
||||
{
|
||||
SHLOG_ERROR("Shaderc failed to compile GLSL shader to binary | " + compileResult.GetErrorMessage());
|
||||
return nullptr;
|
||||
}
|
||||
if (compileResult.GetCompilationStatus() != shaderc_compilation_status_success)
|
||||
{
|
||||
SHLOG_ERROR("Shaderc failed to compile GLSL shader to binary | " + compileResult.GetErrorMessage());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto result = new SHShaderAsset();
|
||||
result->spirvBinary.resize(compileResult.end() - compileResult.begin());
|
||||
auto result = new SHShaderAsset();
|
||||
result->spirvBinary.resize(compileResult.end() - compileResult.begin());
|
||||
|
||||
std::ranges::copy(compileResult.begin(), compileResult.end(), result->spirvBinary.data());
|
||||
std::ranges::copy(compileResult.begin(), compileResult.end(), result->spirvBinary.data());
|
||||
|
||||
result->name = name;
|
||||
result->shaderType = type;
|
||||
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
SH_SHADER_TYPE SHShaderSourceCompiler::GetShaderTypeFromFilename(std::string name) noexcept
|
||||
{
|
||||
for (auto i { 0}; i < SHADER_TYPE_MAX_COUNT; ++i)
|
||||
{
|
||||
if (name.find(SHADER_IDENTIFIERS[i].data()) != std::string::npos)
|
||||
{
|
||||
return static_cast<SH_SHADER_TYPE>(i);
|
||||
}
|
||||
}
|
||||
SH_SHADER_TYPE SHShaderSourceCompiler::GetShaderTypeFromFilename(std::string name) noexcept
|
||||
{
|
||||
for (auto i { 0 }; i < SHADER_TYPE_MAX_COUNT; ++i)
|
||||
{
|
||||
const auto& [SHADER_SUFFIX, SHADER_TYPE] = SHADER_IDENTIFIERS[i];
|
||||
if (name.find(SHADER_SUFFIX.data()) != std::string::npos)
|
||||
{
|
||||
return SHADER_TYPE;
|
||||
}
|
||||
}
|
||||
|
||||
return SH_SHADER_TYPE::INAVLID_TYPE;
|
||||
}
|
||||
return SH_SHADER_TYPE::INAVLID_TYPE;
|
||||
}
|
||||
|
||||
std::optional<AssetPath> SHShaderSourceCompiler::LoadAndCompileShader(AssetPath path) noexcept
|
||||
{
|
||||
auto type = GetShaderTypeFromFilename(path.filename().string());
|
||||
{
|
||||
auto type = GetShaderTypeFromFilename(path.filename().string());
|
||||
|
||||
if (type == SH_SHADER_TYPE::INAVLID_TYPE)
|
||||
{
|
||||
SHLOG_ERROR("Invalid filename for shaders, follow suffix in SHAssetMacros.h: {}", path.string());
|
||||
return {};
|
||||
}
|
||||
if (type == SH_SHADER_TYPE::INAVLID_TYPE)
|
||||
{
|
||||
SHLOG_ERROR("Invalid filename for shaders, follow suffix in SHAssetMacros.h: {}", path.string());
|
||||
return {};
|
||||
}
|
||||
|
||||
path.make_preferred();
|
||||
|
||||
std::ifstream file{ path.string(), std::ios::in };
|
||||
std::ifstream file{ path.string(), std::ios::in };
|
||||
|
||||
if (file.is_open())
|
||||
{
|
||||
std::stringstream stream;
|
||||
if (file.is_open())
|
||||
{
|
||||
std::stringstream stream;
|
||||
|
||||
stream << file.rdbuf();
|
||||
stream << file.rdbuf();
|
||||
|
||||
std::string const content = stream.str();
|
||||
std::string const content = stream.str();
|
||||
|
||||
auto data = CompileShaderSourceToMemory(content, path.filename().string(), type);
|
||||
auto data = CompileShaderSourceToMemory(content, path.filename().string(), type);
|
||||
|
||||
if (data == nullptr)
|
||||
{
|
||||
return{};
|
||||
}
|
||||
if (data == nullptr)
|
||||
{
|
||||
return{};
|
||||
}
|
||||
|
||||
return CompileShaderSourceToBinary(path, *data);
|
||||
}
|
||||
return CompileShaderSourceToBinary(path, *data);
|
||||
}
|
||||
|
||||
SHLOG_ERROR("Unable to open shader file: {}", path.string());
|
||||
SHLOG_ERROR("Unable to open shader file: {}", path.string());
|
||||
|
||||
return {};
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
std::optional<AssetPath> SHShaderSourceCompiler::CompileShaderFromString
|
||||
(std::string const& string, AssetPath path, SH_SHADER_TYPE type) noexcept
|
||||
{
|
||||
auto const data = CompileShaderSourceToMemory(string, path.filename().string(), type);
|
||||
std::optional<AssetPath> SHShaderSourceCompiler::CompileShaderFromString
|
||||
(std::string const& string, AssetPath path, SH_SHADER_TYPE type) noexcept
|
||||
{
|
||||
auto const data = CompileShaderSourceToMemory(string, path.filename().string(), type);
|
||||
|
||||
if (data == nullptr)
|
||||
{
|
||||
return{};
|
||||
}
|
||||
if (data == nullptr)
|
||||
{
|
||||
return{};
|
||||
}
|
||||
|
||||
return CompileShaderSourceToBinary(path, *data);
|
||||
}
|
||||
return CompileShaderSourceToBinary(path, *data);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <filesystem>
|
||||
#include "Asset Types/SHShaderAsset.h"
|
||||
|
||||
// FMOD Fwd Declare
|
||||
namespace FMOD
|
||||
|
@ -113,10 +114,10 @@ constexpr std::string_view VERTEX_SHADER{ "_VS" };
|
|||
constexpr std::string_view FRAGMENT_SHADER{ "_FS" };
|
||||
constexpr std::string_view COMPUTER_SHADER{ "_CS" };
|
||||
|
||||
constexpr std::string_view SHADER_IDENTIFIERS[] = {
|
||||
VERTEX_SHADER,
|
||||
FRAGMENT_SHADER,
|
||||
COMPUTER_SHADER
|
||||
constexpr std::pair<std::string_view, SHADE::SH_SHADER_TYPE> SHADER_IDENTIFIERS[] = {
|
||||
std::make_pair(VERTEX_SHADER, SHADE::SH_SHADER_TYPE::VERTEX),
|
||||
std::make_pair(FRAGMENT_SHADER, SHADE::SH_SHADER_TYPE::FRAGMENT),
|
||||
std::make_pair(COMPUTER_SHADER, SHADE::SH_SHADER_TYPE::COMPUTE)
|
||||
};
|
||||
|
||||
constexpr size_t SHADER_TYPE_MAX_COUNT{ 3 };
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
#include "SHpch.h"
|
||||
#include "SHCameraArmComponent.h"
|
||||
|
||||
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
||||
SHCameraArmComponent::SHCameraArmComponent()
|
||||
:pitch(0.0f), yaw(0.0f), armLength(1.0f),offset(), dirty(true), lookAtCameraOrigin(true)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
SHVec3 const& SHCameraArmComponent::GetOffset() const noexcept
|
||||
{
|
||||
return offset;
|
||||
}
|
||||
|
||||
float SHCameraArmComponent::GetPitch() const noexcept
|
||||
{
|
||||
return pitch;
|
||||
}
|
||||
|
||||
float SHCameraArmComponent::GetYaw() const noexcept
|
||||
{
|
||||
return yaw;
|
||||
}
|
||||
|
||||
float SHCameraArmComponent::GetArmLength() const noexcept
|
||||
{
|
||||
return armLength;
|
||||
}
|
||||
|
||||
void SHCameraArmComponent::SetPitch(float pitch) noexcept
|
||||
{
|
||||
this->pitch = pitch;
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
void SHCameraArmComponent::SetYaw(float yaw) noexcept
|
||||
{
|
||||
this->yaw = yaw;
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
void SHCameraArmComponent::SetArmLength(float length) noexcept
|
||||
{
|
||||
this->armLength = length;
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
}//namespace SHADE
|
||||
|
||||
|
||||
RTTR_REGISTRATION
|
||||
{
|
||||
using namespace SHADE;
|
||||
using namespace rttr;
|
||||
|
||||
registration::class_<SHCameraArmComponent>("Camera Arm Component")
|
||||
.property("Arm Pitch", &SHCameraArmComponent::GetPitch, &SHCameraArmComponent::SetPitch)
|
||||
.property("Arm Yaw", &SHCameraArmComponent::GetYaw, &SHCameraArmComponent::SetYaw)
|
||||
.property("Arm Length", &SHCameraArmComponent::GetArmLength, &SHCameraArmComponent::SetArmLength)
|
||||
.property("Look At Camera Origin", &SHCameraArmComponent::lookAtCameraOrigin);
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
#pragma once
|
||||
|
||||
|
||||
#include <rttr/registration>
|
||||
#include "ECS_Base/Components/SHComponent.h"
|
||||
#include "Math/SHMatrix.h"
|
||||
#include "SH_API.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
class SH_API SHCameraArmComponent final: public SHComponent
|
||||
{
|
||||
private:
|
||||
float pitch;
|
||||
float yaw;
|
||||
float armLength;
|
||||
|
||||
bool dirty;
|
||||
SHVec3 offset;
|
||||
|
||||
public:
|
||||
friend class SHCameraSystem;
|
||||
SHCameraArmComponent();
|
||||
virtual ~SHCameraArmComponent() = default;
|
||||
|
||||
bool lookAtCameraOrigin;
|
||||
//Getters
|
||||
//SHMatrix const& GetMatrix() const noexcept;
|
||||
SHVec3 const& GetOffset() const noexcept;
|
||||
float GetPitch() const noexcept;
|
||||
float GetYaw() const noexcept;
|
||||
float GetArmLength() const noexcept;
|
||||
|
||||
//Setters
|
||||
void SetPitch(float pitch) noexcept;
|
||||
void SetYaw(float yaw) noexcept;
|
||||
void SetArmLength(float length) noexcept;
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
};
|
||||
|
||||
}//namespace SHADE
|
|
@ -13,7 +13,7 @@ namespace SHADE
|
|||
, width(1920.0f), height(1080.0f), zNear(0.01f), zFar(10000.0f), fov(90.0f), movementSpeed(1.0f), turnSpeed(0.5f)
|
||||
, perspProj(true), dirtyView(true), dirtyProj(true)
|
||||
, viewMatrix(), projMatrix()
|
||||
, position()
|
||||
, position(), offset()
|
||||
{
|
||||
ComponentFamily::GetID<SHCameraComponent>();
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ namespace SHADE
|
|||
SHVec3 position;
|
||||
|
||||
bool perspProj;
|
||||
|
||||
SHVec3 offset;
|
||||
|
||||
|
||||
|
||||
|
@ -41,7 +41,7 @@ namespace SHADE
|
|||
friend class SHCameraSystem;
|
||||
|
||||
SHCameraComponent();
|
||||
~SHCameraComponent();
|
||||
virtual ~SHCameraComponent();
|
||||
|
||||
|
||||
//Getters and setters.
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "SHpch.h"
|
||||
#include "SHCameraDirector.h"
|
||||
#include "SHCameraComponent.h"
|
||||
#include "SHCameraArmComponent.h"
|
||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||
#include "ECS_Base/SHECSMacros.h"
|
||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||
|
@ -48,6 +49,7 @@ namespace SHADE
|
|||
viewMatrix = camComponent->GetViewMatrix();
|
||||
projMatrix = camComponent->GetProjMatrix();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SHCameraDirector::SetMainCamera(SHCameraComponent& camera) noexcept
|
||||
|
|
|
@ -21,6 +21,7 @@ namespace SHADE
|
|||
|
||||
EntityID mainCameraEID;
|
||||
EntityID transitionCameraEID;
|
||||
|
||||
|
||||
SHMatrix GetViewMatrix() const noexcept;
|
||||
SHMatrix GetProjMatrix() const noexcept;
|
||||
|
@ -35,7 +36,7 @@ namespace SHADE
|
|||
protected:
|
||||
SHMatrix viewMatrix;
|
||||
SHMatrix projMatrix;
|
||||
|
||||
|
||||
};
|
||||
|
||||
typedef Handle<SHCameraDirector> DirectorHandle;
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
#include "SHpch.h"
|
||||
#include "SHCameraSystem.h"
|
||||
#include "SHCameraArmComponent.h"
|
||||
#include "Math/SHMathHelpers.h"
|
||||
#include "Input/SHInputManager.h"
|
||||
#include "Math/Vector/SHVec2.h"
|
||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||
#include "Math/Transform/SHTransformComponent.h"
|
||||
#include <math.h>
|
||||
|
||||
|
||||
namespace SHADE
|
||||
|
@ -59,6 +61,7 @@ namespace SHADE
|
|||
}
|
||||
|
||||
UpdateCameraComponent(editorCamera);
|
||||
|
||||
}
|
||||
void SHCameraSystem::EditorCameraUpdate::Execute(double dt) noexcept
|
||||
{
|
||||
|
@ -112,6 +115,8 @@ namespace SHADE
|
|||
|
||||
//std::cout << "Camera position: " << camera.position.x << " " << camera.position.y << std::endl;
|
||||
system->UpdateCameraComponent(system->editorCamera);
|
||||
|
||||
system->DecomposeViewMatrix(camera.viewMatrix, camera.pitch, camera.yaw, camera.roll, camera.position);
|
||||
}
|
||||
|
||||
void SHCameraSystem::Init(void)
|
||||
|
@ -121,6 +126,9 @@ namespace SHADE
|
|||
editorCamera.SetYaw(0.0f);
|
||||
editorCamera.SetRoll(0.0f);
|
||||
editorCamera.movementSpeed = 2.0f;
|
||||
|
||||
SHComponentManager::CreateComponentSparseSet<SHCameraComponent>();
|
||||
SHComponentManager::CreateComponentSparseSet<SHCameraArmComponent>();
|
||||
|
||||
}
|
||||
|
||||
|
@ -134,6 +142,26 @@ namespace SHADE
|
|||
return &editorCamera;
|
||||
}
|
||||
|
||||
void SHCameraSystem::UpdatePivotArmComponent(SHCameraArmComponent& pivot) noexcept
|
||||
{
|
||||
if (pivot.dirty)
|
||||
{
|
||||
|
||||
SHVec3 offset{ 0.0f,0.0f, pivot.GetArmLength() };
|
||||
offset = SHVec3::RotateX(offset, -(SHMath::DegreesToRadians(pivot.GetPitch())));
|
||||
offset = SHVec3::RotateY(offset, (SHMath::DegreesToRadians(pivot.GetYaw())));
|
||||
|
||||
|
||||
//pivot.rtMatrix = SHMatrix::RotateX(SHMath::DegreesToRadians(pivot.GetPitch()))
|
||||
// * SHMatrix::RotateY(SHMath::DegreesToRadians(pivot.GetYaw()))
|
||||
// * SHMatrix::Translate(SHVec3(0.0f , 0.0f, pivot.GetArmLength()));
|
||||
|
||||
pivot.offset = offset;
|
||||
// pivot.rtMatrix = SHMatrix::Inverse(pivot.rtMatrix);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SHCameraSystem::UpdateCameraComponent(SHCameraComponent& camera) noexcept
|
||||
{
|
||||
if (SHComponentManager::HasComponent<SHTransformComponent>(camera.GetEID()) == true && &camera != &editorCamera)
|
||||
|
@ -151,6 +179,15 @@ namespace SHADE
|
|||
if (camera.dirtyView)
|
||||
{
|
||||
|
||||
camera.offset = SHVec3{ 0.0f };
|
||||
if (SHComponentManager::HasComponent<SHCameraArmComponent>(camera.GetEID()))
|
||||
{
|
||||
auto arm = SHComponentManager::GetComponent<SHCameraArmComponent>(camera.GetEID());
|
||||
camera.offset = arm->GetOffset();
|
||||
if(arm->lookAtCameraOrigin)
|
||||
CameraLookAt(camera, camera.position);
|
||||
}
|
||||
|
||||
SHVec3 view, right, UP;
|
||||
|
||||
|
||||
|
@ -171,9 +208,12 @@ namespace SHADE
|
|||
camera.viewMatrix(2, 1) = view[1];
|
||||
camera.viewMatrix(2, 2) = view[2];
|
||||
|
||||
camera.viewMatrix(0, 3) = -right.Dot(camera.position);
|
||||
camera.viewMatrix(1, 3) = -UP.Dot(camera.position);
|
||||
camera.viewMatrix(2, 3) = -view.Dot(camera.position);
|
||||
camera.viewMatrix(0, 3) = -right.Dot(camera.position + camera.offset);
|
||||
camera.viewMatrix(1, 3) = -UP.Dot(camera.position + camera.offset);
|
||||
camera.viewMatrix(2, 3) = -view.Dot(camera.position + camera.offset);
|
||||
|
||||
|
||||
|
||||
|
||||
camera.dirtyView = false;
|
||||
}
|
||||
|
@ -221,6 +261,8 @@ namespace SHADE
|
|||
SHVec3 up = { 0.0f,1.0f,0.0f };
|
||||
|
||||
|
||||
|
||||
|
||||
target = SHVec3::RotateX(target, SHMath::DegreesToRadians(camera.pitch));
|
||||
target = SHVec3::RotateY(target, SHMath::DegreesToRadians(camera.yaw));
|
||||
target += camera.position;
|
||||
|
@ -241,6 +283,13 @@ namespace SHADE
|
|||
{
|
||||
SHCameraSystem* system = static_cast<SHCameraSystem*>(GetSystem());
|
||||
auto& dense = SHComponentManager::GetDense<SHCameraComponent>();
|
||||
auto& pivotDense = SHComponentManager::GetDense<SHCameraArmComponent>();
|
||||
|
||||
for (auto& pivot : pivotDense)
|
||||
{
|
||||
system->UpdatePivotArmComponent(pivot);
|
||||
}
|
||||
|
||||
for (auto& cam : dense)
|
||||
{
|
||||
system->UpdateCameraComponent(cam);
|
||||
|
@ -274,18 +323,115 @@ namespace SHADE
|
|||
}
|
||||
void SHCameraSystem::ClampCameraRotation(SHCameraComponent& camera) noexcept
|
||||
{
|
||||
constexpr float clampVal = 85.0f;
|
||||
|
||||
|
||||
if (camera.pitch > clampVal)
|
||||
camera.SetPitch(clampVal);
|
||||
if (camera.pitch < -clampVal)
|
||||
camera.SetPitch(-clampVal);
|
||||
if (camera.roll > clampVal)
|
||||
camera.SetRoll(clampVal);
|
||||
if (camera.roll < -clampVal)
|
||||
camera.SetRoll(-clampVal);
|
||||
|
||||
if (camera.pitch > 85)
|
||||
camera.SetPitch(85);
|
||||
if (camera.pitch < -85)
|
||||
camera.SetPitch(-85);
|
||||
if (camera.roll > 85)
|
||||
camera.SetRoll(85);
|
||||
if (camera.roll < -85)
|
||||
camera.SetRoll(-85);
|
||||
while (camera.yaw > 360)
|
||||
camera.yaw -= 360;
|
||||
while (camera.yaw < -360)
|
||||
camera.yaw += 360;
|
||||
|
||||
}
|
||||
|
||||
void SHCameraSystem::SetMainCamera(EntityID eid, size_t directorIndex) noexcept
|
||||
{
|
||||
if (SHComponentManager::HasComponent<SHCameraComponent>(eid) && directorIndex < directorHandleList.size())
|
||||
directorHandleList[directorIndex]->SetMainCamera(*SHComponentManager::GetComponent<SHCameraComponent>(eid));
|
||||
else
|
||||
{
|
||||
SHLOG_WARNING("Set Main Camera warning: Entity does not have camera component or director does not exist.")
|
||||
}
|
||||
}
|
||||
|
||||
void SHCameraSystem::DecomposeViewMatrix(SHMatrix const& viewMatrix, float& pitch, float& yaw, float& roll, SHVec3& pos) noexcept
|
||||
{
|
||||
|
||||
float initPitch = pitch;
|
||||
SHVec3 initPos = pos;
|
||||
SHVec3 translate3, scale;
|
||||
SHQuaternion quat;
|
||||
|
||||
//SHMatrix viewInverse = viewMatrix;
|
||||
|
||||
viewMatrix.Decompose(translate3, quat, scale);
|
||||
yaw = 180+ SHMath::RadiansToDegrees(quat.ToEuler().y);
|
||||
pitch = -SHMath::RadiansToDegrees(quat.ToEuler().x);
|
||||
|
||||
SHVec4 dotPos{ -viewMatrix(0,3),-viewMatrix(1,3), -viewMatrix(2,3), 1.0f };
|
||||
SHMatrix mtx = viewMatrix;
|
||||
mtx(0, 3) = 0.0f;
|
||||
mtx(1, 3) = 0.0f;
|
||||
mtx(2, 3) = 0.0f;
|
||||
mtx.Transpose();
|
||||
mtx = SHMatrix::Inverse(mtx);
|
||||
SHVec4 translate = mtx* dotPos;
|
||||
|
||||
pos.x = translate.x;
|
||||
pos.y = translate.y;
|
||||
pos.z = translate.z;
|
||||
|
||||
}
|
||||
void SHCameraSystem::SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept
|
||||
{
|
||||
DecomposeViewMatrix(viewMatrix, camera.pitch, camera.yaw, camera.roll, camera.position);
|
||||
camera.dirtyView = true;
|
||||
}
|
||||
|
||||
void SHCameraSystem::CameraLookAt(SHCameraComponent& camera, SHVec3 target) noexcept
|
||||
{
|
||||
|
||||
if (camera.position == target)
|
||||
{
|
||||
//lets off set it abit so the view is nt fked
|
||||
target.z -= 0.0001f;
|
||||
}
|
||||
SHVec3 forward, right, upVec;
|
||||
|
||||
SHVec3 up = { 0.0f,1.0f,0.0f };
|
||||
|
||||
|
||||
////SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll));
|
||||
|
||||
//target = SHVec3::Normalise(target);
|
||||
|
||||
SHVec3::RotateZ(up, camera.roll);
|
||||
up = SHVec3::Normalise(up);
|
||||
|
||||
|
||||
forward = target - (camera.position + camera.offset); forward = SHVec3::Normalise(forward);
|
||||
right = SHVec3::Cross(forward, up); right = SHVec3::Normalise(right);
|
||||
upVec = SHVec3::Cross(forward, right);
|
||||
|
||||
|
||||
SHMatrix viewMtx;
|
||||
viewMtx = SHMatrix::Identity;
|
||||
viewMtx(0, 0) = right[0];
|
||||
viewMtx(0, 1) = right[1];
|
||||
viewMtx(0, 2) = right[2];
|
||||
|
||||
viewMtx(1, 0) = upVec[0];
|
||||
viewMtx(1, 1) = upVec[1];
|
||||
viewMtx(1, 2) = upVec[2];
|
||||
|
||||
viewMtx(2, 0) = forward[0];
|
||||
viewMtx(2, 1) = forward[1];
|
||||
viewMtx(2, 2) = forward[2];
|
||||
|
||||
viewMtx(0, 3) = -right.Dot(camera.position + camera.offset);
|
||||
viewMtx(1, 3) = -upVec.Dot(camera.position + camera.offset);
|
||||
viewMtx(2, 3) = -forward.Dot(camera.position + camera.offset);
|
||||
|
||||
|
||||
SetCameraViewMatrix(camera, viewMtx);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,9 @@
|
|||
|
||||
namespace SHADE
|
||||
{
|
||||
|
||||
class SHCameraArmComponent;
|
||||
|
||||
class SH_API SHCameraSystem final : public SHSystem
|
||||
{
|
||||
private:
|
||||
|
@ -19,6 +22,11 @@ namespace SHADE
|
|||
SHResourceLibrary<SHCameraDirector> directorLibrary;
|
||||
std::vector<DirectorHandle> directorHandleList;
|
||||
|
||||
|
||||
void UpdateCameraComponent(SHCameraComponent& camera) noexcept;
|
||||
void UpdatePivotArmComponent(SHCameraArmComponent& pivot) noexcept;
|
||||
|
||||
|
||||
public:
|
||||
SHCameraSystem(void) = default;
|
||||
virtual ~SHCameraSystem(void) = default;
|
||||
|
@ -39,7 +47,7 @@ namespace SHADE
|
|||
class SH_API CameraSystemUpdate final: public SHSystemRoutine
|
||||
{
|
||||
public:
|
||||
CameraSystemUpdate() : SHSystemRoutine("Camera System Update", false) {};
|
||||
CameraSystemUpdate() : SHSystemRoutine("Camera System Update", true) {};
|
||||
virtual void Execute(double dt)noexcept override final;
|
||||
};
|
||||
friend class CameraSystemUpdate;
|
||||
|
@ -51,12 +59,10 @@ namespace SHADE
|
|||
DirectorHandle GetDirector(size_t index) noexcept;
|
||||
void ClampCameraRotation(SHCameraComponent& camera) noexcept;
|
||||
void UpdateEditorCamera(double dt) noexcept;
|
||||
protected:
|
||||
|
||||
void UpdateCameraComponent(SHCameraComponent& camera) noexcept;
|
||||
|
||||
|
||||
|
||||
void SetMainCamera(EntityID eid, size_t directorIndex) noexcept;
|
||||
void DecomposeViewMatrix(SHMatrix const& matrix, float& pitch, float& yaw, float& roll, SHVec3& pos) noexcept;
|
||||
void SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept;
|
||||
void CameraLookAt(SHCameraComponent& camera, SHVec3 target) noexcept;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -39,6 +39,12 @@ namespace SHADE
|
|||
if (comp)
|
||||
{
|
||||
comp->OnDestroy();
|
||||
|
||||
SHComponentRemovedEvent eventData;
|
||||
eventData.eid = entityID;
|
||||
eventData.removedComponentType = i;
|
||||
|
||||
SHEventManager::BroadcastEvent<SHComponentRemovedEvent>(eventData, SH_COMPONENT_REMOVED_EVENT);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -53,6 +59,7 @@ namespace SHADE
|
|||
|
||||
//entityHandle.RemoveHandle(entityID);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -213,5 +213,14 @@ namespace SHADE
|
|||
return SHSerialization::DeserializeEntityToSceneFromString(data);
|
||||
}*/
|
||||
|
||||
|
||||
EntityID SHEntityManager::GetEntityByName(std::string const& name) noexcept
|
||||
{
|
||||
EntityID result = MAX_EID;
|
||||
for (auto& entity : entityVec)
|
||||
{
|
||||
if (entity->name == name)
|
||||
result = entity->GetEID();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -209,6 +209,8 @@ namespace SHADE
|
|||
|
||||
//static EntityID DuplicateEntity(EntityID eid) noexcept;
|
||||
|
||||
static EntityID GetEntityByName(std::string const& name) noexcept;
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
|
|
|
@ -251,7 +251,7 @@ namespace SHADE
|
|||
SHEditorWidgets::DragVec3
|
||||
(
|
||||
"Half Extents", { "X", "Y", "Z" },
|
||||
[box, transformComponent] { return (transformComponent->GetWorldScale() * 2.0f) * box->GetHalfExtents(); },
|
||||
[box, transformComponent] { return (box->GetHalfExtents() * 2.0f) / transformComponent->GetWorldScale(); },
|
||||
[collider](SHVec3 const& vec) { collider->SetBoundingBox(vec); });
|
||||
}
|
||||
else if (collider->GetType() == SHCollider::Type::SPHERE)
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "Physics/Components/SHRigidBodyComponent.h"
|
||||
#include "Physics/Components/SHColliderComponent.h"
|
||||
#include "Camera/SHCameraComponent.h"
|
||||
#include "Camera/SHCameraArmComponent.h"
|
||||
#include "SHEditorComponentView.h"
|
||||
|
||||
namespace SHADE
|
||||
|
@ -126,6 +127,9 @@ namespace SHADE
|
|||
if (auto cameraComponent = SHComponentManager::GetComponent_s<SHCameraComponent>(eid))
|
||||
{
|
||||
DrawComponent(cameraComponent);
|
||||
}if (auto cameraArmComponent = SHComponentManager::GetComponent_s<SHCameraArmComponent>(eid))
|
||||
{
|
||||
DrawComponent(cameraArmComponent);
|
||||
}
|
||||
ImGui::Separator();
|
||||
// Render Scripts
|
||||
|
@ -136,6 +140,7 @@ namespace SHADE
|
|||
{
|
||||
DrawAddComponentButton<SHTransformComponent>(eid);
|
||||
DrawAddComponentButton<SHCameraComponent>(eid);
|
||||
DrawAddComponentButton<SHCameraArmComponent>(eid);
|
||||
DrawAddComponentButton<SHLightComponent>(eid);
|
||||
|
||||
// Components that require Transforms
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include "ECS_Base/System/SHSystemRoutine.h"
|
||||
#include "Resource/SHHandle.h"
|
||||
#include "EditorWindow/SHEditorWindow.h"
|
||||
#include "Tools/SHLogger.h"
|
||||
#include "Tools/SHLog.h"
|
||||
#include "Gizmos/SHTransformGizmo.h"
|
||||
|
||||
|
||||
|
@ -76,7 +76,7 @@ namespace SHADE
|
|||
}
|
||||
else
|
||||
{
|
||||
SHLOG_WARNING("Attempt to create duplicate of Editor window type")
|
||||
SHLog::Warning("Attempt to create duplicate of Editor window type");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,8 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#include "Assets/Asset Types/SHTextureAsset.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHMousePickSystem.h"
|
||||
#include "Graphics/MiddleEnd/Lights/SHLightingSubSystem.h"
|
||||
#include "Assets/SHAssetManager.h"
|
||||
#include "Resource/SHResourceManager.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -109,9 +111,10 @@ namespace SHADE
|
|||
transferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||
graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||
|
||||
|
||||
shaderModuleLibrary.ImportAllShaderSource(device);
|
||||
shaderModuleLibrary.ReflectAllShaderModules();
|
||||
// Load Built In Shaders
|
||||
static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(VS_DEFAULT);
|
||||
static constexpr AssetID FS_DEFAULT = 46377769; defaultFragShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(FS_DEFAULT);
|
||||
static constexpr AssetID CS_COMPOSITE = 45072428; deferredCompositeShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(CS_COMPOSITE);
|
||||
}
|
||||
|
||||
void SHGraphicsSystem::InitSceneRenderGraph(void) noexcept
|
||||
|
@ -180,16 +183,7 @@ namespace SHADE
|
|||
gBufferSubpass->AddColorOutput("Albedo");
|
||||
gBufferSubpass->AddDepthOutput("Depth Buffer", SH_ATT_DESC_TYPE_FLAGS::DEPTH_STENCIL);
|
||||
|
||||
//// kirsch
|
||||
//auto kirschShader = shaderModuleLibrary.GetShaderModule("KirschCs.glsl");
|
||||
//gBufferNode->AddNodeCompute(kirschShader, { "Position", "Scene" });
|
||||
|
||||
//// copy
|
||||
//auto pureCopyShader = shaderModuleLibrary.GetShaderModule("PureCopyCs.glsl");
|
||||
//gBufferNode->AddNodeCompute(pureCopyShader, { "Position", "Scene" });
|
||||
|
||||
// deferred composite
|
||||
auto deferredCompositeShader = shaderModuleLibrary.GetBuiltInShaderModule("DeferredComposite_CS");
|
||||
gBufferNode->AddNodeCompute(deferredCompositeShader, { "Position", "Normals", "Albedo", "Light Layer Indices", "Scene" });
|
||||
|
||||
|
||||
|
@ -207,10 +201,7 @@ namespace SHADE
|
|||
|
||||
worldRenderer->SetCameraDirector(cameraSystem->CreateDirector());
|
||||
|
||||
auto cubeVS = shaderModuleLibrary.GetBuiltInShaderModule("TestCube_VS");
|
||||
auto cubeFS = shaderModuleLibrary.GetBuiltInShaderModule("TestCube_FS");
|
||||
|
||||
defaultMaterial = AddMaterial(cubeVS, cubeFS, gBufferSubpass);
|
||||
defaultMaterial = AddMaterial(defaultVertShader, defaultFragShader, gBufferSubpass);
|
||||
}
|
||||
|
||||
void SHGraphicsSystem::InitMiddleEnd(void) noexcept
|
||||
|
|
|
@ -25,7 +25,6 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#include "ECS_Base/System/SHSystemRoutine.h"
|
||||
#include "Graphics/Descriptors/SHVkDescriptorPool.h"
|
||||
#include "Graphics/RenderGraph/SHRenderGraph.h"
|
||||
#include "Graphics/MiddleEnd/Shaders/SHShaderModuleLibrary.h"
|
||||
#include "SHMeshLibrary.h"
|
||||
#include "Graphics/MiddleEnd/Materials/SHMaterialInstanceCache.h"
|
||||
#include "../Textures/SHTextureLibrary.h"
|
||||
|
@ -293,6 +292,10 @@ namespace SHADE
|
|||
|
||||
//Handle<SHVkRenderpass> GetRenderPass() const { return renderPass; }
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Getters */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
SHWindow* GetWindow() noexcept { return window; }
|
||||
|
||||
private:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
|
@ -320,11 +323,12 @@ namespace SHADE
|
|||
SHWindow* window = nullptr;
|
||||
|
||||
// Middle End Resources
|
||||
SHResourceHub resourceManager;
|
||||
SHResourceHub resourceManager;
|
||||
SHMeshLibrary meshLibrary;
|
||||
SHTextureLibrary texLibrary;
|
||||
SHSamplerCache samplerCache;
|
||||
SHMaterialInstanceCache materialInstanceCache;
|
||||
|
||||
// Viewports
|
||||
#ifdef SHEDITOR
|
||||
Handle<SHViewport> editorViewport;
|
||||
|
@ -345,10 +349,13 @@ namespace SHADE
|
|||
// Temp Cameras
|
||||
Handle<SHCamera> worldCamera;
|
||||
Handle<SHCamera> screenCamera;
|
||||
|
||||
SHShaderModuleLibrary shaderModuleLibrary;
|
||||
|
||||
// Temp Materials
|
||||
// Built-In Shaders
|
||||
Handle<SHVkShaderModule> defaultVertShader;
|
||||
Handle<SHVkShaderModule> defaultFragShader;
|
||||
Handle<SHVkShaderModule> deferredCompositeShader;
|
||||
|
||||
// Built-In Materials
|
||||
Handle<SHMaterial> defaultMaterial;
|
||||
|
||||
Handle<SHRenderGraph> worldRenderGraph;
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
/************************************************************************************//*!
|
||||
\file SHGraphicsSystemInterface.cpp
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 31, 2022
|
||||
\brief Contains the definitions of the functions of the static
|
||||
SHGraphicsSystemInterface class.
|
||||
|
||||
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.
|
||||
*//*************************************************************************************/
|
||||
// Precompiled Headers
|
||||
#include "SHpch.h"
|
||||
// Primary Header
|
||||
#include "SHGraphicsSystemInterface.h"
|
||||
// Project Includes
|
||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h"
|
||||
#include "Graphics/Windowing/SHWindow.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Static Usage Functions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
uint32_t SHGraphicsSystemInterface::GetWindowWidth()
|
||||
{
|
||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (gfxSystem)
|
||||
{
|
||||
const auto WND = gfxSystem->GetWindow();
|
||||
return WND->GetWindowSize().first;
|
||||
}
|
||||
|
||||
SHLOG_WARNING("[SHGraphicsSystemInterface] Failed to get window width. Value of 0 returned instead.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t SHGraphicsSystemInterface::GetWindowHeight()
|
||||
{
|
||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (gfxSystem)
|
||||
{
|
||||
const auto WND = gfxSystem->GetWindow();
|
||||
return WND->GetWindowSize().second;
|
||||
}
|
||||
|
||||
SHLOG_WARNING("[SHGraphicsSystemInterface] Failed to get window height. Value of 0 returned instead.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SHGraphicsSystemInterface::IsFullscreen()
|
||||
{
|
||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (gfxSystem)
|
||||
{
|
||||
const auto WND = gfxSystem->GetWindow();
|
||||
return WND->GetWindowData().isFullscreen;
|
||||
}
|
||||
|
||||
SHLOG_WARNING("[SHGraphicsSystemInterface] Failed to get window fullscreen status. Value of false returned instead.");
|
||||
return false;
|
||||
}
|
||||
|
||||
void SHGraphicsSystemInterface::CloseWindow()
|
||||
{
|
||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (gfxSystem)
|
||||
{
|
||||
auto WND = gfxSystem->GetWindow();
|
||||
return WND->Close();
|
||||
}
|
||||
|
||||
SHLOG_WARNING("[SHGraphicsSystemInterface] Failed to close window.");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
/************************************************************************************//*!
|
||||
\file SHGraphicsSystemInterface.h
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 31, 2022
|
||||
\brief Contains the definition of the SHGraphicsSystemInterface static class.
|
||||
|
||||
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
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/// <summary>
|
||||
/// Static class that wraps up certain functions in the SHGraphicsSystem so that
|
||||
/// accessing it from SHADE_Managed would not cause issues due to C++20 features.
|
||||
/// </summary>
|
||||
class SH_API SHGraphicsSystemInterface final
|
||||
{
|
||||
public:
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Constructor */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
SHGraphicsSystemInterface() = delete;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Static Usage Functions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Retrieves the current window width.
|
||||
/// </summary>
|
||||
/// <returns>The current window width.</returns>
|
||||
static uint32_t GetWindowWidth();
|
||||
/// <summary>
|
||||
/// Retrieves the current window height.
|
||||
/// </summary>
|
||||
/// <returns>The current window height.</returns>
|
||||
static uint32_t GetWindowHeight();
|
||||
/// <summary>
|
||||
/// Retrieves the current window fullscreen status.
|
||||
/// </summary>
|
||||
/// <returns>The current window fullscreen status..</returns>
|
||||
static bool IsFullscreen();
|
||||
/// <summary>
|
||||
/// Closes the current window, and depending on the implementation, should also
|
||||
/// close the application.
|
||||
/// </summary>
|
||||
static void CloseWindow();
|
||||
};
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
/************************************************************************************//*!
|
||||
\file SHMaterialSpec.h
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 31, 2022
|
||||
\brief Contains the struct definition of SHMaterialSpec.
|
||||
|
||||
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
|
||||
// Standard Library
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
// Project Includes
|
||||
#include "Assets/SHAssetMacros.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*************************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
Describes a Material's serialized properties. A representation of a material that is
|
||||
independent of GPU resources.
|
||||
*/
|
||||
/*************************************************************************************/
|
||||
struct SHMaterialSpec
|
||||
{
|
||||
AssetID vertexShader;
|
||||
AssetID fragShader;
|
||||
std::string subpassName;
|
||||
YAML::Node properties;
|
||||
};
|
||||
}
|
|
@ -1,139 +0,0 @@
|
|||
#include "SHPch.h"
|
||||
#include "SHShaderModuleLibrary.h"
|
||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||
#include "Assets/SHAssetManager.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/***************************************************************************/
|
||||
/*!
|
||||
|
||||
\brief
|
||||
Imports all shader binaries from the source library.
|
||||
|
||||
\param logicalDeviceHdl
|
||||
For creating shader modules.
|
||||
|
||||
\param sourceLib
|
||||
The source library class that stores the container of shader binary data.
|
||||
|
||||
*/
|
||||
/***************************************************************************/
|
||||
//void SHShaderModuleLibrary::ImportFromSourceLibrary(Handle<SHVkLogicalDevice>& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept
|
||||
//{
|
||||
// auto const& sources = sourceLib.GetSourceLibrary();
|
||||
// for (auto const& source : sources)
|
||||
// {
|
||||
// vk::ShaderStageFlagBits shaderType{};
|
||||
// switch (source.shaderType)
|
||||
// {
|
||||
// case SH_SHADER_TYPE::VERTEX:
|
||||
// shaderType = vk::ShaderStageFlagBits::eVertex;
|
||||
// break;
|
||||
// case SH_SHADER_TYPE::FRAGMENT:
|
||||
// shaderType = vk::ShaderStageFlagBits::eFragment;
|
||||
// break;
|
||||
// case SH_SHADER_TYPE::COMPUTE:
|
||||
// shaderType = vk::ShaderStageFlagBits::eCompute;
|
||||
// break;
|
||||
// default:
|
||||
// shaderType = vk::ShaderStageFlagBits::eVertex;
|
||||
// break;
|
||||
// }
|
||||
|
||||
// Handle<SHVkShaderModule> newShaderModule = logicalDeviceHdl->CreateShaderModule(source.spirvBinary, "main", shaderType, source.name);
|
||||
// shaderModules.emplace(source.id, newShaderModule);
|
||||
// stringToID.emplace(source.name, source.id);
|
||||
// }
|
||||
//}
|
||||
|
||||
/***************************************************************************/
|
||||
/*!
|
||||
|
||||
\brief
|
||||
Gets the shader module based on module name.
|
||||
|
||||
\param shaderName
|
||||
|
||||
\return
|
||||
|
||||
*/
|
||||
/***************************************************************************/
|
||||
//Handle<SHVkShaderModule> SHShaderModuleLibrary::GetShaderModule(std::string shaderName) const noexcept
|
||||
//{
|
||||
// if (stringToID.contains(shaderName))
|
||||
// return shaderModules.at(stringToID.at(shaderName));
|
||||
// else
|
||||
// return {};
|
||||
//}
|
||||
|
||||
vk::ShaderStageFlagBits SHShaderModuleLibrary::GetVkShaderFlag(SH_SHADER_TYPE type) noexcept
|
||||
{
|
||||
vk::ShaderStageFlagBits shaderType{};
|
||||
switch (type)
|
||||
{
|
||||
case SH_SHADER_TYPE::VERTEX:
|
||||
shaderType = vk::ShaderStageFlagBits::eVertex;
|
||||
break;
|
||||
case SH_SHADER_TYPE::FRAGMENT:
|
||||
shaderType = vk::ShaderStageFlagBits::eFragment;
|
||||
break;
|
||||
case SH_SHADER_TYPE::COMPUTE:
|
||||
shaderType = vk::ShaderStageFlagBits::eCompute;
|
||||
break;
|
||||
default:
|
||||
shaderType = vk::ShaderStageFlagBits::eVertex;
|
||||
break;
|
||||
}
|
||||
|
||||
return shaderType;
|
||||
}
|
||||
|
||||
Handle<SHVkShaderModule> SHShaderModuleLibrary::GetBuiltInShaderModule(std::string shaderName) const noexcept
|
||||
{
|
||||
if (builtInShaderModules.contains(shaderName))
|
||||
return builtInShaderModules.at(shaderName);
|
||||
else
|
||||
return {};
|
||||
}
|
||||
|
||||
void SHShaderModuleLibrary::ImportAllShaderSource(Handle<SHVkLogicalDevice>& logicalDeviceHdl) noexcept
|
||||
{
|
||||
uint32_t idCounter{ 0 };
|
||||
|
||||
auto const data = SHAssetManager::GetAllDataOfType(AssetType::SHADER);
|
||||
for (auto const& dataPtr : data)
|
||||
{
|
||||
auto const shader = dynamic_cast<SHShaderAsset const*>(dataPtr);
|
||||
|
||||
Handle<SHVkShaderModule> newShaderModule =
|
||||
logicalDeviceHdl->CreateShaderModule(shader->spirvBinary, "main", GetVkShaderFlag(shader->shaderType), shader->name);
|
||||
|
||||
shaderModules.emplace(idCounter++, newShaderModule);
|
||||
}
|
||||
|
||||
auto const builtIn = SHAssetManager::GetAllDataOfType(AssetType::SHADER_BUILT_IN);
|
||||
for (auto const& dataPtr : builtIn)
|
||||
{
|
||||
auto const shader = dynamic_cast<SHShaderAsset const*>(dataPtr);
|
||||
|
||||
Handle<SHVkShaderModule> newShaderModule =
|
||||
logicalDeviceHdl->CreateShaderModule(shader->spirvBinary, "main", GetVkShaderFlag(shader->shaderType), shader->name);
|
||||
|
||||
builtInShaderModules.emplace(shader->name, newShaderModule);
|
||||
}
|
||||
}
|
||||
|
||||
void SHShaderModuleLibrary::ReflectAllShaderModules() noexcept
|
||||
{
|
||||
for (auto& module : shaderModules)
|
||||
{
|
||||
module.second->Reflect();
|
||||
}
|
||||
|
||||
for (auto& module : builtInShaderModules)
|
||||
{
|
||||
module.second->Reflect();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
#ifndef SH_SHADER_MODULE_LIBRARY_H
|
||||
#define SH_SHADER_MODULE_LIBRARY_H
|
||||
|
||||
#include "Graphics/Shaders/SHVkShaderModule.h"
|
||||
#include "Assets/Asset Types/SHShaderAsset.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
class SHVkLogicalDevice;
|
||||
|
||||
/*
|
||||
* The purpose of this shader module library is to be separate from the source library. The source library contains
|
||||
* pure shader binary data that contains no vulkan related objects. Every time we load on unload a scene/level,
|
||||
* this class and the source library class is cleared of its modules and recreated.
|
||||
*/
|
||||
class SHShaderModuleLibrary
|
||||
{
|
||||
private:
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* PRIVATE MEMBER VARIABLES */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
//! Stored shader modules
|
||||
std::unordered_map<uint32_t, Handle<SHVkShaderModule>> shaderModules;
|
||||
std::unordered_map<std::string, Handle<SHVkShaderModule>> builtInShaderModules;
|
||||
|
||||
inline vk::ShaderStageFlagBits GetVkShaderFlag(SH_SHADER_TYPE type) noexcept;
|
||||
|
||||
public:
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* PUBLIC MEMBER FUNCTIONS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
//void ImportFromSourceLibrary(Handle<SHVkLogicalDevice>& logicalDeviceHdl, SHShaderSourceLibrary const& sourceLib) noexcept;
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* SETTERS AND GETTERS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
Handle<SHVkShaderModule> GetBuiltInShaderModule(std::string shaderName) const noexcept;
|
||||
|
||||
void ImportAllShaderSource(Handle<SHVkLogicalDevice>& logicalDeviceHdl) noexcept;
|
||||
void ReflectAllShaderModules() noexcept;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
|
@ -260,7 +260,7 @@ namespace SHADE
|
|||
return wndHWND;
|
||||
}
|
||||
|
||||
const WindowData SHWindow::GetWindowData()
|
||||
const WindowData SHWindow::GetWindowData() const
|
||||
{
|
||||
return wndData;
|
||||
}
|
||||
|
|
|
@ -123,7 +123,7 @@ namespace SHADE
|
|||
|
||||
HWND GetHWND();
|
||||
|
||||
const WindowData GetWindowData();
|
||||
const WindowData GetWindowData() const;
|
||||
|
||||
CALLBACKID RegisterWindowSizeCallback(WindowResizeCallbackFn);
|
||||
void UnregisterWindowSizeCallback(CALLBACKID const& callbackid);
|
||||
|
|
|
@ -47,16 +47,14 @@ namespace SHADE
|
|||
{
|
||||
// Get the current scene graph to traverse and update
|
||||
const auto& SCENE_GRAPH = SHSceneManager::GetCurrentSceneGraph();
|
||||
|
||||
// TODO(Diren): Consider how to clear dirty in pause / stop mode and update physics, but do not clear in play mode.
|
||||
UpdateEntity(SCENE_GRAPH.GetRoot(), false);
|
||||
UpdateEntity(SCENE_GRAPH.GetRoot(), !IsRunInEditorPause);
|
||||
}
|
||||
|
||||
void SHTransformSystem::TransformPostPhysicsUpdate::Execute(double) noexcept
|
||||
{
|
||||
// Get the current scene graph to traverse and update
|
||||
const auto& SCENE_GRAPH = SHSceneManager::GetCurrentSceneGraph();
|
||||
UpdateEntity(SCENE_GRAPH.GetRoot(), true);
|
||||
UpdateEntity(SCENE_GRAPH.GetRoot(), IsRunInEditorPause);
|
||||
}
|
||||
|
||||
void SHTransformSystem::Init()
|
||||
|
|
|
@ -96,7 +96,7 @@ namespace SHADE
|
|||
void SetDensity (float density) noexcept;
|
||||
void SetMaterial (const SHPhysicsMaterial& newMaterial) noexcept;
|
||||
|
||||
void SetPositionOffset (const SHVec3& positionOffset) noexcept;
|
||||
void SetPositionOffset (const SHVec3& posOffset) noexcept;
|
||||
|
||||
private:
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
|
|
@ -172,90 +172,94 @@ namespace SHADE
|
|||
{
|
||||
SHASSERT(rp3dBody != nullptr, "ReactPhysics body does not exist!")
|
||||
|
||||
if (rb->dirtyFlags == 0)
|
||||
return;
|
||||
|
||||
auto* rigidBody = reinterpret_cast<rp3d::RigidBody*>(rp3dBody);
|
||||
|
||||
const uint16_t RB_FLAGS = rb->dirtyFlags;
|
||||
for (size_t i = 0; i < SHRigidBodyComponent::NUM_DIRTY_FLAGS; ++i)
|
||||
if (rb->dirtyFlags != 0)
|
||||
{
|
||||
// Check if current dirty flag has been set to true
|
||||
if (RB_FLAGS & 1U << i)
|
||||
const uint16_t RB_FLAGS = rb->dirtyFlags;
|
||||
for (size_t i = 0; i < SHRigidBodyComponent::NUM_DIRTY_FLAGS; ++i)
|
||||
{
|
||||
switch (i)
|
||||
// Check if current dirty flag has been set to true
|
||||
if (RB_FLAGS & 1U << i)
|
||||
{
|
||||
case 0: // Gravity
|
||||
switch (i)
|
||||
{
|
||||
rigidBody->enableGravity(rb->IsGravityEnabled());
|
||||
break;
|
||||
}
|
||||
case 1: // Sleeping
|
||||
{
|
||||
rigidBody->setIsAllowedToSleep(rb->IsAllowedToSleep());
|
||||
break;
|
||||
}
|
||||
case 2: // Linear Constraints
|
||||
{
|
||||
const rp3d::Vector3 CONSTRAINTS
|
||||
case 0: // Gravity
|
||||
{
|
||||
rb->flags & 1U << 2 ? 0.0f : 1.0f,
|
||||
rb->flags & 1U << 3 ? 0.0f : 1.0f,
|
||||
rb->flags & 1U << 4 ? 0.0f : 1.0f
|
||||
};
|
||||
rigidBody->enableGravity(rb->IsGravityEnabled());
|
||||
break;
|
||||
}
|
||||
case 1: // Sleeping
|
||||
{
|
||||
rigidBody->setIsAllowedToSleep(rb->IsAllowedToSleep());
|
||||
break;
|
||||
}
|
||||
case 2: // Linear Constraints
|
||||
{
|
||||
const rp3d::Vector3 CONSTRAINTS
|
||||
{
|
||||
rb->flags & 1U << 2 ? 0.0f : 1.0f,
|
||||
rb->flags & 1U << 3 ? 0.0f : 1.0f,
|
||||
rb->flags & 1U << 4 ? 0.0f : 1.0f
|
||||
};
|
||||
|
||||
|
||||
rigidBody->setLinearLockAxisFactor(CONSTRAINTS);
|
||||
break;
|
||||
}
|
||||
case 3: // Angular Constraints
|
||||
{
|
||||
const rp3d::Vector3 CONSTRAINTS
|
||||
rigidBody->setLinearLockAxisFactor(CONSTRAINTS);
|
||||
break;
|
||||
}
|
||||
case 3: // Angular Constraints
|
||||
{
|
||||
rb->flags & 1U << 5 ? 0.0f : 1.0f,
|
||||
rb->flags & 1U << 6 ? 0.0f : 1.0f,
|
||||
rb->flags & 1U << 7 ? 0.0f : 1.0f
|
||||
};
|
||||
const rp3d::Vector3 CONSTRAINTS
|
||||
{
|
||||
rb->flags & 1U << 5 ? 0.0f : 1.0f,
|
||||
rb->flags & 1U << 6 ? 0.0f : 1.0f,
|
||||
rb->flags & 1U << 7 ? 0.0f : 1.0f
|
||||
};
|
||||
|
||||
rigidBody->setAngularLockAxisFactor(CONSTRAINTS);
|
||||
break;
|
||||
rigidBody->setAngularLockAxisFactor(CONSTRAINTS);
|
||||
break;
|
||||
}
|
||||
case 4: // Type
|
||||
{
|
||||
rigidBody->setType(static_cast<rp3d::BodyType>(rb->GetType()));
|
||||
break;
|
||||
}
|
||||
case 5: // Mass
|
||||
{
|
||||
rigidBody->setMass(rb->GetMass());
|
||||
break;
|
||||
}
|
||||
case 6: // Drag
|
||||
{
|
||||
rigidBody->setLinearDamping(rb->GetDrag());
|
||||
break;
|
||||
}
|
||||
case 7: // Angular Drag
|
||||
{
|
||||
rigidBody->setAngularDamping(rb->GetAngularDrag());
|
||||
break;
|
||||
}
|
||||
case 8: // Linear Velocity
|
||||
{
|
||||
rigidBody->setLinearVelocity(rb->GetLinearVelocity());
|
||||
break;
|
||||
}
|
||||
case 9: // Angular Velocity
|
||||
{
|
||||
rigidBody->setAngularVelocity(rb->GetAngularVelocity());
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
case 4: // Type
|
||||
{
|
||||
rigidBody->setType(static_cast<rp3d::BodyType>(rb->GetType()));
|
||||
break;
|
||||
}
|
||||
case 5: // Mass
|
||||
{
|
||||
rigidBody->setMass(rb->GetMass());
|
||||
break;
|
||||
}
|
||||
case 6: // Drag
|
||||
{
|
||||
rigidBody->setLinearDamping(rb->GetDrag());
|
||||
break;
|
||||
}
|
||||
case 7: // Angular Drag
|
||||
{
|
||||
rigidBody->setAngularDamping(rb->GetAngularDrag());
|
||||
break;
|
||||
}
|
||||
case 8: // Linear Velocity
|
||||
{
|
||||
rigidBody->setLinearVelocity(rb->GetLinearVelocity());
|
||||
break;
|
||||
}
|
||||
case 9: // Angular Velocity
|
||||
{
|
||||
rigidBody->setAngularVelocity(rb->GetAngularVelocity());
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rb->dirtyFlags = 0;
|
||||
rb->dirtyFlags = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
rb->linearVelocity = rigidBody->getLinearVelocity();
|
||||
rb->angularVelocity = rigidBody->getAngularVelocity();
|
||||
}
|
||||
}
|
||||
|
||||
void SHPhysicsObject::SyncColliders(SHColliderComponent* c) const noexcept
|
||||
|
@ -266,8 +270,12 @@ namespace SHADE
|
|||
if (!collider.dirty)
|
||||
continue;
|
||||
|
||||
// Update offsets
|
||||
auto* rp3dCollider = rp3dBody->getCollider(index);
|
||||
|
||||
// Update trigger flag
|
||||
rp3dCollider->setIsTrigger(collider.IsTrigger());
|
||||
|
||||
// Update offsets
|
||||
rp3dCollider->setLocalToBodyTransform(rp3d::Transform(collider.GetPositionOffset(), SHQuaternion::Identity));
|
||||
|
||||
switch (collider.GetType())
|
||||
|
@ -293,6 +301,8 @@ namespace SHADE
|
|||
default: break;
|
||||
}
|
||||
|
||||
// TODO(Diren): Update Material
|
||||
|
||||
collider.dirty = false;
|
||||
++index;
|
||||
}
|
||||
|
|
|
@ -19,8 +19,9 @@
|
|||
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||
#include "Editor/SHEditor.h"
|
||||
#include "Math/SHMathHelpers.h"
|
||||
#include "Scene/SHSceneManager.h"
|
||||
#include "Math/Transform/SHTransformComponent.h"
|
||||
#include "Scene/SHSceneManager.h"
|
||||
#include "Scripting/SHScriptEngine.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -99,6 +100,16 @@ namespace SHADE
|
|||
return 0;
|
||||
}
|
||||
|
||||
const SHPhysicsSystem::CollisionEvents& SHPhysicsSystem::GetCollisionInfo() const noexcept
|
||||
{
|
||||
return collisionInfo;
|
||||
}
|
||||
|
||||
const SHPhysicsSystem::CollisionEvents& SHPhysicsSystem::GetTriggerInfo() const noexcept
|
||||
{
|
||||
return triggerInfo;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Setter Function Definitions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
@ -187,6 +198,7 @@ namespace SHADE
|
|||
settings.defaultBounciness = 0.0f;
|
||||
|
||||
world = factory.createPhysicsWorld(settings);
|
||||
world->setEventListener(this);
|
||||
|
||||
// Set up solvers
|
||||
world->setContactsPositionCorrectionTechnique(rp3d::ContactsPositionCorrectionTechnique::SPLIT_IMPULSES);
|
||||
|
@ -246,7 +258,10 @@ namespace SHADE
|
|||
if (physicsObject.rp3dBody == nullptr)
|
||||
continue;
|
||||
|
||||
const auto* transformComponent = SHComponentManager::GetComponent_s<SHTransformComponent>(entityID);
|
||||
const auto* transformComponent = SHComponentManager::GetComponent_s<SHTransformComponent>(entityID);
|
||||
auto* rigidBodyComponent = SHComponentManager::GetComponent_s<SHRigidBodyComponent>(entityID);
|
||||
auto* colliderComponent = SHComponentManager::GetComponent_s<SHColliderComponent>(entityID);
|
||||
|
||||
if (transformComponent && transformComponent->HasChanged())
|
||||
{
|
||||
const auto WORLD_POS = transformComponent->GetWorldPosition();
|
||||
|
@ -255,68 +270,112 @@ namespace SHADE
|
|||
physicsObject.SetPosition(WORLD_POS);
|
||||
physicsObject.SetOrientation(WORLD_ROT);
|
||||
|
||||
auto* rigidBodyComponent = SHComponentManager::GetComponent_s<SHRigidBodyComponent>(entityID);
|
||||
// Sync physics component transforms
|
||||
|
||||
if (rigidBodyComponent)
|
||||
{
|
||||
rigidBodyComponent->position = WORLD_POS;
|
||||
rigidBodyComponent->orientation = WORLD_ROT;
|
||||
|
||||
// Clear all forces and velocities if editor is stopped
|
||||
if (SHSystemManager::GetSystem<SHEditor>()->editorState == SHEditor::State::STOP)
|
||||
{
|
||||
auto* rp3dRigidBody = reinterpret_cast<rp3d::RigidBody*>(physicsObject.rp3dBody);
|
||||
rp3dRigidBody->resetForce();
|
||||
rp3dRigidBody->resetTorque();
|
||||
rp3dRigidBody->setLinearVelocity(SHVec3::Zero);
|
||||
rp3dRigidBody->setAngularVelocity(SHVec3::Zero);
|
||||
}
|
||||
}
|
||||
|
||||
auto* colliderComponent = SHComponentManager::GetComponent_s<SHColliderComponent>(entityID);
|
||||
if (colliderComponent)
|
||||
{
|
||||
colliderComponent->position = WORLD_POS;
|
||||
colliderComponent->orientation = WORLD_ROT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update bodies and colliders if component is dirty
|
||||
system->SyncRigidBodyComponents(SHComponentManager::GetDense<SHRigidBodyComponent>());
|
||||
system->SyncColliderComponents(SHComponentManager::GetDense<SHColliderComponent>());
|
||||
// Sync rigid bodies
|
||||
|
||||
if (rigidBodyComponent)
|
||||
{
|
||||
// Clear all forces and velocities if editor is stopped
|
||||
if (SHSystemManager::GetSystem<SHEditor>()->editorState == SHEditor::State::STOP)
|
||||
{
|
||||
auto* rp3dRigidBody = reinterpret_cast<rp3d::RigidBody*>(physicsObject.rp3dBody);
|
||||
rp3dRigidBody->resetForce();
|
||||
rp3dRigidBody->resetTorque();
|
||||
rp3dRigidBody->setLinearVelocity(SHVec3::Zero);
|
||||
rp3dRigidBody->setAngularVelocity(SHVec3::Zero);
|
||||
}
|
||||
|
||||
// Sync active states
|
||||
const bool COMPONENT_ACTIVE = rigidBodyComponent->isActive;
|
||||
SyncActiveStates(physicsObject, COMPONENT_ACTIVE);
|
||||
|
||||
if (!COMPONENT_ACTIVE)
|
||||
continue;
|
||||
|
||||
physicsObject.SyncRigidBody(rigidBodyComponent);
|
||||
}
|
||||
|
||||
// Sync colliders
|
||||
|
||||
if (colliderComponent)
|
||||
{
|
||||
const bool COMPONENT_ACTIVE = colliderComponent->isActive;
|
||||
SyncActiveStates(physicsObject, colliderComponent->isActive);
|
||||
|
||||
if (!COMPONENT_ACTIVE)
|
||||
continue;
|
||||
|
||||
physicsObject.SyncColliders(colliderComponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SHPhysicsSystem::PhysicsFixedUpdate::Execute(double dt) noexcept
|
||||
{
|
||||
auto* system = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||
fixedTimeStep = 1.0 / system->fixedDT;
|
||||
auto* physicsSystem = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||
|
||||
fixedTimeStep = 1.0 / physicsSystem->fixedDT;
|
||||
accumulatedTime += dt;
|
||||
|
||||
int count = 0;
|
||||
while (accumulatedTime > fixedTimeStep)
|
||||
{
|
||||
system->world->update(static_cast<rp3d::decimal>(fixedTimeStep));
|
||||
physicsSystem->world->update(static_cast<rp3d::decimal>(fixedTimeStep));
|
||||
|
||||
accumulatedTime -= fixedTimeStep;
|
||||
++count;
|
||||
}
|
||||
|
||||
stats.numSteps = count;
|
||||
system->worldUpdated = count > 0;
|
||||
physicsSystem->worldUpdated = count > 0;
|
||||
|
||||
system->interpolationFactor = accumulatedTime / fixedTimeStep;
|
||||
physicsSystem->interpolationFactor = accumulatedTime / fixedTimeStep;
|
||||
}
|
||||
|
||||
void SHPhysicsSystem::PhysicsPostUpdate::Execute(double) noexcept
|
||||
{
|
||||
auto* system = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||
auto* physicsSystem = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||
|
||||
// Interpolate transforms for rendering
|
||||
if (system->worldUpdated)
|
||||
{
|
||||
system->SyncTransforms();
|
||||
if (physicsSystem->worldUpdated)
|
||||
physicsSystem->SyncTransforms();
|
||||
|
||||
// TODO(Diren): Handle trigger messages for scripting
|
||||
physicsSystem->ClearInvalidCollisions();
|
||||
}
|
||||
|
||||
void SHPhysicsSystem::onContact(const CallbackData& callbackData)
|
||||
{
|
||||
for (uint32_t i = 0; i < callbackData.getNbContactPairs(); ++i)
|
||||
{
|
||||
const auto CONTACT_PAIR = callbackData.getContactPair(i);
|
||||
const SHCollisionEvent NEW_EVENT = GenerateCollisionEvent(CONTACT_PAIR);
|
||||
|
||||
UpdateEventContainers(NEW_EVENT, collisionInfo);
|
||||
}
|
||||
}
|
||||
|
||||
void SHPhysicsSystem::onTrigger(const rp3d::OverlapCallback::CallbackData& callbackData)
|
||||
{
|
||||
for (uint32_t i = 0; i < callbackData.getNbOverlappingPairs(); ++i)
|
||||
{
|
||||
const auto& OVERLAP_PAIR = callbackData.getOverlappingPair(i);
|
||||
const SHCollisionEvent NEW_EVENT = GenerateCollisionEvent(OVERLAP_PAIR);
|
||||
|
||||
UpdateEventContainers(NEW_EVENT, triggerInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -353,58 +412,11 @@ namespace SHADE
|
|||
map.erase(entityID);
|
||||
}
|
||||
|
||||
void SHPhysicsSystem::SyncActiveStates(SHPhysicsObject* physicsObject, bool componentActive) noexcept
|
||||
void SHPhysicsSystem::SyncActiveStates(SHPhysicsObject& physicsObject, bool componentActive) noexcept
|
||||
{
|
||||
const bool RP3D_ACTIVE = physicsObject->rp3dBody->isActive();
|
||||
const bool RP3D_ACTIVE = physicsObject.rp3dBody->isActive();
|
||||
if (RP3D_ACTIVE != componentActive)
|
||||
physicsObject->rp3dBody->setIsActive(componentActive);
|
||||
}
|
||||
|
||||
|
||||
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* physicsObject = GetPhysicsObject(ENTITY_ID);
|
||||
|
||||
// TODO(Diren): Check if active in hierarchy
|
||||
const bool COMPONENT_ACTIVE = comp.isActive;
|
||||
SyncActiveStates(physicsObject, COMPONENT_ACTIVE);
|
||||
|
||||
if (!COMPONENT_ACTIVE)
|
||||
continue;
|
||||
|
||||
physicsObject->SyncRigidBody(&comp);
|
||||
}
|
||||
}
|
||||
|
||||
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* physicsObject = GetPhysicsObject(ENTITY_ID);
|
||||
|
||||
// TODO(Diren): Check if active in hierarchy
|
||||
const bool COMPONENT_ACTIVE = comp.isActive;
|
||||
SyncActiveStates(physicsObject, COMPONENT_ACTIVE);
|
||||
|
||||
if (!COMPONENT_ACTIVE)
|
||||
continue;
|
||||
|
||||
physicsObject->SyncColliders(&comp);
|
||||
}
|
||||
physicsObject.rp3dBody->setIsActive(componentActive);
|
||||
}
|
||||
|
||||
void SHPhysicsSystem::SyncTransforms() noexcept
|
||||
|
@ -459,15 +471,54 @@ namespace SHADE
|
|||
}
|
||||
|
||||
// Convert RP3D Transform to SHADE
|
||||
auto* transformComponent = SHComponentManager::GetComponent<SHTransformComponent>(entityID);
|
||||
transformComponent->SetWorldPosition(rp3dPos);
|
||||
transformComponent->SetWorldOrientation(rp3dRot);
|
||||
auto* transformComponent = SHComponentManager::GetComponent_s<SHTransformComponent>(entityID);
|
||||
|
||||
if (transformComponent != nullptr)
|
||||
{
|
||||
transformComponent->SetWorldPosition(rp3dPos);
|
||||
transformComponent->SetWorldOrientation(rp3dRot);
|
||||
}
|
||||
|
||||
// Cache transforms
|
||||
physicsObject.prevTransform = CURRENT_TF;
|
||||
}
|
||||
}
|
||||
|
||||
void SHPhysicsSystem::UpdateEventContainers(const SHCollisionEvent& collisionEvent, CollisionEvents& container) noexcept
|
||||
{
|
||||
const auto IT = std::ranges::find_if(container.begin(), container.end(), [&](const SHCollisionEvent& e)
|
||||
{
|
||||
const bool ENTITY_MATCH = e.value[0] == collisionEvent.value[0];
|
||||
const bool COLLIDERS_MATCH = e.value[1] == collisionEvent.value[1];
|
||||
return ENTITY_MATCH && COLLIDERS_MATCH;
|
||||
});
|
||||
|
||||
if (IT == container.end())
|
||||
container.emplace_back(collisionEvent);
|
||||
else
|
||||
IT->collisionState = collisionEvent.collisionState;
|
||||
}
|
||||
|
||||
void SHPhysicsSystem::ClearInvalidCollisions() noexcept
|
||||
{
|
||||
static const auto CLEAR = [](CollisionEvents& container)
|
||||
{
|
||||
for (auto eventIter = container.begin(); eventIter != container.end();)
|
||||
{
|
||||
const bool CLEAR_EVENT = eventIter->GetCollisionState() == SHCollisionEvent::State::EXIT
|
||||
|| eventIter->GetCollisionState() == SHCollisionEvent::State::INVALID;
|
||||
|
||||
if (CLEAR_EVENT)
|
||||
eventIter = container.erase(eventIter);
|
||||
else
|
||||
++eventIter;
|
||||
}
|
||||
};
|
||||
|
||||
CLEAR(collisionInfo);
|
||||
CLEAR(triggerInfo);
|
||||
}
|
||||
|
||||
SHEventHandle SHPhysicsSystem::AddPhysicsComponent(SHEventPtr addComponentEvent)
|
||||
{
|
||||
const auto& EVENT_DATA = reinterpret_cast<const SHEventSpec<SHComponentAddedEvent>*>(addComponentEvent.get());
|
||||
|
@ -556,14 +607,23 @@ namespace SHADE
|
|||
const EntityID ENTITY_ID = EVENT_DATA->data->eid;
|
||||
auto* physicsObject = GetPhysicsObject(ENTITY_ID);
|
||||
|
||||
SHASSERT(physicsObject != nullptr, "Physics object has been lost from the world!")
|
||||
auto* rigidBodyComponent = SHComponentManager::GetComponent_s<SHRigidBodyComponent>(ENTITY_ID);
|
||||
auto* colliderComponent = SHComponentManager::GetComponent_s<SHColliderComponent>(ENTITY_ID);
|
||||
|
||||
SHASSERT(physicsObject != nullptr, "Physics object " + std::to_string(ENTITY_ID) + " has been lost from the world!")
|
||||
|
||||
if (REMOVED_ID == RIGID_BODY_ID)
|
||||
{
|
||||
// Wake up all physics objects
|
||||
for (auto& [entityID, object] : map)
|
||||
{
|
||||
if (SHComponentManager::HasComponent<SHRigidBodyComponent>(entityID))
|
||||
reinterpret_cast<rp3d::RigidBody*>(object.rp3dBody)->setIsSleeping(false);
|
||||
}
|
||||
|
||||
world->destroyRigidBody(reinterpret_cast<rp3d::RigidBody*>(physicsObject->rp3dBody));
|
||||
physicsObject->rp3dBody = nullptr;
|
||||
|
||||
auto* colliderComponent = SHComponentManager::GetComponent_s<SHColliderComponent>(ENTITY_ID);
|
||||
if (colliderComponent != nullptr)
|
||||
{
|
||||
// Preserve colliders as a collision body
|
||||
|
@ -575,13 +635,6 @@ namespace SHADE
|
|||
for (auto& collider : colliderComponent->colliders)
|
||||
physicsObject->AddCollider(&collider);
|
||||
}
|
||||
|
||||
// Wake up all physics objects
|
||||
for (auto& [entityID, object] : map)
|
||||
{
|
||||
if (SHComponentManager::HasComponent<SHRigidBodyComponent>(entityID))
|
||||
reinterpret_cast<rp3d::RigidBody*>(object.rp3dBody)->setIsSleeping(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (REMOVED_ID == COLLIDER_ID)
|
||||
|
@ -594,6 +647,10 @@ namespace SHADE
|
|||
auto* collider = physicsObject->rp3dBody->getCollider(i);
|
||||
physicsObject->rp3dBody->removeCollider(collider);
|
||||
}
|
||||
|
||||
// Check for a rigidbody component
|
||||
if (rigidBodyComponent == nullptr)
|
||||
physicsObject->rp3dBody = nullptr;
|
||||
}
|
||||
|
||||
if (physicsObject->rp3dBody == nullptr)
|
||||
|
|
|
@ -23,16 +23,23 @@
|
|||
#include "Math/Transform/SHTransformComponent.h"
|
||||
#include "Scene/SHSceneGraph.h"
|
||||
#include "SHPhysicsObject.h"
|
||||
|
||||
#include "SHPhysicsUtils.h"
|
||||
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Concepts */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Type Definitions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
class SH_API SHPhysicsSystem final : public SHSystem
|
||||
class SH_API SHPhysicsSystem final : public SHSystem
|
||||
, public rp3d::EventListener
|
||||
{
|
||||
public:
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
@ -47,6 +54,8 @@ namespace SHADE
|
|||
bool sleepingEnabled;
|
||||
};
|
||||
|
||||
using CollisionEvents = std::vector<SHCollisionEvent>;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Constructors & Destructor */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
@ -57,13 +66,16 @@ namespace SHADE
|
|||
/* Getter Functions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
[[nodiscard]] double GetFixedDT () const noexcept;
|
||||
[[nodiscard]] double GetFixedDT () const noexcept;
|
||||
|
||||
[[nodiscard]] bool IsSleepingEnabled () const noexcept;
|
||||
[[nodiscard]] bool IsSleepingEnabled () const noexcept;
|
||||
|
||||
[[nodiscard]] SHVec3 GetWorldGravity () const noexcept;
|
||||
[[nodiscard]] uint16_t GetNumberVelocityIterations () const noexcept;
|
||||
[[nodiscard]] uint16_t GetNumberPositionIterations () const noexcept;
|
||||
[[nodiscard]] SHVec3 GetWorldGravity () const noexcept;
|
||||
[[nodiscard]] uint16_t GetNumberVelocityIterations () const noexcept;
|
||||
[[nodiscard]] uint16_t GetNumberPositionIterations () const noexcept;
|
||||
|
||||
[[nodiscard]] const CollisionEvents& GetCollisionInfo () const noexcept;
|
||||
[[nodiscard]] const CollisionEvents& GetTriggerInfo () const noexcept;
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
@ -82,16 +94,14 @@ namespace SHADE
|
|||
/* Function Members */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
void Init () override;
|
||||
void Exit () override;
|
||||
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 AddCollisionShape (EntityID entityID, SHCollider* collider);
|
||||
void RemoveCollisionShape (EntityID entityID, int index);
|
||||
|
||||
void AddCollisionShape (EntityID entityID, SHCollider* collider);
|
||||
void RemoveCollisionShape (EntityID entityID, int index);
|
||||
void onContact (const rp3d::CollisionCallback::CallbackData& callbackData) override;
|
||||
void onTrigger (const rp3d::OverlapCallback::CallbackData& callbackData) override;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* System Routines */
|
||||
|
@ -156,49 +166,40 @@ namespace SHADE
|
|||
/* Data Members */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
bool worldUpdated;
|
||||
bool worldUpdated;
|
||||
|
||||
double interpolationFactor;
|
||||
double fixedDT;
|
||||
|
||||
rp3d::PhysicsWorld* world;
|
||||
rp3d::PhysicsCommon factory;
|
||||
|
||||
EntityObjectMap map;
|
||||
double interpolationFactor;
|
||||
double fixedDT;
|
||||
|
||||
rp3d::PhysicsWorld* world;
|
||||
rp3d::PhysicsCommon factory;
|
||||
|
||||
EntityObjectMap map;
|
||||
CollisionEvents collisionInfo;
|
||||
CollisionEvents triggerInfo;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Function Members */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
SHPhysicsObject* EnsurePhysicsObject (EntityID entityID) noexcept;
|
||||
SHPhysicsObject* GetPhysicsObject (EntityID entityID) noexcept;
|
||||
void DestroyPhysicsObject (EntityID entityID) noexcept;
|
||||
|
||||
void SyncActiveStates (SHPhysicsObject* physicsObject, bool componentActive) noexcept;
|
||||
void SyncRigidBodyComponents (std::vector<SHRigidBodyComponent>& denseArray) noexcept;
|
||||
void SyncColliderComponents (std::vector<SHColliderComponent>& denseArray) noexcept;
|
||||
SHPhysicsObject* EnsurePhysicsObject (EntityID entityID) noexcept;
|
||||
SHPhysicsObject* GetPhysicsObject (EntityID entityID) noexcept;
|
||||
void DestroyPhysicsObject (EntityID entityID) noexcept;
|
||||
|
||||
static void SyncActiveStates (SHPhysicsObject& physicsObject, bool componentActive) noexcept;
|
||||
void SyncTransforms () noexcept;
|
||||
|
||||
static void UpdateEventContainers (const SHCollisionEvent& collisionEvent, CollisionEvents& container) noexcept;
|
||||
void ClearInvalidCollisions () noexcept;
|
||||
|
||||
SHEventHandle AddPhysicsComponent (SHEventPtr addComponentEvent);
|
||||
SHEventHandle RemovePhysicsComponent (SHEventPtr removeComponentEvent);
|
||||
|
||||
template <typename RP3DCollisionPair, typename = std::enable_if_t
|
||||
<std::is_same_v<RP3DCollisionPair, rp3d::CollisionCallback::ContactPair>
|
||||
|| std::is_same_v<RP3DCollisionPair, rp3d::OverlapCallback::OverlapPair>>>
|
||||
SHCollisionEvent GenerateCollisionEvent (const RP3DCollisionPair& cp) noexcept;
|
||||
};
|
||||
} // namespace SHADE
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Event Data Definitions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
struct SHPhysicsColliderAddedEvent
|
||||
{
|
||||
EntityID entityID;
|
||||
SHCollider::Type colliderType;
|
||||
int colliderIndex;
|
||||
};
|
||||
|
||||
struct SHPhysicsColliderRemovedEvent
|
||||
{
|
||||
EntityID entityID;
|
||||
int colliderIndex;
|
||||
};
|
||||
|
||||
} // namespace SHADE
|
||||
#include "SHPhysicsSystem.hpp"
|
|
@ -0,0 +1,84 @@
|
|||
/****************************************************************************************
|
||||
* \file SHPhysicsSystem.hpp
|
||||
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||
* \brief Implementation for templated functions 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 <type_traits>
|
||||
|
||||
// Primary Header
|
||||
#include "SHPhysicsSystem.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Private Function Member Definitions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
template <typename RP3DCollisionPair, typename Condition>
|
||||
SHCollisionEvent SHPhysicsSystem::GenerateCollisionEvent(const RP3DCollisionPair& cp) noexcept
|
||||
{
|
||||
static const auto MATCH_COLLIDER = []
|
||||
(
|
||||
const SHPhysicsObject& physicsObject
|
||||
, const rp3d::Entity colliderID
|
||||
)->uint32_t
|
||||
{
|
||||
for (uint32_t i = 0; i < physicsObject.rp3dBody->getNbColliders(); ++i)
|
||||
{
|
||||
const auto* collider = physicsObject.rp3dBody->getCollider(i);
|
||||
if (collider->getEntity() == colliderID)
|
||||
return i;
|
||||
}
|
||||
|
||||
return std::numeric_limits<uint32_t>::max();
|
||||
};
|
||||
|
||||
SHCollisionEvent cInfo;
|
||||
|
||||
// Match body and collider for collision event
|
||||
const rp3d::Entity body1 = cp.getBody1()->getEntity();
|
||||
const rp3d::Entity body2 = cp.getBody2()->getEntity();
|
||||
const rp3d::Entity collider1 = cp.getCollider1()->getEntity();
|
||||
const rp3d::Entity collider2 = cp.getCollider2()->getEntity();
|
||||
|
||||
// Find and match both ids
|
||||
bool matched[2] = { false, false };
|
||||
|
||||
|
||||
for (auto& [entityID, physicsObject] : map)
|
||||
{
|
||||
// Match body 1
|
||||
if (matched[SHCollisionEvent::ENTITY_A] == false && physicsObject.rp3dBody->getEntity() == body1)
|
||||
{
|
||||
cInfo.ids[SHCollisionEvent::ENTITY_A] = entityID;
|
||||
cInfo.ids[SHCollisionEvent::COLLIDER_A] = MATCH_COLLIDER(physicsObject, collider1);
|
||||
|
||||
matched[SHCollisionEvent::ENTITY_A] = true;
|
||||
}
|
||||
|
||||
// Match body 2
|
||||
if (matched[SHCollisionEvent::ENTITY_B] == false && physicsObject.rp3dBody->getEntity() == body2)
|
||||
{
|
||||
cInfo.ids[SHCollisionEvent::ENTITY_B] = entityID;
|
||||
cInfo.ids[SHCollisionEvent::COLLIDER_B] = MATCH_COLLIDER(physicsObject, collider2);
|
||||
|
||||
matched[SHCollisionEvent::ENTITY_B] = true;
|
||||
}
|
||||
|
||||
if (matched[SHCollisionEvent::ENTITY_A] == true && matched[SHCollisionEvent::ENTITY_B] == true)
|
||||
return cInfo;
|
||||
}
|
||||
|
||||
// Update collision state
|
||||
cInfo.collisionState = static_cast<SHCollisionEvent::State>(cp.getEventType());
|
||||
|
||||
return cInfo;
|
||||
}
|
||||
} // namespace SHADE
|
|
@ -0,0 +1,93 @@
|
|||
/****************************************************************************************
|
||||
* \file SHPhysicsUtils.cpp
|
||||
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||
* \brief Implementation for some Physics Utilities
|
||||
*
|
||||
* \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 "SHPhysicsUtils.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Constructors & Destructor Definitions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
SHCollisionEvent::SHCollisionEvent() noexcept
|
||||
: collisionState { State::INVALID }
|
||||
{
|
||||
ids[ENTITY_A] = MAX_EID;
|
||||
ids[ENTITY_B] = MAX_EID;
|
||||
ids[COLLIDER_A] = std::numeric_limits<uint32_t>::max();
|
||||
ids[COLLIDER_B] = std::numeric_limits<uint32_t>::max();
|
||||
}
|
||||
|
||||
SHCollisionEvent::SHCollisionEvent(EntityID entityA, EntityID entityB) noexcept
|
||||
: collisionState { State::INVALID }
|
||||
{
|
||||
ids[ENTITY_A] = entityA;
|
||||
ids[ENTITY_B] = entityB;
|
||||
ids[COLLIDER_A] = std::numeric_limits<uint32_t>::max();
|
||||
ids[COLLIDER_B] = std::numeric_limits<uint32_t>::max();
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Operator Overload Definitions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
bool SHCollisionEvent::operator==(const SHCollisionEvent& rhs) const noexcept
|
||||
{
|
||||
return value[0] == rhs.value[0] && value[1] == rhs.value[1];
|
||||
}
|
||||
|
||||
bool SHCollisionEvent::operator!=(const SHCollisionEvent& rhs) const noexcept
|
||||
{
|
||||
return value[0] != rhs.value[0] || value[1] != rhs.value[1];
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Getter Function Definitions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
EntityID SHCollisionEvent::GetEntityA() const noexcept
|
||||
{
|
||||
return ids[ENTITY_A];
|
||||
}
|
||||
|
||||
EntityID SHCollisionEvent::GetEntityB() const noexcept
|
||||
{
|
||||
return ids[ENTITY_B];
|
||||
}
|
||||
|
||||
const SHRigidBodyComponent* SHCollisionEvent::GetRigidBodyA() const noexcept
|
||||
{
|
||||
return SHComponentManager::GetComponent_s<SHRigidBodyComponent>(ids[ENTITY_A]);
|
||||
}
|
||||
|
||||
const SHRigidBodyComponent* SHCollisionEvent::GetRigidBodyB() const noexcept
|
||||
{
|
||||
return SHComponentManager::GetComponent_s<SHRigidBodyComponent>(ids[ENTITY_B]);
|
||||
}
|
||||
|
||||
const SHCollider* SHCollisionEvent::GetColliderA() const noexcept
|
||||
{
|
||||
return &SHComponentManager::GetComponent<SHColliderComponent>(ids[ENTITY_A])->GetCollider(ids[COLLIDER_A]);
|
||||
}
|
||||
|
||||
const SHCollider* SHCollisionEvent::GetColliderB() const noexcept
|
||||
{
|
||||
return &SHComponentManager::GetComponent<SHColliderComponent>(ids[ENTITY_B])->GetCollider(ids[COLLIDER_B]);
|
||||
}
|
||||
|
||||
SHCollisionEvent::State SHCollisionEvent::GetCollisionState() const noexcept
|
||||
{
|
||||
return collisionState;
|
||||
}
|
||||
|
||||
} // namespace SHADE
|
|
@ -0,0 +1,116 @@
|
|||
/****************************************************************************************
|
||||
* \file SHPhysicsUtils.h
|
||||
* \author Diren D Bharwani, diren.dbharwani, 390002520
|
||||
* \brief Interface for some Physics Utilities
|
||||
*
|
||||
* \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 "Components/SHColliderComponent.h"
|
||||
#include "Components/SHRigidBodyComponent.h"
|
||||
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
/* Type Definitions */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
|
||||
struct SHPhysicsColliderAddedEvent
|
||||
{
|
||||
EntityID entityID;
|
||||
SHCollider::Type colliderType;
|
||||
int colliderIndex;
|
||||
};
|
||||
|
||||
struct SHPhysicsColliderRemovedEvent
|
||||
{
|
||||
EntityID entityID;
|
||||
int colliderIndex;
|
||||
};
|
||||
|
||||
class SH_API SHCollisionEvent
|
||||
{
|
||||
private:
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Friends */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
friend class SHPhysicsSystem;
|
||||
|
||||
public:
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Type Definitions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
enum class State
|
||||
{
|
||||
ENTER
|
||||
, STAY
|
||||
, EXIT
|
||||
|
||||
, TOTAL
|
||||
, INVALID = -1
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Constructors & Destructor */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
SHCollisionEvent () noexcept;
|
||||
SHCollisionEvent (EntityID entityA, EntityID entityB) noexcept;
|
||||
|
||||
|
||||
SHCollisionEvent (const SHCollisionEvent& rhs) = default;
|
||||
SHCollisionEvent (SHCollisionEvent&& rhs) = default;
|
||||
~SHCollisionEvent () = default;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Operator Overloads */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
bool operator== (const SHCollisionEvent& rhs) const noexcept;
|
||||
bool operator!= (const SHCollisionEvent& rhs) const noexcept;
|
||||
|
||||
SHCollisionEvent& operator= (const SHCollisionEvent& rhs) = default;
|
||||
SHCollisionEvent& operator= (SHCollisionEvent&& rhs) = default;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Getter Functions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
[[nodiscard]] EntityID GetEntityA () const noexcept;
|
||||
[[nodiscard]] EntityID GetEntityB () const noexcept;
|
||||
[[nodiscard]] const SHRigidBodyComponent* GetRigidBodyA () const noexcept;
|
||||
[[nodiscard]] const SHRigidBodyComponent* GetRigidBodyB () const noexcept;
|
||||
[[nodiscard]] const SHCollider* GetColliderA () const noexcept;
|
||||
[[nodiscard]] const SHCollider* GetColliderB () const noexcept;
|
||||
[[nodiscard]] State GetCollisionState () const noexcept;
|
||||
|
||||
private:
|
||||
|
||||
static constexpr uint32_t ENTITY_A = 0;
|
||||
static constexpr uint32_t ENTITY_B = 1;
|
||||
static constexpr uint32_t COLLIDER_A = 2;
|
||||
static constexpr uint32_t COLLIDER_B = 3;
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Data Members */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
||||
union
|
||||
{
|
||||
uint64_t value[2]; // EntityValue, ColliderIndexValue
|
||||
uint32_t ids [4]; // EntityA, EntityB, ColliderIndexA, ColliderIndexB
|
||||
};
|
||||
|
||||
State collisionState;
|
||||
};
|
||||
|
||||
|
||||
} // namespace SHADE
|
|
@ -17,9 +17,45 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#include "SH_API.h"
|
||||
#include "SHResourceLibrary.h"
|
||||
#include "Assets/SHAssetMacros.h"
|
||||
#include "Assets/Asset Types/SHMeshAsset.h"
|
||||
#include "Assets/Asset Types/SHTextureAsset.h"
|
||||
#include "Assets/Asset Types/SHShaderAsset.h"
|
||||
#include "Graphics/Shaders/SHVkShaderModule.h"
|
||||
#include "Graphics/MiddleEnd/Textures/SHTextureLibrary.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHMeshLibrary.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHMaterial.h"
|
||||
#include "Assets/Asset Types/SHMaterialAsset.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
template<typename T = void>
|
||||
struct SHResourceLoader
|
||||
{
|
||||
using AssetType = void;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct SHResourceLoader<SHMesh>
|
||||
{
|
||||
using AssetType = SHMeshAsset;
|
||||
};
|
||||
template<>
|
||||
struct SHResourceLoader<SHTexture>
|
||||
{
|
||||
using AssetType = SHTextureAsset;
|
||||
};
|
||||
template<>
|
||||
struct SHResourceLoader<SHVkShaderModule>
|
||||
{
|
||||
using AssetType = SHShaderAsset;
|
||||
};
|
||||
template<>
|
||||
struct SHResourceLoader<SHMaterial>
|
||||
{
|
||||
using AssetType = SHMaterialAsset;
|
||||
};
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Static class responsible for loading and caching runtime resources from their
|
||||
/// serialised Asset IDs.
|
||||
|
@ -124,6 +160,14 @@ namespace SHADE
|
|||
/// <returns>Reference to the AssetHandleMap of the specified type.</returns>
|
||||
template<typename ResourceType>
|
||||
static std::pair<AssetHandleMapRef, HandleAssetMapRef> getAssetHandleMap();
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="ResourceType"></typeparam>
|
||||
/// <param name="assetData"></param>
|
||||
/// <returns></returns>
|
||||
template<typename ResourceType>
|
||||
static Handle<ResourceType> load(AssetID assetId, const typename SHResourceLoader<ResourceType>::AssetType& assetData);
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 21, 2022
|
||||
\brief Contains the definition of the function templates of the
|
||||
\brief Contains the definition of the function templates of the
|
||||
SHResourceManager static class.
|
||||
|
||||
Copyright (C) 2022 DigiPen Institute of Technology.
|
||||
|
@ -13,12 +13,17 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#pragma once
|
||||
// Primary Include
|
||||
#include "SHResourceManager.h"
|
||||
// External Dependencies
|
||||
#include <yaml-cpp/yaml.h>
|
||||
// Project Includes
|
||||
#include "Assets/SHAssetManager.h"
|
||||
#include "Assets/Asset Types/SHAssetIncludes.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h"
|
||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||
#include "Tools/SHLog.h"
|
||||
#include "Graphics/Shaders/SHVkShaderModule.h"
|
||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -40,67 +45,19 @@ namespace SHADE
|
|||
return Handle<ResourceType>(typedHandleMap.get()[assetId]);
|
||||
|
||||
/* Otherwise, we need to load it! */
|
||||
// Meshes
|
||||
if constexpr (std::is_same_v<ResourceType, SHMesh>)
|
||||
// Load Asset Data
|
||||
const auto* assetData = SHAssetManager::GetData<SHResourceLoader<ResourceType>::AssetType>(assetId);
|
||||
if (assetData == nullptr)
|
||||
{
|
||||
// Get system
|
||||
SHGraphicsSystem* gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (gfxSystem == nullptr)
|
||||
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
||||
|
||||
// Load
|
||||
const SHMeshAsset* assetData = SHAssetManager::GetData<SHMeshAsset>(assetId);
|
||||
if (assetData == nullptr)
|
||||
{
|
||||
SHLog::Warning("[SHResourceManager] Attempted to load an asset with an invalid Asset ID.");
|
||||
return {};
|
||||
}
|
||||
loadedAssetData.emplace_back(assetId);
|
||||
|
||||
Handle<SHMesh> meshHandle = gfxSystem->AddMesh
|
||||
(
|
||||
assetData->vertexPosition.size(),
|
||||
assetData->vertexPosition.data(),
|
||||
assetData->texCoords.data(),
|
||||
assetData->vertexTangent.data(),
|
||||
assetData->vertexNormal.data(),
|
||||
assetData->indices.size(),
|
||||
assetData->indices.data()
|
||||
);
|
||||
Handle genericHandle = Handle(meshHandle);
|
||||
typedHandleMap.get().emplace(assetId, genericHandle);
|
||||
typedAssetIdMap.get().emplace(genericHandle, assetId);
|
||||
return meshHandle;
|
||||
SHLog::Warning("[SHResourceManager] Attempted to load an asset with an invalid Asset ID.");
|
||||
return {};
|
||||
}
|
||||
// Textures
|
||||
else if constexpr (std::is_same_v<ResourceType, SHTexture>)
|
||||
{
|
||||
// Get system
|
||||
SHGraphicsSystem* gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (gfxSystem == nullptr)
|
||||
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
||||
|
||||
// Load
|
||||
const SHTextureAsset* assetData = SHAssetManager::GetData<SHTextureAsset>(assetId);
|
||||
if (assetData == nullptr)
|
||||
{
|
||||
SHLog::Warning("[SHResourceManager] Attempted to load an asset with an invalid Asset ID.");
|
||||
return {};
|
||||
}
|
||||
loadedAssetData.emplace_back(assetId);
|
||||
|
||||
Handle<SHTexture> texHandle = gfxSystem->AddTexture
|
||||
(
|
||||
assetData->numBytes,
|
||||
assetData->pixelData,
|
||||
assetData->width,
|
||||
assetData->height,
|
||||
assetData->format,
|
||||
assetData->mipOffsets
|
||||
);
|
||||
typedHandleMap.get().emplace(assetId, Handle(texHandle));
|
||||
return texHandle;
|
||||
}
|
||||
auto handle = load<ResourceType>(assetId, *assetData);
|
||||
Handle genericHandle = Handle();
|
||||
typedHandleMap.get().emplace(assetId, genericHandle);
|
||||
typedAssetIdMap.get().emplace(genericHandle, assetId);
|
||||
return handle;
|
||||
}
|
||||
|
||||
template<typename ResourceType>
|
||||
|
@ -152,7 +109,7 @@ namespace SHADE
|
|||
template<typename ResourceType>
|
||||
std::pair<SHResourceManager::AssetHandleMapRef, SHResourceManager::HandleAssetMapRef> SHResourceManager::getAssetHandleMap()
|
||||
{
|
||||
const std::type_index TYPE = typeid(ResourceType);
|
||||
const std::type_index TYPE = typeid(ResourceType);
|
||||
|
||||
if (!handlesMap.contains(TYPE))
|
||||
{
|
||||
|
@ -160,7 +117,7 @@ namespace SHADE
|
|||
assetIdMap.emplace(TYPE, HandleAssetMap{});
|
||||
typedFreeFuncMap.emplace
|
||||
(
|
||||
TYPE,
|
||||
TYPE,
|
||||
[TYPE](AssetID assetId)
|
||||
{
|
||||
static_cast<Handle<ResourceType>>(SHResourceManager::handlesMap[TYPE][assetId]).Free();
|
||||
|
@ -169,4 +126,129 @@ namespace SHADE
|
|||
}
|
||||
return std::make_pair(std::ref(handlesMap[TYPE]), std::ref(assetIdMap[TYPE]));
|
||||
}
|
||||
|
||||
template<typename ResourceType>
|
||||
Handle<ResourceType> SHResourceManager::load(AssetID assetId, const typename SHResourceLoader<ResourceType>::AssetType& assetData)
|
||||
{
|
||||
// Get system
|
||||
SHGraphicsSystem* gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (gfxSystem == nullptr)
|
||||
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
||||
|
||||
// Meshes
|
||||
if constexpr (std::is_same_v<ResourceType, SHMesh>)
|
||||
{
|
||||
loadedAssetData.emplace_back(assetId);
|
||||
|
||||
return gfxSystem->AddMesh
|
||||
(
|
||||
assetData.vertexPosition.size(),
|
||||
assetData.vertexPosition.data(),
|
||||
assetData.texCoords.data(),
|
||||
assetData.vertexTangent.data(),
|
||||
assetData.vertexNormal.data(),
|
||||
assetData.indices.size(),
|
||||
assetData.indices.data()
|
||||
);
|
||||
}
|
||||
// Textures
|
||||
else if constexpr (std::is_same_v<ResourceType, SHTexture>)
|
||||
{
|
||||
loadedAssetData.emplace_back(assetId);
|
||||
|
||||
return gfxSystem->AddTexture
|
||||
(
|
||||
assetData.numBytes,
|
||||
assetData.pixelData,
|
||||
assetData.width,
|
||||
assetData.height,
|
||||
assetData.format,
|
||||
assetData.mipOffsets
|
||||
);
|
||||
}
|
||||
// Shaders
|
||||
else if constexpr (std::is_same_v<ResourceType, SHVkShaderModule>)
|
||||
{
|
||||
auto shader = gfxSystem->GetDevice()->CreateShaderModule
|
||||
(
|
||||
assetData.spirvBinary,
|
||||
"main",
|
||||
static_cast<vk::ShaderStageFlagBits>(assetData.shaderType),
|
||||
assetData.name
|
||||
);
|
||||
shader->Reflect();
|
||||
return shader;
|
||||
}
|
||||
// Materials
|
||||
else if constexpr (std::is_same_v<ResourceType, SHMaterial>)
|
||||
{
|
||||
// Get the data we need to construct
|
||||
SHMaterialSpec matSpec = YAML::Node(assetData.data).as<SHMaterialSpec>();
|
||||
|
||||
// Load shaders
|
||||
auto vertexShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(matSpec.vertexShader);
|
||||
auto fragShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(matSpec.fragShader);
|
||||
|
||||
// Ensure that both shaders are present
|
||||
if (!(vertexShader && fragShader))
|
||||
{
|
||||
SHLOG_ERROR("[SHResourceManager] Failed to load material as shaders failed to be loaded.");
|
||||
return {};
|
||||
}
|
||||
|
||||
// Grab subpass from worldRenderer
|
||||
auto renderPass = gfxSystem->GetPrimaryRenderpass();
|
||||
if (!renderPass)
|
||||
{
|
||||
SHLOG_ERROR("[SHResourceManager] Failed to load material as RenderPass could not be found.");
|
||||
return {};
|
||||
}
|
||||
auto subPass = renderPass->GetSubpass(matSpec.subpassName);
|
||||
if (!subPass)
|
||||
{
|
||||
SHLOG_ERROR("[SHResourceManager] Failed to load material as SubPass could not be found.");
|
||||
return {};
|
||||
}
|
||||
|
||||
// Create material
|
||||
auto matHandle = gfxSystem->AddMaterial(vertexShader, fragShader, subPass);
|
||||
|
||||
// Set properties for the material
|
||||
Handle<SHShaderBlockInterface> pipelineProperties = matHandle->GetShaderBlockInterface();
|
||||
for (int i = 0; i < static_cast<int>(pipelineProperties->GetVariableCount()); ++i)
|
||||
{
|
||||
const std::string& PROP_NAME = pipelineProperties->GetVariableName(i);
|
||||
const auto& PROP_NODE = matSpec.properties;
|
||||
if (PROP_NODE)
|
||||
{
|
||||
const std::string& VAR_NAME = pipelineProperties->GetVariableName(i);
|
||||
const SHShaderBlockInterface::Variable* VARIABLE = pipelineProperties->GetVariable(i);
|
||||
switch (VARIABLE->type)
|
||||
{
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::FLOAT:
|
||||
matHandle->SetProperty(VARIABLE->offset, PROP_NODE.as<float>());
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::INT:
|
||||
matHandle->SetProperty(VARIABLE->offset, PROP_NODE.as<int>());
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR2:
|
||||
matHandle->SetProperty(VARIABLE->offset, PROP_NODE.as<SHVec2>());
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR3:
|
||||
matHandle->SetProperty(VARIABLE->offset, PROP_NODE.as<SHVec3>());
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR4:
|
||||
matHandle->SetProperty(VARIABLE->offset, PROP_NODE.as<SHVec4>());
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::OTHER:
|
||||
default:
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return matHandle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ namespace SHADE
|
|||
/* System Routine Functions - FrameCleanUpRoutine */
|
||||
/*-----------------------------------------------------------------------------------*/
|
||||
SHScriptEngine::FrameCleanUpRoutine::FrameCleanUpRoutine()
|
||||
: SHSystemRoutine("Script Engine Frame Clean Up", false)
|
||||
: SHSystemRoutine("Script Engine Frame Clean Up", true)
|
||||
{}
|
||||
void SHScriptEngine::FrameCleanUpRoutine::Execute(double) noexcept
|
||||
{
|
||||
|
|
|
@ -12,8 +12,11 @@
|
|||
#include "Resource/SHResourceManager.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHMaterial.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||
#include "SHSerializationTools.h"
|
||||
#include "Physics/Components/SHColliderComponent.h"
|
||||
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
||||
#include "Tools/SHLog.h"
|
||||
|
||||
namespace YAML
|
||||
{
|
||||
|
@ -303,104 +306,45 @@ namespace YAML
|
|||
// Write Material
|
||||
YAML::Node node;
|
||||
|
||||
node[VERT_SHADER_YAML_TAG.data()] = 0; // SHResourceManager::GetAssetID<SHVkShaderModule>(vertexShader).value_or(0);
|
||||
node[FRAG_SHADER_YAML_TAG.data()] = 0; // SHResourceManager::GetAssetID<SHVkShaderModule>(fragShader).value_or(0);
|
||||
node[SUBPASS_YAML_TAG.data()] = rhs.GetPipeline()->GetPipelineState().GetSubpass()->GetName();
|
||||
node[VERT_SHADER_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHVkShaderModule>(vertexShader).value_or(0);
|
||||
node[FRAG_SHADER_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHVkShaderModule>(fragShader).value_or(0);
|
||||
node[SUBPASS_YAML_TAG.data()] = rhs.GetPipeline()->GetPipelineState().GetSubpass()->GetName();
|
||||
node[PROPS_YAML_TAG.data()] = propertiesNode;
|
||||
|
||||
return node;
|
||||
}
|
||||
static bool decode(YAML::Node const& node, SHMaterial& rhs)
|
||||
{
|
||||
/*
|
||||
// Retrieve Shader Asset IDs
|
||||
AssetID vertShaderId = 0;
|
||||
AssetID fragShaderId = 0;
|
||||
if (node[VERT_SHADER_YAML_TAG.data()])
|
||||
vertShaderId = node[VERT_SHADER_YAML_TAG.data()].as<AssetID>();
|
||||
if (node[FRAG_SHADER_YAML_TAG.data()])
|
||||
fragShaderId = node[FRAG_SHADER_YAML_TAG.data()].as<AssetID>();
|
||||
};
|
||||
|
||||
// Ensure that both shaders are present
|
||||
if (vertShaderId == 0 || fragShaderId == 0)
|
||||
return false; // No pipeline
|
||||
template<>
|
||||
struct convert<SHMaterialSpec>
|
||||
{
|
||||
static constexpr std::string_view VERT_SHADER_YAML_TAG = "VertexShader";
|
||||
static constexpr std::string_view FRAG_SHADER_YAML_TAG = "FragmentShader";
|
||||
static constexpr std::string_view SUBPASS_YAML_TAG = "SubPass";
|
||||
static constexpr std::string_view PROPS_YAML_TAG = "Properties";
|
||||
|
||||
// Get Shader Modules
|
||||
Handle<SHVkShaderModule> vertexShader, fragShader;
|
||||
vertexShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(vertShaderId);
|
||||
fragShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(fragShaderId);
|
||||
static bool decode(YAML::Node const& node, SHMaterialSpec& rhs)
|
||||
{
|
||||
// Retrieve Shader Asset IDs
|
||||
if (!node[VERT_SHADER_YAML_TAG.data()])
|
||||
return false;
|
||||
rhs.vertexShader = node[VERT_SHADER_YAML_TAG.data()].as<AssetID>();
|
||||
if (!node[FRAG_SHADER_YAML_TAG.data()])
|
||||
return false;
|
||||
rhs.fragShader = node[FRAG_SHADER_YAML_TAG.data()].as<AssetID>();
|
||||
|
||||
// Get Pipeline Library
|
||||
if (node[SUBPASS_YAML_TAG.data()])
|
||||
{
|
||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (!gfxSystem)
|
||||
return false;
|
||||
// Retrieve Subpass
|
||||
if (!node[SUBPASS_YAML_TAG.data()])
|
||||
return false;
|
||||
rhs.subpassName = node[SUBPASS_YAML_TAG.data()].as<std::string>();
|
||||
|
||||
// Grab subpass from worldRenderer
|
||||
auto renderPass = gfxSystem->GetPrimaryRenderpass();
|
||||
if (!renderPass)
|
||||
return false;
|
||||
auto subPass = renderPass->GetSubpass(node[SUBPASS_YAML_TAG.data()].as<std::string>());
|
||||
if (!subPass)
|
||||
return false;
|
||||
// Retrieve
|
||||
if (!node[PROPS_YAML_TAG.data()])
|
||||
return false;
|
||||
rhs.properties = node[PROPS_YAML_TAG.data()];
|
||||
|
||||
// Set Pipeline
|
||||
rhs.SetPipeline(renderPass->GetOrCreatePipeline
|
||||
(
|
||||
std::make_pair(vertexShader, fragShader),
|
||||
subPass
|
||||
));
|
||||
}
|
||||
*/
|
||||
|
||||
// TODO: Load Proper Material!
|
||||
// Set default material
|
||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (!gfxSystem)
|
||||
return false;
|
||||
rhs.SetPipeline(gfxSystem->GetDefaultMaterial()->GetPipeline());
|
||||
|
||||
if (node[PROPS_YAML_TAG.data()].IsDefined())
|
||||
{
|
||||
// Loop through all properties
|
||||
Handle<SHShaderBlockInterface> pipelineProperties = rhs.GetShaderBlockInterface();
|
||||
const YAML::Node& PROPS_NODE = node[PROPS_YAML_TAG.data()];
|
||||
for (int i = 0; i < static_cast<int>(pipelineProperties->GetVariableCount()); ++i)
|
||||
{
|
||||
const std::string& PROP_NAME = pipelineProperties->GetVariableName(i);
|
||||
const auto& PROP_NODE = PROPS_NODE[PROP_NAME.data()];
|
||||
if (PROP_NODE)
|
||||
{
|
||||
const std::string& VAR_NAME = pipelineProperties->GetVariableName(i);
|
||||
const SHShaderBlockInterface::Variable* VARIABLE = pipelineProperties->GetVariable(i);
|
||||
switch (VARIABLE->type)
|
||||
{
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::FLOAT:
|
||||
rhs.SetProperty(VARIABLE->offset, PROP_NODE.as<float>());
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::INT:
|
||||
rhs.SetProperty(VARIABLE->offset, PROP_NODE.as<int>());
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR2:
|
||||
rhs.SetProperty(VARIABLE->offset, SHSerializationTools::YAMLToVec2(PROP_NODE));
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR3:
|
||||
rhs.SetProperty(VARIABLE->offset, SHSerializationTools::YAMLToVec3(PROP_NODE));
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::VECTOR4:
|
||||
rhs.SetProperty(VARIABLE->offset, SHSerializationTools::YAMLToVec4(PROP_NODE));
|
||||
break;
|
||||
case SHADE::SHShaderBlockInterface::Variable::Type::OTHER:
|
||||
default:
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
@ -413,7 +357,7 @@ namespace YAML
|
|||
{
|
||||
YAML::Node node;
|
||||
node[MESH_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHMesh>(rhs.GetMesh()).value_or(0);
|
||||
node[MAT_YAML_TAG.data()] = 0; // TODO: Asset ID
|
||||
node[MAT_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHMaterial>(rhs.GetMaterial()->GetBaseMaterial()).value_or(0);
|
||||
return node;
|
||||
}
|
||||
static bool decode(YAML::Node const& node, SHRenderable& rhs)
|
||||
|
@ -424,12 +368,17 @@ namespace YAML
|
|||
}
|
||||
if (node[MAT_YAML_TAG.data()].IsDefined())
|
||||
{
|
||||
// TODO: Convert Asset ID To Material HAndle
|
||||
// Temporarily, use default material
|
||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||
if (!gfxSystem)
|
||||
return false;
|
||||
rhs.SetMaterial(gfxSystem->AddOrGetBaseMaterialInstance(gfxSystem->GetDefaultMaterial()));
|
||||
Handle<SHMaterial> baseMat = SHResourceManager::LoadOrGet<SHMaterial>(node[MAT_YAML_TAG.data()].as<AssetID>());
|
||||
if (!baseMat)
|
||||
{
|
||||
baseMat = gfxSystem->GetDefaultMaterial();
|
||||
SHLog::Warning("[SHSerializationHelper] Unable to load specified material. Falling back to default material.");
|
||||
}
|
||||
rhs.SetMaterial(gfxSystem->AddOrGetBaseMaterialInstance(baseMat));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ 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
|
||||
// Standard Library
|
||||
#include <string>
|
||||
// Project Headers
|
||||
|
|
|
@ -25,11 +25,16 @@ project "SHADE_Managed"
|
|||
includedirs
|
||||
{
|
||||
"%{prj.location}/src",
|
||||
}
|
||||
|
||||
externalincludedirs
|
||||
{
|
||||
"%{IncludeDir.spdlog}/include",
|
||||
"%{IncludeDir.imgui}",
|
||||
"%{IncludeDir.imguizmo}",
|
||||
"%{IncludeDir.imnodes}",
|
||||
"%{IncludeDir.yamlcpp}",
|
||||
"%{IncludeDir.SDL}\\include",
|
||||
"%{IncludeDir.RTTR}/include",
|
||||
"%{IncludeDir.dotnet}\\include",
|
||||
"%{IncludeDir.reactphysics3d}\\include",
|
||||
|
@ -38,13 +43,16 @@ project "SHADE_Managed"
|
|||
|
||||
libdirs
|
||||
{
|
||||
"%{IncludeDir.RTTR}/lib"
|
||||
"%{IncludeDir.RTTR}/lib",
|
||||
"%{IncludeDir.SDL}/lib"
|
||||
}
|
||||
|
||||
links
|
||||
{
|
||||
"yaml-cpp",
|
||||
"imgui",
|
||||
"SDL2.lib",
|
||||
"SDL2main.lib",
|
||||
"SHADE_Engine",
|
||||
"SHADE_CSharp"
|
||||
}
|
||||
|
|
|
@ -67,6 +67,11 @@ namespace SHADE
|
|||
ScriptStore::RemoveScript<T>(owner.GetEntity());
|
||||
}
|
||||
|
||||
BaseComponent::operator bool(BaseComponent^ c)
|
||||
{
|
||||
return c != nullptr;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Constructors */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
|
|
@ -101,6 +101,15 @@ namespace SHADE
|
|||
generic<typename T> where T : ref class, Script
|
||||
void RemoveScript();
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Operator Overloads */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Implicit conversion operator to enable checking if a component is null.
|
||||
/// </summary>
|
||||
/// <param name="c">Component to check.</param>
|
||||
static operator bool(BaseComponent^ c);
|
||||
|
||||
protected:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Constructors */
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
/************************************************************************************//*!
|
||||
\file Application.cxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 31, 2022
|
||||
\brief Contains the definitions of the functions in the static managed
|
||||
Application class.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
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.
|
||||
*//*************************************************************************************/
|
||||
// Precompiled Headers
|
||||
#include "SHpch.h"
|
||||
// Primary Header
|
||||
#include "Application.hxx"
|
||||
// External Dependencies
|
||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||
#include "Editor/SHEditor.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystemInterface.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Properties */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
bool Application::IsPlaying::get()
|
||||
{
|
||||
auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||
if (editor)
|
||||
return editor->editorState == SHEditor::State::PLAY
|
||||
||
|
||||
editor->editorState == SHEditor::State::PAUSE;
|
||||
|
||||
return true;
|
||||
}
|
||||
bool Application::IsPaused::get()
|
||||
{
|
||||
auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||
if (editor)
|
||||
return editor->editorState == SHEditor::State::PAUSE;
|
||||
|
||||
return false;
|
||||
}
|
||||
int Application::WindowWidth::get()
|
||||
{
|
||||
return SHGraphicsSystemInterface::GetWindowWidth();
|
||||
}
|
||||
int Application::WindowHeight::get()
|
||||
{
|
||||
return SHGraphicsSystemInterface::GetWindowWidth();
|
||||
}
|
||||
bool Application::IsFullscreen::get()
|
||||
{
|
||||
return SHGraphicsSystemInterface::IsFullscreen();
|
||||
}
|
||||
/*void Application::IsFullscreen::set(bool value)
|
||||
{
|
||||
return SHGraphicsSystemInterface::SetFullscreen(value);
|
||||
}*/
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* Usage Functions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
void Application::Quit()
|
||||
{
|
||||
SHGraphicsSystemInterface::CloseWindow();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
/************************************************************************************//*!
|
||||
\file Application.hxx
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Oct 31, 2022
|
||||
\brief Contains the definitions of a managed static Application class.
|
||||
|
||||
Note: This file is written in C++17/CLI.
|
||||
|
||||
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
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
/// <summary>
|
||||
/// Static class that contains useful properties for querying the state of the
|
||||
/// engine.
|
||||
/// </summary>
|
||||
public ref class Application abstract sealed
|
||||
{
|
||||
public:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Properties */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Whether or not the engine is playing. This will always be true on Publish.
|
||||
/// On Debug/Release builds, this is true when the editor is in Play Mode. It
|
||||
/// will also be true even if the editor is in Play Mode but is paused.
|
||||
/// </summary>
|
||||
static property bool IsPlaying
|
||||
{
|
||||
bool get();
|
||||
}
|
||||
/// <summary>
|
||||
/// Whether or not the engine is in a paused state where script updates and
|
||||
/// physics are not in play.
|
||||
/// </summary>
|
||||
static property bool IsPaused
|
||||
{
|
||||
bool get();
|
||||
}
|
||||
/// <summary>
|
||||
/// Retrieves the designated width of the current window.
|
||||
/// </summary>
|
||||
static property int WindowWidth
|
||||
{
|
||||
int get();
|
||||
}
|
||||
/// <summary>
|
||||
/// Retrieves the designated height of the current window.
|
||||
/// </summary>
|
||||
static property int WindowHeight
|
||||
{
|
||||
int get();
|
||||
}
|
||||
/// <summary>
|
||||
/// Whether or not the application is currently in fullscreen mode or not.
|
||||
/// </summary>
|
||||
static property bool IsFullscreen
|
||||
{
|
||||
bool get();
|
||||
// TODO: once implemented on SHADE_Engine
|
||||
//void set(bool value);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Usage Functions */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Marks the application to stop at the end of the current frame.
|
||||
/// </summary>
|
||||
static void Quit();
|
||||
};
|
||||
}
|
|
@ -19,7 +19,9 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||
// Project Headers
|
||||
#include "ECS.hxx"
|
||||
#include "Utility/Convert.hxx"
|
||||
#include "Scripts/ScriptStore.hxx"
|
||||
#include "Utility/Debug.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -39,7 +41,13 @@ namespace SHADE
|
|||
System::Nullable<GameObject> GameObject::Find(System::String ^ name)
|
||||
{
|
||||
// Search the GameObjectLibrary for an Entity with the specified name
|
||||
throw gcnew System::NotImplementedException();
|
||||
const auto ENTITY_ID = SHEntityManager::GetEntityByName(Convert::ToNative(name));
|
||||
if (ENTITY_ID == MAX_EID)
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
return GameObject(ENTITY_ID);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
@ -56,7 +64,13 @@ namespace SHADE
|
|||
}
|
||||
bool GameObject::IsActiveInHierarchy::get()
|
||||
{
|
||||
return true; // TODO: Update once we have an equivalent on the Entity object
|
||||
auto node = SHSceneManager::GetCurrentSceneGraph().GetNode(GetEntity());
|
||||
if (!node)
|
||||
{
|
||||
Debug::LogWarning("Attempting to access a GameObject's ActiveInHierarchy state which does not exist. Assuming inactive.");
|
||||
return false;
|
||||
}
|
||||
return node->IsActive();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
|
|
@ -31,10 +31,159 @@ namespace SHADE
|
|||
/// <summary>
|
||||
/// Represents the available supported keycodes that can be passed into the
|
||||
/// key-based Input functions.
|
||||
///
|
||||
/// Attempting to follow https://docs.unity3d.com/ScriptReference/KeyCode.html
|
||||
/// Win32 keycodes are shift-insensitive, i.e. 'A' and 'a' are the same keycode and '1' and '!' are the same keycode
|
||||
/// </summary>
|
||||
enum class KeyCode : int
|
||||
{
|
||||
Backspace = static_cast<int>(SHInputManager::SH_KEYCODE::BACKSPACE),
|
||||
Delete = static_cast<int>(SHInputManager::SH_KEYCODE::DEL),
|
||||
Tab = static_cast<int>(SHInputManager::SH_KEYCODE::TAB),
|
||||
Clear = static_cast<int>(SHInputManager::SH_KEYCODE::CLEAR),
|
||||
Return = static_cast<int>(SHInputManager::SH_KEYCODE::ENTER),
|
||||
Pause = static_cast<int>(SHInputManager::SH_KEYCODE::PAUSE),
|
||||
Escape = static_cast<int>(SHInputManager::SH_KEYCODE::ESCAPE),
|
||||
Space = static_cast<int>(SHInputManager::SH_KEYCODE::SPACE),
|
||||
Keypad0 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_0),
|
||||
Keypad1 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_1),
|
||||
Keypad2 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_2),
|
||||
Keypad3 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_3),
|
||||
Keypad4 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_4),
|
||||
Keypad5 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_5),
|
||||
Keypad6 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_6),
|
||||
Keypad7 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_7),
|
||||
Keypad8 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_8),
|
||||
Keypad9 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMPAD_9),
|
||||
KeypadPeriod = static_cast<int>(SHInputManager::SH_KEYCODE::DECIMAL),
|
||||
KeypadDivide = static_cast<int>(SHInputManager::SH_KEYCODE::DIVIDE),
|
||||
KeypadMultiply = static_cast<int>(SHInputManager::SH_KEYCODE::MULTIPLY),
|
||||
KeypadMinus = static_cast<int>(SHInputManager::SH_KEYCODE::SUBTRACT),
|
||||
KeypadPlus = static_cast<int>(SHInputManager::SH_KEYCODE::ADD),
|
||||
KeypadEnter = static_cast<int>(SHInputManager::SH_KEYCODE::ENTER),
|
||||
//KeypadEquals
|
||||
UpArrow = static_cast<int>(SHInputManager::SH_KEYCODE::UP_ARROW),
|
||||
DownArrow = static_cast<int>(SHInputManager::SH_KEYCODE::DOWN_ARROW),
|
||||
RightArrow = static_cast<int>(SHInputManager::SH_KEYCODE::RIGHT_ARROW),
|
||||
LeftArrow = static_cast<int>(SHInputManager::SH_KEYCODE::LEFT_ARROW),
|
||||
Insert = static_cast<int>(SHInputManager::SH_KEYCODE::INSERT),
|
||||
Home = static_cast<int>(SHInputManager::SH_KEYCODE::HOME),
|
||||
End = static_cast<int>(SHInputManager::SH_KEYCODE::END),
|
||||
PageUp = static_cast<int>(SHInputManager::SH_KEYCODE::PAGE_UP),
|
||||
PageDown = static_cast<int>(SHInputManager::SH_KEYCODE::PAGE_DOWN),
|
||||
F1 = static_cast<int>(SHInputManager::SH_KEYCODE::F1),
|
||||
F2 = static_cast<int>(SHInputManager::SH_KEYCODE::F2),
|
||||
F3 = static_cast<int>(SHInputManager::SH_KEYCODE::F3),
|
||||
F4 = static_cast<int>(SHInputManager::SH_KEYCODE::F4),
|
||||
F5 = static_cast<int>(SHInputManager::SH_KEYCODE::F5),
|
||||
F6 = static_cast<int>(SHInputManager::SH_KEYCODE::F6),
|
||||
F7 = static_cast<int>(SHInputManager::SH_KEYCODE::F7),
|
||||
F8 = static_cast<int>(SHInputManager::SH_KEYCODE::F8),
|
||||
F9 = static_cast<int>(SHInputManager::SH_KEYCODE::F9),
|
||||
F10 = static_cast<int>(SHInputManager::SH_KEYCODE::F10),
|
||||
F11 = static_cast<int>(SHInputManager::SH_KEYCODE::F11),
|
||||
F12 = static_cast<int>(SHInputManager::SH_KEYCODE::F12),
|
||||
F13 = static_cast<int>(SHInputManager::SH_KEYCODE::F13),
|
||||
F14 = static_cast<int>(SHInputManager::SH_KEYCODE::F14),
|
||||
F15 = static_cast<int>(SHInputManager::SH_KEYCODE::F15),
|
||||
F16 = static_cast<int>(SHInputManager::SH_KEYCODE::F16),
|
||||
F17 = static_cast<int>(SHInputManager::SH_KEYCODE::F17),
|
||||
F18 = static_cast<int>(SHInputManager::SH_KEYCODE::F18),
|
||||
F19 = static_cast<int>(SHInputManager::SH_KEYCODE::F19),
|
||||
F20 = static_cast<int>(SHInputManager::SH_KEYCODE::F20),
|
||||
F21 = static_cast<int>(SHInputManager::SH_KEYCODE::F21),
|
||||
F22 = static_cast<int>(SHInputManager::SH_KEYCODE::F22),
|
||||
F23 = static_cast<int>(SHInputManager::SH_KEYCODE::F23),
|
||||
F24 = static_cast<int>(SHInputManager::SH_KEYCODE::F24),
|
||||
Alpha0 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_0),
|
||||
Alpha1 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_1),
|
||||
Alpha2 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_2),
|
||||
Alpha3 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_3),
|
||||
Alpha4 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_4),
|
||||
Alpha5 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_5),
|
||||
Alpha6 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_6),
|
||||
Alpha7 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_7),
|
||||
Alpha8 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_8),
|
||||
Alpha9 = static_cast<int>(SHInputManager::SH_KEYCODE::NUMBER_9),
|
||||
//Exclaim
|
||||
//DoubleQuote
|
||||
//Hash
|
||||
//Dollar
|
||||
//Percent
|
||||
//Ampersand
|
||||
Quote = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_7),
|
||||
//LeftParen
|
||||
//RightParen
|
||||
//Asterisk
|
||||
//Plus
|
||||
Comma = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_COMMA),
|
||||
Minus = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_MINUS),
|
||||
Period = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_PERIOD),
|
||||
Slash = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_2),
|
||||
//Colon
|
||||
Semicolon = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_1),
|
||||
//Less
|
||||
Equals = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_PLUS),
|
||||
//Greater
|
||||
//Question
|
||||
//At
|
||||
LeftBracket = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_4),
|
||||
Backslash = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_5),
|
||||
RightBracket = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_6),
|
||||
//Caret
|
||||
//Underscore
|
||||
BackQuote = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_3),
|
||||
A = static_cast<int>(SHInputManager::SH_KEYCODE::A),
|
||||
B = static_cast<int>(SHInputManager::SH_KEYCODE::B),
|
||||
C = static_cast<int>(SHInputManager::SH_KEYCODE::C),
|
||||
D = static_cast<int>(SHInputManager::SH_KEYCODE::D),
|
||||
E = static_cast<int>(SHInputManager::SH_KEYCODE::E),
|
||||
F = static_cast<int>(SHInputManager::SH_KEYCODE::F),
|
||||
G = static_cast<int>(SHInputManager::SH_KEYCODE::G),
|
||||
H = static_cast<int>(SHInputManager::SH_KEYCODE::H),
|
||||
I = static_cast<int>(SHInputManager::SH_KEYCODE::I),
|
||||
J = static_cast<int>(SHInputManager::SH_KEYCODE::J),
|
||||
K = static_cast<int>(SHInputManager::SH_KEYCODE::K),
|
||||
L = static_cast<int>(SHInputManager::SH_KEYCODE::L),
|
||||
M = static_cast<int>(SHInputManager::SH_KEYCODE::M),
|
||||
N = static_cast<int>(SHInputManager::SH_KEYCODE::N),
|
||||
O = static_cast<int>(SHInputManager::SH_KEYCODE::O),
|
||||
P = static_cast<int>(SHInputManager::SH_KEYCODE::P),
|
||||
Q = static_cast<int>(SHInputManager::SH_KEYCODE::Q),
|
||||
R = static_cast<int>(SHInputManager::SH_KEYCODE::R),
|
||||
S = static_cast<int>(SHInputManager::SH_KEYCODE::S),
|
||||
T = static_cast<int>(SHInputManager::SH_KEYCODE::T),
|
||||
U = static_cast<int>(SHInputManager::SH_KEYCODE::U),
|
||||
V = static_cast<int>(SHInputManager::SH_KEYCODE::V),
|
||||
W = static_cast<int>(SHInputManager::SH_KEYCODE::W),
|
||||
X = static_cast<int>(SHInputManager::SH_KEYCODE::X),
|
||||
Y = static_cast<int>(SHInputManager::SH_KEYCODE::Y),
|
||||
Z = static_cast<int>(SHInputManager::SH_KEYCODE::Z),
|
||||
//LeftCurlyBracket
|
||||
//Pipe
|
||||
//RightCurlyBracket
|
||||
//Tilde
|
||||
NumLock = static_cast<int>(SHInputManager::SH_KEYCODE::NUM_LOCK),
|
||||
CapsLock = static_cast<int>(SHInputManager::SH_KEYCODE::CAPS_LOCK),
|
||||
ScrollLock = static_cast<int>(SHInputManager::SH_KEYCODE::SCROLL_LOCK),
|
||||
RightShift = static_cast<int>(SHInputManager::SH_KEYCODE::RIGHT_SHIFT),
|
||||
LeftShift = static_cast<int>(SHInputManager::SH_KEYCODE::LEFT_SHIFT),
|
||||
RightControl = static_cast<int>(SHInputManager::SH_KEYCODE::RIGHT_CTRL),
|
||||
LeftControl = static_cast<int>(SHInputManager::SH_KEYCODE::LEFT_CTRL),
|
||||
RightAlt = static_cast<int>(SHInputManager::SH_KEYCODE::RIGHT_ALT),
|
||||
LeftAlt = static_cast<int>(SHInputManager::SH_KEYCODE::LEFT_ALT),
|
||||
LeftWindows = static_cast<int>(SHInputManager::SH_KEYCODE::LEFT_WINDOWS),
|
||||
RightWindows = static_cast<int>(SHInputManager::SH_KEYCODE::RIGHT_WINDOWS),
|
||||
//AltGr
|
||||
Help = static_cast<int>(SHInputManager::SH_KEYCODE::HELP),
|
||||
Print = static_cast<int>(SHInputManager::SH_KEYCODE::PRINT),
|
||||
SysReq = static_cast<int>(SHInputManager::SH_KEYCODE::PRINT_SCREEN),
|
||||
//Break
|
||||
//Menu
|
||||
//Mouse buttons use mouse codes, which are enums declared later
|
||||
//TODO Controller input
|
||||
#if 0
|
||||
Space = static_cast<int>(SHInputManager::SH_KEYCODE::SPACE),
|
||||
//Apostrophe = static_cast<int>(SHInputManager::SH_KEYCODE::APOSTROPHE),
|
||||
Comma = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_COMMA),
|
||||
Minus = static_cast<int>(SHInputManager::SH_KEYCODE::OEM_MINUS),
|
||||
|
@ -190,7 +339,8 @@ namespace SHADE
|
|||
JoystickButton6 = JoystickView,
|
||||
JoystickButton7 = JoystickMenu,
|
||||
JoystickButton8 = JoystickLeftStick,
|
||||
JoystickButton9 = JoystickRightStick
|
||||
JoystickButton9 = JoystickRightStick
|
||||
#endif
|
||||
|
||||
};
|
||||
/// <summary>
|
||||
|
|
|
@ -18,6 +18,8 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#include "Script.hxx"
|
||||
// Project Headers
|
||||
#include "Utility/Debug.hxx"
|
||||
#include "ScriptStore.hxx"
|
||||
#include "Engine/ECS.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -49,8 +51,7 @@ namespace SHADE
|
|||
generic <typename T>
|
||||
void Script::RemoveComponent()
|
||||
{
|
||||
throw gcnew System::NotImplementedException;
|
||||
//ECS::RemoveComponent<T>(owner.GetNativeEntity());
|
||||
owner.RemoveComponent<T>();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
@ -59,37 +60,37 @@ namespace SHADE
|
|||
generic <typename T>
|
||||
T Script::AddScript()
|
||||
{
|
||||
throw gcnew System::NotImplementedException;
|
||||
//return ScriptStore::AddScript<T>(owner.GetEntity());
|
||||
return ScriptStore::AddScript<T>(owner.GetEntity());
|
||||
}
|
||||
generic <typename T>
|
||||
T Script::GetScript()
|
||||
{
|
||||
throw gcnew System::NotImplementedException;
|
||||
//return ScriptStore::GetScript<T>(owner.GetEntity());
|
||||
return ScriptStore::GetScript<T>(owner.GetEntity());
|
||||
}
|
||||
|
||||
generic <typename T>
|
||||
T Script::GetScriptInChildren()
|
||||
{
|
||||
throw gcnew System::NotImplementedException;
|
||||
//return ScriptStore::GetScriptInChildren<T>(owner.GetEntity());
|
||||
return ScriptStore::GetScriptInChildren<T>(owner.GetEntity());
|
||||
}
|
||||
|
||||
generic <typename T>
|
||||
System::Collections::Generic::IEnumerable<T>^ Script::GetScripts()
|
||||
{
|
||||
throw gcnew System::NotImplementedException;
|
||||
//return ScriptStore::GetScripts<T>(owner.GetEntity());
|
||||
return ScriptStore::GetScripts<T>(owner.GetEntity());
|
||||
}
|
||||
|
||||
generic <typename T>
|
||||
void Script::RemoveScript()
|
||||
{
|
||||
throw gcnew System::NotImplementedException;
|
||||
//ScriptStore::RemoveScript<T>(owner.GetEntity());
|
||||
ScriptStore::RemoveScript<T>(owner.GetEntity());
|
||||
}
|
||||
|
||||
|
||||
Script::operator bool(Script^ s)
|
||||
{
|
||||
return s != nullptr;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
/* "All-time" Lifecycle Functions */
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
|
|
@ -153,6 +153,15 @@ namespace SHADE
|
|||
generic<typename T> where T : ref class, Script
|
||||
void RemoveScript();
|
||||
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* Operator Overloads */
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/// <summary>
|
||||
/// Implicit conversion operator to enable checking if a component is null.
|
||||
/// </summary>
|
||||
/// <param name="c">Component to check.</param>
|
||||
static operator bool(Script^ s);
|
||||
|
||||
internal:
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
/* "All-Time" Lifecycle Functions */
|
||||
|
|
|
@ -27,6 +27,7 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#include "Script.hxx"
|
||||
#include "Engine/Entity.hxx"
|
||||
#include "Serialisation/ReflectionUtilities.hxx"
|
||||
#include "Engine/Application.hxx"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -372,8 +373,11 @@ namespace SHADE
|
|||
// Clear the queue
|
||||
while (disposalQueue.Count > 0)
|
||||
{
|
||||
Script^ script = disposalQueue.Dequeue();
|
||||
script->OnDestroy();
|
||||
Script^ script = disposalQueue.Dequeue();
|
||||
if (Application::IsPlaying)
|
||||
{
|
||||
script->OnDestroy();
|
||||
}
|
||||
auto entity = script->Owner.GetEntity();
|
||||
auto scriptList = scripts[script->Owner.GetEntity()];
|
||||
scriptList->Remove(script);
|
||||
|
@ -388,7 +392,7 @@ namespace SHADE
|
|||
{
|
||||
SAFE_NATIVE_CALL_BEGIN
|
||||
// Run the deinit all scripts if needed
|
||||
//if (Application::IsPlaying)
|
||||
if (Application::IsPlaying)
|
||||
{
|
||||
Debug::Log("Running OnDestroy() for scripts.");
|
||||
for each (System::Collections::Generic::KeyValuePair<Entity, ScriptList^> entity in scripts)
|
||||
|
@ -663,14 +667,10 @@ namespace SHADE
|
|||
|
||||
bool ScriptStore::isEntityActive(Entity entity)
|
||||
{
|
||||
// Get native Entity
|
||||
SHEntity* nativeEntity = SHEntityManager::GetEntityByID(entity);
|
||||
|
||||
// Entity Validity Check
|
||||
if (nativeEntity == nullptr)
|
||||
// Invalid entity
|
||||
if (!EntityUtils::IsValid(entity))
|
||||
return false;
|
||||
|
||||
// Check active state
|
||||
return nativeEntity->GetActive();
|
||||
return GameObject(entity).IsActiveInHierarchy;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
using SHADE;
|
||||
|
||||
public class PrintWhenActive : Script
|
||||
{
|
||||
public PrintWhenActive(GameObject gameObj) : base(gameObj) { }
|
||||
|
||||
protected override void update()
|
||||
{
|
||||
Debug.Log("Active!");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue