// // Created by martin on 03.12.25. // #include "synced_animation_node.h" void AnimationData::sample_from_animation(const Ref &animation, const Skeleton3D *skeleton_3d, double p_time) { const Vector tracks = animation->get_tracks(); Animation::Track *const *tracks_ptr = tracks.ptr(); int count = tracks.size(); for (int i = 0; i < count; i++) { AnimationData::TrackValue *track_value = nullptr; const Animation::Track *animation_track = tracks_ptr[i]; const NodePath &track_node_path = animation_track->path; if (!animation_track->enabled) { continue; } Animation::TrackType ttype = animation_track->type; switch (ttype) { case Animation::TYPE_POSITION_3D: { AnimationData::PositionTrackValue *position_track_value = memnew(AnimationData::PositionTrackValue); if (track_node_path.get_subname_count() == 1) { int bone_idx = skeleton_3d->find_bone(track_node_path.get_subname(0)); if (bone_idx != -1) { position_track_value->bone_idx = bone_idx; } animation->try_position_track_interpolate(i, p_time, &position_track_value->position); } else { // TODO assert(false && !"Not yet implemented"); } track_value = position_track_value; break; } case Animation::TYPE_ROTATION_3D: { AnimationData::RotationTrackValue *rotation_track_value = memnew(AnimationData::RotationTrackValue); if (track_node_path.get_subname_count() == 1) { int bone_idx = skeleton_3d->find_bone(track_node_path.get_subname(0)); if (bone_idx != -1) { rotation_track_value->bone_idx = bone_idx; } animation->try_rotation_track_interpolate(i, p_time, &rotation_track_value->rotation); } else { // TODO assert(false && !"Not yet implemented"); } track_value = rotation_track_value; break; } default: { // TODO assert(false && !"Not yet implemented"); break; } } track_value->track = tracks_ptr[i]; set_value(animation_track->thash, track_value); } } void AnimationSamplerNode::initialize(GraphEvaluationContext &context) { animation = context.animation_player->get_animation(animation_name); node_time_info.length = animation->get_length(); node_time_info.loop_mode = Animation::LOOP_LINEAR; } void AnimationSamplerNode::evaluate(GraphEvaluationContext &context, const LocalVector &inputs, AnimationData &output) { assert(inputs.size() == 0); output.clear(); output.sample_from_animation(animation, context.skeleton_3d, node_time_info.position); } void AnimationBlend2Node::evaluate(GraphEvaluationContext &context, const LocalVector &inputs, AnimationData &output) { output = *inputs[0]; output.blend(*inputs[1], blend_weight); }