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
6 changed files with 160 additions and 1 deletions
Showing only changes of commit e285d5e6b2 - Show all commits

View File

@ -192,6 +192,20 @@ namespace SHADE
parameters.erase(name);
}
void SHAnimationController::SetTrigger(InstanceData& instData, const std::string& paramName)
{
// Invalid param
if (!parameters.contains(paramName))
return;
// Not a trigger
if (parameters[paramName] != AnimParam::Type::Trigger)
return;
// Set the flag
instData.Params[paramName].Value = true;
}
/*-----------------------------------------------------------------------------------*/
/* Helper Functions */
/*-----------------------------------------------------------------------------------*/

View File

@ -14,6 +14,7 @@ of DigiPen Institute of Technology is prohibited.
// STL Includes
#include <variant>
#include <vector>
#include <optional>
// Project Includes
#include "SH_API.h"
#include "Resource/SHHandle.h"
@ -191,7 +192,37 @@ namespace SHADE
/// </summary>
/// <param name="name">Name of the parameter.</param>
void RemoveParameter(const std::string& name);
void SetStartingNode(Handle<Node> node);
/// <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.
/// </summary>
/// <typeparam name="T">
/// Type of parameter. Only bool, int, floats are supported.
/// </typeparam>
/// <param name="instData">Data of the instance to update.</param>
/// <param name="paramName">Name of the parameter.</param>
/// <param name="value">Value to set the parameter to.</param>
template<typename T>
void SetParameter(InstanceData& instData, const std::string& paramName, T value);
/// <summary>
/// Gets the parameter of the for the string. Types are checked and will not return
/// a value if there is nothing.
/// </summary>
/// <typeparam name="T">
/// Type of parameter. Only bool, int, floats are supported.
/// </typeparam>
/// <param name="instData">Data of the instance to update.</param>
/// <param name="paramName">Name of the parameter.</param>
/// <returns>The value of the parameter or nothing if invalid.</returns>
template<typename T>
std::optional<T> GetParameter(InstanceData& instData, const std::string& paramName);
/// <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="instData">Data of the instance to update.</param>
/// <param name="paramName">Name of the parameter.</param>
void SetTrigger(InstanceData& instData, const std::string& paramName);
/*---------------------------------------------------------------------------------*/
/* Getters */

View File

@ -66,4 +66,55 @@ namespace SHADE
// Neither of the existing cases
return false;
}
template<typename T>
void SHAnimationController::SetParameter(InstanceData& instData, const std::string& paramName, T value)
{
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
if (!parameters.contains(paramName))
return;
// Set the value
instData.Params[paramName].Value = value;
}
template<typename T>
std::optional<T> SHAnimationController::GetParameter(InstanceData& instData, const std::string& paramName)
{
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
if (!parameters.contains(paramName))
return {};
// Check if the type matches
const auto TYPE = parameters[paramName];
if constexpr (std::is_same_v<T, bool>)
{
if (TYPE != AnimParam::Type::Bool && TYPE != AnimParam::Type::Trigger)
return {};
}
else if constexpr (std::is_same_v<T, float>)
{
if (parameters[paramName] != AnimParam::Type::Float)
return {};
}
else if constexpr (std::is_same_v<T, int>)
{
if (parameters[paramName] != AnimParam::Type::Int)
return {};
}
// Return the correct value
if (instData.Params.contains(paramName))
{
return instData.Params[paramName];
}
else
{
return T(); // Default constructed value
}
}
}

View File

@ -199,6 +199,14 @@ namespace SHADE
}
}
void SHAnimatorComponent::SetTrigger(const std::string& paramName)
{
if (!animController)
return;
return animController->SetTrigger(animInstanceData, paramName);
}
/*-----------------------------------------------------------------------------------*/
/* Helper Functions - Loading */
/*-----------------------------------------------------------------------------------*/

View File

@ -95,7 +95,42 @@ namespace SHADE
/// </summary>
/// <param name="newRig">Rig to use.</param>
void SetRig(Handle<SHRig> newRig);
/// <summary>
/// Sets the animation controller to use for this animator.
/// </summary>
/// <param name="newRig">Animation controller to use.</param>
void SetAnimationController(Handle<SHAnimationController> ac);
/// <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>
template<typename T>
void SetParameter(const std::string& paramName, T value);
/// <summary>
/// Gets the parameter of the for the string. Types are checked and will not return
/// a value if there is nothing. Returns nothing if there is no animation controller
/// specified either.
/// </summary>
/// <typeparam name="T">
/// Type of parameter. Only bool, int, floats are supported.
/// </typeparam>
/// <param name="paramName">Name of the parameter.</param>
/// <returns>The value of the parameter or nothing if invalid.</returns>
template<typename T>
std::optional<T> GetParameter(const std::string& paramName);
/// <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="instData">Data of the instance to .</param>
/// <param name="paramName">Name of the parameter.</param>
void SetTrigger(const std::string& paramName);
/*---------------------------------------------------------------------------------*/
/* Getter Functions */

View File

@ -22,6 +22,26 @@ of DigiPen Institute of Technology is prohibited.
namespace SHADE
{
/*-----------------------------------------------------------------------------------*/
/* Setter Functions */
/*-----------------------------------------------------------------------------------*/
template<typename T>
std::optional<T> SHAnimatorComponent::GetParameter(const std::string& paramName)
{
if (!animController)
return;
return animController->GetParameter(paramName);
}
template<typename T>
void SHAnimatorComponent::SetParameter(const std::string& paramName, T value)
{
if (!animController)
return;
return animController->SetParameter(paramName, value);
}
/*-----------------------------------------------------------------------------------*/
/* Helper Functions */
/*-----------------------------------------------------------------------------------*/