You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
-Display on animation editor which keys are invalid and which tracks are unresolved
-Added a tool to clean up unresolved tracks and unused keys
This commit is contained in:
@@ -268,6 +268,7 @@ void AnimationPlayer::_generate_node_caches(AnimationData* p_anim) {
|
||||
TrackNodeCacheKey key;
|
||||
key.id=id;
|
||||
key.bone_idx=bone_idx;
|
||||
|
||||
|
||||
if (node_cache_map.has(key)) {
|
||||
|
||||
@@ -278,6 +279,7 @@ void AnimationPlayer::_generate_node_caches(AnimationData* p_anim) {
|
||||
node_cache_map[key]=TrackNodeCache();
|
||||
|
||||
p_anim->node_cache[i]=&node_cache_map[key];
|
||||
p_anim->node_cache[i]->path=a->track_get_path(i);
|
||||
p_anim->node_cache[i]->node=child;
|
||||
p_anim->node_cache[i]->resource=resource;
|
||||
p_anim->node_cache[i]->node_2d=child->cast_to<Node2D>();
|
||||
@@ -320,6 +322,7 @@ void AnimationPlayer::_generate_node_caches(AnimationData* p_anim) {
|
||||
pa.prop=property;
|
||||
pa.object=resource.is_valid()?(Object*)resource.ptr():(Object*)child;
|
||||
pa.special=SP_NONE;
|
||||
pa.owner=p_anim->node_cache[i];
|
||||
if (false && p_anim->node_cache[i]->node_2d) {
|
||||
|
||||
if (pa.prop==SceneStringNames::get_singleton()->transform_pos)
|
||||
@@ -410,7 +413,7 @@ void AnimationPlayer::_animation_process_animation(AnimationData* p_anim,float p
|
||||
TrackNodeCache::PropertyAnim *pa = &E->get();
|
||||
|
||||
|
||||
if (a->value_track_is_continuous(i) || p_delta==0) {
|
||||
if (a->value_track_is_continuous(i) || p_delta==0) { //delta == 0 means seek
|
||||
|
||||
|
||||
Variant value=a->value_track_interpolate(i,p_time);
|
||||
@@ -436,10 +439,42 @@ void AnimationPlayer::_animation_process_animation(AnimationData* p_anim,float p
|
||||
Variant value=a->track_get_key_value(i,F->get());
|
||||
switch(pa->special) {
|
||||
|
||||
case SP_NONE: pa->object->set(pa->prop,value); break; //you are not speshul
|
||||
case SP_NODE2D_POS: static_cast<Node2D*>(pa->object)->set_pos(value); break;
|
||||
case SP_NODE2D_ROT: static_cast<Node2D*>(pa->object)->set_rot(Math::deg2rad(value)); break;
|
||||
case SP_NODE2D_SCALE: static_cast<Node2D*>(pa->object)->set_scale(value); break;
|
||||
case SP_NONE: {
|
||||
bool valid;
|
||||
pa->object->set(pa->prop,value,&valid); //you are not speshul
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (!valid) {
|
||||
ERR_PRINTS("Failed setting track value '"+String(pa->owner->path)+"'. Check if property exists or the type of key is valid");
|
||||
}
|
||||
#endif
|
||||
|
||||
} break;
|
||||
case SP_NODE2D_POS: {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (value.get_type()!=Variant::VECTOR2) {
|
||||
ERR_PRINTS("Position key at time "+rtos(p_time)+" in Animation Track '"+String(pa->owner->path)+"' not of type Vector2()");
|
||||
}
|
||||
#endif
|
||||
static_cast<Node2D*>(pa->object)->set_pos(value);
|
||||
} break;
|
||||
case SP_NODE2D_ROT: {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (value.is_num()) {
|
||||
ERR_PRINTS("Rotation key at time "+rtos(p_time)+" in Animation Track '"+String(pa->owner->path)+"' not numerical");
|
||||
}
|
||||
#endif
|
||||
|
||||
static_cast<Node2D*>(pa->object)->set_rot(Math::deg2rad(value));
|
||||
} break;
|
||||
case SP_NODE2D_SCALE: {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (value.get_type()!=Variant::VECTOR2) {
|
||||
ERR_PRINTS("Scale key at time "+rtos(p_time)+" in Animation Track '"+String(pa->owner->path)+"' not of type Vector2()");
|
||||
}
|
||||
#endif
|
||||
|
||||
static_cast<Node2D*>(pa->object)->set_scale(value);
|
||||
} break;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -607,13 +642,53 @@ void AnimationPlayer::_animation_update_transforms() {
|
||||
ERR_CONTINUE( pa->accum_pass!=accum_pass );
|
||||
|
||||
#if 1
|
||||
switch(pa->special) {
|
||||
/* switch(pa->special) {
|
||||
|
||||
|
||||
case SP_NONE: pa->object->set(pa->prop,pa->value_accum); break; //you are not speshul
|
||||
case SP_NODE2D_POS: static_cast<Node2D*>(pa->object)->set_pos(pa->value_accum); break;
|
||||
case SP_NODE2D_ROT: static_cast<Node2D*>(pa->object)->set_rot(Math::deg2rad(pa->value_accum)); break;
|
||||
case SP_NODE2D_SCALE: static_cast<Node2D*>(pa->object)->set_scale(pa->value_accum); break;
|
||||
}*/
|
||||
|
||||
switch(pa->special) {
|
||||
|
||||
case SP_NONE: {
|
||||
bool valid;
|
||||
pa->object->set(pa->prop,pa->value_accum,&valid); //you are not speshul
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (!valid) {
|
||||
ERR_PRINTS("Failed setting key at time "+rtos(playback.current.pos)+" in Animation '"+get_current_animation()+"', Track '"+String(pa->owner->path)+"'. Check if property exists or the type of key is right for the property");
|
||||
}
|
||||
#endif
|
||||
|
||||
} break;
|
||||
case SP_NODE2D_POS: {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (pa->value_accum.get_type()!=Variant::VECTOR2) {
|
||||
ERR_PRINTS("Position key at time "+rtos(playback.current.pos)+" in Animation '"+get_current_animation()+"', Track '"+String(pa->owner->path)+"' not of type Vector2()");
|
||||
}
|
||||
#endif
|
||||
static_cast<Node2D*>(pa->object)->set_pos(pa->value_accum);
|
||||
} break;
|
||||
case SP_NODE2D_ROT: {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (pa->value_accum.is_num()) {
|
||||
ERR_PRINTS("Rotation key at time "+rtos(playback.current.pos)+" in Animation '"+get_current_animation()+"', Track '"+String(pa->owner->path)+"' not numerical");
|
||||
}
|
||||
#endif
|
||||
|
||||
static_cast<Node2D*>(pa->object)->set_rot(Math::deg2rad(pa->value_accum));
|
||||
} break;
|
||||
case SP_NODE2D_SCALE: {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (pa->value_accum.get_type()!=Variant::VECTOR2) {
|
||||
ERR_PRINTS("Scale key at time "+rtos(playback.current.pos)+" in Animation '"+get_current_animation()+"', Track '"+String(pa->owner->path)+"' not of type Vector2()");
|
||||
}
|
||||
#endif
|
||||
|
||||
static_cast<Node2D*>(pa->object)->set_scale(pa->value_accum);
|
||||
} break;
|
||||
}
|
||||
#else
|
||||
|
||||
|
||||
Reference in New Issue
Block a user