Fixed AI C# Script for final submission #283
|
@ -1,4 +1,4 @@
|
||||||
Start in Fullscreen: false
|
Start in Fullscreen: false
|
||||||
Starting Scene ID: 97158628
|
Starting Scene ID: 86098106
|
||||||
Window Size: {x: 1920, y: 1080}
|
Window Size: {x: 1920, y: 1080}
|
||||||
Window Title: SHADE Engine
|
Window Title: SHADE Engine
|
|
@ -82,7 +82,7 @@
|
||||||
Transform Component:
|
Transform Component:
|
||||||
Translate: {x: 0, y: 4.28833103, z: 0}
|
Translate: {x: 0, y: 4.28833103, z: 0}
|
||||||
Rotate: {x: -0, y: 0, z: -0}
|
Rotate: {x: -0, y: 0, z: -0}
|
||||||
Scale: {x: 1, y: 1, z: 1}
|
Scale: {x: 1, y: 0, z: 1}
|
||||||
IsActive: true
|
IsActive: true
|
||||||
RigidBody Component:
|
RigidBody Component:
|
||||||
Type: Dynamic
|
Type: Dynamic
|
||||||
|
@ -108,14 +108,6 @@
|
||||||
Density: 1
|
Density: 1
|
||||||
Position Offset: {x: 0, y: 0, z: 0}
|
Position Offset: {x: 0, y: 0, z: 0}
|
||||||
Rotation Offset: {x: 0, y: 0, z: 0}
|
Rotation Offset: {x: 0, y: 0, z: 0}
|
||||||
- Is Trigger: false
|
|
||||||
Type: Box
|
|
||||||
Half Extents: {x: 2, y: 2, z: 2}
|
|
||||||
Friction: 0.400000006
|
|
||||||
Bounciness: 0
|
|
||||||
Density: 1
|
|
||||||
Position Offset: {x: 0, y: 0, z: 0}
|
|
||||||
Rotation Offset: {x: 0, y: 0, z: 0}
|
|
||||||
IsActive: true
|
IsActive: true
|
||||||
Scripts: ~
|
Scripts: ~
|
||||||
- EID: 65537
|
- EID: 65537
|
||||||
|
|
|
@ -8599,6 +8599,7 @@
|
||||||
Arm Length: 1
|
Arm Length: 1
|
||||||
Look At Camera Origin: true
|
Look At Camera Origin: true
|
||||||
Target Offset: {x: 0, y: 0, z: 0}
|
Target Offset: {x: 0, y: 0, z: 0}
|
||||||
|
Camera Collision: true
|
||||||
IsActive: true
|
IsActive: true
|
||||||
Scripts:
|
Scripts:
|
||||||
- Type: SHADE_Scripting.ThirdPersonCamera
|
- Type: SHADE_Scripting.ThirdPersonCamera
|
||||||
|
@ -8675,15 +8676,7 @@
|
||||||
Scripts:
|
Scripts:
|
||||||
- Type: Homeowner1
|
- Type: Homeowner1
|
||||||
Enabled: true
|
Enabled: true
|
||||||
player: 2
|
waypointsPool: 51000
|
||||||
waypoints:
|
|
||||||
- [2.70000005, 0, -2]
|
|
||||||
- [-0.300000012, 0, -2.70000005]
|
|
||||||
- [-2, 0, -3.79999995]
|
|
||||||
- [-4, 0, -2.0999999]
|
|
||||||
- [-2.9000001, 0, 2.4000001]
|
|
||||||
- [-1, 0, 4]
|
|
||||||
- [2.70000005, 0, 4]
|
|
||||||
patrolSpeed: 1
|
patrolSpeed: 1
|
||||||
chaseSpeed: 2
|
chaseSpeed: 2
|
||||||
turningSpeed: 5
|
turningSpeed: 5
|
||||||
|
|
|
@ -12,7 +12,7 @@ public class MainMenu : Script
|
||||||
if (Input.GetKey(Input.KeyCode.Space))
|
if (Input.GetKey(Input.KeyCode.Space))
|
||||||
{
|
{
|
||||||
Audio.PlaySFXOnce2D("event:/UI/mouse_down_element");
|
Audio.PlaySFXOnce2D("event:/UI/mouse_down_element");
|
||||||
SceneManager.ChangeScene(86098106);
|
SceneManager.ChangeScene(89830755);
|
||||||
Audio.StopAllSounds();
|
Audio.StopAllSounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,8 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
||||||
SHCameraArmComponent::SHCameraArmComponent()
|
SHCameraArmComponent::SHCameraArmComponent()
|
||||||
:pitch(0.0f), yaw(0.0f), armLength(1.0f),offset(), dirty(true), lookAtCameraOrigin(true)
|
:pitch(0.0f), yaw(0.0f), armLength(1.0f), offset(), enableCameraCollision(false), lookAtCameraOrigin(true)
|
||||||
, targetOffset(0.0f)
|
, targetOffset(0.0f),ray()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -39,22 +39,23 @@ namespace SHADE
|
||||||
return targetOffset;
|
return targetOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SHCameraArmComponent::SetPitch(float pitch) noexcept
|
void SHCameraArmComponent::SetPitch(float pitch) noexcept
|
||||||
{
|
{
|
||||||
this->pitch = pitch;
|
this->pitch = pitch;
|
||||||
dirty = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCameraArmComponent::SetYaw(float yaw) noexcept
|
void SHCameraArmComponent::SetYaw(float yaw) noexcept
|
||||||
{
|
{
|
||||||
this->yaw = yaw;
|
this->yaw = yaw;
|
||||||
dirty = true;
|
//dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCameraArmComponent::SetArmLength(float length) noexcept
|
void SHCameraArmComponent::SetArmLength(float length) noexcept
|
||||||
{
|
{
|
||||||
this->armLength = length;
|
this->armLength = length;
|
||||||
dirty = true;
|
//dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCameraArmComponent::SetTargetOffset(SHVec3 offset) noexcept
|
void SHCameraArmComponent::SetTargetOffset(SHVec3 offset) noexcept
|
||||||
|
@ -62,6 +63,8 @@ namespace SHADE
|
||||||
this->targetOffset = offset;
|
this->targetOffset = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,6 +79,7 @@ RTTR_REGISTRATION
|
||||||
.property("Arm Length", &SHCameraArmComponent::GetArmLength, &SHCameraArmComponent::SetArmLength)
|
.property("Arm Length", &SHCameraArmComponent::GetArmLength, &SHCameraArmComponent::SetArmLength)
|
||||||
.property("Look At Camera Origin", &SHCameraArmComponent::lookAtCameraOrigin)
|
.property("Look At Camera Origin", &SHCameraArmComponent::lookAtCameraOrigin)
|
||||||
.property("Target Offset", &SHCameraArmComponent::GetTargetOffset, &SHCameraArmComponent::SetTargetOffset)
|
.property("Target Offset", &SHCameraArmComponent::GetTargetOffset, &SHCameraArmComponent::SetTargetOffset)
|
||||||
|
.property("Camera Collision", &SHCameraArmComponent::enableCameraCollision)
|
||||||
;
|
;
|
||||||
|
|
||||||
}
|
}
|
|
@ -5,9 +5,14 @@
|
||||||
#include "ECS_Base/Components/SHComponent.h"
|
#include "ECS_Base/Components/SHComponent.h"
|
||||||
#include "Math/SHMatrix.h"
|
#include "Math/SHMatrix.h"
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
|
#include "Math/SHRay.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class SHBox;
|
||||||
|
class SHRay;
|
||||||
|
|
||||||
class SH_API SHCameraArmComponent final: public SHComponent
|
class SH_API SHCameraArmComponent final: public SHComponent
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -15,15 +20,18 @@ namespace SHADE
|
||||||
float yaw;
|
float yaw;
|
||||||
float armLength;
|
float armLength;
|
||||||
|
|
||||||
bool dirty;
|
|
||||||
SHVec3 offset;
|
SHVec3 offset;
|
||||||
SHVec3 targetOffset;
|
SHVec3 targetOffset;
|
||||||
|
SHRay ray;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
friend class SHCameraSystem;
|
friend class SHCameraSystem;
|
||||||
SHCameraArmComponent();
|
SHCameraArmComponent();
|
||||||
virtual ~SHCameraArmComponent() = default;
|
virtual ~SHCameraArmComponent() = default;
|
||||||
|
|
||||||
bool lookAtCameraOrigin;
|
bool lookAtCameraOrigin;
|
||||||
|
bool enableCameraCollision;
|
||||||
//Getters
|
//Getters
|
||||||
//SHMatrix const& GetMatrix() const noexcept;
|
//SHMatrix const& GetMatrix() const noexcept;
|
||||||
SHVec3 const& GetOffset() const noexcept;
|
SHVec3 const& GetOffset() const noexcept;
|
||||||
|
@ -31,12 +39,14 @@ namespace SHADE
|
||||||
float GetYaw() const noexcept;
|
float GetYaw() const noexcept;
|
||||||
float GetArmLength() const noexcept;
|
float GetArmLength() const noexcept;
|
||||||
SHVec3 GetTargetOffset() const noexcept;
|
SHVec3 GetTargetOffset() const noexcept;
|
||||||
|
|
||||||
|
|
||||||
//Setters
|
//Setters
|
||||||
void SetPitch(float pitch) noexcept;
|
void SetPitch(float pitch) noexcept;
|
||||||
void SetYaw(float yaw) noexcept;
|
void SetYaw(float yaw) noexcept;
|
||||||
void SetArmLength(float length) noexcept;
|
void SetArmLength(float length) noexcept;
|
||||||
void SetTargetOffset(SHVec3 offset)noexcept;
|
void SetTargetOffset(SHVec3 offset) noexcept;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,10 @@
|
||||||
#include "Scene/SHSceneManager.h"
|
#include "Scene/SHSceneManager.h"
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
#include "Editor/SHEditor.h"
|
#include "Editor/SHEditor.h"
|
||||||
|
#include "Math/Geometry/SHBox.h"
|
||||||
|
#include "Math/SHRay.h"
|
||||||
|
#include "Physics/System/SHPhysicsSystem.h"
|
||||||
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -96,7 +100,7 @@ namespace SHADE
|
||||||
if (editorCameraArm.armLength < 1.0f)
|
if (editorCameraArm.armLength < 1.0f)
|
||||||
editorCameraArm.armLength = 1.0f;
|
editorCameraArm.armLength = 1.0f;
|
||||||
|
|
||||||
UpdatePivotArmComponent(editorCameraArm);
|
UpdateCameraArmComponent(editorCameraArm);
|
||||||
|
|
||||||
editorCamera.offset = editorCameraArm.GetOffset();
|
editorCamera.offset = editorCameraArm.GetOffset();
|
||||||
|
|
||||||
|
@ -132,10 +136,12 @@ namespace SHADE
|
||||||
return &editorCamera;
|
return &editorCamera;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCameraSystem::UpdatePivotArmComponent(SHCameraArmComponent& pivot) noexcept
|
void SHCameraSystem::UpdateCameraArmComponent(SHCameraArmComponent& pivot) noexcept
|
||||||
{
|
{
|
||||||
if (pivot.dirty)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SHVec3 offset{ 0.0f,0.0f, pivot.GetArmLength() };
|
SHVec3 offset{ 0.0f,0.0f, pivot.GetArmLength() };
|
||||||
offset = SHVec3::RotateX(offset, -(SHMath::DegreesToRadians(pivot.GetPitch())));
|
offset = SHVec3::RotateX(offset, -(SHMath::DegreesToRadians(pivot.GetPitch())));
|
||||||
|
@ -145,10 +151,61 @@ namespace SHADE
|
||||||
//pivot.rtMatrix = SHMatrix::RotateX(SHMath::DegreesToRadians(pivot.GetPitch()))
|
//pivot.rtMatrix = SHMatrix::RotateX(SHMath::DegreesToRadians(pivot.GetPitch()))
|
||||||
// * SHMatrix::RotateY(SHMath::DegreesToRadians(pivot.GetYaw()))
|
// * SHMatrix::RotateY(SHMath::DegreesToRadians(pivot.GetYaw()))
|
||||||
// * SHMatrix::Translate(SHVec3(0.0f , 0.0f, pivot.GetArmLength()));
|
// * SHMatrix::Translate(SHVec3(0.0f , 0.0f, pivot.GetArmLength()));
|
||||||
|
|
||||||
pivot.offset = offset;
|
pivot.offset = offset;
|
||||||
|
if (!pivot.enableCameraCollision)
|
||||||
|
{
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHCameraComponent* camera = SHComponentManager::GetComponent_s<SHCameraComponent>(pivot.GetEID());
|
||||||
|
SHTransformComponent* transform = SHComponentManager::GetComponent_s<SHTransformComponent>(pivot.GetEID());
|
||||||
|
auto physicsSystem = SHSystemManager::GetSystem<SHPhysicsSystem>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (camera == nullptr || transform == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
/*if (SHComponentManager::HasComponent<SHTransformComponent>(camera->GetEID()) == true && camera != &editorCamera)
|
||||||
|
{
|
||||||
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(camera->GetEID());
|
||||||
|
SHVec3 rotation = transform->GetWorldRotation();
|
||||||
|
camera->pitch = SHMath::RadiansToDegrees(rotation.x);
|
||||||
|
camera->yaw = SHMath::RadiansToDegrees(rotation.y);
|
||||||
|
camera->roll = SHMath::RadiansToDegrees(rotation.z);
|
||||||
|
camera->position = transform->GetWorldPosition();
|
||||||
|
camera->dirtyView = true;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
pivot.ray.position = camera->GetPosition() + pivot.targetOffset;
|
||||||
|
pivot.ray.direction = SHVec3::Normalise((camera->position + offset)- pivot.ray.position);
|
||||||
|
|
||||||
|
//SHLOG_INFO("Ray position: {},{},{} direction:{},{},{}",pivot.ray.position.x, pivot.ray.position.y, pivot.ray.position.z,pivot.ray.direction.x, pivot.ray.direction.y, pivot.ray.direction.z)
|
||||||
|
|
||||||
|
auto result = physicsSystem->Raycast(pivot.ray );
|
||||||
|
if (result && result.distance < pivot.GetArmLength())
|
||||||
|
{
|
||||||
|
|
||||||
|
SHVec3 newOffset = SHVec3{ 0.0f,0.0f, result.distance * 0.8f };
|
||||||
|
newOffset = SHVec3::RotateX(newOffset, -(SHMath::DegreesToRadians(pivot.GetPitch())));
|
||||||
|
newOffset = SHVec3::RotateY(newOffset, (SHMath::DegreesToRadians(pivot.GetYaw())));
|
||||||
|
pivot.offset = newOffset;
|
||||||
|
//SHLOG_INFO("CAMERA COLLISION HIT, {}", result.distance);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//SHLOG_INFO("CAMERA COLLISION CANT HIT CAMERA");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// pivot.rtMatrix = SHMatrix::Inverse(pivot.rtMatrix);
|
// pivot.rtMatrix = SHMatrix::Inverse(pivot.rtMatrix);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -291,7 +348,7 @@ namespace SHADE
|
||||||
for (auto& pivot : pivotDense)
|
for (auto& pivot : pivotDense)
|
||||||
{
|
{
|
||||||
if(SHSceneManager::CheckNodeAndComponentsActive<SHCameraArmComponent>(pivot.GetEID()))
|
if(SHSceneManager::CheckNodeAndComponentsActive<SHCameraArmComponent>(pivot.GetEID()))
|
||||||
system->UpdatePivotArmComponent(pivot);
|
system->UpdateCameraArmComponent(pivot);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& cam : dense)
|
for (auto& cam : dense)
|
||||||
|
@ -390,7 +447,9 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
void SHCameraSystem::SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept
|
void SHCameraSystem::SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept
|
||||||
{
|
{
|
||||||
|
SHVec3 pos;
|
||||||
DecomposeViewMatrix(viewMatrix, camera.pitch, camera.yaw, camera.roll, camera.position);
|
DecomposeViewMatrix(viewMatrix, camera.pitch, camera.yaw, camera.roll, camera.position);
|
||||||
|
|
||||||
camera.dirtyView = true;
|
camera.dirtyView = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ namespace SHADE
|
||||||
|
|
||||||
|
|
||||||
void UpdateCameraComponent(SHCameraComponent& camera) noexcept;
|
void UpdateCameraComponent(SHCameraComponent& camera) noexcept;
|
||||||
void UpdatePivotArmComponent(SHCameraArmComponent& pivot) noexcept;
|
void UpdateCameraArmComponent(SHCameraArmComponent& pivot) noexcept;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ namespace SHADE
|
||||||
class SH_API CameraSystemUpdate final: public SHSystemRoutine
|
class SH_API CameraSystemUpdate final: public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CameraSystemUpdate() : SHSystemRoutine("Camera System Update", true) {};
|
CameraSystemUpdate() : SHSystemRoutine("Camera System Update", false) {};
|
||||||
virtual void Execute(double dt)noexcept override final;
|
virtual void Execute(double dt)noexcept override final;
|
||||||
};
|
};
|
||||||
friend class CameraSystemUpdate;
|
friend class CameraSystemUpdate;
|
||||||
|
|
|
@ -53,7 +53,7 @@ namespace SHADE
|
||||||
|
|
||||||
for (auto value : values)
|
for (auto value : values)
|
||||||
{
|
{
|
||||||
max = Min(max, value);
|
max = Max(max, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return max;
|
return max;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#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"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -35,7 +36,7 @@ namespace SHADE
|
||||||
{}
|
{}
|
||||||
|
|
||||||
SHTransformSystem::TransformPostPhysicsUpdate::TransformPostPhysicsUpdate()
|
SHTransformSystem::TransformPostPhysicsUpdate::TransformPostPhysicsUpdate()
|
||||||
: SHSystemRoutine { "Transform Post-Physics Update", false }
|
: SHSystemRoutine { "Transform Post-Physics Update", true }
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,7 +55,28 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
// Get the current scene graph to traverse and update
|
// Get the current scene graph to traverse and update
|
||||||
const auto& SCENE_GRAPH = SHSceneManager::GetCurrentSceneGraph();
|
const auto& SCENE_GRAPH = SHSceneManager::GetCurrentSceneGraph();
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
|
||||||
|
// When editor is not in play, only clear all dirty flags. No update required.
|
||||||
|
|
||||||
|
const auto* EDITOR = SHSystemManager::GetSystem<SHEditor>();
|
||||||
|
if (EDITOR && EDITOR->editorState != SHEditor::State::PLAY)
|
||||||
|
{
|
||||||
|
auto& transformsSet = SHComponentManager::GetDense<SHTransformComponent>();
|
||||||
|
for (auto& tfComp : transformsSet)
|
||||||
|
tfComp.dirty = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UpdateEntity(SCENE_GRAPH.GetRoot(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
UpdateEntity(SCENE_GRAPH.GetRoot(), true);
|
UpdateEntity(SCENE_GRAPH.GetRoot(), true);
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHTransformSystem::Init()
|
void SHTransformSystem::Init()
|
||||||
|
|
|
@ -107,6 +107,7 @@ namespace SHADE
|
||||||
const SHVec3& RELATIVE_EXTENTS = box->GetRelativeExtents();
|
const SHVec3& RELATIVE_EXTENTS = box->GetRelativeExtents();
|
||||||
|
|
||||||
// Recompute world extents based on new scale and fixed relative extents
|
// Recompute world extents based on new scale and fixed relative extents
|
||||||
|
|
||||||
const SHVec3 WORLD_EXTENTS = RELATIVE_EXTENTS * (scale * 0.5f);
|
const SHVec3 WORLD_EXTENTS = RELATIVE_EXTENTS * (scale * 0.5f);
|
||||||
box->SetWorldExtents(WORLD_EXTENTS);
|
box->SetWorldExtents(WORLD_EXTENTS);
|
||||||
|
|
||||||
|
@ -118,6 +119,7 @@ namespace SHADE
|
||||||
const float RELATIVE_RADIUS = sphere->GetRelativeRadius();
|
const float RELATIVE_RADIUS = sphere->GetRelativeRadius();
|
||||||
|
|
||||||
// Recompute world radius based on new scale and fixed radius
|
// Recompute world radius based on new scale and fixed radius
|
||||||
|
|
||||||
const float MAX_SCALE = SHMath::Max({ scale.x, scale.y, scale.z });
|
const float MAX_SCALE = SHMath::Max({ scale.x, scale.y, scale.z });
|
||||||
const float WORLD_RADIUS = RELATIVE_RADIUS * MAX_SCALE * 0.5f;
|
const float WORLD_RADIUS = RELATIVE_RADIUS * MAX_SCALE * 0.5f;
|
||||||
sphere->SetWorldRadius(WORLD_RADIUS);
|
sphere->SetWorldRadius(WORLD_RADIUS);
|
||||||
|
|
|
@ -206,7 +206,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the half extents relative to world scale
|
// Set the half extents relative to world scale
|
||||||
const SHVec3 WORLD_EXTENTS = correctedHalfExtents * COLLIDER->GetScale();
|
const SHVec3 WORLD_EXTENTS = correctedHalfExtents * COLLIDER->GetScale() * 0.5f;
|
||||||
|
|
||||||
if (type != Type::BOX)
|
if (type != Type::BOX)
|
||||||
{
|
{
|
||||||
|
|
|
@ -309,12 +309,9 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
colliderComponent->position = WORLD_POS;
|
colliderComponent->position = WORLD_POS;
|
||||||
colliderComponent->orientation = WORLD_ROT;
|
colliderComponent->orientation = WORLD_ROT;
|
||||||
|
colliderComponent->scale = WORLD_SCL;
|
||||||
|
|
||||||
if (colliderComponent->scale != WORLD_SCL)
|
colliderComponent->RecomputeCollisionShapes();
|
||||||
{
|
|
||||||
colliderComponent->scale = WORLD_SCL;
|
|
||||||
colliderComponent->RecomputeCollisionShapes();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -197,12 +197,18 @@ namespace SHADE
|
||||||
if (BUILD_SUCCESS)
|
if (BUILD_SUCCESS)
|
||||||
{
|
{
|
||||||
// Copy to built dll to the working directory and replace
|
// Copy to built dll to the working directory and replace
|
||||||
std::filesystem::copy_file("./tmp/SHADE_Scripting.dll", "SHADE_Scripting.dll", std::filesystem::copy_options::overwrite_existing);
|
if (!copyFile("./tmp/SHADE_Scripting.dll", "SHADE_Scripting.dll", std::filesystem::copy_options::overwrite_existing))
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("[ScriptEngine] Failed to replace scripts assembly. Scripts will remain outdated.");
|
||||||
|
}
|
||||||
|
|
||||||
// If debug, we want to copy the PDB so that we can do script debugging
|
// If debug, we want to copy the PDB so that we can do script debugging
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
std::filesystem::copy_file("./tmp/SHADE_Scripting.pdb", "SHADE_Scripting.pdb", std::filesystem::copy_options::overwrite_existing);
|
if (!copyFile("./tmp/SHADE_Scripting.pdb", "SHADE_Scripting.pdb", std::filesystem::copy_options::overwrite_existing))
|
||||||
|
{
|
||||||
|
SHLOG_WARNING("[ScriptEngine] Breakpoint debugging will not work as PDB cannot be updated. If you are currently debugging, stop the debugger first.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
oss << "[ScriptEngine] Successfully built Managed Script Assembly (" << MANAGED_SCRIPT_LIB_NAME << ")!";
|
oss << "[ScriptEngine] Successfully built Managed Script Assembly (" << MANAGED_SCRIPT_LIB_NAME << ")!";
|
||||||
|
@ -591,6 +597,19 @@ namespace SHADE
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SHScriptEngine::copyFile(const std::filesystem::path& from, const std::filesystem::path& to, const std::filesystem::copy_options options) noexcept
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return std::filesystem::copy_file(from, to, options);
|
||||||
|
}
|
||||||
|
catch (std::exception& e)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("[ScriptEngine] Failed to copy file {} ({})", to.string(), std::string(e.what()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DWORD SHScriptEngine::execProcess(const std::wstring& path, const std::wstring& args)
|
DWORD SHScriptEngine::execProcess(const std::wstring& path, const std::wstring& args)
|
||||||
{
|
{
|
||||||
STARTUPINFOW startInfo;
|
STARTUPINFOW startInfo;
|
||||||
|
|
|
@ -319,6 +319,7 @@ namespace SHADE
|
||||||
/// <param name="filePath">File path to the file to check.</param>
|
/// <param name="filePath">File path to the file to check.</param>
|
||||||
/// <returns> True if the file exists </returns>
|
/// <returns> True if the file exists </returns>
|
||||||
static bool fileExists(const std::filesystem::path& filePath);
|
static bool fileExists(const std::filesystem::path& filePath);
|
||||||
|
static bool copyFile(const std::filesystem::path& from, const std::filesystem::path& to, const std::filesystem::copy_options options) noexcept;
|
||||||
static DWORD execProcess(const std::wstring& path, const std::wstring& args);
|
static DWORD execProcess(const std::wstring& path, const std::wstring& args);
|
||||||
static std::wstring generateBuildCommand(bool debug);
|
static std::wstring generateBuildCommand(bool debug);
|
||||||
};
|
};
|
||||||
|
|
|
@ -49,6 +49,16 @@ namespace SHADE
|
||||||
GetNativeComponent()->lookAtCameraOrigin = val;
|
GetNativeComponent()->lookAtCameraOrigin = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CameraArm::EnableCameraCollision::get()
|
||||||
|
{
|
||||||
|
return GetNativeComponent()->enableCameraCollision;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraArm::EnableCameraCollision::set(bool val)
|
||||||
|
{
|
||||||
|
GetNativeComponent()->enableCameraCollision = val;
|
||||||
|
}
|
||||||
|
|
||||||
Vector3 CameraArm::TargetOffset::get()
|
Vector3 CameraArm::TargetOffset::get()
|
||||||
{
|
{
|
||||||
return Convert::ToCLI(GetNativeComponent()->GetTargetOffset());
|
return Convert::ToCLI(GetNativeComponent()->GetTargetOffset());
|
||||||
|
|
|
@ -36,6 +36,12 @@ namespace SHADE
|
||||||
void set(bool val);
|
void set(bool val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
property bool EnableCameraCollision
|
||||||
|
{
|
||||||
|
bool get();
|
||||||
|
void set(bool val);
|
||||||
|
}
|
||||||
|
|
||||||
property Vector3 TargetOffset
|
property Vector3 TargetOffset
|
||||||
{
|
{
|
||||||
Vector3 get();
|
Vector3 get();
|
||||||
|
|
|
@ -22,6 +22,14 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/* Properties */
|
||||||
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
GameObject BaseComponent::Owner::get()
|
||||||
|
{
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Component Access Functions */
|
/* Component Access Functions */
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace SHADE
|
||||||
/// </summary>
|
/// </summary>
|
||||||
property GameObject Owner
|
property GameObject Owner
|
||||||
{
|
{
|
||||||
GameObject get() { return owner; }
|
GameObject get();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
@ -166,6 +166,19 @@ namespace SHADE
|
||||||
template<typename NativeType>
|
template<typename NativeType>
|
||||||
public ref class Component : public BaseComponent
|
public ref class Component : public BaseComponent
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
/* Properties */
|
||||||
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
/// <summary>
|
||||||
|
/// Whether or not the Component is active and being updated by the engine.
|
||||||
|
/// </summary>
|
||||||
|
property bool Enabled
|
||||||
|
{
|
||||||
|
bool get() { return GetNativeComponent()->isActive; }
|
||||||
|
void set(bool value) { GetNativeComponent()->isActive = value; }
|
||||||
|
}
|
||||||
|
|
||||||
internal:
|
internal:
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Type Definitions */
|
/* Type Definitions */
|
||||||
|
|
|
@ -200,7 +200,16 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if (SHEditorUI::Button("Add Item"))
|
if (SHEditorUI::Button("Add Item"))
|
||||||
{
|
{
|
||||||
System::Object^ obj = System::Activator::CreateInstance(listType);
|
System::Object^ obj;
|
||||||
|
if (listType == System::String::typeid)
|
||||||
|
{
|
||||||
|
// Special case for string
|
||||||
|
obj = gcnew System::String("");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
obj = System::Activator::CreateInstance(listType);
|
||||||
|
}
|
||||||
iList->Add(obj);
|
iList->Add(obj);
|
||||||
registerUndoListAddAction(listType, iList, iList->Count - 1, obj);
|
registerUndoListAddAction(listType, iList, iList->Count - 1, obj);
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ namespace SHADE
|
||||||
// Add the script in
|
// Add the script in
|
||||||
script->Initialize(GameObject(entity));
|
script->Initialize(GameObject(entity));
|
||||||
entityScriptList->Insert(System::Math::Clamp(index, 0, entityScriptList->Count), script);
|
entityScriptList->Insert(System::Math::Clamp(index, 0, entityScriptList->Count), script);
|
||||||
if (Application::IsPlaying && !SHSceneManager::HasSceneChanged())
|
if (Application::IsPlaying && !isDeserialising)
|
||||||
{
|
{
|
||||||
// Only call immediately if we are in game and is not loading another scene
|
// Only call immediately if we are in game and is not loading another scene
|
||||||
script->Awake();
|
script->Awake();
|
||||||
|
@ -423,6 +423,8 @@ namespace SHADE
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
void ScriptStore::Init()
|
void ScriptStore::Init()
|
||||||
{
|
{
|
||||||
|
isDeserialising = false;
|
||||||
|
|
||||||
// Create an enumerable list of script types
|
// Create an enumerable list of script types
|
||||||
refreshScriptTypeList();
|
refreshScriptTypeList();
|
||||||
// Get stored methods for interop variants of functions
|
// Get stored methods for interop variants of functions
|
||||||
|
@ -724,6 +726,10 @@ namespace SHADE
|
||||||
bool ScriptStore::DeserialiseScripts(Entity entity, System::IntPtr yamlNodePtr)
|
bool ScriptStore::DeserialiseScripts(Entity entity, System::IntPtr yamlNodePtr)
|
||||||
{
|
{
|
||||||
SAFE_NATIVE_CALL_BEGIN
|
SAFE_NATIVE_CALL_BEGIN
|
||||||
|
|
||||||
|
// Flag that deserialization processs is ongoing
|
||||||
|
isDeserialising = true;
|
||||||
|
|
||||||
// Convert to pointer
|
// Convert to pointer
|
||||||
YAML::Node* yamlNode = reinterpret_cast<YAML::Node*>(yamlNodePtr.ToPointer());
|
YAML::Node* yamlNode = reinterpret_cast<YAML::Node*>(yamlNodePtr.ToPointer());
|
||||||
|
|
||||||
|
@ -765,9 +771,16 @@ namespace SHADE
|
||||||
Debug::LogWarning("[ScriptStore] Script with unloaded type detected, skipping.");
|
Debug::LogWarning("[ScriptStore] Script with unloaded type detected, skipping.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unset flag for deserialization process
|
||||||
|
isDeserialising = false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
SAFE_NATIVE_CALL_END_N("SHADE_Managed.ScriptStore")
|
SAFE_NATIVE_CALL_END_N("SHADE_Managed.ScriptStore")
|
||||||
|
|
||||||
|
// Unset flag for deserialization process
|
||||||
|
isDeserialising = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -337,6 +337,7 @@ namespace SHADE
|
||||||
static ScriptSet disposalQueue;
|
static ScriptSet disposalQueue;
|
||||||
static System::Collections::Generic::IEnumerable<System::Type^>^ scriptTypeList;
|
static System::Collections::Generic::IEnumerable<System::Type^>^ scriptTypeList;
|
||||||
static System::Reflection::MethodInfo^ addScriptMethod;
|
static System::Reflection::MethodInfo^ addScriptMethod;
|
||||||
|
static bool isDeserialising;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Helper Functions */
|
/* Helper Functions */
|
||||||
|
|
|
@ -279,7 +279,15 @@ namespace SHADE
|
||||||
for (int i = 0; i < LIST_SIZE; ++i)
|
for (int i = 0; i < LIST_SIZE; ++i)
|
||||||
{
|
{
|
||||||
// Create the object
|
// Create the object
|
||||||
System::Object^ obj = System::Activator::CreateInstance(elemType);
|
System::Object^ obj;
|
||||||
|
if (elemType == System::String::typeid)
|
||||||
|
{
|
||||||
|
obj = gcnew System::String("");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
obj = System::Activator::CreateInstance(elemType);
|
||||||
|
}
|
||||||
|
|
||||||
// Set it's value
|
// Set it's value
|
||||||
if (varAssignYaml(obj, node[i]))
|
if (varAssignYaml(obj, node[i]))
|
||||||
|
|
|
@ -167,6 +167,10 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
valueObj = 0;
|
valueObj = 0;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -181,6 +185,10 @@ namespace SHADE
|
||||||
valueObj = FieldType();
|
valueObj = FieldType();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue