Animation crash debugging

This commit is contained in:
2023-09-16 12:21:39 +03:00
parent b9be14800d
commit b553b8ca1d
3 changed files with 610 additions and 221 deletions

44
src/modules/.clang-tidy Normal file
View File

@@ -0,0 +1,44 @@
---
Checks: 'clang-diagnostic-*,clang-analyzer-*,-*,modernize-redundant-void-arg,modernize-use-bool-literals,modernize-use-nullptr,readability-braces-around-statements'
WarningsAsErrors: ''
HeaderFilterRegex: '.*'
AnalyzeTemporaryDtors: false
FormatStyle: none
CheckOptions:
CheckOptions:
- key: cert-dcl16-c.NewSuffixes
value: 'L;LL;LU;LLU'
- key: cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField
value: '0'
- key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors
value: '1'
- key: cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic
value: '1'
- key: google-readability-function-size.StatementThreshold
value: '800'
- key: google-readability-namespace-comments.ShortNamespaceLines
value: '10'
- key: google-readability-namespace-comments.SpacesBeforeComments
value: '2'
- key: modernize-loop-convert.MaxCopySize
value: '16'
- key: modernize-loop-convert.MinConfidence
value: reasonable
- key: modernize-loop-convert.NamingStyle
value: CamelCase
- key: modernize-pass-by-value.IncludeStyle
value: llvm
- key: modernize-replace-auto-ptr.IncludeStyle
value: llvm
- key: modernize-use-bool-literals.IgnoreMacros
value: '0'
- key: modernize-use-default-member-init.IgnoreMacros
value: '0'
- key: modernize-use-default-member-init.UseAssignment
value: '1'
- key: modernize-use-nullptr.NullMacros
value: 'NULL'
- key: readability-braces-around-statements.ShortStatementLines
value: '0'
...

File diff suppressed because it is too large Load Diff

View File

@@ -66,7 +66,9 @@ struct TrackNodeCache {
owner(nullptr),
bezier_accum(0.0),
object(nullptr),
accum_pass(0) {}
accum_pass(0)
{
}
};
Map<StringName, BezierAnim> bezier_anim;
TrackNodeCache() :
@@ -86,11 +88,112 @@ struct TrackNodeCache {
{
}
};
struct Track {
Animation::TrackType type;
Animation::InterpolationType interpolation;
bool loop_wrap;
NodePath path; // path to something
bool imported;
bool enabled;
Track()
{
interpolation = Animation::INTERPOLATION_LINEAR;
imported = false;
loop_wrap = true;
enabled = true;
}
virtual ~Track() {}
};
struct Key {
float transition;
float time; // time in secs
Key() { transition = 1; }
};
// transform key holds either Vector3 or Quaternion
template <class T> struct TKey : public Key {
T value;
};
struct TransformKey {
Vector3 loc;
Quat rot;
Vector3 scale;
};
struct TransformTrack : public Track {
Vector<TKey<TransformKey>> transforms;
TransformTrack() { type = Animation::TYPE_TRANSFORM; }
};
struct ValueTrack : public Track {
Animation::UpdateMode update_mode;
bool update_on_seek;
Vector<TKey<Variant>> values;
ValueTrack()
{
type = Animation::TYPE_VALUE;
update_mode = Animation::UPDATE_CONTINUOUS;
}
};
struct MethodKey : public Key {
StringName method;
Vector<Variant> params;
};
struct MethodTrack : public Track {
Vector<MethodKey> methods;
MethodTrack() { type = Animation::TYPE_METHOD; }
};
struct BezierKey {
Vector2 in_handle; //relative (x always <0)
Vector2 out_handle; //relative (x always >0)
float value;
};
struct BezierTrack : public Track {
Vector<TKey<BezierKey>> values;
BezierTrack() { type = Animation::TYPE_BEZIER; }
};
struct AudioKey {
RES stream;
float start_offset; //offset from start
float end_offset; //offset from end, if 0 then full length or infinite
AudioKey()
{
start_offset = 0;
end_offset = 0;
}
};
struct AudioTrack : public Track {
Vector<TKey<AudioKey>> values;
AudioTrack() { type = Animation::TYPE_AUDIO; }
};
struct BasicTrack : public Track {
uint8_t data[256];
BasicTrack() { type = Animation::TYPE_TRANSFORM; }
};
struct AnimationData {
String name;
StringName next;
Vector<TrackNodeCache *> node_cache;
int node_cache_size;
struct TrackNodeCache *node_cache[128];
Ref<Animation> animation;
AnimationData(Ref<Animation> anim) :
animation(anim), node_cache_size(0)
{
}
AnimationData() : animation(Ref<Animation>()), node_cache_size(0) {}
};
struct PlaybackData {
AnimationData *from;
@@ -124,7 +227,11 @@ struct Playback {
struct BlendKey {
StringName from;
StringName to;
bool operator<(const BlendKey &bk) const { return from == bk.from ? String(to) < String(bk.to) : String(from) < String(bk.from); }
bool operator<(const BlendKey &bk) const
{
return from == bk.from ? String(to) < String(bk.to)
: String(from) < String(bk.from);
}
};
struct TrackNodeCacheKey {
uint32_t id;
@@ -141,10 +248,7 @@ struct TrackNodeCacheKey {
}
}
};
enum {
NODE_CACHE_UPDATE_MAX = 1024,
BLEND_FROM_MAX = 3
};
enum { NODE_CACHE_UPDATE_MAX = 1024, BLEND_FROM_MAX = 3 };
struct AnimationPlayerData {
Map<TrackNodeCacheKey, TrackNodeCache> node_cache_map;
TrackNodeCache *cache_update[NODE_CACHE_UPDATE_MAX];
@@ -176,75 +280,72 @@ struct AnimationPlayerData {
bool playing;
};
/* public functions */
StringName find_animation(struct AnimationPlayerData *player,
const Ref<Animation> &p_animation);
StringName find_animation(
struct AnimationPlayerData *player, const Ref<Animation> &p_animation);
Error add_animation(struct AnimationPlayerData *player,
const StringName &p_name, const Ref<Animation> &p_animation);
void remove_animation(struct AnimationPlayerData *player,
const StringName &p_name);
void remove_animation(
struct AnimationPlayerData *player, const StringName &p_name);
void rename_animation(struct AnimationPlayerData *player,
const StringName &p_name, const StringName &p_new_name);
bool has_animation(struct AnimationPlayerData *player,
const StringName &p_name);
Ref<Animation> get_animation(struct AnimationPlayerData *player,
const StringName &p_name);
void get_animation_list(struct AnimationPlayerData *player,
List<StringName> *p_animations);
bool has_animation(
struct AnimationPlayerData *player, const StringName &p_name);
Ref<Animation> get_animation(
struct AnimationPlayerData *player, const StringName &p_name);
void get_animation_list(
struct AnimationPlayerData *player, List<StringName> *p_animations);
void set_blend_time(struct AnimationPlayerData *player,
const StringName &p_animation1, const StringName &p_animation2, float p_time);
const StringName &p_animation1, const StringName &p_animation2,
float p_time);
float get_blend_time(struct AnimationPlayerData *player,
const StringName &p_animation1, const StringName &p_animation2);
void animation_set_next(struct AnimationPlayerData *player,
const StringName &p_animation, const StringName &p_next);
StringName animation_get_next(struct AnimationPlayerData *player,
const StringName &p_animation);
void set_default_blend_time(struct AnimationPlayerData *player,
float p_default);
StringName animation_get_next(
struct AnimationPlayerData *player, const StringName &p_animation);
void set_default_blend_time(
struct AnimationPlayerData *player, float p_default);
float get_default_blend_time(struct AnimationPlayerData *player);
void play(struct AnimationPlayerData *player,
const StringName &p_name = StringName(),
float p_custom_blend = -1, float p_custom_scale = 1.0,
bool p_from_end = false);
const StringName &p_name = StringName(), float p_custom_blend = -1,
float p_custom_scale = 1.0, bool p_from_end = false);
void play_backwards(struct AnimationPlayerData *player,
const StringName &p_name = StringName(), float p_custom_blend = -1);
void queue(struct AnimationPlayerData *player,
const StringName &p_name);
void queue(struct AnimationPlayerData *player, const StringName &p_name);
PoolVector<String> get_queue(struct AnimationPlayerData *player);
void clear_queue(struct AnimationPlayerData *player);
void stop(struct AnimationPlayerData *player,
bool p_reset = true);
void stop(struct AnimationPlayerData *player, bool p_reset = true);
bool is_playing(struct AnimationPlayerData *player);
String get_current_animation(struct AnimationPlayerData *player);
void set_current_animation(struct AnimationPlayerData *player,
const String &p_anim);
void set_current_animation(
struct AnimationPlayerData *player, const String &p_anim);
String get_assigned_animation(struct AnimationPlayerData *player);
void set_assigned_animation(struct AnimationPlayerData *player,
const String &p_anim);
void set_active(struct AnimationPlayerData *player,
bool p_active);
void set_assigned_animation(
struct AnimationPlayerData *player, const String &p_anim);
void set_active(struct AnimationPlayerData *player, bool p_active);
bool is_active(struct AnimationPlayerData *player);
bool is_valid(struct AnimationPlayerData *player);
void set_speed_scale(struct AnimationPlayerData *player,
float p_speed);
void set_speed_scale(struct AnimationPlayerData *player, float p_speed);
float get_speed_scale(struct AnimationPlayerData *player);
float get_playing_speed(struct AnimationPlayerData *player);
void set_autoplay(struct AnimationPlayerData *player,
const String &p_name);
void set_autoplay(struct AnimationPlayerData *player, const String &p_name);
String get_autoplay(struct AnimationPlayerData *player);
void set_reset_on_save_enabled(struct AnimationPlayerData *player,
bool p_enabled);
void set_reset_on_save_enabled(
struct AnimationPlayerData *player, bool p_enabled);
bool is_reset_on_save_enabled(struct AnimationPlayerData *player);
void set_animation_process_mode(struct AnimationPlayerData *player,
AnimationProcessMode p_mode);
AnimationProcessMode get_animation_process_mode(struct AnimationPlayerData *player);
void set_method_call_mode(struct AnimationPlayerData *player,
AnimationMethodCallMode p_mode);
AnimationMethodCallMode get_method_call_mode(struct AnimationPlayerData *player);
void set_animation_process_mode(
struct AnimationPlayerData *player, AnimationProcessMode p_mode);
AnimationProcessMode get_animation_process_mode(
struct AnimationPlayerData *player);
void set_method_call_mode(
struct AnimationPlayerData *player, AnimationMethodCallMode p_mode);
AnimationMethodCallMode get_method_call_mode(
struct AnimationPlayerData *player);
void seek(struct AnimationPlayerData *player,
float p_time, bool p_update = false);
void seek_delta(struct AnimationPlayerData *player,
float p_time, float p_delta);
void seek(struct AnimationPlayerData *player, float p_time,
bool p_update = false);
void seek_delta(
struct AnimationPlayerData *player, float p_time, float p_delta);
float get_current_animation_position(struct AnimationPlayerData *player);
float get_current_animation_length(struct AnimationPlayerData *player);
void advance(struct AnimationPlayerData *player, float p_time);