Merge branch 'main' into PlayerController

This commit is contained in:
Glence 2022-11-25 13:22:51 +08:00
commit 9daaade56a
20 changed files with 209 additions and 27 deletions

View File

@ -1,4 +1,4 @@
Start in Fullscreen: false
Starting Scene ID: 97158628
Starting Scene ID: 86098106
Window Size: {x: 1920, y: 1080}
Window Title: SHADE Engine

View File

@ -8578,6 +8578,7 @@
Arm Length: 1
Look At Camera Origin: true
Target Offset: {x: 0, y: 0, z: 0}
Camera Collision: true
IsActive: true
Scripts:
- Type: SHADE_Scripting.ThirdPersonCamera

View File

@ -41,6 +41,12 @@ public partial class LeafAttack : BehaviourTreeNode
onEnter(BehaviourTreeNodeStatus.RUNNING);
//Succeed when stand in hurt box for long enough
object timeObj = GetNodeData("captureTimeLeft");
if (timeObj == null)
{
return BehaviourTreeNodeStatus.FAILURE;
}
float captureTime = (float)GetNodeData("captureTimeLeft");
captureTime -= Time.DeltaTimeF;
SetNodeData("captureTimeLeft", captureTime);

View File

@ -83,7 +83,13 @@ public partial class LeafPatrol : BehaviourTreeNode
return;
}
waypoints = (List<GameObject>)GetNodeData("waypoints");
object waypoint = GetNodeData("waypoints");
if (waypoint == null)
{
return;
}
waypoints = (List<GameObject>)waypoint;
Vector3 targetPosition = waypoints[currentWaypointIndex].GetComponent<Transform>().GlobalPosition;
//Reach waypoint by X and Z being near enough

View File

@ -12,7 +12,7 @@ public class MainMenu : Script
if (Input.GetKeyDown(Input.KeyCode.Space))
{
Audio.PlaySFXOnce2D("event:/UI/mouse_down_element");
SceneManager.ChangeScene(86098106);
SceneManager.ChangeScene(89830755);
Audio.StopAllSounds();
}

View File

@ -7,8 +7,8 @@ namespace SHADE
{
SHCameraArmComponent::SHCameraArmComponent()
:pitch(0.0f), yaw(0.0f), armLength(1.0f),offset(), dirty(true), lookAtCameraOrigin(true)
, targetOffset(0.0f)
:pitch(0.0f), yaw(0.0f), armLength(1.0f), offset(), enableCameraCollision(false), lookAtCameraOrigin(true)
, targetOffset(0.0f),ray()
{
}
@ -39,22 +39,23 @@ namespace SHADE
return targetOffset;
}
void SHCameraArmComponent::SetPitch(float pitch) noexcept
{
this->pitch = pitch;
dirty = true;
}
void SHCameraArmComponent::SetYaw(float yaw) noexcept
{
this->yaw = yaw;
dirty = true;
//dirty = true;
}
void SHCameraArmComponent::SetArmLength(float length) noexcept
{
this->armLength = length;
dirty = true;
//dirty = true;
}
void SHCameraArmComponent::SetTargetOffset(SHVec3 offset) noexcept
@ -62,6 +63,8 @@ namespace SHADE
this->targetOffset = offset;
}
}//namespace SHADE
@ -76,6 +79,7 @@ RTTR_REGISTRATION
.property("Arm Length", &SHCameraArmComponent::GetArmLength, &SHCameraArmComponent::SetArmLength)
.property("Look At Camera Origin", &SHCameraArmComponent::lookAtCameraOrigin)
.property("Target Offset", &SHCameraArmComponent::GetTargetOffset, &SHCameraArmComponent::SetTargetOffset)
.property("Camera Collision", &SHCameraArmComponent::enableCameraCollision)
;
}

View File

@ -5,9 +5,14 @@
#include "ECS_Base/Components/SHComponent.h"
#include "Math/SHMatrix.h"
#include "SH_API.h"
#include "Math/SHRay.h"
namespace SHADE
{
class SHBox;
class SHRay;
class SH_API SHCameraArmComponent final: public SHComponent
{
private:
@ -15,15 +20,18 @@ namespace SHADE
float yaw;
float armLength;
bool dirty;
SHVec3 offset;
SHVec3 targetOffset;
SHRay ray;
public:
friend class SHCameraSystem;
SHCameraArmComponent();
virtual ~SHCameraArmComponent() = default;
bool lookAtCameraOrigin;
bool enableCameraCollision;
//Getters
//SHMatrix const& GetMatrix() const noexcept;
SHVec3 const& GetOffset() const noexcept;
@ -32,11 +40,13 @@ namespace SHADE
float GetArmLength() const noexcept;
SHVec3 GetTargetOffset() const noexcept;
//Setters
void SetPitch(float pitch) noexcept;
void SetYaw(float yaw) noexcept;
void SetArmLength(float length) noexcept;
void SetTargetOffset(SHVec3 offset)noexcept;
void SetTargetOffset(SHVec3 offset) noexcept;
protected:

View File

@ -10,6 +10,10 @@
#include "Scene/SHSceneManager.h"
#include "ECS_Base/Managers/SHSystemManager.h"
#include "Editor/SHEditor.h"
#include "Math/Geometry/SHBox.h"
#include "Math/SHRay.h"
#include "Physics/System/SHPhysicsSystem.h"
namespace SHADE
{
@ -96,7 +100,7 @@ namespace SHADE
if (editorCameraArm.armLength < 1.0f)
editorCameraArm.armLength = 1.0f;
UpdatePivotArmComponent(editorCameraArm);
UpdateCameraArmComponent(editorCameraArm);
editorCamera.offset = editorCameraArm.GetOffset();
@ -132,11 +136,13 @@ namespace SHADE
return &editorCamera;
}
void SHCameraSystem::UpdatePivotArmComponent(SHCameraArmComponent& pivot) noexcept
{
if (pivot.dirty)
void SHCameraSystem::UpdateCameraArmComponent(SHCameraArmComponent& pivot) noexcept
{
SHVec3 offset{ 0.0f,0.0f, pivot.GetArmLength() };
offset = SHVec3::RotateX(offset, -(SHMath::DegreesToRadians(pivot.GetPitch())));
offset = SHVec3::RotateY(offset, (SHMath::DegreesToRadians(pivot.GetYaw())));
@ -145,10 +151,61 @@ namespace SHADE
//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);
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);
}
@ -291,7 +348,7 @@ namespace SHADE
for (auto& pivot : pivotDense)
{
if(SHSceneManager::CheckNodeAndComponentsActive<SHCameraArmComponent>(pivot.GetEID()))
system->UpdatePivotArmComponent(pivot);
system->UpdateCameraArmComponent(pivot);
}
for (auto& cam : dense)
@ -390,7 +447,9 @@ namespace SHADE
}
void SHCameraSystem::SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept
{
SHVec3 pos;
DecomposeViewMatrix(viewMatrix, camera.pitch, camera.yaw, camera.roll, camera.position);
camera.dirtyView = true;
}

View File

@ -26,7 +26,7 @@ namespace SHADE
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
{
public:
CameraSystemUpdate() : SHSystemRoutine("Camera System Update", true) {};
CameraSystemUpdate() : SHSystemRoutine("Camera System Update", false) {};
virtual void Execute(double dt)noexcept override final;
};
friend class CameraSystemUpdate;

View File

@ -197,12 +197,18 @@ namespace SHADE
if (BUILD_SUCCESS)
{
// 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)
{
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 << ")!";
@ -591,6 +597,19 @@ namespace SHADE
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)
{
STARTUPINFOW startInfo;

View File

@ -319,6 +319,7 @@ namespace SHADE
/// <param name="filePath">File path to the file to check.</param>
/// <returns> True if the file exists </returns>
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 std::wstring generateBuildCommand(bool debug);
};

View File

@ -49,6 +49,16 @@ namespace SHADE
GetNativeComponent()->lookAtCameraOrigin = val;
}
bool CameraArm::EnableCameraCollision::get()
{
return GetNativeComponent()->enableCameraCollision;
}
void CameraArm::EnableCameraCollision::set(bool val)
{
GetNativeComponent()->enableCameraCollision = val;
}
Vector3 CameraArm::TargetOffset::get()
{
return Convert::ToCLI(GetNativeComponent()->GetTargetOffset());

View File

@ -36,6 +36,12 @@ namespace SHADE
void set(bool val);
}
property bool EnableCameraCollision
{
bool get();
void set(bool val);
}
property Vector3 TargetOffset
{
Vector3 get();

View File

@ -22,6 +22,14 @@ of DigiPen Institute of Technology is prohibited.
namespace SHADE
{
/*---------------------------------------------------------------------------------*/
/* Properties */
/*---------------------------------------------------------------------------------*/
GameObject BaseComponent::Owner::get()
{
return owner;
}
/*---------------------------------------------------------------------------------*/
/* Component Access Functions */
/*---------------------------------------------------------------------------------*/

View File

@ -36,7 +36,7 @@ namespace SHADE
/// </summary>
property GameObject Owner
{
GameObject get() { return owner; }
GameObject get();
}
/*-----------------------------------------------------------------------------*/
@ -166,6 +166,19 @@ namespace SHADE
template<typename NativeType>
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:
/*-----------------------------------------------------------------------------*/
/* Type Definitions */

View File

@ -200,7 +200,16 @@ namespace SHADE
{
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);
registerUndoListAddAction(listType, iList, iList->Count - 1, obj);
}

View File

@ -74,7 +74,7 @@ namespace SHADE
// Add the script in
script->Initialize(GameObject(entity));
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
script->Awake();
@ -423,6 +423,8 @@ namespace SHADE
/*---------------------------------------------------------------------------------*/
void ScriptStore::Init()
{
isDeserialising = false;
// Create an enumerable list of script types
refreshScriptTypeList();
// Get stored methods for interop variants of functions
@ -724,6 +726,10 @@ namespace SHADE
bool ScriptStore::DeserialiseScripts(Entity entity, System::IntPtr yamlNodePtr)
{
SAFE_NATIVE_CALL_BEGIN
// Flag that deserialization processs is ongoing
isDeserialising = true;
// Convert to pointer
YAML::Node* yamlNode = reinterpret_cast<YAML::Node*>(yamlNodePtr.ToPointer());
@ -765,9 +771,16 @@ namespace SHADE
Debug::LogWarning("[ScriptStore] Script with unloaded type detected, skipping.");
}
}
// Unset flag for deserialization process
isDeserialising = false;
return true;
SAFE_NATIVE_CALL_END_N("SHADE_Managed.ScriptStore")
// Unset flag for deserialization process
isDeserialising = false;
return false;
}

View File

@ -337,6 +337,7 @@ namespace SHADE
static ScriptSet disposalQueue;
static System::Collections::Generic::IEnumerable<System::Type^>^ scriptTypeList;
static System::Reflection::MethodInfo^ addScriptMethod;
static bool isDeserialising;
/*-----------------------------------------------------------------------------*/
/* Helper Functions */

View File

@ -279,7 +279,15 @@ namespace SHADE
for (int i = 0; i < LIST_SIZE; ++i)
{
// 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
if (varAssignYaml(obj, node[i]))

View File

@ -167,6 +167,10 @@ namespace SHADE
{
valueObj = 0;
}
else
{
return false;
}
}
else
{
@ -181,6 +185,10 @@ namespace SHADE
valueObj = FieldType();
}
}
else
{
return false;
}
}
}