|
@@ -109,8 +109,16 @@ float AnimationNode::blend_input(int p_input, float p_time, bool p_seek, float p
|
|
|
Ref<AnimationNode> node = blend_tree->get_node(node_name);
|
|
|
|
|
|
//inputs.write[p_input].last_pass = state->last_pass;
|
|
|
- float activity;
|
|
|
- return _blend_node(node_name, blend_tree->get_node_connection_array(node_name), NULL, node, p_time, p_seek, p_blend, p_filter, p_optimize, &activity);
|
|
|
+ float activity=0;
|
|
|
+ float ret = _blend_node(node_name, blend_tree->get_node_connection_array(node_name), NULL, node, p_time, p_seek, p_blend, p_filter, p_optimize, &activity);
|
|
|
+
|
|
|
+ Vector<AnimationTree::Activity> *activity_ptr = state->tree->input_activity_map.getptr(base_path);
|
|
|
+
|
|
|
+ if (activity_ptr && p_input<activity_ptr->size()) {
|
|
|
+ activity_ptr->write[p_input].last_pass = state->last_pass;
|
|
|
+ activity_ptr->write[p_input].activity = activity;
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
float AnimationNode::blend_node(const StringName &p_sub_path, Ref<AnimationNode> p_node, float p_time, bool p_seek, float p_blend, FilterAction p_filter, bool p_optimize) {
|
|
@@ -1285,6 +1293,18 @@ void AnimationTree::_update_properties_for_node(const String &p_base_path, Ref<A
|
|
|
property_parent_map[p_base_path] = HashMap<StringName, StringName>();
|
|
|
}
|
|
|
|
|
|
+ if (node->get_input_count() && !input_activity_map.has(p_base_path)) {
|
|
|
+
|
|
|
+ Vector<Activity> activity;
|
|
|
+ for(int i=0;i<node->get_input_count();i++) {
|
|
|
+ Activity a;
|
|
|
+ a.last_pass=0;
|
|
|
+ activity.push_back(a);
|
|
|
+ }
|
|
|
+ input_activity_map[p_base_path] = activity;
|
|
|
+ input_activity_map_get[String(p_base_path).substr(0,String(p_base_path).length()-1)]=&input_activity_map[p_base_path];
|
|
|
+ }
|
|
|
+
|
|
|
List<PropertyInfo> plist;
|
|
|
node->get_parameter_list(&plist);
|
|
|
for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) {
|
|
@@ -1317,6 +1337,8 @@ void AnimationTree::_update_properties() {
|
|
|
|
|
|
properties.clear();
|
|
|
property_parent_map.clear();
|
|
|
+ input_activity_map.clear();
|
|
|
+ input_activity_map_get.clear();
|
|
|
|
|
|
if (root.is_valid()) {
|
|
|
_update_properties_for_node(SceneStringNames::get_singleton()->parameters_base_path, root);
|
|
@@ -1380,6 +1402,25 @@ void AnimationTree::rename_parameter(const String &p_base, const String &p_new_b
|
|
|
_update_properties();
|
|
|
}
|
|
|
|
|
|
+float AnimationTree::get_connection_activity(const StringName& p_path,int p_connection) const {
|
|
|
+
|
|
|
+ if (!input_activity_map_get.has(p_path)) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ const Vector<Activity> *activity = input_activity_map_get[p_path];
|
|
|
+
|
|
|
+ if (!activity || p_connection<0 || p_connection>=activity->size()) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((*activity)[p_connection].last_pass != process_pass) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return (*activity)[p_connection].activity;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void AnimationTree::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("set_active", "active"), &AnimationTree::set_active);
|
|
|
ClassDB::bind_method(D_METHOD("is_active"), &AnimationTree::is_active);
|