summaryrefslogtreecommitdiff
path: root/scene/resources
diff options
context:
space:
mode:
Diffstat (limited to 'scene/resources')
-rw-r--r--scene/resources/animation.cpp45
-rw-r--r--scene/resources/animation.h20
2 files changed, 48 insertions, 17 deletions
diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp
index f7d5ddc744..e897e1515c 100644
--- a/scene/resources/animation.cpp
+++ b/scene/resources/animation.cpp
@@ -154,8 +154,20 @@ bool Animation::_set(const StringName& p_name, const Variant& p_value) {
Dictionary d = p_value;
ERR_FAIL_COND_V(!d.has("times"),false);
ERR_FAIL_COND_V(!d.has("values"),false);
- if (d.has("cont"))
- vt->continuous=d["cont"];
+ if (d.has("cont")) {
+ bool v = d["cont"];
+ vt->update_mode=v?UPDATE_CONTINUOUS:UPDATE_DISCRETE;
+ }
+
+ if (d.has("update")) {
+ int um =d["update"];
+ if (um<0)
+ um=0;
+ else if (um>2)
+ um=2;
+ vt->update_mode=UpdateMode(um);
+ }
+
DVector<float> times=d["times"];
Array values=d["values"];
@@ -353,7 +365,7 @@ bool Animation::_get(const StringName& p_name,Variant &r_ret) const {
d["transitions"]=key_transitions;
d["values"]=key_values;
if (track_get_type(track)==TYPE_VALUE) {
- d["cont"]=value_track_is_continuous(track);
+ d["update"]=value_track_get_update_mode(track);
}
r_ret=d;
@@ -394,7 +406,7 @@ bool Animation::_get(const StringName& p_name,Variant &r_ret) const {
d["transitions"]=key_transitions;
d["values"]=key_values;
if (track_get_type(track)==TYPE_VALUE) {
- d["cont"]=value_track_is_continuous(track);
+ d["update"]=value_track_get_update_mode(track);
}
r_ret=d;
@@ -1373,7 +1385,7 @@ Variant Animation::value_track_interpolate(int p_track, float p_time) const {
bool ok;
- Variant res = _interpolate( vt->values, p_time, vt->interpolation, &ok );
+ Variant res = _interpolate( vt->values, p_time, vt->update_mode==UPDATE_CONTINUOUS?vt->interpolation:INTERPOLATION_NEAREST, &ok );
if (ok) {
@@ -1461,28 +1473,30 @@ void Animation::value_track_get_key_indices(int p_track, float p_time, float p_d
}
-void Animation::value_track_set_continuous(int p_track, bool p_continuous) {
+void Animation::value_track_set_update_mode(int p_track, UpdateMode p_mode) {
ERR_FAIL_INDEX(p_track, tracks.size());
Track *t=tracks[p_track];
ERR_FAIL_COND( t->type != TYPE_VALUE );
+ ERR_FAIL_INDEX(p_mode,3);
ValueTrack * vt = static_cast<ValueTrack*>(t);
- vt->continuous=p_continuous;
+ vt->update_mode=p_mode;
}
-bool Animation::value_track_is_continuous(int p_track) const{
+Animation::UpdateMode Animation::value_track_get_update_mode(int p_track) const {
- ERR_FAIL_INDEX_V(p_track, tracks.size(), false);
+ ERR_FAIL_INDEX_V(p_track, tracks.size(), UPDATE_CONTINUOUS);
Track *t=tracks[p_track];
- ERR_FAIL_COND_V( t->type != TYPE_VALUE, false );
+ ERR_FAIL_COND_V( t->type != TYPE_VALUE, UPDATE_CONTINUOUS );
ValueTrack * vt = static_cast<ValueTrack*>(t);
- return vt->continuous;
+ return vt->update_mode;
}
+
void Animation::_method_track_get_key_indices_in_range(const MethodTrack * mt, float from_time, float to_time,List<int> *p_indices) const {
if (from_time!=length && to_time==length)
@@ -1676,8 +1690,8 @@ void Animation::_bind_methods() {
ObjectTypeDB::bind_method(_MD("transform_track_interpolate","idx","time_sec"),&Animation::_transform_track_interpolate);
- ObjectTypeDB::bind_method(_MD("value_track_set_continuous","idx","continuous"),&Animation::value_track_set_continuous);
- ObjectTypeDB::bind_method(_MD("value_track_is_continuous","idx"),&Animation::value_track_is_continuous);
+ ObjectTypeDB::bind_method(_MD("value_track_set_update_mode","idx","mode"),&Animation::value_track_set_update_mode);
+ ObjectTypeDB::bind_method(_MD("value_track_get_update_mode","idx"),&Animation::value_track_get_update_mode);
ObjectTypeDB::bind_method(_MD("value_track_get_key_indices","idx","time_sec","delta"),&Animation::_value_track_get_key_indices);
@@ -1704,6 +1718,11 @@ void Animation::_bind_methods() {
BIND_CONSTANT( INTERPOLATION_LINEAR );
BIND_CONSTANT( INTERPOLATION_CUBIC );
+ BIND_CONSTANT( UPDATE_CONTINUOUS );
+ BIND_CONSTANT( UPDATE_DISCRETE );
+ BIND_CONSTANT( UPDATE_TRIGGER );
+
+
}
void Animation::clear() {
diff --git a/scene/resources/animation.h b/scene/resources/animation.h
index 1f2d9b80ab..5be76d7780 100644
--- a/scene/resources/animation.h
+++ b/scene/resources/animation.h
@@ -58,6 +58,13 @@ public:
INTERPOLATION_CUBIC
};
+ enum UpdateMode {
+ UPDATE_CONTINUOUS,
+ UPDATE_DISCRETE,
+ UPDATE_TRIGGER,
+
+ };
+
private:
struct Track {
@@ -105,10 +112,11 @@ private:
struct ValueTrack : public Track {
- bool continuous;
+ UpdateMode update_mode;
+ bool update_on_seek;
Vector< TKey<Variant> > values;
- ValueTrack() { type=TYPE_VALUE; continuous=true; }
+ ValueTrack() { type=TYPE_VALUE; update_mode=UPDATE_CONTINUOUS; }
};
@@ -253,8 +261,9 @@ public:
Variant value_track_interpolate(int p_track, float p_time) const;
void value_track_get_key_indices(int p_track, float p_time, float p_delta,List<int> *p_indices) const;
- void value_track_set_continuous(int p_track, bool p_continuous);
- bool value_track_is_continuous(int p_track) const;
+ void value_track_set_update_mode(int p_track, UpdateMode p_mode);
+ UpdateMode value_track_get_update_mode(int p_track) const;
+
void method_track_get_key_indices(int p_track, float p_time, float p_delta,List<int> *p_indices) const;
Vector<Variant> method_track_get_params(int p_track,int p_key_idx) const;
@@ -281,5 +290,8 @@ public:
VARIANT_ENUM_CAST( Animation::TrackType );
VARIANT_ENUM_CAST( Animation::InterpolationType );
+VARIANT_ENUM_CAST( Animation::UpdateMode );
+
+
#endif