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

@ -8,8 +8,6 @@ layout (location = 2) in vec2 inUV;
layout (location = 3) in vec3 inViewVec; layout (location = 3) in vec3 inViewVec;
layout (location = 4) in vec3 inLightVec; layout (location = 4) in vec3 inLightVec;
layout (location = 5) in vec4 inColVis;
layout (location = 0) out vec4 outFragColor; layout (location = 0) out vec4 outFragColor;
void main() void main()
@ -20,9 +18,7 @@ void main()
vec3 L = normalize(inLightVec); vec3 L = normalize(inLightVec);
vec3 V = normalize(inViewVec); vec3 V = normalize(inViewVec);
vec3 R = reflect(-L, N); vec3 R = reflect(-L, N);
vec3 diffuse = max(dot(N, L), 0.15) * inColor; vec3 diffuse = max(dot(N, L), 0.5) * inColor;
vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.75); vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.75);
outFragColor = vec4(diffuse * color.rgb + specular, 1.0); outFragColor = vec4(diffuse * color.rgb + specular, 1.0);
// outFragColor = inColVis;
} }

Binary file not shown.

View file

@ -28,15 +28,13 @@ layout (location = 2) out vec2 outUV;
layout (location = 3) out vec3 outViewVec; layout (location = 3) out vec3 outViewVec;
layout (location = 4) out vec3 outLightVec; layout (location = 4) out vec3 outLightVec;
layout (location = 5) out vec4 outColVis;
void main() void main()
{ {
outNormal = inNormal; outNormal = inNormal;
outColor = inColor; outColor = inColor;
outUV = inUV; outUV = inUV;
// Calculated skinned matrix from vertice's weights and joint indices // Calculate skinned matrix from weights and joint indices of the current vertex
mat4 skinMat = mat4 skinMat =
inJointWeights.x * jointMatrices[int(inJointIndices.x)] + inJointWeights.x * jointMatrices[int(inJointIndices.x)] +
inJointWeights.y * jointMatrices[int(inJointIndices.y)] + inJointWeights.y * jointMatrices[int(inJointIndices.y)] +
@ -50,6 +48,4 @@ void main()
vec3 lPos = mat3(uboScene.view) * uboScene.lightPos.xyz; vec3 lPos = mat3(uboScene.view) * uboScene.lightPos.xyz;
outLightVec = lPos - pos.xyz; outLightVec = lPos - pos.xyz;
outViewVec = -pos.xyz; outViewVec = -pos.xyz;
outColVis = inJointWeights;
} }

Binary file not shown.

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 glTF rendering functions
*/ */
@ -713,6 +767,7 @@ class VulkanExample : public VulkanExampleBase
{ {
public: public:
bool wireframe = false; bool wireframe = false;
float animationTimer = 0.0f;
VulkanglTFModel glTFModel; VulkanglTFModel glTFModel;
@ -1085,6 +1140,16 @@ public:
if (camera.updated) { if (camera.updated) {
updateUniformBuffers(); 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) virtual void OnUpdateUIOverlay(vks::UIOverlay *overlay)