bool AnimationPlayer::_get(const StringName &p_name, Variant &r_ret) const { String name = p_name; if (name == "playback/speed") { //bw compatibility r_ret = speed_scale; } else if (name == "playback/active") { r_ret = is_active(); } else if (name == "playback/play") { if (is_active() && is_playing()) r_ret = playback.assigned; else r_ret = "[stop]"; } else if (name.begins_with("anims/")) { String which = name.get_slicec('/', 1); r_ret = get_animation(which).get_ref_ptr(); } else if (name.begins_with("next/")) { String which = name.get_slicec('/', 1); r_ret = animation_get_next(which); } else if (name == "blend_times") { Vector<BlendKey> keys; for (Map<BlendKey, float>::Element *E = blend_times.front(); E; E = E->next()) { keys.ordered_insert(E->key()); } Array array; for (int i = 0; i < keys.size(); i++) { array.push_back(keys[i].from); array.push_back(keys[i].to); array.push_back(blend_times[keys[i]]); } r_ret = array; } else if (name == "autoplay") { r_ret = autoplay; } else return false; return true; }
bool AnimationPlayer::_get(const StringName& p_name,Variant &r_ret) const { String name=p_name; if (name=="playback/speed") { //bw compatibility r_ret=speed_scale; } else if (name=="playback/active") { r_ret=is_active(); } else if (name=="playback/play") { if (is_active() && is_playing()) r_ret=playback.assigned; else r_ret="[stop]"; } else if (name.begins_with("anims/")) { String which=name.get_slicec('/',1); r_ret= get_animation(which).get_ref_ptr(); } else if (name.begins_with("next/")) { String which=name.get_slicec('/',1); r_ret= animation_get_next(which); } else if (name=="blend_times") { Array array; array.resize(blend_times.size()*3); int idx=0; for(Map<BlendKey, float >::Element *E=blend_times.front();E;E=E->next()) { array.set(idx*3+0,E->key().from); array.set(idx*3+1,E->key().to); array.set(idx*3+2,E->get()); idx++; } r_ret=array; } else if (name=="autoplay") { r_ret=autoplay; } else return false; return true; }
void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float p_custom_scale, bool p_from_end) { //printf("animation is %ls\n", String(p_name).c_str()); //ERR_FAIL_COND(!is_inside_scene()); StringName name = p_name; if (String(name) == "") name = playback.assigned; if (!animation_set.has(name)) { ERR_EXPLAIN("Animation not found: " + name); ERR_FAIL(); } Playback &c = playback; if (c.current.from) { float blend_time = 0; // find if it can blend BlendKey bk; bk.from = c.current.from->name; bk.to = name; if (p_custom_blend >= 0) { blend_time = p_custom_blend; } else if (blend_times.has(bk)) { blend_time = blend_times[bk]; } else { bk.from = "*"; if (blend_times.has(bk)) { blend_time = blend_times[bk]; } else { bk.from = c.current.from->name; bk.to = "*"; if (blend_times.has(bk)) { blend_time = blend_times[bk]; } } } if (p_custom_blend < 0 && blend_time == 0 && default_blend_time) blend_time = default_blend_time; if (blend_time > 0) { Blend b; b.data = c.current; b.blend_time = b.blend_left = blend_time; c.blend.push_back(b); } } c.current.from = &animation_set[name]; c.current.pos = p_from_end ? c.current.from->animation->get_length() : 0; c.current.speed_scale = p_custom_scale; c.assigned = p_name; if (!end_notify) queued.clear(); _set_process(true); // always process when starting an animation playing = true; emit_signal(SceneStringNames::get_singleton()->animation_started, c.assigned); if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) return; // no next in this case StringName next = animation_get_next(p_name); if (next != StringName() && animation_set.has(next)) { queue(next); } }