From 79ba7a7ad5e39fe7cc723e8178c105904ff7166b Mon Sep 17 00:00:00 2001 From: bjorn Date: Sat, 18 May 2019 22:19:28 -0700 Subject: [PATCH] gltf: Support partially-keyed animation properties; --- src/data/modelData.h | 3 +++ src/data/modelData_gltf.c | 6 +++--- src/graphics/animator.c | 8 +++++++- src/graphics/model.c | 4 ++-- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/data/modelData.h b/src/data/modelData.h index 2b441f58..39694da1 100644 --- a/src/data/modelData.h +++ b/src/data/modelData.h @@ -162,6 +162,9 @@ typedef struct { typedef struct { float transform[16]; + float translation[3]; + float rotation[4]; + float scale[3]; uint32_t* children; uint32_t childCount; uint32_t primitiveIndex; diff --git a/src/data/modelData_gltf.c b/src/data/modelData_gltf.c index e6235286..4b801258 100644 --- a/src/data/modelData_gltf.c +++ b/src/data/modelData_gltf.c @@ -743,9 +743,9 @@ ModelData* lovrModelDataInitGltf(ModelData* model, Blob* source) { jsmntok_t* token = info.nodes; ModelNode* node = model->nodes; for (int i = (token++)->size; i > 0; i--, node++) { - float translation[3] = { 0, 0, 0 }; - float rotation[4] = { 0, 0, 0, 0 }; - float scale[3] = { 1, 1, 1 }; + vec3 translation = vec3_set(node->translation, 0.f, 0.f, 0.f); + quat rotation = quat_set(node->rotation, 0.f, 0.f, 0.f, 1.f); + vec3 scale = vec3_set(node->scale, 1.f, 1.f, 1.f); bool matrix = false; node->primitiveCount = 0; node->skin = -1; diff --git a/src/graphics/animator.c b/src/graphics/animator.c index 100b1ce1..f8ec07d2 100644 --- a/src/graphics/animator.c +++ b/src/graphics/animator.c @@ -68,7 +68,11 @@ void lovrAnimatorUpdate(Animator* animator, float dt) { } bool lovrAnimatorEvaluate(Animator* animator, int nodeIndex, mat4 transform) { - float properties[3][4] = { { 0, 0, 0 }, { 0, 0, 0, 1 }, { 1, 1, 1 } }; + float properties[3][4]; + ModelNode* node = &animator->data->nodes[nodeIndex]; + vec3_init(properties[PROP_TRANSLATION], node->translation); + quat_init(properties[PROP_ROTATION], node->rotation); + vec3_init(properties[PROP_SCALE], node->scale); bool touched = false; for (int i = 0; i < animator->data->animationCount; i++) { @@ -138,6 +142,8 @@ bool lovrAnimatorEvaluate(Animator* animator, int nodeIndex, mat4 transform) { mat4_translate(transform, T[0], T[1], T[2]); mat4_rotateQuat(transform, R); mat4_scale(transform, S[0], S[1], S[2]); + } else { + mat4_multiply(transform, node->transform); } return touched; diff --git a/src/graphics/model.c b/src/graphics/model.c index 6e2fbe2c..55623f4d 100644 --- a/src/graphics/model.c +++ b/src/graphics/model.c @@ -13,8 +13,8 @@ static void updateGlobalNodeTransform(Model* model, uint32_t nodeIndex, mat4 tra mat4 globalTransform = model->globalNodeTransforms + 16 * nodeIndex; mat4_set(globalTransform, transform); - if (!model->animator || !lovrAnimatorEvaluate(model->animator, nodeIndex, globalTransform)) { - mat4_multiply(globalTransform, node->transform); + if (model->animator) { + lovrAnimatorEvaluate(model->animator, nodeIndex, globalTransform); } for (uint32_t i = 0; i < node->childCount; i++) {