Write animation data

This commit is contained in:
Xiao Qi 2022-11-16 18:38:16 +08:00
parent 7cc7c51fd9
commit 37a2edef14
3 changed files with 98 additions and 14 deletions

View File

@ -174,7 +174,7 @@ namespace SH_COMP
head.animNodeCount = anim.nodeChannels.size(); head.animNodeCount = anim.nodeChannels.size();
head.nodeHeaders.resize(head.animNodeCount); head.nodeHeaders.resize(head.animNodeCount);
for (auto j{0}; i < head.animNodeCount; ++j) for (auto j{0}; j < head.animNodeCount; ++j)
{ {
auto const& animNode = anim.nodeChannels[j]; auto const& animNode = anim.nodeChannels[j];
auto& nodeHeader = head.nodeHeaders[j]; auto& nodeHeader = head.nodeHeaders[j];
@ -233,18 +233,104 @@ namespace SH_COMP
void MeshCompiler::WriteAnimHeader(FileReference file, AnimDataHeader const& header) void MeshCompiler::WriteAnimHeader(FileReference file, AnimDataHeader const& header)
{ {
auto constexpr intSize = sizeof(uint32_t);
file.write(
reinterpret_cast<char const*>(&header.charCount),
intSize
);
file.write(
reinterpret_cast<char const*>(&header.animNodeCount),
intSize
);
file.write(
reinterpret_cast<char const*>(header.nodeHeaders.data()),
sizeof(AnimNodeInfo) * header.nodeHeaders.size()
);
} }
void MeshCompiler::WriteAnimData(FileReference file, AnimDataHeader const& header, AnimData& data) void MeshCompiler::WriteAnimData(FileReference file, AnimDataHeader const& header, AnimData const& data)
{ {
file.write(
data.name.data(),
header.charCount
);
file.write(
reinterpret_cast<char const*>(&data.duration),
sizeof(double)
);
file.write(
reinterpret_cast<char const*>(&data.ticksPerSecond),
sizeof(double)
);
for (auto i{0}; i < header.animNodeCount; ++i)
{
WriteAnimNode(file, header.nodeHeaders[i], data.nodeChannels[i]);
}
}
void MeshCompiler::WriteAnimNode(FileReference file, AnimNodeInfo const& info, AnimNode const& node)
{
file.write(
node.name.data(),
info.charCount
);
file.write(
reinterpret_cast<char const*>(&node.pre),
sizeof(AnimationBehaviour)
);
file.write(
reinterpret_cast<char const*>(&node.post),
sizeof(AnimationBehaviour)
);
file.write(
reinterpret_cast<char const*>(node.positionKeys.data()),
sizeof(PositionKey) * node.positionKeys.size()
);
file.write(
reinterpret_cast<char const*>(node.rotationKeys.data()),
sizeof(RotationKey) * node.rotationKeys.size()
);
file.write(
reinterpret_cast<char const*>(node.scaleKeys.data()),
sizeof(ScaleKey) * node.scaleKeys.size()
);
} }
void MeshCompiler::WriteHeaders(FileReference file, ModelConstRef asset) void MeshCompiler::WriteHeaders(FileReference file, ModelConstRef asset)
{ {
for (auto const& header : asset.meshHeaders)
{
WriteMeshHeader(file, header);
}
for (auto const& header : asset.animHeaders)
{
WriteAnimHeader(file, header);
}
} }
void MeshCompiler::WriteData(FileReference file, ModelConstRef asset) void MeshCompiler::WriteData(FileReference file, ModelConstRef asset)
{ {
for (auto i {0}; i < asset.meshes.size(); ++i)
{
WriteMeshData(file, asset.meshHeaders[i], asset.meshes[i]);
}
for (auto i {0}; i < asset.anims.size(); ++i)
{
WriteAnimData(file, asset.animHeaders[i], asset.anims[i]);
}
} }
void MeshCompiler::ParseAnimations(aiScene const& scene, std::vector<AnimData>& anims) noexcept void MeshCompiler::ParseAnimations(aiScene const& scene, std::vector<AnimData>& anims) noexcept
@ -357,12 +443,8 @@ namespace SH_COMP
sizeof(asset.header) sizeof(asset.header)
); );
// Write Meshes WriteHeaders(file, asset);
for (auto i {0}; i < asset.meshHeaders.size(); ++i) WriteData(file, asset);
{
WriteMeshHeader(file, asset.meshHeaders[i]);
WriteMeshData(file, asset.meshHeaders[i], asset.meshes[i]);
}
file.close(); file.close();
} }

View File

@ -43,7 +43,8 @@ namespace SH_COMP
static void WriteMeshData(FileReference file, MeshDataHeader const& header, MeshData const& asset); static void WriteMeshData(FileReference file, MeshDataHeader const& header, MeshData const& asset);
static void WriteAnimHeader(FileReference file, AnimDataHeader const& header); static void WriteAnimHeader(FileReference file, AnimDataHeader const& header);
static void WriteAnimData(FileReference file, AnimDataHeader const& header, AnimData cosnt& data); static void WriteAnimData(FileReference file, AnimDataHeader const& header, AnimData const& data);
static void WriteAnimNode(FileReference file, AnimNodeInfo const& info, AnimNode const& node);
static void WriteHeaders(FileReference file, ModelConstRef asset); static void WriteHeaders(FileReference file, ModelConstRef asset);
static void WriteData(FileReference file, ModelConstRef asset); static void WriteData(FileReference file, ModelConstRef asset);

View File

@ -63,23 +63,24 @@ namespace SH_COMP
struct AnimNode struct AnimNode
{ {
std::string name; std::string name;
AnimationBehaviour pre;
AnimationBehaviour post;
std::vector<PositionKey> positionKeys; std::vector<PositionKey> positionKeys;
std::vector<RotationKey> rotationKeys; std::vector<RotationKey> rotationKeys;
std::vector<ScaleKey> scaleKeys; std::vector<ScaleKey> scaleKeys;
AnimationBehaviour pre;
AnimationBehaviour post;
}; };
struct AnimData struct AnimData
{ {
std::string name; std::string name;
double duration;
double ticksPerSecond;
std::vector<AnimNode> nodeChannels; std::vector<AnimNode> nodeChannels;
//std::vector<aiMeshAnim*> meshChannels; //std::vector<aiMeshAnim*> meshChannels;
//std::vector<aiMeshMorphAnim*> morphMeshChannels; //std::vector<aiMeshMorphAnim*> morphMeshChannels;
double duration;
double ticksPerSecond;
}; };
} }