WIP
This commit is contained in:
parent
9947ee7526
commit
6f8a580e26
@ -23,6 +23,7 @@ libraries = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[node name="SyncedAnimationGraph" type="SyncedAnimationGraph" parent="."]
|
[node name="SyncedAnimationGraph" type="SyncedAnimationGraph" parent="."]
|
||||||
|
active = false
|
||||||
animation_tree = NodePath("../AnimationTree")
|
animation_tree = NodePath("../AnimationTree")
|
||||||
skeleton = NodePath("../MixamoAmy/Armature/Skeleton3D")
|
skeleton = NodePath("../MixamoAmy/Armature/Skeleton3D")
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,6 @@
|
|||||||
#include "scene/3d/skeleton_3d.h"
|
#include "scene/3d/skeleton_3d.h"
|
||||||
#include "scene/animation/animation_player.h"
|
#include "scene/animation/animation_player.h"
|
||||||
|
|
||||||
|
|
||||||
void SyncedAnimationGraph::_bind_methods() {
|
void SyncedAnimationGraph::_bind_methods() {
|
||||||
print_line(vformat("binding methods"));
|
print_line(vformat("binding methods"));
|
||||||
|
|
||||||
@ -219,14 +218,12 @@ void SyncedAnimationGraph::_process_graph(double p_delta, bool p_update_only) {
|
|||||||
default: {
|
default: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// skeleton->set_bone_pose_position(3, Vector3(sin(current_time) * 10., 0., 0.));
|
// skeleton->set_bone_pose_position(3, Vector3(sin(current_time) * 10., 0., 0.));
|
||||||
skeleton->force_update_all_bone_transforms();
|
skeleton->force_update_all_bone_transforms();
|
||||||
|
|
||||||
|
|
||||||
// TrackCache *track = track_num_to_track_cache[i];
|
// TrackCache *track = track_num_to_track_cache[i];
|
||||||
// if (track == nullptr) {
|
// if (track == nullptr) {
|
||||||
// continue; // No path, but avoid error spamming.
|
// continue; // No path, but avoid error spamming.
|
||||||
@ -248,7 +245,6 @@ void SyncedAnimationGraph::_process_graph(double p_delta, bool p_update_only) {
|
|||||||
// print_line(vformat(" %s", node_name));
|
// print_line(vformat(" %s", node_name));
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
void SyncedAnimationGraph::_set_process(bool p_process, bool p_force) {
|
void SyncedAnimationGraph::_set_process(bool p_process, bool p_force) {
|
||||||
if (processing == p_process && !p_force) {
|
if (processing == p_process && !p_force) {
|
||||||
return;
|
return;
|
||||||
@ -262,3 +258,16 @@ void SyncedAnimationGraph::_set_process(bool p_process, bool p_force) {
|
|||||||
|
|
||||||
SyncedAnimationGraph::SyncedAnimationGraph() {
|
SyncedAnimationGraph::SyncedAnimationGraph() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AnimationSamplerNode::initialize(GraphEvaluationContext &context) {
|
||||||
|
animation = context.animation_tree->get_animation(animation_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AnimationSamplerNode::evaluate(AnimationData &output) {
|
||||||
|
const Vector<Animation::Track *> tracks = animation->get_tracks();
|
||||||
|
Animation::Track *const *tracks_ptr = tracks.ptr();
|
||||||
|
// real_t a_length = animation->get_length();
|
||||||
|
int count = tracks.size();
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,8 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "scene/animation/animation_blend_tree.h"
|
|
||||||
#include "scene/animation/animation_tree.h"
|
#include "scene/animation/animation_tree.h"
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
class SyncedAnimationGraph : public Node {
|
class SyncedAnimationGraph : public Node {
|
||||||
GDCLASS(SyncedAnimationGraph, Node);
|
GDCLASS(SyncedAnimationGraph, Node);
|
||||||
|
|
||||||
@ -17,7 +18,7 @@ private:
|
|||||||
NodePath get_skeleton() const;
|
NodePath get_skeleton() const;
|
||||||
|
|
||||||
// AnimationMixer::TrackCache
|
// AnimationMixer::TrackCache
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
@ -50,4 +51,79 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void _set_process(bool p_process, bool p_force = false);
|
void _set_process(bool p_process, bool p_force = false);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct AnimationData {
|
||||||
|
struct TrackValue {
|
||||||
|
Animation::Track *track = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PositionTrackValue : public TrackValue {
|
||||||
|
int bone_idx = -1;
|
||||||
|
Vector3 position = Vector3(0, 0, 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RotationTrackValue : public TrackValue {
|
||||||
|
int bone_idx = -1;
|
||||||
|
Quaternion rotation = Quaternion(0, 0, 0, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ScaleTrackValue : public TrackValue {
|
||||||
|
int bone_idx = -1;
|
||||||
|
Vector3 scale;
|
||||||
|
};
|
||||||
|
|
||||||
|
AHashMap<Animation::Track, TrackValue *, HashHasher, HashMapComparatorDefault<unsigned>> track_values;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GraphEvaluationContext {
|
||||||
|
AnimationTree *animation_tree = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SyncedAnimationNode {
|
||||||
|
public:
|
||||||
|
struct NodeTimeInfo {
|
||||||
|
double length = 0.0;
|
||||||
|
double position = 0.0;
|
||||||
|
double delta = 0.0;
|
||||||
|
|
||||||
|
Animation::LoopMode loop_mode = Animation::LOOP_NONE;
|
||||||
|
};
|
||||||
|
NodeTimeInfo node_time_info;
|
||||||
|
|
||||||
|
virtual ~SyncedAnimationNode() = default;
|
||||||
|
virtual void initialize(GraphEvaluationContext &context) {}
|
||||||
|
virtual void activate_inputs(Vector<StringName> input_names) {}
|
||||||
|
virtual void calculate_sync_track() {}
|
||||||
|
virtual void update_time(double p_delta) {
|
||||||
|
node_time_info.position += p_delta;
|
||||||
|
if (node_time_info.position > node_time_info.length) {
|
||||||
|
switch (node_time_info.loop_mode) {
|
||||||
|
case Animation::LOOP_NONE: {
|
||||||
|
node_time_info.position = node_time_info.length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Animation::LOOP_LINEAR: {
|
||||||
|
assert(node_time_info.length > 0.0);
|
||||||
|
while (node_time_info.position > node_time_info.length) {
|
||||||
|
node_time_info.position -= node_time_info.length;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Animation::LOOP_PINGPONG: {
|
||||||
|
assert(false && !"Not yet implemented.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtual void evaluate(AnimationData &output) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class AnimationSamplerNode : public SyncedAnimationNode {
|
||||||
|
StringName animation_name;
|
||||||
|
Ref<Animation> animation;
|
||||||
|
|
||||||
|
void initialize(GraphEvaluationContext &context) override;
|
||||||
|
void evaluate(AnimationData &output) override;
|
||||||
};
|
};
|
||||||
Loading…
x
Reference in New Issue
Block a user