AnimationData is now a buffer and a hashmap with offsets of the TrackValues. During graph initialization all used TrackValues get registered and their offsets computed. AnimationData should now be allocated by the AnimationDataAllocator. It takes care of pooling already allocated AnimationDatas and also has a buffer block that contains the default values making it fast to allocate a new AnimationData with the initial pose / default values.
83 lines
2.7 KiB
C++
83 lines
2.7 KiB
C++
#pragma once
|
|
|
|
#include "scene/animation/animation_player.h"
|
|
#include "synced_animation_node.h"
|
|
|
|
class Skeleton3D;
|
|
|
|
class SyncedAnimationGraph : public Node {
|
|
GDCLASS(SyncedAnimationGraph, Node);
|
|
|
|
private:
|
|
NodePath animation_player_path;
|
|
Ref<SyncedAnimationNode> root_animation_node;
|
|
NodePath skeleton_path;
|
|
|
|
GraphEvaluationContext graph_context = {};
|
|
|
|
mutable List<PropertyInfo> properties;
|
|
mutable AHashMap<StringName, Pair<Ref<SyncedAnimationNode>, StringName>> parameter_to_node_parameter_map;
|
|
|
|
mutable bool properties_dirty = true;
|
|
|
|
void _update_properties() const;
|
|
void _update_properties_for_node(const String &p_base_path, Ref<SyncedAnimationNode> p_node) const;
|
|
|
|
void _tree_changed();
|
|
|
|
protected:
|
|
void _notification(int p_what);
|
|
static void _bind_methods();
|
|
|
|
bool _set(const StringName &p_name, const Variant &p_value);
|
|
bool _get(const StringName &p_name, Variant &r_ret) const;
|
|
void _get_property_list(List<PropertyInfo> *p_list) const;
|
|
|
|
/* ---- General settings for animation ---- */
|
|
AnimationMixer::AnimationCallbackModeProcess callback_mode_process = AnimationMixer::ANIMATION_CALLBACK_MODE_PROCESS_IDLE;
|
|
AnimationMixer::AnimationCallbackModeMethod callback_mode_method = AnimationMixer::ANIMATION_CALLBACK_MODE_METHOD_DEFERRED;
|
|
AnimationMixer::AnimationCallbackModeDiscrete callback_mode_discrete = AnimationMixer::ANIMATION_CALLBACK_MODE_DISCRETE_RECESSIVE;
|
|
|
|
bool processing = false;
|
|
bool active = true;
|
|
|
|
public:
|
|
void _process_graph(double p_delta, bool p_update_only = false);
|
|
void _apply_animation_data(const AnimationData &output_data) const;
|
|
|
|
void set_active(bool p_active);
|
|
bool is_active() const;
|
|
|
|
void set_animation_player(const NodePath &p_path);
|
|
NodePath get_animation_player() const;
|
|
|
|
void set_root_animation_node(const Ref<SyncedAnimationNode> &p_animation_node);
|
|
Ref<SyncedAnimationNode> get_root_animation_node() const;
|
|
|
|
void set_skeleton(const NodePath &p_path);
|
|
NodePath get_skeleton() const;
|
|
|
|
void set_callback_mode_process(AnimationMixer::AnimationCallbackModeProcess p_mode);
|
|
AnimationMixer::AnimationCallbackModeProcess get_callback_mode_process() const;
|
|
|
|
void set_callback_mode_method(AnimationMixer::AnimationCallbackModeMethod p_mode);
|
|
AnimationMixer::AnimationCallbackModeMethod get_callback_mode_method() const;
|
|
|
|
void set_callback_mode_discrete(AnimationMixer::AnimationCallbackModeDiscrete p_mode);
|
|
AnimationMixer::AnimationCallbackModeDiscrete get_callback_mode_discrete() const;
|
|
|
|
GraphEvaluationContext &get_context() {
|
|
return graph_context;
|
|
}
|
|
|
|
SyncedAnimationGraph();
|
|
|
|
private:
|
|
void _set_process(bool p_process, bool p_force = false);
|
|
|
|
void _setup_evaluation_context();
|
|
void _cleanup_evaluation_context();
|
|
|
|
void _setup_graph();
|
|
};
|