Separated asset data class
Parsing of animation clips, frames, channels
This commit is contained in:
parent
66baaf374d
commit
03c17ca5d4
|
@ -46,26 +46,26 @@ namespace SH_COMP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshCompiler::ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept
|
//void MeshCompiler::ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept
|
||||||
{
|
//{
|
||||||
if (scene.HasAnimations())
|
// if (scene.HasAnimations())
|
||||||
{
|
// {
|
||||||
std::vector<AnimationAsset> anims(scene.mNumAnimations);
|
// std::vector<AnimationAsset> anims(scene.mNumAnimations);
|
||||||
for (auto i{ 0 }; i < scene.mNumAnimations; ++i)
|
// for (auto i{ 0 }; i < scene.mNumAnimations; ++i)
|
||||||
{
|
// {
|
||||||
auto const& anim{ *scene.mAnimations[i] };
|
// auto const& anim{ *scene.mAnimations[i] };
|
||||||
|
|
||||||
anims[i].name = anim.mName.C_Str();
|
// anims[i].name = anim.mName.C_Str();
|
||||||
|
|
||||||
anims[i].duration = anim.mDuration;
|
// anims[i].duration = anim.mDuration;
|
||||||
anims[i].ticksPerSecond = anim.mTicksPerSecond;
|
// anims[i].ticksPerSecond = anim.mTicksPerSecond;
|
||||||
|
|
||||||
std::copy_n(anim.mChannels, anim.mNumChannels, anims[i].nodeChannels.data());
|
// std::copy_n(anim.mChannels, anim.mNumChannels, anims[i].nodeChannels.data());
|
||||||
std::copy_n(anim.mMeshChannels, anim.mNumMeshChannels, anims[i].meshChannels.data());
|
// std::copy_n(anim.mMeshChannels, anim.mNumMeshChannels, anims[i].meshChannels.data());
|
||||||
std::copy_n(anim.mMorphMeshChannels, anim.mNumMorphMeshChannels, anims[i].morphMeshChannels.data());
|
// std::copy_n(anim.mMorphMeshChannels, anim.mNumMorphMeshChannels, anims[i].morphMeshChannels.data());
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
void MeshCompiler::GetMesh(aiMesh const& mesh, MeshData& meshData) noexcept
|
void MeshCompiler::GetMesh(aiMesh const& mesh, MeshData& meshData) noexcept
|
||||||
{
|
{
|
||||||
|
@ -226,7 +226,9 @@ namespace SH_COMP
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//ExtractAnimations(*scene, anims);
|
std::vector<AnimationAsset> anims;
|
||||||
|
|
||||||
|
ParseAnimations(*scene, anims);
|
||||||
|
|
||||||
ProcessNode(*scene->mRootNode, *scene, asset.meshes, asset.rig.root);
|
ProcessNode(*scene->mRootNode, *scene, asset.meshes, asset.rig.root);
|
||||||
|
|
||||||
|
@ -285,6 +287,71 @@ namespace SH_COMP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MeshCompiler::ParseAnimations(aiScene const& scene, std::vector<AnimationAsset>& anims) noexcept
|
||||||
|
{
|
||||||
|
// Size and read for number of animation clips
|
||||||
|
anims.resize(scene.mNumAnimations);
|
||||||
|
for (auto i {0}; i < scene.mNumAnimations; ++i)
|
||||||
|
{
|
||||||
|
auto const& animData = *scene.mAnimations[i];
|
||||||
|
auto& anim = anims[i];
|
||||||
|
|
||||||
|
anim.name = animData.mName.C_Str();
|
||||||
|
anim.duration = animData.mDuration;
|
||||||
|
anim.ticksPerSecond = animData.mTicksPerSecond;
|
||||||
|
|
||||||
|
// Size and read for number of animation frames
|
||||||
|
anim.nodeChannels.resize(animData.mNumChannels);
|
||||||
|
for (auto j {0}; j < animData.mNumChannels; ++j)
|
||||||
|
{
|
||||||
|
auto const& channelData = *animData.mChannels[j];
|
||||||
|
auto& node = anim.nodeChannels[j];
|
||||||
|
|
||||||
|
node.name = channelData.mNodeName.C_Str();
|
||||||
|
|
||||||
|
// Position Keys
|
||||||
|
node.positionKeys.resize(channelData.mNumPositionKeys);
|
||||||
|
for (auto k{0}; k < channelData.mNumPositionKeys; ++k)
|
||||||
|
{
|
||||||
|
auto const& posKeyData = channelData.mPositionKeys[k];
|
||||||
|
auto& posKey = node.positionKeys[k];
|
||||||
|
|
||||||
|
posKey.time = posKeyData.mTime;
|
||||||
|
posKey.value.x = posKeyData.mValue.x;
|
||||||
|
posKey.value.y = posKeyData.mValue.y;
|
||||||
|
posKey.value.z = posKeyData.mValue.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotation Keys
|
||||||
|
node.rotationKeys.resize(channelData.mNumRotationKeys);
|
||||||
|
for (auto k{0}; k < channelData.mNumRotationKeys; ++k)
|
||||||
|
{
|
||||||
|
auto const& posKeyData = channelData.mRotationKeys[k];
|
||||||
|
auto& posKey = node.rotationKeys[k];
|
||||||
|
|
||||||
|
posKey.time = posKeyData.mTime;
|
||||||
|
posKey.value.x = posKeyData.mValue.x;
|
||||||
|
posKey.value.y = posKeyData.mValue.y;
|
||||||
|
posKey.value.z = posKeyData.mValue.z;
|
||||||
|
posKey.value.w = posKeyData.mValue.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale Keys
|
||||||
|
node.scaleKeys.resize(channelData.mNumScalingKeys);
|
||||||
|
for (auto k{0}; k < channelData.mNumScalingKeys; ++k)
|
||||||
|
{
|
||||||
|
auto const& posKeyData = channelData.mScalingKeys[k];
|
||||||
|
auto& posKey = node.scaleKeys[k];
|
||||||
|
|
||||||
|
posKey.time = posKeyData.mTime;
|
||||||
|
posKey.value.x = posKeyData.mValue.x;
|
||||||
|
posKey.value.y = posKeyData.mValue.y;
|
||||||
|
posKey.value.z = posKeyData.mValue.z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MeshCompiler::LoadAndCompile(AssetPath path) noexcept
|
void MeshCompiler::LoadAndCompile(AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
auto const asset = new ModelAsset();
|
auto const asset = new ModelAsset();
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "Types/AnimationAsset.h"
|
#include "Types/AnimationAsset.h"
|
||||||
#include "Types/MeshAsset.h"
|
#include "Types/ModelAsset.h"
|
||||||
#include "AssetMacros.h"
|
#include "AssetMacros.h"
|
||||||
|
|
||||||
namespace SH_COMP
|
namespace SH_COMP
|
||||||
|
@ -31,7 +31,7 @@ namespace SH_COMP
|
||||||
static Assimp::Importer aiImporter;
|
static Assimp::Importer aiImporter;
|
||||||
|
|
||||||
static void ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes, RigNode*& root) noexcept;
|
static void ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes, RigNode*& root) noexcept;
|
||||||
static void ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept;
|
//static void ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept;
|
||||||
static void GetMesh(aiMesh const& mesh, MeshData& meshData) noexcept;
|
static void GetMesh(aiMesh const& mesh, MeshData& meshData) noexcept;
|
||||||
static void BuildHeaders(ModelAsset& asset) noexcept;
|
static void BuildHeaders(ModelAsset& asset) noexcept;
|
||||||
|
|
||||||
|
@ -43,6 +43,8 @@ namespace SH_COMP
|
||||||
|
|
||||||
static void BuildArmature(aiNode const& node, RigNode*& root) noexcept;
|
static void BuildArmature(aiNode const& node, RigNode*& root) noexcept;
|
||||||
static void CopyNode(aiNode const& source, RigNode* parent) noexcept;
|
static void CopyNode(aiNode const& source, RigNode* parent) noexcept;
|
||||||
|
|
||||||
|
static void ParseAnimations(aiScene const& scene, std::vector<AnimationAsset>& anims) noexcept;
|
||||||
public:
|
public:
|
||||||
static void LoadAndCompile(AssetPath path) noexcept;
|
static void LoadAndCompile(AssetPath path) noexcept;
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace SH_COMP
|
||||||
|
{
|
||||||
|
|
||||||
|
struct SHVec2
|
||||||
|
{
|
||||||
|
float x, y;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SHVec3
|
||||||
|
{
|
||||||
|
float x, y, z;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SHVec4
|
||||||
|
{
|
||||||
|
float x, y, z, w;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SHMat4
|
||||||
|
{
|
||||||
|
float data[16];
|
||||||
|
};
|
||||||
|
}
|
|
@ -10,18 +10,32 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "PseudoMath.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <assimp/anim.h>
|
#include <assimp/anim.h>
|
||||||
|
|
||||||
namespace SH_COMP
|
namespace SH_COMP
|
||||||
{
|
{
|
||||||
|
struct AnimationKey
|
||||||
|
{
|
||||||
|
float time;
|
||||||
|
SHVec4 value;
|
||||||
|
};
|
||||||
|
struct AnimationNode
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
std::vector<AnimationKey> positionKeys;
|
||||||
|
std::vector<AnimationKey> rotationKeys;
|
||||||
|
std::vector<AnimationKey> scaleKeys;
|
||||||
|
};
|
||||||
|
|
||||||
struct AnimationAsset
|
struct AnimationAsset
|
||||||
{
|
{
|
||||||
std::string name;
|
std::string name;
|
||||||
|
|
||||||
std::vector<aiNodeAnim*> nodeChannels;
|
std::vector<AnimationNode> nodeChannels;
|
||||||
std::vector<aiMeshAnim*> meshChannels;
|
//std::vector<aiMeshAnim*> meshChannels;
|
||||||
std::vector<aiMeshMorphAnim*> morphMeshChannels;
|
//std::vector<aiMeshMorphAnim*> morphMeshChannels;
|
||||||
|
|
||||||
double duration;
|
double duration;
|
||||||
double ticksPerSecond;
|
double ticksPerSecond;
|
||||||
|
|
|
@ -1,38 +1,12 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHMeshAsset.h
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Struct to contain ready data for loading into GPU. Also used for
|
|
||||||
* compilation into binary files
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 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
|
#pragma once
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "PseudoMath.h"
|
||||||
|
|
||||||
namespace SH_COMP
|
namespace SH_COMP
|
||||||
{
|
{
|
||||||
|
|
||||||
struct SHVec2
|
|
||||||
{
|
|
||||||
float x, y;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SHVec3
|
|
||||||
{
|
|
||||||
float x, y, z;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SHMat4
|
|
||||||
{
|
|
||||||
float data[16];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MeshDataHeader
|
struct MeshDataHeader
|
||||||
{
|
{
|
||||||
uint32_t vertexCount;
|
uint32_t vertexCount;
|
||||||
|
@ -71,29 +45,4 @@ namespace SH_COMP
|
||||||
std::vector<MeshBoneInfo> bonesInfo;
|
std::vector<MeshBoneInfo> bonesInfo;
|
||||||
std::vector<MeshBone> bones;
|
std::vector<MeshBone> bones;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RigNode
|
|
||||||
{
|
|
||||||
std::string name;
|
|
||||||
uint32_t id;
|
|
||||||
SHMat4 transform;
|
|
||||||
std::vector<RigNode*> children;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RigData
|
|
||||||
{
|
|
||||||
RigNode* root;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ModelAssetHeader
|
|
||||||
{
|
|
||||||
size_t meshCount;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ModelAsset
|
|
||||||
{
|
|
||||||
ModelAssetHeader header;
|
|
||||||
std::vector<MeshDataHeader> headers;
|
|
||||||
std::vector<MeshData> meshes;
|
|
||||||
};
|
|
||||||
}
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHMeshAsset.h
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 30 September 2022
|
||||||
|
* \brief Struct to contain ready data for loading into GPU. Also used for
|
||||||
|
* compilation into binary files
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "MeshAsset.h"
|
||||||
|
|
||||||
|
namespace SH_COMP
|
||||||
|
{
|
||||||
|
struct RigNode
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
uint32_t id;
|
||||||
|
SHMat4 transform;
|
||||||
|
std::vector<RigNode*> children;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RigData
|
||||||
|
{
|
||||||
|
RigNode* root;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ModelAssetHeader
|
||||||
|
{
|
||||||
|
size_t meshCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ModelAsset
|
||||||
|
{
|
||||||
|
ModelAssetHeader header;
|
||||||
|
RigData rig;
|
||||||
|
std::vector<MeshDataHeader> headers;
|
||||||
|
std::vector<MeshData> meshes;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
#pragma once
|
Loading…
Reference in New Issue