2014-02-09 22:10:30 -03:00
/**************************************************************************/
/* animation.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2018-01-05 00:50:27 +01:00
2014-02-09 22:10:30 -03:00
# pragma once
2020-11-07 19:33:38 -03:00
# include "core/io/resource.h"
2021-10-20 20:42:22 -03:00
# include "core/templates/local_vector.h"
2019-08-10 07:28:17 -05:00
2020-12-20 11:46:44 +01:00
# define ANIM_MIN_LENGTH 0.001
2014-02-09 22:10:30 -03:00
class Animation : public Resource {
2017-01-02 23:03:46 -03:00
GDCLASS ( Animation , Resource ) ;
2017-06-15 19:44:11 -03:00
RES_BASE_EXTENSION ( " anim " ) ;
2014-02-09 22:10:30 -03:00
2017-03-05 16:44:50 +01:00
public :
2024-01-06 02:21:38 +09:00
typedef uint32_t TypeHash ;
2024-05-14 13:28:56 +02:00
static inline String PARAMETERS_BASE_PATH = " parameters/ " ;
2025-04-28 21:09:43 +02:00
static constexpr real_t DEFAULT_STEP = 1.0 / 30 ;
2024-05-14 13:28:56 +02:00
2024-06-05 14:12:52 +03:00
enum TrackType : uint8_t {
2023-12-31 16:05:34 +09:00
TYPE_VALUE , // Set a value in a property, can be interpolated.
TYPE_POSITION_3D , // Position 3D track, can be compressed.
TYPE_ROTATION_3D , // Rotation 3D track, can be compressed.
TYPE_SCALE_3D , // Scale 3D track, can be compressed.
TYPE_BLEND_SHAPE , // Blend Shape track, can be compressed.
TYPE_METHOD , // Call any method on a specific node.
TYPE_BEZIER , // Bezier curve.
2018-06-07 12:46:14 -03:00
TYPE_AUDIO ,
TYPE_ANIMATION ,
2014-02-09 22:10:30 -03:00
} ;
2024-06-05 14:12:52 +03:00
enum InterpolationType : uint8_t {
2014-02-09 22:10:30 -03:00
INTERPOLATION_NEAREST ,
INTERPOLATION_LINEAR ,
2022-07-29 04:55:10 +09:00
INTERPOLATION_CUBIC ,
2022-08-26 11:42:00 +09:00
INTERPOLATION_LINEAR_ANGLE ,
INTERPOLATION_CUBIC_ANGLE ,
2014-02-09 22:10:30 -03:00
} ;
2024-06-05 14:12:52 +03:00
enum UpdateMode : uint8_t {
2016-06-19 01:43:02 -03:00
UPDATE_CONTINUOUS ,
UPDATE_DISCRETE ,
2018-06-07 12:46:14 -03:00
UPDATE_CAPTURE ,
2021-10-15 22:25:00 +09:00
} ;
2016-06-19 01:43:02 -03:00
2024-06-05 14:12:52 +03:00
enum LoopMode : uint8_t {
2021-10-15 22:25:00 +09:00
LOOP_NONE ,
LOOP_LINEAR ,
LOOP_PINGPONG ,
2016-06-19 01:43:02 -03:00
} ;
2024-01-08 06:08:10 +09:00
// LoopedFlag is used in Animataion to "process the keys at both ends correct".
2024-06-05 14:12:52 +03:00
enum LoopedFlag : uint8_t {
2022-11-29 18:51:45 +09:00
LOOPED_FLAG_NONE ,
LOOPED_FLAG_END ,
LOOPED_FLAG_START ,
} ;
2024-06-05 14:12:52 +03:00
enum FindMode : uint8_t {
2022-12-08 21:38:01 +09:00
FIND_MODE_NEAREST ,
FIND_MODE_APPROX ,
FIND_MODE_EXACT ,
} ;
2022-08-22 19:45:30 +09:00
# ifdef TOOLS_ENABLED
2024-08-30 19:36:54 +03:00
enum HandleMode {
2021-09-03 10:02:53 -04:00
HANDLE_MODE_FREE ,
2022-08-22 19:45:30 +09:00
HANDLE_MODE_LINEAR ,
2021-09-03 10:02:53 -04:00
HANDLE_MODE_BALANCED ,
2022-08-22 19:45:30 +09:00
HANDLE_MODE_MIRRORED ,
2021-09-03 10:02:53 -04:00
} ;
2024-08-30 19:36:54 +03:00
enum HandleSetMode {
2022-08-22 19:45:30 +09:00
HANDLE_SET_MODE_NONE ,
HANDLE_SET_MODE_RESET ,
HANDLE_SET_MODE_AUTO ,
} ;
# endif // TOOLS_ENABLED
2021-09-03 10:02:53 -04:00
2014-02-09 22:10:30 -03:00
struct Track {
2021-02-09 18:24:36 +01:00
TrackType type = TrackType : : TYPE_ANIMATION ;
InterpolationType interpolation = INTERPOLATION_LINEAR ;
bool loop_wrap = true ;
2024-01-06 02:21:38 +09:00
NodePath path ; // Path to something.
TypeHash thash = 0 ; // Hash by Path + SubPath + TrackType.
2021-02-09 18:24:36 +01:00
bool imported = false ;
2021-03-02 09:15:01 +01:00
bool enabled = true ;
2014-02-09 22:10:30 -03:00
virtual ~ Track ( ) { }
} ;
2024-06-05 14:12:52 +03:00
private :
2014-02-09 22:10:30 -03:00
struct Key {
2021-08-09 17:15:17 -05:00
real_t transition = 1.0 ;
2023-12-31 16:05:34 +09:00
double time = 0.0 ; // Time in secs.
2014-02-09 22:10:30 -03:00
} ;
2016-03-09 00:00:52 +01:00
2023-12-31 16:05:34 +09:00
// Transform key holds either Vector3 or Quaternion.
2014-02-09 22:10:30 -03:00
template < typename T >
struct TKey : public Key {
T value ;
} ;
2016-03-09 00:00:52 +01:00
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
const int32_t POSITION_TRACK_SIZE = 5 ;
const int32_t ROTATION_TRACK_SIZE = 6 ;
const int32_t SCALE_TRACK_SIZE = 5 ;
2021-10-15 19:04:35 -03:00
const int32_t BLEND_SHAPE_TRACK_SIZE = 3 ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
/* POSITION TRACK */
struct PositionTrack : public Track {
2025-01-08 12:48:28 +02:00
LocalVector < TKey < Vector3 > > positions ;
2021-10-20 20:42:22 -03:00
int32_t compressed_track = - 1 ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
PositionTrack ( ) { type = TYPE_POSITION_3D ; }
2014-02-09 22:10:30 -03:00
} ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
/* ROTATION TRACK */
2021-08-22 18:24:27 -07:00
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
struct RotationTrack : public Track {
2025-01-08 12:48:28 +02:00
LocalVector < TKey < Quaternion > > rotations ;
2021-10-20 20:42:22 -03:00
int32_t compressed_track = - 1 ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
RotationTrack ( ) { type = TYPE_ROTATION_3D ; }
} ;
2016-03-09 00:00:52 +01:00
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
/* SCALE TRACK */
struct ScaleTrack : public Track {
2025-01-08 12:48:28 +02:00
LocalVector < TKey < Vector3 > > scales ;
2021-10-20 20:42:22 -03:00
int32_t compressed_track = - 1 ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
ScaleTrack ( ) { type = TYPE_SCALE_3D ; }
2014-02-09 22:10:30 -03:00
} ;
2016-03-09 00:00:52 +01:00
2021-10-15 19:04:35 -03:00
/* BLEND SHAPE TRACK */
struct BlendShapeTrack : public Track {
2025-01-08 12:48:28 +02:00
LocalVector < TKey < float > > blend_shapes ;
2021-10-20 20:42:22 -03:00
int32_t compressed_track = - 1 ;
2021-10-15 19:04:35 -03:00
BlendShapeTrack ( ) { type = TYPE_BLEND_SHAPE ; }
} ;
2014-02-09 22:10:30 -03:00
/* PROPERTY VALUE TRACK */
struct ValueTrack : public Track {
2021-02-09 18:24:36 +01:00
UpdateMode update_mode = UPDATE_CONTINUOUS ;
bool update_on_seek = false ;
2025-01-08 12:48:28 +02:00
LocalVector < TKey < Variant > > values ;
2016-03-09 00:00:52 +01:00
2016-06-19 01:43:02 -03:00
ValueTrack ( ) {
type = TYPE_VALUE ;
}
2014-02-09 22:10:30 -03:00
} ;
/* METHOD TRACK */
2016-03-09 00:00:52 +01:00
2014-02-09 22:10:30 -03:00
struct MethodKey : public Key {
StringName method ;
Vector < Variant > params ;
} ;
2016-03-09 00:00:52 +01:00
2014-02-09 22:10:30 -03:00
struct MethodTrack : public Track {
2025-01-08 12:48:28 +02:00
LocalVector < MethodKey > methods ;
2014-02-09 22:10:30 -03:00
MethodTrack ( ) { type = TYPE_METHOD ; }
2016-03-09 00:00:52 +01:00
} ;
2018-06-07 12:46:14 -03:00
/* BEZIER TRACK */
2024-01-08 06:08:10 +09:00
2018-06-07 12:46:14 -03:00
struct BezierKey {
2023-12-31 16:05:34 +09:00
Vector2 in_handle ; // Relative (x always <0)
Vector2 out_handle ; // Relative (x always >0)
2021-08-09 17:15:17 -05:00
real_t value = 0.0 ;
2022-08-22 19:45:30 +09:00
# ifdef TOOLS_ENABLED
HandleMode handle_mode = HANDLE_MODE_FREE ;
# endif // TOOLS_ENABLED
2018-06-07 12:46:14 -03:00
} ;
struct BezierTrack : public Track {
2025-01-08 12:48:28 +02:00
LocalVector < TKey < BezierKey > > values ;
2018-06-07 12:46:14 -03:00
BezierTrack ( ) {
type = TYPE_BEZIER ;
}
} ;
/* AUDIO TRACK */
struct AudioKey {
2022-05-03 01:43:50 +02:00
Ref < Resource > stream ;
2023-12-31 16:05:34 +09:00
real_t start_offset = 0.0 ; // Offset from start.
real_t end_offset = 0.0 ; // Offset from end, if 0 then full length or infinite.
2018-06-07 12:46:14 -03:00
AudioKey ( ) {
}
} ;
struct AudioTrack : public Track {
2025-01-08 12:48:28 +02:00
LocalVector < TKey < AudioKey > > values ;
2023-01-28 03:25:49 +09:00
bool use_blend = true ;
2018-06-07 12:46:14 -03:00
AudioTrack ( ) {
type = TYPE_AUDIO ;
}
} ;
2024-01-08 06:08:10 +09:00
/* ANIMATION TRACK */
2018-06-07 12:46:14 -03:00
struct AnimationTrack : public Track {
2025-01-08 12:48:28 +02:00
LocalVector < TKey < StringName > > values ;
2018-06-07 12:46:14 -03:00
AnimationTrack ( ) {
type = TYPE_ANIMATION ;
}
} ;
2024-08-31 15:57:34 +09:00
/* Marker */
struct MarkerKey {
double time ;
StringName name ;
MarkerKey ( double p_time , const StringName & p_name ) :
time ( p_time ) , name ( p_name ) { }
MarkerKey ( ) = default ;
} ;
2025-01-08 12:48:28 +02:00
LocalVector < MarkerKey > marker_names ; // time -> name
2024-08-31 15:57:34 +09:00
HashMap < StringName , double > marker_times ; // name -> time
HashMap < StringName , Color > marker_colors ; // name -> color
2025-01-08 12:48:28 +02:00
LocalVector < Track * > tracks ;
2014-02-09 22:10:30 -03:00
template < typename T , typename V >
2021-05-21 02:42:37 -04:00
int _insert ( double p_time , T & p_keys , const V & p_value ) ;
2014-02-09 22:10:30 -03:00
2025-01-08 12:48:28 +02:00
int _marker_insert ( double p_time , LocalVector < MarkerKey > & p_keys , const MarkerKey & p_value ) ;
2024-08-31 15:57:34 +09:00
2014-02-09 22:10:30 -03:00
template < typename K >
2021-10-15 22:25:00 +09:00
2025-01-08 12:48:28 +02:00
inline int _find ( const LocalVector < K > & p_keys , double p_time , bool p_backward = false , bool p_limit = false ) const ;
2016-03-09 00:00:52 +01:00
2021-08-09 17:15:17 -05:00
_FORCE_INLINE_ Vector3 _interpolate ( const Vector3 & p_a , const Vector3 & p_b , real_t p_c ) const ;
_FORCE_INLINE_ Quaternion _interpolate ( const Quaternion & p_a , const Quaternion & p_b , real_t p_c ) const ;
_FORCE_INLINE_ Variant _interpolate ( const Variant & p_a , const Variant & p_b , real_t p_c ) const ;
_FORCE_INLINE_ real_t _interpolate ( const real_t & p_a , const real_t & p_b , real_t p_c ) const ;
2022-08-26 11:42:00 +09:00
_FORCE_INLINE_ Variant _interpolate_angle ( const Variant & p_a , const Variant & p_b , real_t p_c ) const ;
2014-02-09 22:10:30 -03:00
2022-07-29 04:55:10 +09:00
_FORCE_INLINE_ Vector3 _cubic_interpolate_in_time ( const Vector3 & p_pre_a , const Vector3 & p_a , const Vector3 & p_b , const Vector3 & p_post_b , real_t p_c , real_t p_pre_a_t , real_t p_b_t , real_t p_post_b_t ) const ;
_FORCE_INLINE_ Quaternion _cubic_interpolate_in_time ( const Quaternion & p_pre_a , const Quaternion & p_a , const Quaternion & p_b , const Quaternion & p_post_b , real_t p_c , real_t p_pre_a_t , real_t p_b_t , real_t p_post_b_t ) const ;
_FORCE_INLINE_ Variant _cubic_interpolate_in_time ( const Variant & p_pre_a , const Variant & p_a , const Variant & p_b , const Variant & p_post_b , real_t p_c , real_t p_pre_a_t , real_t p_b_t , real_t p_post_b_t ) const ;
_FORCE_INLINE_ real_t _cubic_interpolate_in_time ( const real_t & p_pre_a , const real_t & p_a , const real_t & p_b , const real_t & p_post_b , real_t p_c , real_t p_pre_a_t , real_t p_b_t , real_t p_post_b_t ) const ;
2022-08-26 11:42:00 +09:00
_FORCE_INLINE_ Variant _cubic_interpolate_angle_in_time ( const Variant & p_pre_a , const Variant & p_a , const Variant & p_b , const Variant & p_post_b , real_t p_c , real_t p_pre_a_t , real_t p_b_t , real_t p_post_b_t ) const ;
2022-07-29 04:55:10 +09:00
2014-02-09 22:10:30 -03:00
template < typename T >
2025-01-08 12:48:28 +02:00
_FORCE_INLINE_ T _interpolate ( const LocalVector < TKey < T > > & p_keys , double p_time , InterpolationType p_interp , bool p_loop_wrap , bool * p_ok , bool p_backward = false ) const ;
2014-02-09 22:10:30 -03:00
2018-06-07 12:46:14 -03:00
template < typename T >
2025-01-08 12:48:28 +02:00
_FORCE_INLINE_ void _track_get_key_indices_in_range ( const LocalVector < T > & p_array , double from_time , double to_time , List < int > * p_indices , bool p_is_backward ) const ;
2018-06-07 12:46:14 -03:00
2021-05-21 02:42:37 -04:00
double length = 1.0 ;
2024-10-22 13:43:42 +02:00
real_t step = DEFAULT_STEP ;
2021-10-15 22:25:00 +09:00
LoopMode loop_mode = LOOP_NONE ;
2024-05-02 11:23:11 +09:00
bool capture_included = false ;
void _check_capture_included ( ) ;
2016-03-09 00:00:52 +01:00
2024-01-06 02:21:38 +09:00
void _track_update_hash ( int p_track ) ;
2021-10-20 20:42:22 -03:00
/* Animation compression page format (version 1):
*
* Animation uses bitwidth based compression separated into small pages . The intention is that pages fit easily in the cache , so decoding is cache efficient .
* The page - based nature also makes future animation streaming from disk possible .
*
* Actual format :
*
* num_compressed_tracks = bounds . size ( )
* header : ( x num_compressed_tracks )
* - - - - - - -
* timeline_keys_offset : uint32_t - offset to time keys
* timeline_size : uint32_t - amount of time keys
* data_keys_offset : uint32_t offset to key data
*
* time key ( uint32_t ) :
* - - - - - - - - - - - - - - - - - -
* frame : bits 0 - 15 - time offset of key , computed as : page . time_offset + frame * ( 1.0 / fps )
* data_key_offset : bits 16 - 27 - offset to key data , computed as : data_keys_offset * 4 + data_key_offset
* data_key_count : bits 28 - 31 - amount of data keys pointed to , computed as : data_key_count + 1 ( max 16 )
*
* data key :
* - - - - - - - - -
* X / Blend Shape : uint16_t - X coordinate of XYZ vector key , or Blend Shape value . If Blend shape , Y and Z are not present and can be ignored .
* Y : uint16_t
* Z : uint16_t
* If data_key_count + 1 > 1 ( if more than 1 key is stored ) :
* data_bitwidth : uint16_t - This is only present if data_key_count > 1. Contains delta bitwidth information .
* X / Blend Shape delta bitwidth : bits 0 - 3 -
* if 0 , nothing is present for X ( use the first key - value for subsequent keys ) ,
* else assume the number of bits present for each element ( + 1 for sign ) . Assumed always 16 bits , delta max signed 15 bits , with underflow and overflow supported .
* Y delta bitwidth : bits 4 - 7
* Z delta bitwidth : bits 8 - 11
* FRAME delta bitwidth : 12 - 15 bits - always present ( obviously ) , actual bitwidth is FRAME + 1
* Data key is 4 bytes long for Blend Shapes , 8 bytes long for pos / rot / scale .
*
* delta keys :
* - - - - - - - - - - -
* Compressed format is packed in the following format after the data key , containing delta keys one after the next in a tightly bit packed fashion .
* FRAME bits - > X / Blend Shape Bits ( if bitwidth > 0 ) - > Y Bits ( if not Blend Shape and Y Bitwidth > 0 ) - > Z Bits ( if not Blend Shape and Z Bitwidth > 0 )
*
* data key format :
* - - - - - - - - - - - - - - - -
* Decoding keys means starting from the base key and going key by key applying deltas until the proper position is reached needed for interpolation .
* Resulting values are uint32_t
* data for X / Blend Shape , Y and Z must be normalized first : unorm = float ( data ) / 65535.0
* * * Blend Shape * * : ( unorm * 2.0 - 1.0 ) * Compression : : BLEND_SHAPE_RANGE
* * * Pos / Scale * * : unorm_vec3 * bounds [ track ] . size + bounds [ track ] . position
2025-04-10 11:21:05 -05:00
* * * Rotation * * : Quaternion ( Vector3 : : octahedron_decode ( unorm_vec3 . xy ) , unorm_vec3 . z * Math : : PI * 2.0 )
2021-10-20 20:42:22 -03:00
* * * Frame * * : page . time_offset + frame * ( 1.0 / fps )
*/
struct Compression {
enum {
MAX_DATA_TRACK_SIZE = 16384 ,
2023-12-31 16:05:34 +09:00
BLEND_SHAPE_RANGE = 8 , // -8.0 to 8.0.
2021-10-20 20:42:22 -03:00
FORMAT_VERSION = 1
} ;
struct Page {
Vector < uint8_t > data ;
double time_offset ;
} ;
uint32_t fps = 120 ;
LocalVector < Page > pages ;
2023-12-31 16:05:34 +09:00
LocalVector < AABB > bounds ; // Used by position and scale tracks (which contain index to track and index to bounds).
2021-10-20 20:42:22 -03:00
bool enabled = false ;
} compression ;
Vector3i _compress_key ( uint32_t p_track , const AABB & p_bounds , int32_t p_key = - 1 , float p_time = 0.0 ) ;
bool _rotation_interpolate_compressed ( uint32_t p_compressed_track , double p_time , Quaternion & r_ret ) const ;
bool _pos_scale_interpolate_compressed ( uint32_t p_compressed_track , double p_time , Vector3 & r_ret ) const ;
bool _blend_shape_interpolate_compressed ( uint32_t p_compressed_track , double p_time , float & r_ret ) const ;
template < uint32_t COMPONENTS >
bool _fetch_compressed ( uint32_t p_compressed_track , double p_time , Vector3i & r_current_value , double & r_current_time , Vector3i & r_next_value , double & r_next_time , uint32_t * key_index = nullptr ) const ;
template < uint32_t COMPONENTS >
bool _fetch_compressed_by_index ( uint32_t p_compressed_track , int p_index , Vector3i & r_value , double & r_time ) const ;
int _get_compressed_key_count ( uint32_t p_compressed_track ) const ;
template < uint32_t COMPONENTS >
void _get_compressed_key_indices_in_range ( uint32_t p_compressed_track , double p_time , double p_delta , List < int > * r_indices ) const ;
_FORCE_INLINE_ Quaternion _uncompress_quaternion ( const Vector3i & p_value ) const ;
_FORCE_INLINE_ Vector3 _uncompress_pos_scale ( uint32_t p_compressed_track , const Vector3i & p_value ) const ;
_FORCE_INLINE_ float _uncompress_blend_shape ( const Vector3i & p_value ) const ;
2014-02-09 22:10:30 -03:00
// bind helpers
2016-03-09 00:00:52 +01:00
private :
2025-04-22 12:58:29 -05:00
bool _float_track_optimize_key ( const TKey < float > t0 , const TKey < float > t1 , const TKey < float > t2 , real_t p_allowed_velocity_err , real_t p_allowed_precision_error , bool p_is_nearest ) ;
bool _vector2_track_optimize_key ( const TKey < Vector2 > t0 , const TKey < Vector2 > t1 , const TKey < Vector2 > t2 , real_t p_allowed_velocity_err , real_t p_allowed_angular_error , real_t p_allowed_precision_error , bool p_is_nearest ) ;
bool _vector3_track_optimize_key ( const TKey < Vector3 > t0 , const TKey < Vector3 > t1 , const TKey < Vector3 > t2 , real_t p_allowed_velocity_err , real_t p_allowed_angular_error , real_t p_allowed_precision_error , bool p_is_nearest ) ;
bool _quaternion_track_optimize_key ( const TKey < Quaternion > t0 , const TKey < Quaternion > t1 , const TKey < Quaternion > t2 , real_t p_allowed_velocity_err , real_t p_allowed_angular_error , real_t p_allowed_precision_error , bool p_is_nearest ) ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
2022-08-07 10:55:37 +09:00
void _position_track_optimize ( int p_idx , real_t p_allowed_velocity_err , real_t p_allowed_angular_err , real_t p_allowed_precision_error ) ;
void _rotation_track_optimize ( int p_idx , real_t p_allowed_velocity_err , real_t p_allowed_angular_error , real_t p_allowed_precision_error ) ;
void _scale_track_optimize ( int p_idx , real_t p_allowed_velocity_err , real_t p_allowed_angular_err , real_t p_allowed_precision_error ) ;
void _blend_shape_track_optimize ( int p_idx , real_t p_allowed_velocity_err , real_t p_allowed_precision_error ) ;
2022-08-27 07:55:08 +09:00
void _value_track_optimize ( int p_idx , real_t p_allowed_velocity_err , real_t p_allowed_angular_err , real_t p_allowed_precision_error ) ;
2014-02-09 22:10:30 -03:00
2016-03-09 00:00:52 +01:00
protected :
2014-02-09 22:10:30 -03:00
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 ;
2016-03-09 00:00:52 +01:00
2021-02-11 14:18:45 -03:00
virtual void reset_state ( ) override ;
2016-03-09 00:00:52 +01:00
static void _bind_methods ( ) ;
2023-11-10 21:29:45 +09:00
static bool inform_variant_array ( int & r_min , int & r_max ) ; // Returns true if max and min are swapped.
2023-12-30 15:26:17 +09:00
# ifndef DISABLE_DEPRECATED
Vector3 _position_track_interpolate_bind_compat_86629 ( int p_track , double p_time ) const ;
Quaternion _rotation_track_interpolate_bind_compat_86629 ( int p_track , double p_time ) const ;
Vector3 _scale_track_interpolate_bind_compat_86629 ( int p_track , double p_time ) const ;
float _blend_shape_track_interpolate_bind_compat_86629 ( int p_track , double p_time ) const ;
Variant _value_track_interpolate_bind_compat_86629 ( int p_track , double p_time ) const ;
2024-06-07 17:51:19 +09:00
int _track_find_key_bind_compat_92861 ( int p_track , double p_time , FindMode p_find_mode = FIND_MODE_NEAREST ) const ;
2023-12-30 15:26:17 +09:00
static void _bind_compatibility_methods ( ) ;
# endif // DISABLE_DEPRECATED
2014-02-09 22:10:30 -03:00
public :
int add_track ( TrackType p_type , int p_at_pos = - 1 ) ;
void remove_track ( int p_track ) ;
2025-01-08 12:48:28 +02:00
_FORCE_INLINE_ const LocalVector < Track * > & get_tracks ( ) {
2024-06-05 14:12:52 +03:00
return tracks ;
}
2024-05-02 11:23:11 +09:00
bool is_capture_included ( ) const ;
2014-02-09 22:10:30 -03:00
int get_track_count ( ) const ;
TrackType track_get_type ( int p_track ) const ;
2016-03-09 00:00:52 +01:00
2014-02-09 22:10:30 -03:00
void track_set_path ( int p_track , const NodePath & p_path ) ;
NodePath track_get_path ( int p_track ) const ;
2021-10-16 10:04:09 +09:00
int find_track ( const NodePath & p_path , const TrackType p_type ) const ;
2014-02-09 22:10:30 -03:00
2024-01-06 02:21:38 +09:00
TypeHash track_get_type_hash ( int p_track ) const ;
2014-02-09 22:10:30 -03:00
void track_move_up ( int p_track ) ;
void track_move_down ( int p_track ) ;
2019-05-25 13:01:44 -03:00
void track_move_to ( int p_track , int p_to_index ) ;
2018-06-07 12:46:14 -03:00
void track_swap ( int p_track , int p_with_track ) ;
2014-02-09 22:10:30 -03:00
2016-06-20 00:19:04 -03:00
void track_set_imported ( int p_track , bool p_imported ) ;
bool track_is_imported ( int p_track ) const ;
2017-11-28 16:46:37 +01:00
void track_set_enabled ( int p_track , bool p_enabled ) ;
bool track_is_enabled ( int p_track ) const ;
2021-12-20 17:15:21 +08:00
int track_insert_key ( int p_track , double p_time , const Variant & p_key , real_t p_transition = 1 ) ;
2021-08-09 17:15:17 -05:00
void track_set_key_transition ( int p_track , int p_key_idx , real_t p_transition ) ;
2014-02-09 22:10:30 -03:00
void track_set_key_value ( int p_track , int p_key_idx , const Variant & p_value ) ;
2021-05-21 02:42:37 -04:00
void track_set_key_time ( int p_track , int p_key_idx , double p_time ) ;
2024-06-07 17:51:19 +09:00
int track_find_key ( int p_track , double p_time , FindMode p_find_mode = FIND_MODE_NEAREST , bool p_limit = false , bool p_backward = false ) const ;
2014-02-09 22:10:30 -03:00
void track_remove_key ( int p_track , int p_idx ) ;
2021-05-21 02:42:37 -04:00
void track_remove_key_at_time ( int p_track , double p_time ) ;
2014-02-09 22:10:30 -03:00
int track_get_key_count ( int p_track ) const ;
Variant track_get_key_value ( int p_track , int p_key_idx ) const ;
2021-05-21 02:42:37 -04:00
double track_get_key_time ( int p_track , int p_key_idx ) const ;
2021-08-09 17:15:17 -05:00
real_t track_get_key_transition ( int p_track , int p_key_idx ) const ;
2021-10-20 20:42:22 -03:00
bool track_is_compressed ( int p_track ) const ;
2014-02-09 22:10:30 -03:00
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
int position_track_insert_key ( int p_track , double p_time , const Vector3 & p_position ) ;
Error position_track_get_key ( int p_track , int p_key , Vector3 * r_position ) const ;
2023-12-30 15:26:17 +09:00
Error try_position_track_interpolate ( int p_track , double p_time , Vector3 * r_interpolation , bool p_backward = false ) const ;
Vector3 position_track_interpolate ( int p_track , double p_time , bool p_backward = false ) const ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
int rotation_track_insert_key ( int p_track , double p_time , const Quaternion & p_rotation ) ;
Error rotation_track_get_key ( int p_track , int p_key , Quaternion * r_rotation ) const ;
2023-12-30 15:26:17 +09:00
Error try_rotation_track_interpolate ( int p_track , double p_time , Quaternion * r_interpolation , bool p_backward = false ) const ;
Quaternion rotation_track_interpolate ( int p_track , double p_time , bool p_backward = false ) const ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
int scale_track_insert_key ( int p_track , double p_time , const Vector3 & p_scale ) ;
Error scale_track_get_key ( int p_track , int p_key , Vector3 * r_scale ) const ;
2023-12-30 15:26:17 +09:00
Error try_scale_track_interpolate ( int p_track , double p_time , Vector3 * r_interpolation , bool p_backward = false ) const ;
Vector3 scale_track_interpolate ( int p_track , double p_time , bool p_backward = false ) const ;
Remove animation 3D transform track, replace by loc/rot/scale tracks.
* `Animation.TYPE_TRANSFORM3D` track is gone.
* Added POSITION_3D, ROTATION_3D, SCALE_3D tracks.
* GLTF2, Collada, FBX importers will only import the track types found.
* Skeleton3D bone poses are now Pos/Rot/Scale, pose matrix removed.
* AnimationPlayer and AnimationTree animate these tracks separately, only when found.
* Removed BakeReset code, is useless with these changes.
This is the first in a series of commits designed to make the animation system in Godot more useful, which includes:
* Better compatibility with Autodesk products
* Better reusability of animations across models (including retargeting).
* Proper animation compression.
* etc.
*Note* GLTF2 animation saving went broken with this PR, needs to be fixed in a subsequent one.
2021-10-11 19:20:58 -03:00
2021-10-15 19:04:35 -03:00
int blend_shape_track_insert_key ( int p_track , double p_time , float p_blend ) ;
Error blend_shape_track_get_key ( int p_track , int p_key , float * r_blend ) const ;
2023-12-30 15:26:17 +09:00
Error try_blend_shape_track_interpolate ( int p_track , double p_time , float * r_blend , bool p_backward = false ) const ;
float blend_shape_track_interpolate ( int p_track , double p_time , bool p_backward = false ) const ;
2021-10-15 19:04:35 -03:00
2014-02-09 22:10:30 -03:00
void track_set_interpolation_type ( int p_track , InterpolationType p_interp ) ;
InterpolationType track_get_interpolation_type ( int p_track ) const ;
2024-07-04 09:58:07 +01:00
Array make_default_bezier_key ( float p_value ) ;
2022-08-22 19:45:30 +09:00
int bezier_track_insert_key ( int p_track , double p_time , real_t p_value , const Vector2 & p_in_handle , const Vector2 & p_out_handle ) ;
2021-08-09 17:15:17 -05:00
void bezier_track_set_key_value ( int p_track , int p_index , real_t p_value ) ;
2022-08-22 19:45:30 +09:00
void bezier_track_set_key_in_handle ( int p_track , int p_index , const Vector2 & p_handle , real_t p_balanced_value_time_ratio = 1.0 ) ;
void bezier_track_set_key_out_handle ( int p_track , int p_index , const Vector2 & p_handle , real_t p_balanced_value_time_ratio = 1.0 ) ;
2021-08-09 17:15:17 -05:00
real_t bezier_track_get_key_value ( int p_track , int p_index ) const ;
2018-06-07 12:46:14 -03:00
Vector2 bezier_track_get_key_in_handle ( int p_track , int p_index ) const ;
Vector2 bezier_track_get_key_out_handle ( int p_track , int p_index ) const ;
2022-08-22 19:45:30 +09:00
# ifdef TOOLS_ENABLED
void bezier_track_set_key_handle_mode ( int p_track , int p_index , HandleMode p_mode , HandleSetMode p_set_mode = HANDLE_SET_MODE_NONE ) ;
HandleMode bezier_track_get_key_handle_mode ( int p_track , int p_index ) const ;
2024-09-17 16:13:21 +01:00
bool bezier_track_calculate_handles ( int p_track , int p_index , HandleMode p_mode , HandleSetMode p_set_mode , Vector2 * r_in_handle , Vector2 * r_out_handle ) ;
bool bezier_track_calculate_handles ( float p_time , float p_prev_time , float p_prev_value , float p_next_time , float p_next_value , HandleMode p_mode , HandleSetMode p_set_mode , Vector2 * r_in_handle , Vector2 * r_out_handle ) ;
2022-08-22 19:45:30 +09:00
# endif // TOOLS_ENABLED
2018-06-07 12:46:14 -03:00
2021-08-09 17:15:17 -05:00
real_t bezier_track_interpolate ( int p_track , double p_time ) const ;
2018-06-07 12:46:14 -03:00
2022-05-03 01:43:50 +02:00
int audio_track_insert_key ( int p_track , double p_time , const Ref < Resource > & p_stream , real_t p_start_offset = 0 , real_t p_end_offset = 0 ) ;
void audio_track_set_key_stream ( int p_track , int p_key , const Ref < Resource > & p_stream ) ;
2021-08-09 17:15:17 -05:00
void audio_track_set_key_start_offset ( int p_track , int p_key , real_t p_offset ) ;
void audio_track_set_key_end_offset ( int p_track , int p_key , real_t p_offset ) ;
2022-05-03 01:43:50 +02:00
Ref < Resource > audio_track_get_key_stream ( int p_track , int p_key ) const ;
2021-08-09 17:15:17 -05:00
real_t audio_track_get_key_start_offset ( int p_track , int p_key ) const ;
real_t audio_track_get_key_end_offset ( int p_track , int p_key ) const ;
2023-01-28 03:25:49 +09:00
void audio_track_set_use_blend ( int p_track , bool p_enable ) ;
bool audio_track_is_use_blend ( int p_track ) const ;
2018-06-07 12:46:14 -03:00
2021-05-21 02:42:37 -04:00
int animation_track_insert_key ( int p_track , double p_time , const StringName & p_animation ) ;
2018-06-07 12:46:14 -03:00
void animation_track_set_key_animation ( int p_track , int p_key , const StringName & p_animation ) ;
StringName animation_track_get_key_animation ( int p_track , int p_key ) const ;
2017-01-09 00:41:16 -03:00
void track_set_interpolation_loop_wrap ( int p_track , bool p_enable ) ;
bool track_get_interpolation_loop_wrap ( int p_track ) const ;
2016-03-09 00:00:52 +01:00
2023-12-30 15:26:17 +09:00
Variant value_track_interpolate ( int p_track , double p_time , bool p_backward = false ) const ;
2016-06-19 01:43:02 -03:00
void value_track_set_update_mode ( int p_track , UpdateMode p_mode ) ;
UpdateMode value_track_get_update_mode ( int p_track ) const ;
2014-02-09 22:10:30 -03:00
Vector < Variant > method_track_get_params ( int p_track , int p_key_idx ) const ;
StringName method_track_get_name ( int p_track , int p_key_idx ) const ;
2017-12-07 10:18:55 -03:00
void copy_track ( int p_track , Ref < Animation > p_to_animation ) ;
2022-11-29 18:51:45 +09:00
void track_get_key_indices_in_range ( int p_track , double p_time , double p_delta , List < int > * p_indices , Animation : : LoopedFlag p_looped_flag = Animation : : LOOPED_FLAG_NONE ) const ;
2018-06-07 12:46:14 -03:00
2024-08-31 15:57:34 +09:00
void add_marker ( const StringName & p_name , double p_time ) ;
void remove_marker ( const StringName & p_name ) ;
bool has_marker ( const StringName & p_name ) const ;
StringName get_marker_at_time ( double p_time ) const ;
StringName get_next_marker ( double p_time ) const ;
StringName get_prev_marker ( double p_time ) const ;
double get_marker_time ( const StringName & p_time ) const ;
PackedStringArray get_marker_names ( ) const ;
Color get_marker_color ( const StringName & p_name ) const ;
void set_marker_color ( const StringName & p_name , const Color & p_color ) ;
2021-08-09 17:15:17 -05:00
void set_length ( real_t p_length ) ;
real_t get_length ( ) const ;
2016-03-09 00:00:52 +01:00
2021-10-15 22:25:00 +09:00
void set_loop_mode ( LoopMode p_loop_mode ) ;
LoopMode get_loop_mode ( ) const ;
2014-02-09 22:10:30 -03:00
2021-08-09 17:15:17 -05:00
void set_step ( real_t p_step ) ;
real_t get_step ( ) const ;
2014-02-09 22:10:30 -03:00
void clear ( ) ;
2022-08-07 10:55:37 +09:00
void optimize ( real_t p_allowed_velocity_err = 0.01 , real_t p_allowed_angular_err = 0.01 , int p_precision = 3 ) ;
2023-12-31 16:05:34 +09:00
void compress ( uint32_t p_page_size = 8192 , uint32_t p_fps = 120 , float p_split_tolerance = 4.0 ) ; // 4.0 seems to be the split tolerance sweet spot from many tests.
2014-02-09 22:10:30 -03:00
2025-06-12 05:01:00 +09:00
// Helper functions for Rotation.
static double interpolate_via_rest ( double p_from , double p_to , double p_weight , double p_rest = 0.0 ) ; // Deterministic slerp to prevent to cross the inverted rest axis.
static Quaternion interpolate_via_rest ( const Quaternion & p_from , const Quaternion & p_to , real_t p_weight , const Quaternion & p_rest = Quaternion ( ) ) ; // Deterministic slerp to prevent to cross the inverted rest axis.
2023-11-10 21:29:45 +09:00
// Helper functions for Variant.
static bool is_variant_interpolatable ( const Variant p_value ) ;
2025-06-01 06:50:42 +09:00
static bool validate_type_match ( const Variant & p_from , Variant & r_to ) ;
2023-11-10 21:29:45 +09:00
static Variant cast_to_blendwise ( const Variant p_value ) ;
static Variant cast_from_blendwise ( const Variant p_value , const Variant : : Type p_type ) ;
static Variant string_to_array ( const Variant p_value ) ;
static Variant array_to_string ( const Variant p_value ) ;
2022-09-06 12:24:06 +09:00
static Variant add_variant ( const Variant & a , const Variant & b ) ;
static Variant subtract_variant ( const Variant & a , const Variant & b ) ;
static Variant blend_variant ( const Variant & a , const Variant & b , float c ) ;
2023-11-10 21:29:45 +09:00
static Variant interpolate_variant ( const Variant & a , const Variant & b , float c , bool p_snap_array_element = false ) ;
2023-12-29 17:39:49 +09:00
static Variant cubic_interpolate_in_time_variant ( const Variant & pre_a , const Variant & a , const Variant & b , const Variant & post_b , float c , real_t p_pre_a_t , real_t p_b_t , real_t p_post_b_t , bool p_snap_array_element = false ) ;
2022-09-06 12:24:06 +09:00
2024-07-24 01:00:42 +09:00
static bool is_less_or_equal_approx ( double a , double b ) {
return a < b | | Math : : is_equal_approx ( a , b ) ;
}
static bool is_less_approx ( double a , double b ) {
return a < b & & ! Math : : is_equal_approx ( a , b ) ;
}
static bool is_greater_or_equal_approx ( double a , double b ) {
return a > b | | Math : : is_equal_approx ( a , b ) ;
}
static bool is_greater_approx ( double a , double b ) {
return a > b & & ! Math : : is_equal_approx ( a , b ) ;
}
2024-01-06 02:21:38 +09:00
static TrackType get_cache_type ( TrackType p_type ) ;
2016-03-09 00:00:52 +01:00
Animation ( ) ;
2014-02-09 22:10:30 -03:00
~ Animation ( ) ;
} ;
VARIANT_ENUM_CAST ( Animation : : TrackType ) ;
VARIANT_ENUM_CAST ( Animation : : InterpolationType ) ;
2016-06-19 01:43:02 -03:00
VARIANT_ENUM_CAST ( Animation : : UpdateMode ) ;
2021-10-15 22:25:00 +09:00
VARIANT_ENUM_CAST ( Animation : : LoopMode ) ;
2022-11-29 18:51:45 +09:00
VARIANT_ENUM_CAST ( Animation : : LoopedFlag ) ;
2022-12-08 21:38:01 +09:00
VARIANT_ENUM_CAST ( Animation : : FindMode ) ;
2022-08-22 19:45:30 +09:00
# ifdef TOOLS_ENABLED
VARIANT_ENUM_CAST ( Animation : : HandleMode ) ;
VARIANT_ENUM_CAST ( Animation : : HandleSetMode ) ;
# endif // TOOLS_ENABLED