From 3749cbb3cacb6338fbc406e6154326604ebc4ce0 Mon Sep 17 00:00:00 2001 From: demolke Date: Mon, 11 Dec 2023 01:59:22 +0100 Subject: [PATCH] Import step interpolation for loc/rot/scale from GLTF as nearest Currently all object transform animation tracks get imported and baked as linear. For step interpolation mark the resulting animation track with Nearest interpolation to make sure there are no in-betweens generated. This is useful for camera cuts or similar. --- modules/gltf/gltf_document.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 0b491ce1d6f..65b7d9ba0ec 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -6288,6 +6288,9 @@ void GLTFDocument::_import_animation(Ref p_state, AnimationPlayer *p_ animation->add_track(Animation::TYPE_POSITION_3D); animation->track_set_path(position_idx, transform_node_path); animation->track_set_imported(position_idx, true); //helps merging later + if (track.position_track.interpolation == GLTFAnimation::INTERP_STEP) { + animation->track_set_interpolation_type(position_idx, Animation::InterpolationType::INTERPOLATION_NEAREST); + } base_idx++; } } @@ -6310,6 +6313,9 @@ void GLTFDocument::_import_animation(Ref p_state, AnimationPlayer *p_ animation->add_track(Animation::TYPE_ROTATION_3D); animation->track_set_path(rotation_idx, transform_node_path); animation->track_set_imported(rotation_idx, true); //helps merging later + if (track.rotation_track.interpolation == GLTFAnimation::INTERP_STEP) { + animation->track_set_interpolation_type(rotation_idx, Animation::InterpolationType::INTERPOLATION_NEAREST); + } base_idx++; } } @@ -6332,6 +6338,9 @@ void GLTFDocument::_import_animation(Ref p_state, AnimationPlayer *p_ animation->add_track(Animation::TYPE_SCALE_3D); animation->track_set_path(scale_idx, transform_node_path); animation->track_set_imported(scale_idx, true); //helps merging later + if (track.scale_track.interpolation == GLTFAnimation::INTERP_STEP) { + animation->track_set_interpolation_type(scale_idx, Animation::InterpolationType::INTERPOLATION_NEAREST); + } base_idx++; } }