Started animation tree

This commit is contained in:
2023-09-23 10:34:25 +03:00
parent 7876ace20e
commit 0a2a390dce
4 changed files with 35 additions and 132 deletions

View File

@@ -1,8 +1,10 @@
#ifndef ANIMATION_SYSTEM_H #ifndef ANIMATION_SYSTEM_H
#define ANIMATION_SYSTEM_H #define ANIMATION_SYSTEM_H
class AnimationNode;
namespace ECS { namespace ECS {
struct AnimationPlayer; struct AnimationPlayer;
struct AnimationTreee;
enum AnimationProcessMode { enum AnimationProcessMode {
ANIMATION_PROCESS_PHYSICS, ANIMATION_PROCESS_PHYSICS,
ANIMATION_PROCESS_IDLE, ANIMATION_PROCESS_IDLE,
@@ -23,12 +25,6 @@ struct TrackNodeCache {
NodePath path; NodePath path;
flecs::entity_t id; flecs::entity_t id;
Ref<Resource> resource; Ref<Resource> resource;
#if 0
Node *node;
Spatial *spatial;
Node2D *node_2d;
Skeleton *skeleton;
#endif
flecs::entity_t bone_idx; flecs::entity_t bone_idx;
// accumulated transforms // accumulated transforms
Vector3 loc_accum; Vector3 loc_accum;
@@ -39,51 +35,9 @@ struct TrackNodeCache {
float audio_start; float audio_start;
float audio_len; float audio_len;
bool animation_playing; bool animation_playing;
#if 0
struct PropertyAnim {
TrackNodeCache *owner;
SpecialProperty special;
Vector<StringName> subpath;
Object *object;
Variant value_accum;
uint64_t accum_pass;
Variant capture;
PropertyAnim() :
owner(nullptr),
special(SP_NONE),
object(nullptr),
accum_pass(0)
{
}
};
Map<StringName, PropertyAnim> property_anim;
#endif
#if 0
struct BezierAnim {
Vector<StringName> bezier_property;
TrackNodeCache *owner;
float bezier_accum;
Object *object;
uint64_t accum_pass;
BezierAnim() :
owner(nullptr),
bezier_accum(0.0),
object(nullptr),
accum_pass(0)
{
}
};
Map<StringName, BezierAnim> bezier_anim;
#endif
TrackNodeCache() : TrackNodeCache() :
used(false), id(-1), used(false),
#if 0 id(-1),
node(nullptr),
spatial(nullptr),
node_2d(nullptr),
skeleton(nullptr),
#endif
bone_idx(-1), bone_idx(-1),
accum_pass(0), accum_pass(0),
audio_playing(false), audio_playing(false),
@@ -199,10 +153,7 @@ struct AnimationData {
assert(animation); assert(animation);
animation = anim; animation = anim;
} }
AnimationData() : AnimationData() : animation(nullptr), node_cache_size(0) {}
animation(nullptr), node_cache_size(0)
{
}
AnimationData(const AnimationData &d) AnimationData(const AnimationData &d)
{ {
int i; int i;
@@ -236,10 +187,7 @@ struct AnimationData {
memnew_placement(this, AnimationData(d)); memnew_placement(this, AnimationData(d));
return *this; return *this;
} }
const Animation *get_animation() const const Animation *get_animation() const { return animation; }
{
return animation;
}
~AnimationData() { animation = nullptr; } ~AnimationData() { animation = nullptr; }
@@ -305,12 +253,6 @@ struct AnimationPlayerData {
TrackNodeCache *cache_update[NODE_CACHE_UPDATE_MAX]; TrackNodeCache *cache_update[NODE_CACHE_UPDATE_MAX];
int cache_update_size; int cache_update_size;
#if 0
TrackNodeCache::PropertyAnim *cache_update_prop[NODE_CACHE_UPDATE_MAX];
int cache_update_prop_size;
TrackNodeCache::BezierAnim *cache_update_bezier[NODE_CACHE_UPDATE_MAX];
int cache_update_bezier_size;
#endif
Set<TrackNodeCache *> playing_caches; Set<TrackNodeCache *> playing_caches;
uint64_t accum_pass; uint64_t accum_pass;
float speed_scale; float speed_scale;
@@ -327,9 +269,6 @@ struct AnimationPlayerData {
AnimationProcessMode animation_process_mode; AnimationProcessMode animation_process_mode;
bool processing; bool processing;
bool active; bool active;
#if 0
NodePath root;
#endif
bool playing; bool playing;
AnimationPlayerData(int id) AnimationPlayerData(int id)
{ {
@@ -380,29 +319,6 @@ struct AnimationPlayerData {
AnimationPlayerData(AnimationPlayerData &&d) AnimationPlayerData(AnimationPlayerData &&d)
{ {
memnew_placement(this, AnimationPlayerData(d)); memnew_placement(this, AnimationPlayerData(d));
#if 0
int i;
node_cache_map = d.node_cache_map;
for (i = 0; i < NODE_CACHE_UPDATE_MAX; i++)
cache_update[i] = d.cache_update[i];
cache_update_size = d.cache_update_size;
playing_caches = d.playing_caches;
accum_pass = d.accum_pass;
speed_scale = d.speed_scale;
default_blend_time = d.default_blend_time;
animation_set = d.animation_set;
blend_times = d.blend_times;
playback = d.playback;
queued = d.queued;
end_reached = d.end_reached;
end_notify = d.end_notify;
autoplay = d.autoplay;
reset_on_save = d.reset_on_save;
animation_process_mode = d.animation_process_mode;
processing = d.processing;
active = d.active;
playing = d.playing;
#endif
d.playing = playing; d.playing = playing;
d.cache_update_size = 0; d.cache_update_size = 0;
d.active = false; d.active = false;
@@ -410,29 +326,6 @@ struct AnimationPlayerData {
AnimationPlayerData &operator=(const AnimationPlayerData &d) AnimationPlayerData &operator=(const AnimationPlayerData &d)
{ {
memnew_placement(this, AnimationPlayerData(d)); memnew_placement(this, AnimationPlayerData(d));
#if 0
int i;
node_cache_map = d.node_cache_map;
for (i = 0; i < NODE_CACHE_UPDATE_MAX; i++)
cache_update[i] = d.cache_update[i];
cache_update_size = d.cache_update_size;
playing_caches = d.playing_caches;
accum_pass = d.accum_pass;
speed_scale = d.speed_scale;
default_blend_time = d.default_blend_time;
animation_set = d.animation_set;
blend_times = d.blend_times;
playback = d.playback;
queued = d.queued;
end_reached = d.end_reached;
end_notify = d.end_notify;
autoplay = d.autoplay;
reset_on_save = d.reset_on_save;
animation_process_mode = d.animation_process_mode;
processing = d.processing;
active = d.active;
playing = d.playing;
#endif
return *this; return *this;
} }
AnimationPlayerData &operator=(AnimationPlayerData &&d) AnimationPlayerData &operator=(AnimationPlayerData &&d)
@@ -464,11 +357,13 @@ struct AnimationPlayerData {
} }
~AnimationPlayerData() { playing = false; } ~AnimationPlayerData() { playing = false; }
}; };
/* AnimationPlayer */
/* public functions */ /* public functions */
StringName find_animation( StringName find_animation(
struct AnimationPlayerData *player, const Ref<Animation> &p_animation); struct AnimationPlayerData *player, const Ref<Animation> &p_animation);
Error add_animation(flecs::entity_t entity, flecs::world &ecs, struct AnimationPlayerData *player, Error add_animation(flecs::entity_t entity, flecs::world &ecs,
const StringName &p_name, const Animation *p_animation); struct AnimationPlayerData *player, const StringName &p_name,
const Animation *p_animation);
void remove_animation(flecs::entity_t entity, flecs::world &ecs, void remove_animation(flecs::entity_t entity, flecs::world &ecs,
struct AnimationPlayerData *player, const StringName &p_name); struct AnimationPlayerData *player, const StringName &p_name);
void rename_animation(struct AnimationPlayerData *player, void rename_animation(struct AnimationPlayerData *player,
@@ -537,7 +432,8 @@ void advance(flecs::entity_t entity, flecs::world &ecs,
AnimationPlayerData *player, float p_time); AnimationPlayerData *player, float p_time);
void set_root(struct AnimationPlayerData *player, const NodePath &p_root); void set_root(struct AnimationPlayerData *player, const NodePath &p_root);
NodePath get_root(struct AnimationPlayerData *player); NodePath get_root(struct AnimationPlayerData *player);
void clear_caches(flecs::entity_t entity, flecs::world &ecs, struct AnimationPlayerData *player); void clear_caches(flecs::entity_t entity, flecs::world &ecs,
struct AnimationPlayerData *player);
void get_argument_options(struct AnimationPlayerData *player, void get_argument_options(struct AnimationPlayerData *player,
const StringName &p_function, int p_idx, List<String> *r_options); const StringName &p_function, int p_idx, List<String> *r_options);
} //namespace ECS } //namespace ECS

View File

@@ -0,0 +1,8 @@
#include <cassert>
#include <scene/resources/animation.h>
#include <servers/audio/audio_stream.h>
#include <scene/animation/animation_tree.h>
#include <flecs.h>
#include "animation_system_tree.h"

View File

@@ -0,0 +1,13 @@
#ifndef ANIMATION_SYSTEM_TREE
#define ANIMATION_SYSTEM_TREE
struct AnimationTree {
HashMap<NodePath, int> track_cache_map;
TrackCache track_cache_data[NODE_CACHE_UPDATE_MAX];
Set<int> playing_caches;
Ref<AnimationNode> root;
AnimationProcessMode process_mode;
bool active;
NodePath animation_player;
};
#endif

View File

@@ -23,11 +23,7 @@ struct Skeleton {
int parent; int parent;
bool disable_rest; bool disable_rest;
bool custom_pose_enable; bool custom_pose_enable;
Transform Transform custom_pose, rest, pose, pose_global,
custom_pose,
rest,
pose,
pose_global,
pose_global_no_override; pose_global_no_override;
int sort_index; int sort_index;
}; };
@@ -55,16 +51,6 @@ struct BonePose {
int index; int index;
Transform pose; Transform pose;
}; };
struct AnimationTree {
void *root;
AnimationTree() :
root(nullptr)
{
}
~AnimationTree()
{
}
};
struct CharacterSlot { struct CharacterSlot {
String name; String name;
RID instance; RID instance;