Implemented Animation Clip asset and animation controller #410

Merged
XiaoQiDigipen merged 66 commits from SP3-22-AnimationController into main 2023-03-09 16:19:40 +08:00
20 changed files with 883 additions and 21 deletions
Showing only changes of commit 1c12a05837 - Show all commits

View File

@ -14,7 +14,6 @@ of DigiPen Institute of Technology is prohibited.
// Project Includes // Project Includes
#include "SH_API.h" #include "SH_API.h"
#include "Math/SHMatrix.h" #include "Math/SHMatrix.h"
#include "Assets/Asset Types/Models/SHAnimationAsset.h"
#include "Resource/SHHandle.h" #include "Resource/SHHandle.h"
namespace SHADE namespace SHADE

View File

@ -14,6 +14,7 @@ of DigiPen Institute of Technology is prohibited.
#include "SHAnimationController.h" #include "SHAnimationController.h"
#include "SHAnimationSystem.h" #include "SHAnimationSystem.h"
#include "ECS_Base/Managers/SHSystemManager.h" #include "ECS_Base/Managers/SHSystemManager.h"
#include "SHAnimationClip.h"
namespace SHADE namespace SHADE
{ {

View File

@ -18,13 +18,17 @@ of DigiPen Institute of Technology is prohibited.
// Project Includes // Project Includes
#include "SH_API.h" #include "SH_API.h"
#include "Resource/SHHandle.h" #include "Resource/SHHandle.h"
#include "SHAnimationClip.h"
namespace SHADE namespace SHADE
{ {
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/* Forward Declarations */ /* Forward Declarations */
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
class SHAnimationClip;
/*-----------------------------------------------------------------------------------*/
/* Type Definitions */
/*-----------------------------------------------------------------------------------*/
/// <summary> /// <summary>
/// Object that controls the animation that is played by an animator through the use /// Object that controls the animation that is played by an animator through the use
/// of an internal state machine. /// of an internal state machine.
@ -36,7 +40,7 @@ namespace SHADE
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
/* Forward Declarations */ /* Forward Declarations */
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
class Node; struct Node;
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
/* Type Definition */ /* Type Definition */
@ -45,7 +49,7 @@ namespace SHADE
/// Describes a parameter for the AnimationController that can be used to control /// Describes a parameter for the AnimationController that can be used to control
/// the flow of animations. /// the flow of animations.
/// </summary> /// </summary>
struct AnimParam struct SH_API AnimParam
{ {
/*-------------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------------*/
/* Type Definition */ /* Type Definition */

View File

@ -73,7 +73,7 @@ namespace SHADE
static_assert(std::is_same_v<T, bool> || std::is_same_v<T, float> || std::is_same_v<T, int>, "Only works with bool, float or ints."); static_assert(std::is_same_v<T, bool> || std::is_same_v<T, float> || std::is_same_v<T, int>, "Only works with bool, float or ints.");
// Invalid param // Invalid param
if (!parameters.contains(paramName)) if (parameters.find(paramName) == parameters.end())
return; return;
// Set the value // Set the value
@ -86,7 +86,7 @@ namespace SHADE
static_assert(std::is_same_v<T, bool> || std::is_same_v<T, float> || std::is_same_v<T, int>, "Only works with bool, float or ints."); static_assert(std::is_same_v<T, bool> || std::is_same_v<T, float> || std::is_same_v<T, int>, "Only works with bool, float or ints.");
// Invalid param // Invalid param
if (!parameters.contains(paramName)) if (parameters.find(paramName) == parameters.end())
return {}; return {};
// Check if the type matches // Check if the type matches
@ -108,9 +108,10 @@ namespace SHADE
} }
// Return the correct value // Return the correct value
if (instData.Params.contains(paramName)) auto paramIter = instData.Params.find(paramName);
if (paramIter != instData.Params.end())
{ {
return instData.Params[paramName]; return paramIter->second.Value;
} }
else else
{ {

View File

@ -85,6 +85,12 @@ namespace SHADE
void SHAnimatorComponent::PlayFromStart() void SHAnimatorComponent::PlayFromStart()
{ {
if (!currClip)
{
SHLOG_WARNING("[SHAnimatorComponent] Attempted to restart a clip but there is no existing clip. Ignored.");
return;
}
isPlaying = true; isPlaying = true;
currPlaybackTime = 0.0f; currPlaybackTime = 0.0f;
} }
@ -96,6 +102,12 @@ namespace SHADE
void SHAnimatorComponent::Stop() void SHAnimatorComponent::Stop()
{ {
if (!currClip)
{
SHLOG_WARNING("[SHAnimatorComponent] Attempted to stop a clip but there is no existing clip. Ignored.");
return;
}
isPlaying = false; isPlaying = false;
currPlaybackTime = 0.0f; currPlaybackTime = 0.0f;
} }

View File

@ -33,7 +33,6 @@ namespace SHADE
class SHRig; class SHRig;
struct SHRigNode; struct SHRigNode;
class SHAnimationClip; class SHAnimationClip;
class SHVkBuffer;
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/* Type Definitions */ /* Type Definitions */
@ -65,7 +64,8 @@ namespace SHADE
/// <param name="clip">Animation clip to play.</param> /// <param name="clip">Animation clip to play.</param>
void PlayOneShot(Handle<SHAnimationClip> clip); void PlayOneShot(Handle<SHAnimationClip> clip);
/// <summary> /// <summary>
/// Plays the currently loaded animation clip from the start. /// Plays the currently loaded animation clip from the start. Note that this only
/// works when using manual playback mode.
/// </summary> /// </summary>
void PlayFromStart(); void PlayFromStart();
/// <summary> /// <summary>
@ -73,7 +73,9 @@ namespace SHADE
/// </summary> /// </summary>
void Pause(); void Pause();
/// <summary> /// <summary>
/// Stops the animation and resets the play time back to 0. /// Stops the animation and resets the play time back to 0. Note that this only
/// works when using manual playback mode. This is not supported when using an
/// Animation Controller.
/// </summary> /// </summary>
void Stop(); void Stop();
@ -100,6 +102,10 @@ namespace SHADE
/// </summary> /// </summary>
/// <param name="newRig">Animation controller to use.</param> /// <param name="newRig">Animation controller to use.</param>
void SetAnimationController(Handle<SHAnimationController> ac); void SetAnimationController(Handle<SHAnimationController> ac);
/*---------------------------------------------------------------------------------*/
/* Parameter Functions */
/*---------------------------------------------------------------------------------*/
/// <summary> /// <summary>
/// Sets the parameter of the for the string. Does nothing if an invalid param name /// Sets the parameter of the for the string. Does nothing if an invalid param name
/// is provided. Type of the parameter is not checked. Also does nothing if no /// is provided. Type of the parameter is not checked. Also does nothing if no
@ -128,7 +134,6 @@ namespace SHADE
/// Sets the flag for a trigger parameter. Does nothing if an invalid param name is /// Sets the flag for a trigger parameter. Does nothing if an invalid param name is
/// provided or if the param name refers to a parameter that is not a trigger. /// provided or if the param name refers to a parameter that is not a trigger.
/// </summary> /// </summary>
/// <param name="instData">Data of the instance to .</param>
/// <param name="paramName">Name of the parameter.</param> /// <param name="paramName">Name of the parameter.</param>
void SetTrigger(const std::string& paramName); void SetTrigger(const std::string& paramName);
@ -156,6 +161,10 @@ namespace SHADE
/// </summary> /// </summary>
/// <returns>Handle to the current Animation Controller node.</returns> /// <returns>Handle to the current Animation Controller node.</returns>
Handle<SHAnimationController::Node> GetCurrentNode() const noexcept { return animInstanceData.CurrentNode; } Handle<SHAnimationController::Node> GetCurrentNode() const noexcept { return animInstanceData.CurrentNode; }
/// <summary>
/// Retrieves the currently set animation controller.
/// </summary>
/// <returnsHandle to the currently set animtion controller.</returns>
Handle<SHAnimationController> GetAnimationController() const noexcept { return animController; } Handle<SHAnimationController> GetAnimationController() const noexcept { return animController; }
private: private:

View File

@ -16,9 +16,7 @@ of DigiPen Institute of Technology is prohibited.
#include "SHRig.h" #include "SHRig.h"
#include "Math/SHMatrix.h" #include "Math/SHMatrix.h"
#include "SHRawAnimation.h" #include "SHRawAnimation.h"
#include "Graphics/SHVkUtil.h" #include "SHAnimationController.h"
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h"
#include "ECS_Base/Managers/SHSystemManager.h"
namespace SHADE namespace SHADE
{ {
@ -29,9 +27,9 @@ namespace SHADE
std::optional<T> SHAnimatorComponent::GetParameter(const std::string& paramName) std::optional<T> SHAnimatorComponent::GetParameter(const std::string& paramName)
{ {
if (!animController) if (!animController)
return; return {};
return animController->GetParameter(paramName); return animController->GetParameter<T>(animInstanceData, paramName);
} }
template<typename T> template<typename T>
void SHAnimatorComponent::SetParameter(const std::string& paramName, T value) void SHAnimatorComponent::SetParameter(const std::string& paramName, T value)
@ -39,7 +37,7 @@ namespace SHADE
if (!animController) if (!animController)
return; return;
return animController->SetParameter(paramName, value); return animController->SetParameter(animInstanceData, paramName, value);
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/

View File

@ -10,8 +10,10 @@
*****************************************************************************/ *****************************************************************************/
#pragma once #pragma once
#include "Math/SHMath.h"
#include "Assets/Asset Types/SHAssetData.h" #include "Assets/Asset Types/SHAssetData.h"
#include "Math/Vector/SHVec3.h"
#include "Math/Vector/SHVec4.h"
#include "Math/SHQuaternion.h"
#include <vector> #include <vector>

View File

@ -78,7 +78,6 @@ namespace SHADE
// Generate new asset // Generate new asset
const AssetID NEW_ASSET_ID = SHAssetManager::CreateNewAsset(AssetType::ANIM_CLIP, newAssetName); const AssetID NEW_ASSET_ID = SHAssetManager::CreateNewAsset(AssetType::ANIM_CLIP, newAssetName);
auto animClip = SHAssetManager::GetData<SHAnimClipAsset>(NEW_ASSET_ID); auto animClip = SHAssetManager::GetData<SHAnimClipAsset>(NEW_ASSET_ID);
animClip->animRawDataAssetId = SHResourceManager::GetAssetID<SHRawAnimation>(rawAnimation).value_or(INVALID_ASSET_ID);
animClip->firstIndex = firstIndex; animClip->firstIndex = firstIndex;
animClip->lastIndex = lastIndex; animClip->lastIndex = lastIndex;
SHAssetManager::SaveAsset(NEW_ASSET_ID); SHAssetManager::SaveAsset(NEW_ASSET_ID);

View File

@ -370,7 +370,7 @@ namespace SHADE
loadedAssetData.emplace_back(assetId); loadedAssetData.emplace_back(assetId);
return resourceHub.Create<ResourceType> return resourceHub.Create<ResourceType>
( (
LoadOrGet<SHRawAnimation>(assetData.animRawDataAssetId), LoadOrGet<SHRawAnimation>(assetId), // TODO: Wrong, we need to grab the parent asset's ID
assetData.firstIndex, assetData.firstIndex,
assetData.lastIndex assetData.lastIndex
); );

View File

@ -44,6 +44,21 @@ namespace SHADE
return SHResourceManager::LoadOrGet<SHFont>(assetId); return SHResourceManager::LoadOrGet<SHFont>(assetId);
} }
Handle<SHAnimationClip> SHResourceManagerInterface::LoadOrGetAnimationClip(AssetID assetId)
{
return SHResourceManager::LoadOrGet<SHAnimationClip>(assetId);
}
Handle<SHAnimationController> SHResourceManagerInterface::LoadOrGetAnimationController(AssetID assetId)
{
return SHResourceManager::LoadOrGet<SHAnimationController>(assetId);
}
Handle<SHRig> SHResourceManagerInterface::LoadOrGetRig(AssetID assetId)
{
return SHResourceManager::LoadOrGet<SHRig>(assetId);
}
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/* Query Functions */ /* Query Functions */
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/

View File

@ -29,6 +29,9 @@ namespace SHADE
struct SHMaterialSpec; struct SHMaterialSpec;
class SHMaterial; class SHMaterial;
class SHFont; class SHFont;
class SHAnimationClip;
class SHRig;
class SHAnimationController;
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
/* Type Definitions */ /* Type Definitions */
@ -80,6 +83,24 @@ namespace SHADE
/// <param name="assetId">Asset ID of the resource to load.</param> /// <param name="assetId">Asset ID of the resource to load.</param>
/// <returns>Handle to the resource to retrieve.</returns> /// <returns>Handle to the resource to retrieve.</returns>
static Handle<SHFont> LoadOrGetFont(AssetID assetId); static Handle<SHFont> LoadOrGetFont(AssetID assetId);
/// <summary>
/// Wrapper for SHResourceManager::LoadOrGet<SHAnimationClip>().
/// </summary>
/// <param name="assetId">Asset ID of the resource to load.</param>
/// <returns>Handle to the resource to retrieve.</returns>
static Handle<SHAnimationClip> LoadOrGetAnimationClip(AssetID assetId);
/// <summary>
/// Wrapper for SHResourceManager::LoadOrGet<SHAnimationController>().
/// </summary>
/// <param name="assetId">Asset ID of the resource to load.</param>
/// <returns>Handle to the resource to retrieve.</returns>
static Handle<SHAnimationController> LoadOrGetAnimationController(AssetID assetId);
/// <summary>
/// Wrapper for SHResourceManager::LoadOrGet<SHRig>().
/// </summary>
/// <param name="assetId">Asset ID of the resource to load.</param>
/// <returns>Handle to the resource to retrieve.</returns>
static Handle<SHRig> LoadOrGetRig(AssetID assetId);
/*---------------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------------*/
/* Query Functions */ /* Query Functions */

View File

@ -0,0 +1,70 @@
/************************************************************************************//*!
\file AnimationClipAsset.cxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Mar 8, 2023
\brief Contains the implementation of the functions of the managed
AnimationClip class.
Note: This file is written in C++17/CLI.
Copyright (C) 2023 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
// Precompiled Headers
#include "SHpch.h"
// Primary Header
#include "AnimationClipAsset.hxx"
// External Dependencies
#include "Resource/SHResourceManagerInterface.h"
// Project Headers
#include "Utility/Convert.hxx"
namespace SHADE
{
/*---------------------------------------------------------------------------------*/
/* Properties */
/*---------------------------------------------------------------------------------*/
Handle<SHAnimationClip> AnimationClipAsset::NativeObject::get()
try
{
return SHResourceManagerInterface::LoadOrGetAnimationClip(asset.NativeAssetID);
}
catch (const BadHandleCastException&)
{
return Handle<SHAnimationClip>();
}
AssetID AnimationClipAsset::NativeAssetID::get()
{
return asset.NativeAssetID;
}
/*---------------------------------------------------------------------------------*/
/* Constructors/Destructor */
/*---------------------------------------------------------------------------------*/
AnimationClipAsset::AnimationClipAsset(AssetID AnimationClipId)
: asset{ AnimationClipId }
{}
/*---------------------------------------------------------------------------------*/
/* Operator Overloads */
/*---------------------------------------------------------------------------------*/
AnimationClipAsset::operator bool(AnimationClipAsset asset)
{
return asset.asset;
}
/*---------------------------------------------------------------------------------*/
/* Conversion Operators */
/*---------------------------------------------------------------------------------*/
AnimationClipAsset::operator Asset(AnimationClipAsset nativeAsset)
{
return nativeAsset.asset;
}
AnimationClipAsset::operator AnimationClipAsset(Asset asset)
{
return AnimationClipAsset(asset.NativeAssetID);
}
}

View File

@ -0,0 +1,90 @@
/************************************************************************************//*!
\file AnimationClipAsset.hxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Mar 8, 2023
\brief Contains the definition of the managed AnimationClipAsset class.
Note: This file is written in C++17/CLI.
Copyright (C) 2023 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
#pragma once
// External Dependencies
#include "Resource/SHHandle.h"
#include "Animation/SHAnimationClip.h"
// Project Includes
#include "NativeAsset.hxx"
#include "Engine/GenericHandle.hxx"
namespace SHADE
{
/// <summary>
/// Managed counterpart of the native Animation Clip object that specifies a range of
/// animation frames that can be specified to an Animator component to play an
/// animation.
/// </summary>
public value struct AnimationClipAsset
{
internal:
/*-----------------------------------------------------------------------------*/
/* Properties */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Copy of the Handle to the native object.
/// </summary>
property Handle<SHAnimationClip> NativeObject
{
Handle<SHAnimationClip> get();
}
/// <summary>
/// The raw asset ID of the asset.
/// </summary>
property AssetID NativeAssetID
{
AssetID get();
}
/*-----------------------------------------------------------------------------*/
/* Constructors/Destructor */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Constructor for the AnimationClip.
/// </summary>
/// <param name="AnimationClipId">AssetID to the AnimationClip asset.</param>
AnimationClipAsset(AssetID AnimationClipId);
/*-----------------------------------------------------------------------------*/
/* Operator Overloads */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Implicit conversion operator to enable checking if a AnimationClip is valid.
/// </summary>
/// <param name="gameObj">Asset to check.</param>
/// <returns>True if the Asset is valid.</returns>
static operator bool(AnimationClipAsset asset);
/*-----------------------------------------------------------------------------*/
/* Conversion Operators */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Conversion operator to enable casting from a AnimationClip to an Asset.
/// </summary>
/// <param name="vec">Vector3 to convert from.</param>
static explicit operator Asset(AnimationClipAsset nativeAsset);
/// <summary>
/// Conversion operator to enable casting from a Asset to a AnimationClip.
/// </summary>
/// <param name="asset"></param>
static explicit operator AnimationClipAsset(Asset asset);
protected:
/*-----------------------------------------------------------------------------*/
/* Data Members */
/*-----------------------------------------------------------------------------*/
Asset asset;
};
}

View File

@ -0,0 +1,70 @@
/************************************************************************************//*!
\file AnimationController.cxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Mar 8, 2023
\brief Contains the implementation of the functions of the managed
AnimationController class.
Note: This file is written in C++17/CLI.
Copyright (C) 2023 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
// Precompiled Headers
#include "SHpch.h"
// Primary Header
#include "AnimationControllerAsset.hxx"
// External Dependencies
#include "Resource/SHResourceManagerInterface.h"
// Project Headers
#include "Utility/Convert.hxx"
namespace SHADE
{
/*---------------------------------------------------------------------------------*/
/* Properties */
/*---------------------------------------------------------------------------------*/
Handle<SHAnimationController> AnimationControllerAsset::NativeObject::get()
try
{
return SHResourceManagerInterface::LoadOrGetAnimationController(asset.NativeAssetID);
}
catch (const BadHandleCastException&)
{
return Handle<SHAnimationController>();
}
AssetID AnimationControllerAsset::NativeAssetID::get()
{
return asset.NativeAssetID;
}
/*---------------------------------------------------------------------------------*/
/* Constructors/Destructor */
/*---------------------------------------------------------------------------------*/
AnimationControllerAsset::AnimationControllerAsset(AssetID AnimationControllerId)
: asset{ AnimationControllerId }
{}
/*---------------------------------------------------------------------------------*/
/* Operator Overloads */
/*---------------------------------------------------------------------------------*/
AnimationControllerAsset::operator bool(AnimationControllerAsset asset)
{
return asset.asset;
}
/*---------------------------------------------------------------------------------*/
/* Conversion Operators */
/*---------------------------------------------------------------------------------*/
AnimationControllerAsset::operator Asset(AnimationControllerAsset nativeAsset)
{
return nativeAsset.asset;
}
AnimationControllerAsset::operator AnimationControllerAsset(Asset asset)
{
return AnimationControllerAsset(asset.NativeAssetID);
}
}

View File

@ -0,0 +1,89 @@
/************************************************************************************//*!
\file AnimationControllerAsset.hxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Mar 8, 2023
\brief Contains the definition of the managed AnimationController class.
Note: This file is written in C++17/CLI.
Copyright (C) 2022 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
#pragma once
// External Dependencies
#include "Resource/SHHandle.h"
#include "Animation/SHAnimationController.h"
// Project Includes
#include "NativeAsset.hxx"
#include "Engine/GenericHandle.hxx"
namespace SHADE
{
/// <summary>
/// Managed counterpart of the native AnimationController object containing the
/// state machine for controlling what AnimationClips that an Animator should play.
/// </summary>
public value struct AnimationControllerAsset
{
internal:
/*-----------------------------------------------------------------------------*/
/* Properties */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Copy of the Handle to the native object.
/// </summary>
property Handle<SHAnimationController> NativeObject
{
Handle<SHAnimationController> get();
}
/// <summary>
/// The raw asset ID of the asset.
/// </summary>
property AssetID NativeAssetID
{
AssetID get();
}
/*-----------------------------------------------------------------------------*/
/* Constructors/Destructor */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Constructor for the AnimationController.
/// </summary>
/// <param name="AnimationControllerId">AssetID to the AnimationController asset.</param>
AnimationControllerAsset(AssetID AnimationControllerId);
/*-----------------------------------------------------------------------------*/
/* Operator Overloads */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Implicit conversion operator to enable checking if a AnimationController is valid.
/// </summary>
/// <param name="gameObj">Asset to check.</param>
/// <returns>True if the Asset is valid.</returns>
static operator bool(AnimationControllerAsset asset);
/*-----------------------------------------------------------------------------*/
/* Conversion Operators */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Conversion operator to enable casting from a AnimationController to an Asset.
/// </summary>
/// <param name="vec">Vector3 to convert from.</param>
static explicit operator Asset(AnimationControllerAsset nativeAsset);
/// <summary>
/// Conversion operator to enable casting from a Asset to a AnimationController.
/// </summary>
/// <param name="asset"></param>
static explicit operator AnimationControllerAsset(Asset asset);
protected:
/*-----------------------------------------------------------------------------*/
/* Data Members */
/*-----------------------------------------------------------------------------*/
Asset asset;
};
}

View File

@ -0,0 +1,70 @@
/************************************************************************************//*!
\file AnimationRigAsset.cxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Mar 8, 2023
\brief Contains the implementation of the functions of the managed
AnimationRig class.
Note: This file is written in C++17/CLI.
Copyright (C) 2023 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
// Precompiled Headers
#include "SHpch.h"
// Primary Header
#include "AnimationRigAsset.hxx"
// External Dependencies
#include "Resource/SHResourceManagerInterface.h"
// Project Headers
#include "Utility/Convert.hxx"
namespace SHADE
{
/*---------------------------------------------------------------------------------*/
/* Properties */
/*---------------------------------------------------------------------------------*/
Handle<SHRig> AnimationRigAsset::NativeObject::get()
try
{
return SHResourceManagerInterface::LoadOrGetRig(asset.NativeAssetID);
}
catch (const BadHandleCastException&)
{
return Handle<SHRig>();
}
AssetID AnimationRigAsset::NativeAssetID::get()
{
return asset.NativeAssetID;
}
/*---------------------------------------------------------------------------------*/
/* Constructors/Destructor */
/*---------------------------------------------------------------------------------*/
AnimationRigAsset::AnimationRigAsset(AssetID AnimationRigId)
: asset{ AnimationRigId }
{}
/*---------------------------------------------------------------------------------*/
/* Operator Overloads */
/*---------------------------------------------------------------------------------*/
AnimationRigAsset::operator bool(AnimationRigAsset asset)
{
return asset.asset;
}
/*---------------------------------------------------------------------------------*/
/* Conversion Operators */
/*---------------------------------------------------------------------------------*/
AnimationRigAsset::operator Asset(AnimationRigAsset nativeAsset)
{
return nativeAsset.asset;
}
AnimationRigAsset::operator AnimationRigAsset(Asset asset)
{
return AnimationRigAsset(asset.NativeAssetID);
}
}

View File

@ -0,0 +1,89 @@
/************************************************************************************//*!
\file AnimationRigAsset.hxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Mar 8, 2023
\brief Contains the definition of the managed AnimationRigAsset class.
Note: This file is written in C++17/CLI.
Copyright (C) 2023 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
#pragma once
// External Dependencies
#include "Resource/SHHandle.h"
#include "Animation/SHRig.h"
// Project Includes
#include "NativeAsset.hxx"
#include "Engine/GenericHandle.hxx"
namespace SHADE
{
/// <summary>
/// Managed counterpart of the native Animation Rig object that specifies how an
/// Animation Clip affects the model that this Rig is attached to.
/// </summary>
public value struct AnimationRigAsset
{
internal:
/*-----------------------------------------------------------------------------*/
/* Properties */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Copy of the Handle to the native object.
/// </summary>
property Handle<SHRig> NativeObject
{
Handle<SHRig> get();
}
/// <summary>
/// The raw asset ID of the asset.
/// </summary>
property AssetID NativeAssetID
{
AssetID get();
}
/*-----------------------------------------------------------------------------*/
/* Constructors/Destructor */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Constructor for the AnimationRig.
/// </summary>
/// <param name="AnimationRigId">AssetID to the AnimationRig asset.</param>
AnimationRigAsset(AssetID AnimationRigId);
/*-----------------------------------------------------------------------------*/
/* Operator Overloads */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Implicit conversion operator to enable checking if a AnimationRig is valid.
/// </summary>
/// <param name="gameObj">Asset to check.</param>
/// <returns>True if the Asset is valid.</returns>
static operator bool(AnimationRigAsset asset);
/*-----------------------------------------------------------------------------*/
/* Conversion Operators */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Conversion operator to enable casting from a AnimationRig to an Asset.
/// </summary>
/// <param name="vec">Vector3 to convert from.</param>
static explicit operator Asset(AnimationRigAsset nativeAsset);
/// <summary>
/// Conversion operator to enable casting from a Asset to a AnimationRig.
/// </summary>
/// <param name="asset"></param>
static explicit operator AnimationRigAsset(Asset asset);
protected:
/*-----------------------------------------------------------------------------*/
/* Data Members */
/*-----------------------------------------------------------------------------*/
Asset asset;
};
}

View File

@ -0,0 +1,159 @@
/************************************************************************************//*!
\file Animator.cxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Mar 8, 2023
\brief Contains the definition of the functions of the managed Animator class.
Note: This file is written in C++17/CLI.
Copyright (C) 2023 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
// Precompiled Headers
#include "SHpch.h"
// Primary Header
#include "Animator.hxx"
#include "Assets/NativeAsset.hxx"
#include "Utility/Convert.hxx"
namespace SHADE
{
/*---------------------------------------------------------------------------------*/
/* Constructors */
/*---------------------------------------------------------------------------------*/
Animator::Animator(Entity entity)
: Component(entity)
{}
/*---------------------------------------------------------------------------------*/
/* Properties */
/*---------------------------------------------------------------------------------*/
AnimationControllerAsset Animator::AnimationController::get()
{
auto controller = GetNativeComponent()->GetAnimationController();
return controller ? AnimationControllerAsset(controller) : AnimationControllerAsset();
}
void Animator::AnimationController::set(AnimationControllerAsset value)
{
if (value)
{
GetNativeComponent()->SetAnimationController(Handle<SHAnimationController>());
}
else
{
GetNativeComponent()->SetAnimationController(value.NativeObject);
}
}
AnimationRigAsset Animator::Rig::get()
{
auto rig = GetNativeComponent()->GetRig();
return rig ? AnimationRigAsset(rig) : AnimationRigAsset();
}
void Animator::Rig::set(AnimationRigAsset value)
{
if (value)
{
GetNativeComponent()->SetRig(Handle<SHRig>());
}
else
{
GetNativeComponent()->SetRig(Handle<SHRig>(value.NativeObject));
}
}
System::String^ Animator::CurrentNodeName::get()
{
const auto CURR_NODE = GetNativeComponent()->GetCurrentNode();
if (CURR_NODE)
return Convert::ToCLI(CURR_NODE->Name);
return nullptr;
}
/*---------------------------------------------------------------------------------*/
/* Usage Functions */
/*---------------------------------------------------------------------------------*/
void Animator::Play()
{
GetNativeComponent()->Play();
}
void Animator::Play(AnimationClipAsset clip)
{
GetNativeComponent()->Play(clip.NativeObject);
}
void Animator::PlayOneShot(AnimationClipAsset clip)
{
GetNativeComponent()->PlayOneShot(clip.NativeObject);
}
void Animator::PlayFromStart()
{
GetNativeComponent()->Play();
}
void Animator::Pause()
{
GetNativeComponent()->Pause();
}
void Animator::Stop()
{
GetNativeComponent()->Stop();
}
/*---------------------------------------------------------------------------------*/
/* Parameter Functions */
/*---------------------------------------------------------------------------------*/
generic<typename T>
void Animator::SetParameter(System::String^ paramName, T value)
{
if (T::typeid == int::typeid)
{
GetNativeComponent()->SetParameter<int>(Convert::ToNative(paramName), static_cast<int>(value));
}
else if (T::typeid == float::typeid)
{
GetNativeComponent()->SetParameter<float>(Convert::ToNative(paramName), static_cast<float>(value));
}
else if (T::typeid == bool::typeid)
{
GetNativeComponent()->SetParameter<bool>(Convert::ToNative(paramName), static_cast<bool>(value));
}
}
void Animator::SetTrigger(System::String^ paramName)
{
GetNativeComponent()->SetTrigger(Convert::ToNative(paramName));
}
System::Nullable<int> Animator::GetIntParameter(System::String^ paramName)
{
auto val = GetNativeComponent()->GetParameter<int>(Convert::ToNative(paramName));
if (val.has_value())
return System::Nullable<int>(val.value());
return {};
}
System::Nullable<float> Animator::GetFloatParameter(System::String^ paramName)
{
auto val = GetNativeComponent()->GetParameter<float>(Convert::ToNative(paramName));
if (val.has_value())
return System::Nullable<float>(val.value());
return {};
}
System::Nullable<bool> Animator::GetBoolParameter(System::String^ paramName)
{
auto val = GetNativeComponent()->GetParameter<bool>(Convert::ToNative(paramName));
if (val.has_value())
return System::Nullable<bool>(val.value());
return {};
}
System::Nullable<bool> Animator::GetTriggerState(System::String^ paramName)
{
return GetBoolParameter(paramName);
}
}

View File

@ -0,0 +1,164 @@
/************************************************************************************//*!
\file Animator.hxx
\author Tng Kah Wei, kahwei.tng, 390009620
\par email: kahwei.tng\@digipen.edu
\date Mar 8, 2023
\brief Contains the definition of the managed Animator class with the
declaration of functions for working with it.
Note: This file is written in C++17/CLI.
Copyright (C) 2023 DigiPen Institute of Technology.
Reproduction or disclosure of this file or its contents without the prior written consent
of DigiPen Institute of Technology is prohibited.
*//*************************************************************************************/
#pragma once
// Project Includes
#include "Components/Component.hxx"
// External Dependencies
#include "Animation/SHAnimatorComponent.h"
// Project Includes
#include "Assets/AnimationClipAsset.hxx"
#include "Assets/AnimationControllerAsset.hxx"
#include "Assets/AnimationRigAsset.hxx"
namespace SHADE
{
/// <summary>
/// CLR version of the SHADE Engine's SHAnimatorComponent.
/// </summary>
public ref class Animator : public Component<SHAnimatorComponent>
{
internal:
/*-----------------------------------------------------------------------------*/
/* Constructors */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Constructs a Animator Component that represents a native Animator
/// component tied to the specified Entity.
/// </summary>
/// <param name="entity">Entity that this Component will be tied to.</param>
Animator(Entity entity);
public:
/*-----------------------------------------------------------------------------*/
/* Properties */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Animation Controller used to controller the animation of this Animator.
/// </summary>
property AnimationControllerAsset AnimationController
{
AnimationControllerAsset get();
void set(AnimationControllerAsset value);
}
/// <summary>
/// The shared Material used to render this Animator and other Animators
/// using the same base Material.
/// </summary>
property AnimationRigAsset Rig
{
AnimationRigAsset get();
void set(AnimationRigAsset value);
}
/// <summary>
/// Name of the current node if there is an animation controller attached. If
/// there is none, null is returned.
/// </summary>
property System::String^ CurrentNodeName
{
System::String^ get();
}
/*-----------------------------------------------------------------------------*/
/* Usage Functions */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Plays the currently loaded animation from the last time.
/// </summary>
void Play();
/// <summary>
/// Plays the specified animation clip from the start. This will unset any
/// SHAnimationControllers that have been set.
/// </summary>
/// <param name="clip">Animation clip to play.</param>
void Play(AnimationClipAsset clip);
/// <summary>
/// Plays the specified animation clip from the start one time only. This will unset
/// any SHAnimationControllers that have been set.
/// </summary>
/// <param name="clip">Animation clip to play.</param>
void PlayOneShot(AnimationClipAsset clip);
/// <summary>
/// Plays the currently loaded animation clip from the start. Note that this only
/// works when using manual playback mode.
/// </summary>
void PlayFromStart();
/// <summary>
/// Pauses the animation at the current time.
/// </summary>
void Pause();
/// <summary>
/// Stops the animation and resets the play time back to 0. Note that this only
/// works when using manual playback mode. This is not supported when using an
/// Animation Controller.
/// </summary>
void Stop();
/*-----------------------------------------------------------------------------*/
/* Parameter Functions */
/*-----------------------------------------------------------------------------*/
/// <summary>
/// Sets the parameter of the for the string. Does nothing if an invalid param name
/// is provided. Type of the parameter is not checked. Also does nothing if no
/// animation controller is specified.
/// </summary>
/// <typeparam name="T">
/// Type of parameter. Only bool, int, floats are supported.
/// </typeparam>
/// <param name="paramName">Name of the parameter.</param>
/// <param name="value">Value to set the parameter to.</param>
generic<typename T>
void SetParameter(System::String^ paramName, T value);
/// <summary>
/// Sets the flag for a trigger parameter. Does nothing if an invalid param name is
/// provided or if the param name refers to a parameter that is not a trigger.
/// </summary>
/// <param name="paramName">Name of the parameter.</param>
void SetTrigger(System::String^ paramName);
/// <summary>
/// Gets the parameter of the for the named parameter of type int. Types are
/// checked and will not return a value if there is nothing. Returns nothing if
/// there is no animation controller specified either.
/// </summary>
/// <param name="paramName">Name of the parameter.</param>
/// <returns>The value of the parameter or nothing if invalid.</returns>
System::Nullable<int> GetIntParameter(System::String^ paramName);
/// <summary>
/// Gets the parameter of the for the named parameter of type float. Types are
/// checked and will not return a value if there is nothing. Returns nothing if
/// there is no animation controller specified either.
/// </summary>
/// <param name="paramName">Name of the parameter.</param>
/// <returns>The value of the parameter or nothing if invalid.</returns>
System::Nullable<float> GetFloatParameter(System::String^ paramName);
/// <summary>
/// Gets the parameter of the for the named parameter of type bool. Types are
/// checked and will not return a value if there is nothing. Returns nothing if
/// there is no animation controller specified either.
/// </summary>
/// <param name="paramName">Name of the parameter.</param>
/// <returns>The value of the parameter or nothing if invalid.</returns>
System::Nullable<bool> GetBoolParameter(System::String^ paramName);
/// <summary>
/// Checks if the trigger flag for the named trigger parameter is set. Types are
/// checked and will not return a value if there is nothing. Returns nothing if
/// there is no animation controller specified either.
/// </summary>
/// <param name="paramName">Name of the parameter.</param>
/// <returns>True if the trigger is set.</returns>
System::Nullable<bool> GetTriggerState(System::String^ paramName);
};
}