Load animation data into model

This commit is contained in:
Camden Dixie O'Brien committed 2025-10-02 12:42:09 +01:00
1 parent f24a920e66
commit ffa0beb55a
3 files changed
+85 -4

No files matched your search

+55 -1
View File
@@ -1146,13 +1146,67 @@ model_t model_format_glb_read(const char *path)
(const u16_vec4_t *)(bin_data + info.bone_indices.offset),
(const vec4_t *)(bin_data + info.weights.offset), info.vertex_count);
memcpy(model.indices, bin_data + info.indices.offset, info.indices.len);
model.inverse_bind_matrices = calloc(info.bone_count, sizeof(mat4_t));
model.inverse_bind_matrices = malloc(info.bone_count * sizeof(mat4_t));
assert(model.inverse_bind_matrices != nullptr);
memcpy(
model.inverse_bind_matrices,
bin_data + info.inverse_bind_matrices.offset,
info.inverse_bind_matrices.len);
// Load animation data
model.animation.keyframe_count = info.animation.keyframe_count;
const size_t times_size = model.animation.keyframe_count * sizeof(float);
model.animation.times = malloc(times_size);
assert(model.animation.times != nullptr);
memcpy(
model.animation.times, bin_data + info.animation.times[0].offset,
times_size);
model.animation.length_us = (size_t)roundf(
1'000'000
* model.animation.times[model.animation.keyframe_count - 1]);
for (unsigned i = 1; i < info.bone_count; ++i) {
// Verify that all time series data matches
if (info.animation.times[i].offset
!= info.animation.times[0].offset) {
assert(
memcmp(
model.animation.times,
bin_data + info.animation.times[i].offset, times_size)
== 0);
}
}
model.animation.bones
= malloc(model.bone_count * sizeof(animation_bone_t));
assert(model.animation.bones != nullptr);
for (unsigned i = 0; i < info.bone_count; ++i) {
// Load translations
model.animation.bones[i].translations
= malloc(model.animation.keyframe_count * sizeof(vec3_t));
assert(model.animation.bones[i].translations != nullptr);
memcpy(
model.animation.bones[i].translations,
bin_data + info.animation.translations[i].offset,
model.animation.keyframe_count * sizeof(vec3_t));
// Load rotations
model.animation.bones[i].rotations
= malloc(model.animation.keyframe_count * sizeof(vec4_t));
assert(model.animation.bones[i].rotations != nullptr);
memcpy(
model.animation.bones[i].rotations,
bin_data + info.animation.rotations[i].offset,
model.animation.keyframe_count * sizeof(vec4_t));
// Load scales
model.animation.bones[i].scales
= malloc(model.animation.keyframe_count * sizeof(vec3_t));
assert(model.animation.bones[i].scales != nullptr);
memcpy(
model.animation.bones[i].scales,
bin_data + info.animation.scales[i].offset,
model.animation.keyframe_count * sizeof(vec3_t));
}
munmap(file, len);
return model;
}