Merge branch 'main' into PlayerController
This commit is contained in:
commit
04f6e54007
|
@ -195,18 +195,22 @@ namespace SHADE
|
||||||
if (SHDragDrop::BeginSource())
|
if (SHDragDrop::BeginSource())
|
||||||
{
|
{
|
||||||
std::string moveLabel = "Moving EID: ";
|
std::string moveLabel = "Moving EID: ";
|
||||||
|
static std::vector<EntityID> draggingEntities = editor->selectedEntities;
|
||||||
if (!isSelected)
|
if (!isSelected)
|
||||||
editor->selectedEntities.push_back(eid);
|
|
||||||
for (int i = 0; i < static_cast<int>(editor->selectedEntities.size()); ++i)
|
|
||||||
{
|
{
|
||||||
moveLabel.append(std::to_string(editor->selectedEntities[i]));
|
draggingEntities.clear();
|
||||||
if (i + 1 < static_cast<int>(editor->selectedEntities.size()))
|
draggingEntities.push_back(eid);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < static_cast<int>(draggingEntities.size()); ++i)
|
||||||
|
{
|
||||||
|
moveLabel.append(std::to_string(draggingEntities[i]));
|
||||||
|
if (i + 1 < static_cast<int>(draggingEntities.size()))
|
||||||
{
|
{
|
||||||
moveLabel.append(", ");
|
moveLabel.append(", ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::Text(moveLabel.c_str());
|
ImGui::Text(moveLabel.c_str());
|
||||||
SHDragDrop::SetPayload<std::vector<EntityID>>(SHDragDrop::DRAG_EID, &editor->selectedEntities);
|
SHDragDrop::SetPayload<std::vector<EntityID>>(SHDragDrop::DRAG_EID, &draggingEntities);
|
||||||
SHDragDrop::EndSource();
|
SHDragDrop::EndSource();
|
||||||
}
|
}
|
||||||
else if (SHDragDrop::BeginTarget()) //If Received DragDrop
|
else if (SHDragDrop::BeginTarget()) //If Received DragDrop
|
||||||
|
|
|
@ -274,8 +274,27 @@ namespace SHADE
|
||||||
|
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
SHEditorWidgets::BeginPanel("Offset", { ImGui::GetContentRegionAvail().x, 30.0f });
|
SHEditorWidgets::BeginPanel("Offsets",{ ImGui::GetContentRegionAvail().x, 30.0f });
|
||||||
SHEditorWidgets::DragVec3("Position", { "X", "Y", "Z" }, [&collider] {return collider->GetPositionOffset(); }, [&collider](SHVec3 const& vec) {collider->SetPositionOffset(vec); });
|
SHEditorWidgets::DragVec3("Position", { "X", "Y", "Z" }, [&collider] {return collider->GetPositionOffset(); }, [&collider](SHVec3 const& vec) {collider->SetPositionOffset(vec); });
|
||||||
|
SHEditorWidgets::DragVec3("Rotation", { "X", "Y", "Z" },
|
||||||
|
[&collider]
|
||||||
|
{
|
||||||
|
auto offset = collider->GetRotationOffset();
|
||||||
|
offset.x = SHMath::RadiansToDegrees(offset.x);
|
||||||
|
offset.y = SHMath::RadiansToDegrees(offset.y);
|
||||||
|
offset.z = SHMath::RadiansToDegrees(offset.z);
|
||||||
|
return offset;
|
||||||
|
},
|
||||||
|
[&collider](SHVec3 const& vec)
|
||||||
|
{
|
||||||
|
const SHVec3 vecInRad
|
||||||
|
{
|
||||||
|
SHMath::DegreesToRadians(vec.x)
|
||||||
|
, SHMath::DegreesToRadians(vec.y)
|
||||||
|
, SHMath::DegreesToRadians(vec.z)
|
||||||
|
};
|
||||||
|
collider->SetRotationOffset(vecInRad);
|
||||||
|
});
|
||||||
SHEditorWidgets::EndPanel();
|
SHEditorWidgets::EndPanel();
|
||||||
}
|
}
|
||||||
if (ImGui::Button(std::format("{} Remove Collider #{}", ICON_MD_REMOVE, i).data()))
|
if (ImGui::Button(std::format("{} Remove Collider #{}", ICON_MD_REMOVE, i).data()))
|
||||||
|
@ -358,6 +377,7 @@ namespace SHADE
|
||||||
[component](AssetID const& id)
|
[component](AssetID const& id)
|
||||||
{
|
{
|
||||||
component->SetMesh(SHResourceManager::LoadOrGet<SHMesh>(id));
|
component->SetMesh(SHResourceManager::LoadOrGet<SHMesh>(id));
|
||||||
|
SHResourceManager::FinaliseChanges();
|
||||||
}, SHDragDrop::DRAG_RESOURCE);
|
}, SHDragDrop::DRAG_RESOURCE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -175,19 +175,37 @@ namespace SHADE
|
||||||
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PLAY);
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PLAY);
|
||||||
if(ImGui::SmallButton(ICON_MD_PLAY_ARROW))
|
if(ImGui::SmallButton(ICON_MD_PLAY_ARROW))
|
||||||
{
|
{
|
||||||
|
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
||||||
|
{
|
||||||
|
.previousState = editor->editorState
|
||||||
|
};
|
||||||
editor->editorState = SHEditor::State::PLAY;
|
editor->editorState = SHEditor::State::PLAY;
|
||||||
|
|
||||||
|
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_PLAY_EVENT);
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PAUSE);
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PAUSE);
|
||||||
if(ImGui::SmallButton(ICON_MD_PAUSE))
|
if(ImGui::SmallButton(ICON_MD_PAUSE))
|
||||||
{
|
{
|
||||||
|
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
||||||
|
{
|
||||||
|
.previousState = editor->editorState
|
||||||
|
};
|
||||||
editor->editorState = SHEditor::State::PAUSE;
|
editor->editorState = SHEditor::State::PAUSE;
|
||||||
|
|
||||||
|
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_PAUSE_EVENT);
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::BeginDisabled(editor->editorState == SHEditor::State::STOP);
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::STOP);
|
||||||
if(ImGui::SmallButton(ICON_MD_STOP))
|
if(ImGui::SmallButton(ICON_MD_STOP))
|
||||||
{
|
{
|
||||||
|
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
||||||
|
{
|
||||||
|
.previousState = editor->editorState
|
||||||
|
};
|
||||||
editor->editorState = SHEditor::State::STOP;
|
editor->editorState = SHEditor::State::STOP;
|
||||||
|
|
||||||
|
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_STOP_EVENT);
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::EndMenuBar();
|
ImGui::EndMenuBar();
|
||||||
|
|
|
@ -20,4 +20,10 @@ namespace SHADE
|
||||||
float menuBarHeight = 20.0f;
|
float menuBarHeight = 20.0f;
|
||||||
std::vector<std::filesystem::path> layoutPaths;
|
std::vector<std::filesystem::path> layoutPaths;
|
||||||
};//class SHEditorMenuBar
|
};//class SHEditorMenuBar
|
||||||
|
|
||||||
|
struct SHEditorStateChangeEvent
|
||||||
|
{
|
||||||
|
SHEditor::State previousState;
|
||||||
|
};
|
||||||
|
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
|
@ -16,6 +16,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
// External Dependencies
|
// External Dependencies
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
#include "SHEditorWidgets.hpp"
|
#include "SHEditorWidgets.hpp"
|
||||||
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -287,6 +288,35 @@ namespace SHADE
|
||||||
return CHANGED;
|
return CHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SHEditorUI::InputGameObjectField(const std::string& label, uint32_t& value, bool* isHovered)
|
||||||
|
{
|
||||||
|
ImGui::Text(label.c_str());
|
||||||
|
if (isHovered)
|
||||||
|
*isHovered = ImGui::IsItemHovered();
|
||||||
|
ImGui::SameLine();
|
||||||
|
SHEntity* entity = SHEntityManager::GetEntityByID(value);
|
||||||
|
std::ostringstream oss;
|
||||||
|
if (entity)
|
||||||
|
{
|
||||||
|
oss << value << ": " << entity->name;
|
||||||
|
}
|
||||||
|
std::string entityName = oss.str();
|
||||||
|
bool changed = ImGui::InputText("##", &entityName, ImGuiInputTextFlags_ReadOnly);
|
||||||
|
if (SHDragDrop::BeginTarget())
|
||||||
|
{
|
||||||
|
if (const std::vector<EntityID>* payload = SHDragDrop::AcceptPayload<std::vector<EntityID>>(SHDragDrop::DRAG_EID))
|
||||||
|
{
|
||||||
|
if (!payload->empty())
|
||||||
|
{
|
||||||
|
value = payload->at(0);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
SHDragDrop::EndTarget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
bool SHEditorUI::InputEnumCombo(const std::string& label, int& v, const std::vector<std::string>& enumNames, bool* isHovered)
|
bool SHEditorUI::InputEnumCombo(const std::string& label, int& v, const std::vector<std::string>& enumNames, bool* isHovered)
|
||||||
{
|
{
|
||||||
// Clamp input value
|
// Clamp input value
|
||||||
|
|
|
@ -308,6 +308,14 @@ namespace SHADE
|
||||||
/// <returns>True if the value was changed.</returns>
|
/// <returns>True if the value was changed.</returns>
|
||||||
static bool InputTextField(const std::string& label, std::string& value, bool* isHovered = nullptr);
|
static bool InputTextField(const std::string& label, std::string& value, bool* isHovered = nullptr);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// Creates a drag field widget for int input.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="label">Label used to identify this widget.</param>
|
||||||
|
/// <param name="value">Reference to the variable to store the result.</param>
|
||||||
|
/// <param name="isHovered>If set, stores the hover state of this widget.</param>
|
||||||
|
/// <returns>True if the value was changed.</returns>
|
||||||
|
static bool InputGameObjectField(const std::string& label, uint32_t& value, bool* isHovered = nullptr);
|
||||||
|
/// <summary>
|
||||||
/// Creates a combo box for enumeration input.
|
/// Creates a combo box for enumeration input.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="Enum">The type of enum to input.</typeparam>
|
/// <typeparam name="Enum">The type of enum to input.</typeparam>
|
||||||
|
|
|
@ -13,4 +13,7 @@ constexpr SHEventIdentifier SH_COMPONENT_REMOVED_EVENT { 4 };
|
||||||
constexpr SHEventIdentifier SH_SCENEGRAPH_CHANGE_PARENT_EVENT { 5 };
|
constexpr SHEventIdentifier SH_SCENEGRAPH_CHANGE_PARENT_EVENT { 5 };
|
||||||
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_ADDED_EVENT { 6 };
|
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_ADDED_EVENT { 6 };
|
||||||
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_REMOVED_EVENT { 7 };
|
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_REMOVED_EVENT { 7 };
|
||||||
|
constexpr SHEventIdentifier SH_EDITOR_ON_PLAY_EVENT { 8 };
|
||||||
|
constexpr SHEventIdentifier SH_EDITOR_ON_PAUSE_EVENT { 9 };
|
||||||
|
constexpr SHEventIdentifier SH_EDITOR_ON_STOP_EVENT { 10 };
|
||||||
|
|
||||||
|
|
|
@ -74,10 +74,11 @@ namespace SHADE
|
||||||
|
|
||||||
void SHBatch::Remove(const SHRenderable* renderable)
|
void SHBatch::Remove(const SHRenderable* renderable)
|
||||||
{
|
{
|
||||||
// Check if we have a SubBatch with the same mesh yet
|
// Check if we have a SubBatch with the existing mesh yet (if changed, we use the old mesh)
|
||||||
|
Handle<SHMesh> prevSubBatchMesh = renderable->HasMeshChanged() ? renderable->GetPrevMesh() : renderable->GetMesh();
|
||||||
auto subBatch = std::find_if(subBatches.begin(), subBatches.end(), [&](const SHSubBatch& batch)
|
auto subBatch = std::find_if(subBatches.begin(), subBatches.end(), [&](const SHSubBatch& batch)
|
||||||
{
|
{
|
||||||
return batch.Mesh == renderable->GetMesh();
|
return batch.Mesh == prevSubBatchMesh;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Attempt to remove if it exists
|
// Attempt to remove if it exists
|
||||||
|
@ -88,9 +89,7 @@ namespace SHADE
|
||||||
|
|
||||||
// Check if other renderables in subBatches contain the same material instance
|
// Check if other renderables in subBatches contain the same material instance
|
||||||
bool matUnused = true;
|
bool matUnused = true;
|
||||||
|
|
||||||
Handle<SHMaterialInstance> matToCheck = renderable->HasMaterialChanged() ? renderable->GetPrevMaterial() : renderable->GetMaterial();
|
Handle<SHMaterialInstance> matToCheck = renderable->HasMaterialChanged() ? renderable->GetPrevMaterial() : renderable->GetMaterial();
|
||||||
|
|
||||||
for (const auto& sb : subBatches)
|
for (const auto& sb : subBatches)
|
||||||
{
|
{
|
||||||
// Check material usage
|
// Check material usage
|
||||||
|
|
|
@ -106,10 +106,7 @@ namespace SHADE
|
||||||
descPool = device->CreateDescriptorPools();
|
descPool = device->CreateDescriptorPools();
|
||||||
|
|
||||||
// Create generic command buffer
|
// Create generic command buffer
|
||||||
//transferCmdPool = device->CreateCommandPool(SH_QUEUE_FAMILY_ARRAY_INDEX::GRAPHICS, SH_CMD_POOL_RESET::POOL_BASED, true);
|
|
||||||
graphicsCmdPool = device->CreateCommandPool(SH_QUEUE_FAMILY_ARRAY_INDEX::GRAPHICS, SH_CMD_POOL_RESET::POOL_BASED, true);
|
graphicsCmdPool = device->CreateCommandPool(SH_QUEUE_FAMILY_ARRAY_INDEX::GRAPHICS, SH_CMD_POOL_RESET::POOL_BASED, true);
|
||||||
transferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
|
||||||
graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
|
||||||
|
|
||||||
// Load Built In Shaders
|
// Load Built In Shaders
|
||||||
static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(VS_DEFAULT);
|
static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(VS_DEFAULT);
|
||||||
|
@ -621,10 +618,14 @@ namespace SHADE
|
||||||
|
|
||||||
void SHGraphicsSystem::BuildMeshBuffers()
|
void SHGraphicsSystem::BuildMeshBuffers()
|
||||||
{
|
{
|
||||||
|
transferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||||
|
device->WaitIdle();
|
||||||
transferCmdBuffer->BeginRecording();
|
transferCmdBuffer->BeginRecording();
|
||||||
meshLibrary.BuildBuffers(device, transferCmdBuffer);
|
meshLibrary.BuildBuffers(device, transferCmdBuffer);
|
||||||
transferCmdBuffer->EndRecording();
|
transferCmdBuffer->EndRecording();
|
||||||
graphicsQueue->SubmitCommandBuffer({ transferCmdBuffer });
|
graphicsQueue->SubmitCommandBuffer({ transferCmdBuffer });
|
||||||
|
device->WaitIdle();
|
||||||
|
transferCmdBuffer.Free(); transferCmdBuffer = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
@ -649,10 +650,14 @@ namespace SHADE
|
||||||
|
|
||||||
void SHGraphicsSystem::BuildTextures()
|
void SHGraphicsSystem::BuildTextures()
|
||||||
{
|
{
|
||||||
|
graphicsTexCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||||
|
device->WaitIdle();
|
||||||
texLibrary.BuildTextures
|
texLibrary.BuildTextures
|
||||||
(
|
(
|
||||||
device, graphicsTexCmdBuffer, graphicsQueue, descPool
|
device, graphicsTexCmdBuffer, graphicsQueue, descPool
|
||||||
);
|
);
|
||||||
|
device->WaitIdle();
|
||||||
|
graphicsTexCmdBuffer.Free(); graphicsTexCmdBuffer = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma endregion ADD_REMOVE
|
#pragma endregion ADD_REMOVE
|
||||||
|
@ -692,6 +697,7 @@ namespace SHADE
|
||||||
void SHGraphicsSystem::EndRoutine::Execute(double) noexcept
|
void SHGraphicsSystem::EndRoutine::Execute(double) noexcept
|
||||||
{
|
{
|
||||||
reinterpret_cast<SHGraphicsSystem*>(system)->EndRender();
|
reinterpret_cast<SHGraphicsSystem*>(system)->EndRender();
|
||||||
|
SHResourceManager::FinaliseChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
@ -709,8 +715,13 @@ namespace SHADE
|
||||||
if (!renderable.HasChanged())
|
if (!renderable.HasChanged())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Remove from old material's SuperBatch
|
if (!renderable.GetMesh())
|
||||||
Handle<SHMaterialInstance> prevMaterial = renderable.GetPrevMaterial();
|
{
|
||||||
|
SHLOG_CRITICAL("NULL Mesh provided!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove from the SuperBatch it is previously in (prevMat if mat has changed)
|
||||||
|
Handle<SHMaterialInstance> prevMaterial = renderable.HasMaterialChanged() ? renderable.GetPrevMaterial() : renderable.GetMaterial();
|
||||||
if (prevMaterial)
|
if (prevMaterial)
|
||||||
{
|
{
|
||||||
Handle<SHSuperBatch> oldSuperBatch = prevMaterial->GetBaseMaterial()->GetPipeline()->GetPipelineState().GetSubpass()->GetSuperBatch();
|
Handle<SHSuperBatch> oldSuperBatch = prevMaterial->GetBaseMaterial()->GetPipeline()->GetPipelineState().GetSubpass()->GetSuperBatch();
|
||||||
|
|
|
@ -186,6 +186,6 @@ RTTR_REGISTRATION
|
||||||
|
|
||||||
registration::class_<SHTransformComponent>("Transform Component")
|
registration::class_<SHTransformComponent>("Transform Component")
|
||||||
.property("Translate" ,&SHTransformComponent::GetLocalPosition ,&SHTransformComponent::SetLocalPosition ) (metadata(META::tooltip, "Translate"))
|
.property("Translate" ,&SHTransformComponent::GetLocalPosition ,&SHTransformComponent::SetLocalPosition ) (metadata(META::tooltip, "Translate"))
|
||||||
.property("Rotate" ,&SHTransformComponent::GetLocalRotation ,select_overload<void(const SHVec3&)>(&SHTransformComponent::SetLocalRotation) ) (metadata(META::tooltip, "Rotate"), metadata(META::angleInRad, true))
|
.property("Rotate" ,&SHTransformComponent::GetLocalRotation ,select_overload<void(const SHVec3&)>(&SHTransformComponent::SetLocalRotation)) (metadata(META::tooltip, "Rotate"), metadata(META::angleInRad, true))
|
||||||
.property("Scale" ,&SHTransformComponent::GetLocalScale ,&SHTransformComponent::SetLocalScale ) (metadata(META::tooltip, "Scale"));
|
.property("Scale" ,&SHTransformComponent::GetLocalScale ,&SHTransformComponent::SetLocalScale ) (metadata(META::tooltip, "Scale"));
|
||||||
}
|
}
|
|
@ -17,6 +17,7 @@
|
||||||
#include "Math/Geometry/SHBoundingSphere.h"
|
#include "Math/Geometry/SHBoundingSphere.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
#include "Math/SHMathHelpers.h"
|
#include "Math/SHMathHelpers.h"
|
||||||
|
#include "Reflection/SHReflectionMetadata.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -158,6 +159,11 @@ namespace SHADE
|
||||||
return positionOffset;
|
return positionOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const SHVec3& SHCollider::GetRotationOffset() const noexcept
|
||||||
|
{
|
||||||
|
return rotationOffset;
|
||||||
|
}
|
||||||
|
|
||||||
SHShape* SHCollider::GetShape() noexcept
|
SHShape* SHCollider::GetShape() noexcept
|
||||||
{
|
{
|
||||||
dirty = true;
|
dirty = true;
|
||||||
|
@ -275,6 +281,12 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHCollider::SetRotationOffset(const SHVec3& rotOffset) noexcept
|
||||||
|
{
|
||||||
|
dirty = true;
|
||||||
|
rotationOffset = rotOffset;
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
/* Private Function Member Definitions */
|
/* Private Function Member Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
@ -316,5 +328,6 @@ RTTR_REGISTRATION
|
||||||
);
|
);
|
||||||
|
|
||||||
registration::class_<SHCollider>("Collider")
|
registration::class_<SHCollider>("Collider")
|
||||||
.property("Position Offset", &SHCollider::GetPositionOffset, &SHCollider::SetPositionOffset);
|
.property("Position Offset", &SHCollider::GetPositionOffset, &SHCollider::SetPositionOffset)
|
||||||
|
.property("Rotation Offset", &SHCollider::GetRotationOffset, &SHCollider::SetRotationOffset) (metadata(META::angleInRad, true));
|
||||||
}
|
}
|
|
@ -80,6 +80,7 @@ namespace SHADE
|
||||||
[[nodiscard]] const SHPhysicsMaterial& GetMaterial () const noexcept;
|
[[nodiscard]] const SHPhysicsMaterial& GetMaterial () const noexcept;
|
||||||
|
|
||||||
[[nodiscard]] const SHVec3& GetPositionOffset () const noexcept;
|
[[nodiscard]] const SHVec3& GetPositionOffset () const noexcept;
|
||||||
|
[[nodiscard]] const SHVec3& GetRotationOffset () const noexcept;
|
||||||
|
|
||||||
[[nodiscard]] SHShape* GetShape () noexcept;
|
[[nodiscard]] SHShape* GetShape () noexcept;
|
||||||
|
|
||||||
|
@ -97,6 +98,7 @@ namespace SHADE
|
||||||
void SetMaterial (const SHPhysicsMaterial& newMaterial) noexcept;
|
void SetMaterial (const SHPhysicsMaterial& newMaterial) noexcept;
|
||||||
|
|
||||||
void SetPositionOffset (const SHVec3& posOffset) noexcept;
|
void SetPositionOffset (const SHVec3& posOffset) noexcept;
|
||||||
|
void SetRotationOffset (const SHVec3& rotOffset) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
@ -110,6 +112,7 @@ namespace SHADE
|
||||||
SHShape* shape;
|
SHShape* shape;
|
||||||
SHPhysicsMaterial material;
|
SHPhysicsMaterial material;
|
||||||
SHVec3 positionOffset;
|
SHVec3 positionOffset;
|
||||||
|
SHVec3 rotationOffset;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Function Members */
|
/* Function Members */
|
||||||
|
|
|
@ -130,6 +130,8 @@ namespace SHADE
|
||||||
|
|
||||||
int SHPhysicsObject::AddCollider(SHCollider* collider)
|
int SHPhysicsObject::AddCollider(SHCollider* collider)
|
||||||
{
|
{
|
||||||
|
const rp3d::Transform OFFSETS{ collider->GetPositionOffset(), collider->GetRotationOffset() };
|
||||||
|
|
||||||
switch (collider->GetType())
|
switch (collider->GetType())
|
||||||
{
|
{
|
||||||
case SHCollider::Type::BOX:
|
case SHCollider::Type::BOX:
|
||||||
|
@ -137,7 +139,7 @@ namespace SHADE
|
||||||
const auto* box = reinterpret_cast<SHBoundingBox*>(collider->GetShape());
|
const auto* box = reinterpret_cast<SHBoundingBox*>(collider->GetShape());
|
||||||
rp3d::BoxShape* newBox = factory->createBoxShape(box->GetHalfExtents());
|
rp3d::BoxShape* newBox = factory->createBoxShape(box->GetHalfExtents());
|
||||||
|
|
||||||
rp3dBody->addCollider(newBox, rp3d::Transform{ collider->GetPositionOffset(), SHQuaternion::Identity });
|
rp3dBody->addCollider(newBox, OFFSETS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SHCollider::Type::SPHERE:
|
case SHCollider::Type::SPHERE:
|
||||||
|
@ -145,7 +147,7 @@ namespace SHADE
|
||||||
const auto* sphere = reinterpret_cast<SHBoundingSphere*>(collider->GetShape());
|
const auto* sphere = reinterpret_cast<SHBoundingSphere*>(collider->GetShape());
|
||||||
rp3d::SphereShape* newSphere = factory->createSphereShape(sphere->GetRadius());
|
rp3d::SphereShape* newSphere = factory->createSphereShape(sphere->GetRadius());
|
||||||
|
|
||||||
rp3dBody->addCollider(newSphere, rp3d::Transform{ collider->GetPositionOffset(), SHQuaternion::Identity });
|
rp3dBody->addCollider(newSphere, OFFSETS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// TODO(Diren): Add more collider shapes
|
// TODO(Diren): Add more collider shapes
|
||||||
|
@ -182,7 +184,7 @@ namespace SHADE
|
||||||
rp3dCollider->setIsTrigger(collider.IsTrigger());
|
rp3dCollider->setIsTrigger(collider.IsTrigger());
|
||||||
|
|
||||||
// Update offsets
|
// Update offsets
|
||||||
rp3dCollider->setLocalToBodyTransform(rp3d::Transform(collider.GetPositionOffset(), SHQuaternion::Identity));
|
rp3dCollider->setLocalToBodyTransform(rp3d::Transform(collider.GetPositionOffset(), collider.GetRotationOffset()));
|
||||||
|
|
||||||
switch (collider.GetType())
|
switch (collider.GetType())
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
#include "Editor/SHEditor.h"
|
|
||||||
#include "Math/SHMathHelpers.h"
|
#include "Math/SHMathHelpers.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
#include "Scene/SHSceneManager.h"
|
#include "Scene/SHSceneManager.h"
|
||||||
|
@ -212,6 +211,12 @@ namespace SHADE
|
||||||
const std::shared_ptr REMOVE_COMPONENT_RECEIVER { std::make_shared<SHEventReceiverSpec<SHPhysicsSystem>>(this, &SHPhysicsSystem::RemovePhysicsComponent) };
|
const std::shared_ptr REMOVE_COMPONENT_RECEIVER { std::make_shared<SHEventReceiverSpec<SHPhysicsSystem>>(this, &SHPhysicsSystem::RemovePhysicsComponent) };
|
||||||
const ReceiverPtr REMOVE_COMPONENT_RECEIVER_PTR = std::dynamic_pointer_cast<SHEventReceiver>(REMOVE_COMPONENT_RECEIVER);
|
const ReceiverPtr REMOVE_COMPONENT_RECEIVER_PTR = std::dynamic_pointer_cast<SHEventReceiver>(REMOVE_COMPONENT_RECEIVER);
|
||||||
SHEventManager::SubscribeTo(SH_COMPONENT_REMOVED_EVENT, REMOVE_COMPONENT_RECEIVER_PTR);
|
SHEventManager::SubscribeTo(SH_COMPONENT_REMOVED_EVENT, REMOVE_COMPONENT_RECEIVER_PTR);
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
const std::shared_ptr EDITOR_STOP_RECEIVER { std::make_shared<SHEventReceiverSpec<SHPhysicsSystem>>(this, &SHPhysicsSystem::ResetWorld) };
|
||||||
|
const ReceiverPtr EDITOR_STOP_RECEIVER_PTR = std::dynamic_pointer_cast<SHEventReceiver>(EDITOR_STOP_RECEIVER);
|
||||||
|
SHEventManager::SubscribeTo(SH_EDITOR_ON_STOP_EVENT, EDITOR_STOP_RECEIVER_PTR);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHPhysicsSystem::Exit()
|
void SHPhysicsSystem::Exit()
|
||||||
|
@ -289,16 +294,6 @@ namespace SHADE
|
||||||
|
|
||||||
if (rigidBodyComponent)
|
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
|
// Sync active states
|
||||||
const bool COMPONENT_ACTIVE = rigidBodyComponent->isActive;
|
const bool COMPONENT_ACTIVE = rigidBodyComponent->isActive;
|
||||||
SyncActiveStates(physicsObject, COMPONENT_ACTIVE);
|
SyncActiveStates(physicsObject, COMPONENT_ACTIVE);
|
||||||
|
@ -325,10 +320,10 @@ namespace SHADE
|
||||||
void SHPhysicsSystem::PhysicsFixedUpdate::Execute(double dt) noexcept
|
void SHPhysicsSystem::PhysicsFixedUpdate::Execute(double dt) noexcept
|
||||||
{
|
{
|
||||||
auto* physicsSystem = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
auto* physicsSystem = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||||
auto scriptSys = SHSystemManager::GetSystem<SHScriptEngine>();
|
auto* scriptingSystem = SHSystemManager::GetSystem<SHScriptEngine>();
|
||||||
if (!scriptSys)
|
if (scriptingSystem == nullptr)
|
||||||
{
|
{
|
||||||
SHLOG_WARNING("[SHPhysicsSystem] Unable to invoke FixedUpdate() on scripts due to missing SHScriptEngine!");
|
SHLOGV_WARNING("Unable to invoke FixedUpdate() on scripts due to missing SHScriptEngine!");
|
||||||
}
|
}
|
||||||
|
|
||||||
fixedTimeStep = 1.0 / physicsSystem->fixedDT;
|
fixedTimeStep = 1.0 / physicsSystem->fixedDT;
|
||||||
|
@ -337,10 +332,9 @@ namespace SHADE
|
||||||
int count = 0;
|
int count = 0;
|
||||||
while (accumulatedTime > fixedTimeStep)
|
while (accumulatedTime > fixedTimeStep)
|
||||||
{
|
{
|
||||||
if (scriptSys)
|
if (scriptingSystem != nullptr)
|
||||||
{
|
scriptingSystem->ExecuteFixedUpdates();
|
||||||
scriptSys->ExecuteFixedUpdates();
|
|
||||||
}
|
|
||||||
physicsSystem->world->update(static_cast<rp3d::decimal>(fixedTimeStep));
|
physicsSystem->world->update(static_cast<rp3d::decimal>(fixedTimeStep));
|
||||||
|
|
||||||
accumulatedTime -= fixedTimeStep;
|
accumulatedTime -= fixedTimeStep;
|
||||||
|
@ -356,6 +350,11 @@ namespace SHADE
|
||||||
void SHPhysicsSystem::PhysicsPostUpdate::Execute(double) noexcept
|
void SHPhysicsSystem::PhysicsPostUpdate::Execute(double) noexcept
|
||||||
{
|
{
|
||||||
auto* physicsSystem = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
auto* physicsSystem = reinterpret_cast<SHPhysicsSystem*>(GetSystem());
|
||||||
|
auto* scriptingSystem = SHSystemManager::GetSystem<SHScriptEngine>();
|
||||||
|
if (scriptingSystem == nullptr)
|
||||||
|
{
|
||||||
|
SHLOGV_WARNING("Unable to invoke collision and trigger script events due to missing SHScriptEngine!");
|
||||||
|
}
|
||||||
|
|
||||||
// Interpolate transforms for rendering
|
// Interpolate transforms for rendering
|
||||||
if (physicsSystem->worldUpdated)
|
if (physicsSystem->worldUpdated)
|
||||||
|
@ -363,15 +362,8 @@ namespace SHADE
|
||||||
physicsSystem->SyncTransforms();
|
physicsSystem->SyncTransforms();
|
||||||
|
|
||||||
// Collision & Trigger messages
|
// Collision & Trigger messages
|
||||||
auto scriptSys = SHSystemManager::GetSystem<SHScriptEngine>();
|
if (scriptingSystem != nullptr)
|
||||||
if (scriptSys)
|
scriptingSystem->ExecuteCollisionFunctions();
|
||||||
{
|
|
||||||
scriptSys->ExecuteCollisionFunctions();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SHLOG_WARNING("[SHPhysicsSystem] Unable to invoke collision and trigger script events due to missing SHScriptEngine!");
|
|
||||||
}
|
|
||||||
|
|
||||||
physicsSystem->ClearInvalidCollisions();
|
physicsSystem->ClearInvalidCollisions();
|
||||||
}
|
}
|
||||||
|
@ -630,10 +622,6 @@ namespace SHADE
|
||||||
auto* rigidBodyComponent = SHComponentManager::GetComponent_s<SHRigidBodyComponent>(ENTITY_ID);
|
auto* rigidBodyComponent = SHComponentManager::GetComponent_s<SHRigidBodyComponent>(ENTITY_ID);
|
||||||
auto* colliderComponent = SHComponentManager::GetComponent_s<SHColliderComponent>(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
|
// Wake up all physics objects
|
||||||
for (auto& [entityID, object] : map)
|
for (auto& [entityID, object] : map)
|
||||||
{
|
{
|
||||||
|
@ -641,6 +629,8 @@ namespace SHADE
|
||||||
reinterpret_cast<rp3d::RigidBody*>(object.rp3dBody)->setIsSleeping(false);
|
reinterpret_cast<rp3d::RigidBody*>(object.rp3dBody)->setIsSleeping(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (REMOVED_ID == RIGID_BODY_ID && physicsObject != nullptr)
|
||||||
|
{
|
||||||
world->destroyRigidBody(reinterpret_cast<rp3d::RigidBody*>(physicsObject->rp3dBody));
|
world->destroyRigidBody(reinterpret_cast<rp3d::RigidBody*>(physicsObject->rp3dBody));
|
||||||
physicsObject->rp3dBody = nullptr;
|
physicsObject->rp3dBody = nullptr;
|
||||||
|
|
||||||
|
@ -657,7 +647,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (REMOVED_ID == COLLIDER_ID)
|
if (REMOVED_ID == COLLIDER_ID && physicsObject != nullptr)
|
||||||
{
|
{
|
||||||
// Remove all colliders
|
// Remove all colliders
|
||||||
const int NUM_COLLIDERS = static_cast<int>(physicsObject->rp3dBody->getNbColliders());
|
const int NUM_COLLIDERS = static_cast<int>(physicsObject->rp3dBody->getNbColliders());
|
||||||
|
@ -673,11 +663,30 @@ namespace SHADE
|
||||||
physicsObject->rp3dBody = nullptr;
|
physicsObject->rp3dBody = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (physicsObject->rp3dBody == nullptr)
|
if (physicsObject != nullptr && physicsObject->rp3dBody == nullptr)
|
||||||
DestroyPhysicsObject(ENTITY_ID);
|
DestroyPhysicsObject(ENTITY_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EVENT_DATA->handle;
|
return EVENT_DATA->handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHEventHandle SHPhysicsSystem::ResetWorld(SHEventPtr editorStopEvent)
|
||||||
|
{
|
||||||
|
// TODO(Diren): Rebuild world based on how scene reloading is done
|
||||||
|
|
||||||
|
for (auto& [entityID, physicsObject] : map)
|
||||||
|
{
|
||||||
|
if (SHComponentManager::HasComponent<SHRigidBodyComponent>(entityID))
|
||||||
|
{
|
||||||
|
auto* rp3dRigidBody = reinterpret_cast<rp3d::RigidBody*>(physicsObject.rp3dBody);
|
||||||
|
rp3dRigidBody->resetForce();
|
||||||
|
rp3dRigidBody->resetTorque();
|
||||||
|
rp3dRigidBody->setLinearVelocity(SHVec3::Zero);
|
||||||
|
rp3dRigidBody->setAngularVelocity(SHVec3::Zero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return editorStopEvent->handle;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace SHADE
|
} // namespace SHADE
|
|
@ -189,6 +189,7 @@ namespace SHADE
|
||||||
|
|
||||||
SHEventHandle AddPhysicsComponent (SHEventPtr addComponentEvent);
|
SHEventHandle AddPhysicsComponent (SHEventPtr addComponentEvent);
|
||||||
SHEventHandle RemovePhysicsComponent (SHEventPtr removeComponentEvent);
|
SHEventHandle RemovePhysicsComponent (SHEventPtr removeComponentEvent);
|
||||||
|
SHEventHandle ResetWorld (SHEventPtr editorStopEvent);
|
||||||
|
|
||||||
template <typename RP3DCollisionPair, typename = std::enable_if_t
|
template <typename RP3DCollisionPair, typename = std::enable_if_t
|
||||||
<std::is_same_v<RP3DCollisionPair, rp3d::CollisionCallback::ContactPair>
|
<std::is_same_v<RP3DCollisionPair, rp3d::CollisionCallback::ContactPair>
|
||||||
|
|
|
@ -21,9 +21,11 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
SHResourceHub SHResourceManager::resourceHub;
|
SHResourceHub SHResourceManager::resourceHub;
|
||||||
std::unordered_map<std::type_index, std::unordered_map<AssetID, Handle<void>>> SHResourceManager::handlesMap;
|
std::unordered_map<std::type_index, std::unordered_map<AssetID, Handle<void>>> SHResourceManager::handlesMap;
|
||||||
std::unordered_map<std::type_index, SHADE::SHResourceManager::HandleAssetMap> SHResourceManager::assetIdMap;
|
std::unordered_map<std::type_index, SHResourceManager::HandleAssetMap> SHResourceManager::assetIdMap;
|
||||||
std::unordered_map<std::type_index, std::function<void(AssetID)>> SHResourceManager::typedFreeFuncMap;
|
std::unordered_map<std::type_index, std::function<void(AssetID)>> SHResourceManager::typedFreeFuncMap;
|
||||||
std::vector<AssetID> SHResourceManager::loadedAssetData;
|
std::vector<AssetID> SHResourceManager::loadedAssetData;
|
||||||
|
bool SHResourceManager::textureChanged = false;
|
||||||
|
bool SHResourceManager::meshChanged = false;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
/* Function Definitions */
|
/* Function Definitions */
|
||||||
|
@ -63,8 +65,17 @@ namespace SHADE
|
||||||
SHGraphicsSystem* gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
SHGraphicsSystem* gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||||
if (gfxSystem == nullptr)
|
if (gfxSystem == nullptr)
|
||||||
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
throw std::runtime_error("[SHResourceManager] Attempted to load graphics resource without a SHGraphicsSystem installed.");
|
||||||
|
|
||||||
|
if (meshChanged)
|
||||||
|
{
|
||||||
gfxSystem->BuildMeshBuffers();
|
gfxSystem->BuildMeshBuffers();
|
||||||
|
meshChanged = false;
|
||||||
|
}
|
||||||
|
if (textureChanged)
|
||||||
|
{
|
||||||
gfxSystem->BuildTextures();
|
gfxSystem->BuildTextures();
|
||||||
|
textureChanged = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Free CPU Resources
|
// Free CPU Resources
|
||||||
for (auto assetId : loadedAssetData)
|
for (auto assetId : loadedAssetData)
|
||||||
|
|
|
@ -28,33 +28,15 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Template structs that maps a resource to their loaded asset representation type.
|
||||||
|
/// </summary>
|
||||||
template<typename T = void>
|
template<typename T = void>
|
||||||
struct SHResourceLoader
|
struct SHResourceLoader { using AssetType = void; };
|
||||||
{
|
template<> struct SHResourceLoader<SHMesh> { using AssetType = SHMeshAsset; };
|
||||||
using AssetType = void;
|
template<> struct SHResourceLoader<SHTexture> { using AssetType = SHTextureAsset; };
|
||||||
};
|
template<> struct SHResourceLoader<SHVkShaderModule> { using AssetType = SHShaderAsset; };
|
||||||
|
template<> struct SHResourceLoader<SHMaterial> { using AssetType = SHMaterialAsset; };
|
||||||
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>
|
/// <summary>
|
||||||
/// Static class responsible for loading and caching runtime resources from their
|
/// Static class responsible for loading and caching runtime resources from their
|
||||||
|
@ -97,7 +79,7 @@ namespace SHADE
|
||||||
/// <param name="assetId">Handle to the resource to unload.</param>
|
/// <param name="assetId">Handle to the resource to unload.</param>
|
||||||
static void Unload(AssetID assetId);
|
static void Unload(AssetID assetId);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Needs to be called to finalise all changes to loads.
|
/// Needs to be called to finalise all changes to loads, unless at runtime.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
static void FinaliseChanges();
|
static void FinaliseChanges();
|
||||||
|
|
||||||
|
@ -147,6 +129,9 @@ namespace SHADE
|
||||||
static std::unordered_map<std::type_index, std::function<void(AssetID)>> typedFreeFuncMap;
|
static std::unordered_map<std::type_index, std::function<void(AssetID)>> typedFreeFuncMap;
|
||||||
// Pointers to temp CPU resources
|
// Pointers to temp CPU resources
|
||||||
static std::vector<AssetID> loadedAssetData;
|
static std::vector<AssetID> loadedAssetData;
|
||||||
|
// Dirty Flags
|
||||||
|
static bool meshChanged;
|
||||||
|
static bool textureChanged;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Helper Functions */
|
/* Helper Functions */
|
||||||
|
|
|
@ -54,7 +54,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
auto handle = load<ResourceType>(assetId, *assetData);
|
auto handle = load<ResourceType>(assetId, *assetData);
|
||||||
Handle genericHandle = Handle();
|
Handle genericHandle = Handle(handle);
|
||||||
typedHandleMap.get().emplace(assetId, genericHandle);
|
typedHandleMap.get().emplace(assetId, genericHandle);
|
||||||
typedAssetIdMap.get().emplace(genericHandle, assetId);
|
typedAssetIdMap.get().emplace(genericHandle, assetId);
|
||||||
return handle;
|
return handle;
|
||||||
|
@ -139,6 +139,7 @@ namespace SHADE
|
||||||
if constexpr (std::is_same_v<ResourceType, SHMesh>)
|
if constexpr (std::is_same_v<ResourceType, SHMesh>)
|
||||||
{
|
{
|
||||||
loadedAssetData.emplace_back(assetId);
|
loadedAssetData.emplace_back(assetId);
|
||||||
|
meshChanged = true;
|
||||||
|
|
||||||
return gfxSystem->AddMesh
|
return gfxSystem->AddMesh
|
||||||
(
|
(
|
||||||
|
@ -155,6 +156,7 @@ namespace SHADE
|
||||||
else if constexpr (std::is_same_v<ResourceType, SHTexture>)
|
else if constexpr (std::is_same_v<ResourceType, SHTexture>)
|
||||||
{
|
{
|
||||||
loadedAssetData.emplace_back(assetId);
|
loadedAssetData.emplace_back(assetId);
|
||||||
|
textureChanged = true;
|
||||||
|
|
||||||
return gfxSystem->AddTexture
|
return gfxSystem->AddTexture
|
||||||
(
|
(
|
||||||
|
|
|
@ -0,0 +1,127 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
|
||||||
|
#include "Camera.hxx"
|
||||||
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
#include "Camera/SHCameraSystem.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
Camera::Camera(Entity entity)
|
||||||
|
:Component(entity)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float Camera::Pitch::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetPitch());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::Pitch::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetPitch(val);
|
||||||
|
}
|
||||||
|
float Camera::Yaw::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetYaw());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::Yaw::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetYaw(val);
|
||||||
|
}
|
||||||
|
float Camera::Roll::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetRoll());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::Roll::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetRoll(val);
|
||||||
|
}
|
||||||
|
float Camera::Width::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetWidth());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::Width::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetWidth(val);
|
||||||
|
}
|
||||||
|
float Camera::Height::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::Height::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetHeight(val);
|
||||||
|
}
|
||||||
|
float Camera::Near::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetNear());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::Near::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetNear(val);
|
||||||
|
}
|
||||||
|
float Camera::Far::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetFar());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::Far::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetFar(val);
|
||||||
|
}
|
||||||
|
float Camera::FOV::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetFOV());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::FOV::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetFOV(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 Camera::Position::get()
|
||||||
|
{
|
||||||
|
return Convert::ToCLI(GetNativeComponent()->GetPosition());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::Position::set(Vector3 val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetPosition(Convert::ToNative(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::SetMainCamera(size_t directorIndex)
|
||||||
|
{
|
||||||
|
auto system = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||||
|
system->SetMainCamera(GetNativeComponent()->GetEID(), directorIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::SetMainCamera()
|
||||||
|
{
|
||||||
|
SetMainCamera(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::LookAt(Vector3 targetPosition)
|
||||||
|
{
|
||||||
|
auto system = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||||
|
system->CameraLookAt(*GetNativeComponent(), Convert::ToNative(targetPosition));
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 Camera::GetForward()
|
||||||
|
{
|
||||||
|
auto system = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||||
|
SHVec3 forward, up, right;
|
||||||
|
system->GetCameraAxis(*GetNativeComponent(), forward, right, up);
|
||||||
|
return Convert::ToCLI(forward);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Project Includes
|
||||||
|
#include "Components/Component.hxx"
|
||||||
|
#include "Math/Vector3.hxx"
|
||||||
|
#include "Math/Quaternion.hxx"
|
||||||
|
// External Dependencies
|
||||||
|
#include "Camera/SHCameraComponent.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
public ref class Camera : public Component<SHCameraComponent>
|
||||||
|
{
|
||||||
|
internal:
|
||||||
|
Camera(Entity entity);
|
||||||
|
|
||||||
|
public:
|
||||||
|
property float Pitch
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float Yaw
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float Roll
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float Width
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float Height
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float Near
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float Far
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float FOV
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property Vector3 Position
|
||||||
|
{
|
||||||
|
Vector3 get();
|
||||||
|
void set(Vector3 val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SetMainCamera(size_t directorIndex);
|
||||||
|
void SetMainCamera();
|
||||||
|
void LookAt(Vector3 targetPosition);
|
||||||
|
Vector3 GetForward();
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "CameraArm.hxx"
|
||||||
|
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
CameraArm::CameraArm(Entity entity)
|
||||||
|
:Component(entity)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
float CameraArm::Pitch::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetPitch());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraArm::Pitch::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetPitch(val);
|
||||||
|
}
|
||||||
|
float CameraArm::Yaw::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetYaw());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraArm::Yaw::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetYaw(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
float CameraArm::ArmLength::get()
|
||||||
|
{
|
||||||
|
return (GetNativeComponent()->GetArmLength());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraArm::ArmLength::set(float val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->SetArmLength(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CameraArm::LookAtCameraOrigin::get()
|
||||||
|
{
|
||||||
|
return GetNativeComponent()->lookAtCameraOrigin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraArm::LookAtCameraOrigin::set(bool val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->lookAtCameraOrigin = val;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Project Includes
|
||||||
|
#include "Components/Component.hxx"
|
||||||
|
#include "Math/Vector3.hxx"
|
||||||
|
|
||||||
|
// External Dependencies
|
||||||
|
#include "Camera/SHCameraArmComponent.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
public ref class CameraArm : public Component<SHCameraArmComponent>
|
||||||
|
{
|
||||||
|
internal:
|
||||||
|
CameraArm(Entity entity);
|
||||||
|
public:
|
||||||
|
property float Pitch
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float Yaw
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property float ArmLength
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
void set(float val);
|
||||||
|
}
|
||||||
|
property bool LookAtCameraOrigin
|
||||||
|
{
|
||||||
|
bool get();
|
||||||
|
void set(bool val);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
|
@ -260,7 +260,7 @@ namespace SHADE
|
||||||
|
|
||||||
int val = safe_cast<int>(field->GetValue(object));
|
int val = safe_cast<int>(field->GetValue(object));
|
||||||
int oldVal = val;
|
int oldVal = val;
|
||||||
if (SHEditorUI::InputEnumCombo(Convert::ToNative(field->Name), val, nativeEnumNames))
|
if (SHEditorUI::InputEnumCombo(Convert::ToNative(field->Name), val, nativeEnumNames, &isHovered))
|
||||||
{
|
{
|
||||||
field->SetValue(object, val);
|
field->SetValue(object, val);
|
||||||
registerUndoAction(object, field, val, oldVal);
|
registerUndoAction(object, field, val, oldVal);
|
||||||
|
@ -280,12 +280,23 @@ namespace SHADE
|
||||||
// Actual Field
|
// Actual Field
|
||||||
std::string val = Convert::ToNative(stringVal);
|
std::string val = Convert::ToNative(stringVal);
|
||||||
std::string oldVal = val;
|
std::string oldVal = val;
|
||||||
if (SHEditorUI::InputTextField(Convert::ToNative(field->Name), val))
|
if (SHEditorUI::InputTextField(Convert::ToNative(field->Name), val, &isHovered))
|
||||||
{
|
{
|
||||||
field->SetValue(object, Convert::ToCLI(val));
|
field->SetValue(object, Convert::ToCLI(val));
|
||||||
registerUndoAction(object, field, Convert::ToCLI(val), Convert::ToCLI(oldVal));
|
registerUndoAction(object, field, Convert::ToCLI(val), Convert::ToCLI(oldVal));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (field->FieldType == GameObject::typeid)
|
||||||
|
{
|
||||||
|
GameObject gameObj = safe_cast<GameObject>(field->GetValue(object));
|
||||||
|
uint32_t entityId = gameObj.GetEntity();
|
||||||
|
if (SHEditorUI::InputGameObjectField(Convert::ToNative(field->Name), entityId, &isHovered))
|
||||||
|
{
|
||||||
|
GameObject newVal = GameObject(entityId);
|
||||||
|
field->SetValue(object, newVal);
|
||||||
|
registerUndoAction(object, field, newVal, gameObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
array<System::Type^>^ interfaces = field->FieldType->GetInterfaces();
|
array<System::Type^>^ interfaces = field->FieldType->GetInterfaces();
|
||||||
|
|
|
@ -33,6 +33,8 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Components/Transform.hxx"
|
#include "Components/Transform.hxx"
|
||||||
#include "Components\RigidBody.hxx"
|
#include "Components\RigidBody.hxx"
|
||||||
#include "Components\Collider.hxx"
|
#include "Components\Collider.hxx"
|
||||||
|
#include "Components/Camera.hxx"
|
||||||
|
#include "Components/CameraArm.hxx"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -248,6 +250,8 @@ namespace SHADE
|
||||||
componentMap.Add(createComponentSet<SHTransformComponent, Transform>());
|
componentMap.Add(createComponentSet<SHTransformComponent, Transform>());
|
||||||
componentMap.Add(createComponentSet<SHColliderComponent, Collider>());
|
componentMap.Add(createComponentSet<SHColliderComponent, Collider>());
|
||||||
componentMap.Add(createComponentSet<SHRigidBodyComponent, RigidBody>());
|
componentMap.Add(createComponentSet<SHRigidBodyComponent, RigidBody>());
|
||||||
|
componentMap.Add(createComponentSet<SHCameraComponent, Camera>());
|
||||||
|
componentMap.Add(createComponentSet<SHCameraArmComponent, CameraArm>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -72,6 +72,10 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
return node->IsActive();
|
return node->IsActive();
|
||||||
}
|
}
|
||||||
|
Entity GameObject::EntityId::get()
|
||||||
|
{
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* GameObject Property Functions */
|
/* GameObject Property Functions */
|
||||||
|
|
|
@ -86,6 +86,13 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
bool get();
|
bool get();
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Native Entity ID value for this GameObject.
|
||||||
|
/// </summary>
|
||||||
|
property Entity EntityId
|
||||||
|
{
|
||||||
|
Entity get();
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* GameObject Property Functions */
|
/* GameObject Property Functions */
|
||||||
|
|
|
@ -29,6 +29,12 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
return SHFrameRateController::GetRawDeltaTime();
|
return SHFrameRateController::GetRawDeltaTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float Time::DeltaTimeF::get()
|
||||||
|
{
|
||||||
|
return static_cast<float>(SHFrameRateController::GetRawDeltaTime());
|
||||||
|
}
|
||||||
double Time::FixedDeltaTime::get()
|
double Time::FixedDeltaTime::get()
|
||||||
{
|
{
|
||||||
return SHPhysicsSystemInterface::GetFixedDT();
|
return SHPhysicsSystemInterface::GetFixedDT();
|
||||||
|
|
|
@ -32,6 +32,16 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
double get();
|
double get();
|
||||||
}
|
}
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
/* Properties */
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
/// <summary>
|
||||||
|
/// Time taken to process the previous frame.
|
||||||
|
/// </summary>
|
||||||
|
static property float DeltaTimeF
|
||||||
|
{
|
||||||
|
float get();
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Time taken for Physics simulations. You should use this for operations
|
/// Time taken for Physics simulations. You should use this for operations
|
||||||
/// within Script.FixedUpdate()
|
/// within Script.FixedUpdate()
|
||||||
|
|
|
@ -99,4 +99,11 @@ namespace SHADE
|
||||||
return SHInputManager::GetKeyReleasedTime(static_cast<SHInputManager::SH_KEYCODE>(key));
|
return SHInputManager::GetKeyReleasedTime(static_cast<SHInputManager::SH_KEYCODE>(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector2 Input::GetMouseVelocity()
|
||||||
|
{
|
||||||
|
double velX, velY;
|
||||||
|
SHInputManager::GetMouseVelocity(&velX, &velY);
|
||||||
|
|
||||||
|
return Convert::ToCLI(SHVec2{ (float)velX,(float)velY });
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -471,5 +471,7 @@ namespace SHADE
|
||||||
/// <param name="key">The key to check.</param>
|
/// <param name="key">The key to check.</param>
|
||||||
/// <returns>Time in seconds that the key was held.</returns>
|
/// <returns>Time in seconds that the key was held.</returns>
|
||||||
static double GetMouseReleasedTime(MouseCode mouseButton);
|
static double GetMouseReleasedTime(MouseCode mouseButton);
|
||||||
|
|
||||||
|
static Vector2 GetMouseVelocity();
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -22,6 +22,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Math/Vector2.hxx"
|
#include "Math/Vector2.hxx"
|
||||||
#include "Math/Vector3.hxx"
|
#include "Math/Vector3.hxx"
|
||||||
#include "Utility/Debug.hxx"
|
#include "Utility/Debug.hxx"
|
||||||
|
#include "Engine/GameObject.hxx"
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------------------*/
|
||||||
/* Macro Functions */
|
/* Macro Functions */
|
||||||
|
@ -167,6 +168,11 @@ namespace SHADE
|
||||||
fieldNode.push_back(vec.y);
|
fieldNode.push_back(vec.y);
|
||||||
fieldNode.push_back(vec.z);
|
fieldNode.push_back(vec.z);
|
||||||
}
|
}
|
||||||
|
else if (fieldInfo->FieldType == GameObject::typeid)
|
||||||
|
{
|
||||||
|
GameObject gameObj = safe_cast<GameObject>(fieldInfo->GetValue(object));
|
||||||
|
fieldNode = gameObj.GetEntity();
|
||||||
|
}
|
||||||
else // Not any of the supported types
|
else // Not any of the supported types
|
||||||
{
|
{
|
||||||
Debug::LogWarning(Convert::ToNative(System::String::Format
|
Debug::LogWarning(Convert::ToNative(System::String::Format
|
||||||
|
@ -242,6 +248,10 @@ namespace SHADE
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (fieldInfo->FieldType == GameObject::typeid)
|
||||||
|
{
|
||||||
|
fieldInfo->SetValue(object, GameObject(node.as<uint32_t>()));
|
||||||
|
}
|
||||||
else // Not any of the supported types
|
else // Not any of the supported types
|
||||||
{
|
{
|
||||||
Debug::LogWarning(Convert::ToNative(System::String::Format
|
Debug::LogWarning(Convert::ToNative(System::String::Format
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
using System;
|
||||||
|
using SHADE;
|
||||||
|
|
||||||
|
namespace SHADE_Scripting
|
||||||
|
{
|
||||||
|
public class CameraControl :Script
|
||||||
|
{
|
||||||
|
public float turnSpeed = 0.5f;
|
||||||
|
|
||||||
|
public CameraControl(GameObject go) : base(go) { }
|
||||||
|
protected override void update()
|
||||||
|
{
|
||||||
|
//Camera
|
||||||
|
Camera cam = GetComponent<Camera>();
|
||||||
|
Vector2 mouseVel = Input.GetMouseVelocity();
|
||||||
|
|
||||||
|
cam.Pitch -= mouseVel.y * turnSpeed * (float)Time.DeltaTime;
|
||||||
|
cam.Yaw += mouseVel.x * turnSpeed * (float)Time.DeltaTime;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -38,7 +38,6 @@ public class PhysicsTest : Script
|
||||||
RigidBody.AddForce(Force);
|
RigidBody.AddForce(Force);
|
||||||
Debug.Log($"Jump!");
|
Debug.Log($"Jump!");
|
||||||
}
|
}
|
||||||
Debug.Log($"{Transform.LocalPosition.y}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void fixedUpdate()
|
protected override void fixedUpdate()
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using SHADE;
|
||||||
|
|
||||||
|
|
||||||
|
namespace SHADE_Scripting
|
||||||
|
{
|
||||||
|
public class ThirdPersonCamera: Script
|
||||||
|
{
|
||||||
|
|
||||||
|
public float armLength = 4.0f;
|
||||||
|
public float turnSpeedPitch = 0.3f;
|
||||||
|
public float turnSpeedYaw = 0.5f;
|
||||||
|
public float pitchClamp = 45.0f;
|
||||||
|
public ThirdPersonCamera(GameObject go) : base(go) { }
|
||||||
|
|
||||||
|
protected override void awake()
|
||||||
|
{
|
||||||
|
if(!GetComponent<Camera>())
|
||||||
|
{
|
||||||
|
AddComponent<Camera>();
|
||||||
|
}
|
||||||
|
if (!GetComponent<CameraArm>())
|
||||||
|
{
|
||||||
|
AddComponent<CameraArm>();
|
||||||
|
}
|
||||||
|
GetComponent<CameraArm>().ArmLength = armLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void update()
|
||||||
|
{
|
||||||
|
CameraArm arm = GetComponent<CameraArm>();
|
||||||
|
if(arm)
|
||||||
|
{
|
||||||
|
Vector2 vel = Input.GetMouseVelocity();
|
||||||
|
arm.Pitch -= vel.y * turnSpeedPitch * Time.DeltaTimeF;
|
||||||
|
arm.Yaw += vel.x * turnSpeedYaw * Time.DeltaTimeF;
|
||||||
|
|
||||||
|
if(arm.Pitch > pitchClamp)
|
||||||
|
{
|
||||||
|
arm.Pitch = pitchClamp;
|
||||||
|
}
|
||||||
|
else if(arm.Pitch < -pitchClamp)
|
||||||
|
{
|
||||||
|
arm.Pitch = -pitchClamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue