Animation working

Code still wip and lacking comments
This commit is contained in:
Sascha Willems 2020-05-14 21:40:54 +02:00
parent 23010275ce
commit 78a9b5bde1
5 changed files with 67 additions and 10 deletions

View file

@ -655,6 +655,60 @@ public:
}
}
void updateAnimation(uint32_t index, float time)
{
if (index > static_cast<uint32_t>(animations.size()) - 1) {
std::cout << "No animation with index " << index << std::endl;
return;
}
Animation& animation = animations[index];
bool updated = false;
for (auto& channel : animation.channels) {
AnimationSampler& sampler = animation.samplers[channel.samplerIndex];
if (sampler.inputs.size() > sampler.outputsVec4.size()) {
continue;
}
for (size_t i = 0; i < sampler.inputs.size() - 1; i++) {
if ((time >= sampler.inputs[i]) && (time <= sampler.inputs[i + 1])) {
float u = std::max(0.0f, time - sampler.inputs[i]) / (sampler.inputs[i + 1] - sampler.inputs[i]);
if (u <= 1.0f) {
if (channel.path == "translation") {
glm::vec4 trans = glm::mix(sampler.outputsVec4[i], sampler.outputsVec4[i + 1], u);
channel.node->translation = glm::vec3(trans);
updated = true;
}
if (channel.path == "rotation") {
glm::quat q1;
q1.x = sampler.outputsVec4[i].x;
q1.y = sampler.outputsVec4[i].y;
q1.z = sampler.outputsVec4[i].z;
q1.w = sampler.outputsVec4[i].w;
glm::quat q2;
q2.x = sampler.outputsVec4[i + 1].x;
q2.y = sampler.outputsVec4[i + 1].y;
q2.z = sampler.outputsVec4[i + 1].z;
q2.w = sampler.outputsVec4[i + 1].w;
channel.node->rotation = glm::normalize(glm::slerp(q1, q2, u));
updated = true;
}
if (channel.path == "scale") {
glm::vec4 trans = glm::mix(sampler.outputsVec4[i], sampler.outputsVec4[i + 1], u);
channel.node->scale = glm::vec3(trans);
updated = true;
}
}
}
}
}
if (updated) {
for (auto& node : nodes) {
updateJoints(node);
}
}
}
/*
glTF rendering functions
*/
@ -713,6 +767,7 @@ class VulkanExample : public VulkanExampleBase
{
public:
bool wireframe = false;
float animationTimer = 0.0f;
VulkanglTFModel glTFModel;
@ -1085,6 +1140,16 @@ public:
if (camera.updated) {
updateUniformBuffers();
}
// @todo: poi
if (!paused) {
if (glTFModel.animations.size() > 0) {
animationTimer += frameTimer * 0.75f;
if (animationTimer > glTFModel.animations[0].end) {
animationTimer -= glTFModel.animations[0].end;
}
glTFModel.updateAnimation(0, animationTimer);
}
}
}
virtual void OnUpdateUIOverlay(vks::UIOverlay *overlay)