mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	-Many fixes to VisualScript, fixed property names, etc.
-Added ability to set/get a field in GetSet, as well as assignment ops -Added a Select node -Fixed update bugs related to variable list and exported properties, closes #9458
This commit is contained in:
		
							parent
							
								
									e2e73ec906
								
							
						
					
					
						commit
						2a3e00c8c7
					
				
					 36 changed files with 1091 additions and 295 deletions
				
			
		|  | @ -546,25 +546,25 @@ Dictionary VisualScriptFunctionCall::_get_argument_cache() const { | |||
| 
 | ||||
| void VisualScriptFunctionCall::_validate_property(PropertyInfo &property) const { | ||||
| 
 | ||||
| 	if (property.name == "function/base_type") { | ||||
| 	if (property.name == "base_type") { | ||||
| 		if (call_mode != CALL_MODE_INSTANCE) { | ||||
| 			property.usage = PROPERTY_USAGE_NOEDITOR; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "function/base_script") { | ||||
| 	if (property.name == "base_script") { | ||||
| 		if (call_mode != CALL_MODE_INSTANCE) { | ||||
| 			property.usage = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "function/basic_type") { | ||||
| 	if (property.name == "basic_type") { | ||||
| 		if (call_mode != CALL_MODE_BASIC_TYPE) { | ||||
| 			property.usage = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "function/singleton") { | ||||
| 	if (property.name == "singleton") { | ||||
| 		if (call_mode != CALL_MODE_SINGLETON) { | ||||
| 			property.usage = 0; | ||||
| 		} else { | ||||
|  | @ -581,7 +581,7 @@ void VisualScriptFunctionCall::_validate_property(PropertyInfo &property) const | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "function/node_path") { | ||||
| 	if (property.name == "node_path") { | ||||
| 		if (call_mode != CALL_MODE_NODE_PATH) { | ||||
| 			property.usage = 0; | ||||
| 		} else { | ||||
|  | @ -594,7 +594,7 @@ void VisualScriptFunctionCall::_validate_property(PropertyInfo &property) const | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "function/function") { | ||||
| 	if (property.name == "function") { | ||||
| 
 | ||||
| 		if (call_mode == CALL_MODE_BASIC_TYPE) { | ||||
| 
 | ||||
|  | @ -648,7 +648,7 @@ void VisualScriptFunctionCall::_validate_property(PropertyInfo &property) const | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "function/use_default_args") { | ||||
| 	if (property.name == "use_default_args") { | ||||
| 
 | ||||
| 		property.hint = PROPERTY_HINT_RANGE; | ||||
| 
 | ||||
|  | @ -673,7 +673,7 @@ void VisualScriptFunctionCall::_validate_property(PropertyInfo &property) const | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "rpc/call_mode") { | ||||
| 	if (property.name == "rpc_call_mode") { | ||||
| 		if (call_mode == CALL_MODE_BASIC_TYPE) { | ||||
| 			property.usage = 0; | ||||
| 		} | ||||
|  | @ -735,17 +735,17 @@ void VisualScriptFunctionCall::_bind_methods() { | |||
| 		script_ext_hint += "*." + E->get(); | ||||
| 	} | ||||
| 
 | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "function/call_mode", PROPERTY_HINT_ENUM, "Self,Node Path,Instance,Basic Type,Singleton"), "set_call_mode", "get_call_mode"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "function/base_type", PROPERTY_HINT_TYPE_STRING, "Object"), "set_base_type", "get_base_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "function/base_script", PROPERTY_HINT_FILE, script_ext_hint), "set_base_script", "get_base_script"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "function/singleton"), "set_singleton", "get_singleton"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "function/basic_type", PROPERTY_HINT_ENUM, bt), "set_basic_type", "get_basic_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "function/node_path", PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE), "set_base_path", "get_base_path"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "function/argument_cache", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_argument_cache", "_get_argument_cache"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "function/function"), "set_function", "get_function"); //when set, if loaded properly, will override argument count.
 | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "function/use_default_args"), "set_use_default_args", "get_use_default_args"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "function/validate"), "set_validate", "get_validate"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "rpc/call_mode", PROPERTY_HINT_ENUM, "Disabled,Reliable,Unreliable,ReliableToID,UnreliableToID"), "set_rpc_call_mode", "get_rpc_call_mode"); //when set, if loaded properly, will override argument count.
 | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "call_mode", PROPERTY_HINT_ENUM, "Self,Node Path,Instance,Basic Type,Singleton"), "set_call_mode", "get_call_mode"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_type", PROPERTY_HINT_TYPE_STRING, "Object"), "set_base_type", "get_base_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_script", PROPERTY_HINT_FILE, script_ext_hint), "set_base_script", "get_base_script"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "singleton"), "set_singleton", "get_singleton"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "basic_type", PROPERTY_HINT_ENUM, bt), "set_basic_type", "get_basic_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "node_path", PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE), "set_base_path", "get_base_path"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "argument_cache", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_argument_cache", "_get_argument_cache"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "function"), "set_function", "get_function"); //when set, if loaded properly, will override argument count.
 | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "use_default_args"), "set_use_default_args", "get_use_default_args"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "validate"), "set_validate", "get_validate"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "rpc_call_mode", PROPERTY_HINT_ENUM, "Disabled,Reliable,Unreliable,ReliableToID,UnreliableToID"), "set_rpc_call_mode", "get_rpc_call_mode"); //when set, if loaded properly, will override argument count.
 | ||||
| 
 | ||||
| 	BIND_CONSTANT(CALL_MODE_SELF); | ||||
| 	BIND_CONSTANT(CALL_MODE_NODE_PATH); | ||||
|  | @ -1020,6 +1020,18 @@ String VisualScriptPropertySet::get_output_sequence_port_text(int p_port) const | |||
| 	return String(); | ||||
| } | ||||
| 
 | ||||
| void VisualScriptPropertySet::_adjust_input_index(PropertyInfo &pinfo) const { | ||||
| 
 | ||||
| 	if (index != StringName()) { | ||||
| 
 | ||||
| 		Variant v; | ||||
| 		Variant::CallError ce; | ||||
| 		v = Variant::construct(pinfo.type, NULL, 0, ce); | ||||
| 		Variant i = v.get(index); | ||||
| 		pinfo.type = i.get_type(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| PropertyInfo VisualScriptPropertySet::get_input_value_port_info(int p_idx) const { | ||||
| 
 | ||||
| 	if (call_mode == CALL_MODE_INSTANCE || call_mode == CALL_MODE_BASIC_TYPE) { | ||||
|  | @ -1027,6 +1039,7 @@ PropertyInfo VisualScriptPropertySet::get_input_value_port_info(int p_idx) const | |||
| 			PropertyInfo pi; | ||||
| 			pi.type = (call_mode == CALL_MODE_INSTANCE ? Variant::OBJECT : basic_type); | ||||
| 			pi.name = (call_mode == CALL_MODE_INSTANCE ? String("instance") : Variant::get_type_name(basic_type).to_lower()); | ||||
| 			_adjust_input_index(pi); | ||||
| 			return pi; | ||||
| 		} else { | ||||
| 			p_idx--; | ||||
|  | @ -1035,6 +1048,7 @@ PropertyInfo VisualScriptPropertySet::get_input_value_port_info(int p_idx) const | |||
| 
 | ||||
| 	PropertyInfo pinfo = type_cache; | ||||
| 	pinfo.name = "value"; | ||||
| 	_adjust_input_index(pinfo); | ||||
| 	return pinfo; | ||||
| } | ||||
| 
 | ||||
|  | @ -1051,13 +1065,16 @@ PropertyInfo VisualScriptPropertySet::get_output_value_port_info(int p_idx) cons | |||
| String VisualScriptPropertySet::get_caption() const { | ||||
| 
 | ||||
| 	static const char *cname[4] = { | ||||
| 		"SelfSet", | ||||
| 		"NodeSet", | ||||
| 		"InstanceSet", | ||||
| 		"BasicSet" | ||||
| 		"Self", | ||||
| 		"Node", | ||||
| 		"Instance", | ||||
| 		"Basic" | ||||
| 	}; | ||||
| 
 | ||||
| 	return cname[call_mode]; | ||||
| 	static const char *opname[ASSIGN_OP_MAX] = { | ||||
| 		"Set", "Add", "Sub", "Mul", "Div", "Mod", "ShiftLeft", "ShiftRight", "BitAnd", "BitOr", "BitXor" | ||||
| 	}; | ||||
| 	return String(cname[call_mode]) + opname[assign_op]; | ||||
| } | ||||
| 
 | ||||
| String VisualScriptPropertySet::get_text() const { | ||||
|  | @ -1073,6 +1090,9 @@ String VisualScriptPropertySet::get_text() const { | |||
| 	else if (call_mode == CALL_MODE_INSTANCE) | ||||
| 		prop = String(base_type) + ":" + property; | ||||
| 
 | ||||
| 	if (index != StringName()) { | ||||
| 		prop += "." + String(index); | ||||
| 	} | ||||
| 	return prop; | ||||
| } | ||||
| 
 | ||||
|  | @ -1236,6 +1256,7 @@ void VisualScriptPropertySet::set_property(const StringName &p_type) { | |||
| 		return; | ||||
| 
 | ||||
| 	property = p_type; | ||||
| 	index = StringName(); | ||||
| 	_update_cache(); | ||||
| 	_change_notify(); | ||||
| 	ports_changed_notify(); | ||||
|  | @ -1285,27 +1306,58 @@ Dictionary VisualScriptPropertySet::_get_type_cache() const { | |||
| 	return type_cache; | ||||
| } | ||||
| 
 | ||||
| void VisualScriptPropertySet::set_index(const StringName &p_type) { | ||||
| 
 | ||||
| 	if (index == p_type) | ||||
| 		return; | ||||
| 	index = p_type; | ||||
| 	_update_cache(); | ||||
| 	_change_notify(); | ||||
| 	ports_changed_notify(); | ||||
| } | ||||
| 
 | ||||
| StringName VisualScriptPropertySet::get_index() const { | ||||
| 
 | ||||
| 	return index; | ||||
| } | ||||
| 
 | ||||
| void VisualScriptPropertySet::set_assign_op(AssignOp p_op) { | ||||
| 
 | ||||
| 	ERR_FAIL_INDEX(p_op, ASSIGN_OP_MAX); | ||||
| 	if (assign_op == p_op) | ||||
| 		return; | ||||
| 
 | ||||
| 	assign_op = p_op; | ||||
| 	_update_cache(); | ||||
| 	_change_notify(); | ||||
| 	ports_changed_notify(); | ||||
| } | ||||
| 
 | ||||
| VisualScriptPropertySet::AssignOp VisualScriptPropertySet::get_assign_op() const { | ||||
| 	return assign_op; | ||||
| } | ||||
| 
 | ||||
| void VisualScriptPropertySet::_validate_property(PropertyInfo &property) const { | ||||
| 
 | ||||
| 	if (property.name == "property/base_type") { | ||||
| 	if (property.name == "base_type") { | ||||
| 		if (call_mode != CALL_MODE_INSTANCE) { | ||||
| 			property.usage = PROPERTY_USAGE_NOEDITOR; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "property/base_script") { | ||||
| 	if (property.name == "base_script") { | ||||
| 		if (call_mode != CALL_MODE_INSTANCE) { | ||||
| 			property.usage = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "property/basic_type") { | ||||
| 	if (property.name == "basic_type") { | ||||
| 		if (call_mode != CALL_MODE_BASIC_TYPE) { | ||||
| 			property.usage = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "property/node_path") { | ||||
| 	if (property.name == "node_path") { | ||||
| 		if (call_mode != CALL_MODE_NODE_PATH) { | ||||
| 			property.usage = 0; | ||||
| 		} else { | ||||
|  | @ -1318,7 +1370,7 @@ void VisualScriptPropertySet::_validate_property(PropertyInfo &property) const { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "property/property") { | ||||
| 	if (property.name == "property") { | ||||
| 
 | ||||
| 		if (call_mode == CALL_MODE_BASIC_TYPE) { | ||||
| 
 | ||||
|  | @ -1360,6 +1412,24 @@ void VisualScriptPropertySet::_validate_property(PropertyInfo &property) const { | |||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "index") { | ||||
| 
 | ||||
| 		Variant::CallError ce; | ||||
| 		Variant v = Variant::construct(type_cache.type, NULL, 0, ce); | ||||
| 		List<PropertyInfo> plist; | ||||
| 		v.get_property_list(&plist); | ||||
| 		String options = ""; | ||||
| 		for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { | ||||
| 			options += "," + E->get().name; | ||||
| 		} | ||||
| 
 | ||||
| 		property.hint = PROPERTY_HINT_ENUM; | ||||
| 		property.hint_string = options; | ||||
| 		property.type = Variant::STRING; | ||||
| 		if (options == "") | ||||
| 			property.usage = 0; //hide if type has no usable index
 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void VisualScriptPropertySet::_bind_methods() { | ||||
|  | @ -1385,6 +1455,12 @@ void VisualScriptPropertySet::_bind_methods() { | |||
| 	ClassDB::bind_method(D_METHOD("set_base_path", "base_path"), &VisualScriptPropertySet::set_base_path); | ||||
| 	ClassDB::bind_method(D_METHOD("get_base_path"), &VisualScriptPropertySet::get_base_path); | ||||
| 
 | ||||
| 	ClassDB::bind_method(D_METHOD("set_index", "index"), &VisualScriptPropertySet::set_index); | ||||
| 	ClassDB::bind_method(D_METHOD("get_index"), &VisualScriptPropertySet::get_index); | ||||
| 
 | ||||
| 	ClassDB::bind_method(D_METHOD("set_assign_op", "assign_op"), &VisualScriptPropertySet::set_assign_op); | ||||
| 	ClassDB::bind_method(D_METHOD("get_assign_op"), &VisualScriptPropertySet::get_assign_op); | ||||
| 
 | ||||
| 	String bt; | ||||
| 	for (int i = 0; i < Variant::VARIANT_MAX; i++) { | ||||
| 		if (i > 0) | ||||
|  | @ -1405,14 +1481,15 @@ void VisualScriptPropertySet::_bind_methods() { | |||
| 		script_ext_hint += "*." + E->get(); | ||||
| 	} | ||||
| 
 | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "property/set_mode", PROPERTY_HINT_ENUM, "Self,Node Path,Instance,Basic Type"), "set_call_mode", "get_call_mode"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "property/base_type", PROPERTY_HINT_TYPE_STRING, "Object"), "set_base_type", "get_base_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "property/base_script", PROPERTY_HINT_FILE, script_ext_hint), "set_base_script", "get_base_script"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "property/type_cache", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_type_cache", "_get_type_cache"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "property/basic_type", PROPERTY_HINT_ENUM, bt), "set_basic_type", "get_basic_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "property/node_path", PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE), "set_base_path", "get_base_path"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "property/property"), "set_property", "get_property"); | ||||
| 
 | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "set_mode", PROPERTY_HINT_ENUM, "Self,Node Path,Instance,Basic Type"), "set_call_mode", "get_call_mode"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_type", PROPERTY_HINT_TYPE_STRING, "Object"), "set_base_type", "get_base_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_script", PROPERTY_HINT_FILE, script_ext_hint), "set_base_script", "get_base_script"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "type_cache", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_type_cache", "_get_type_cache"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "basic_type", PROPERTY_HINT_ENUM, bt), "set_basic_type", "get_basic_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "node_path", PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE), "set_base_path", "get_base_path"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "property"), "set_property", "get_property"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "index"), "set_index", "get_index"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "assign_op", PROPERTY_HINT_ENUM, "Assign,Add,Sub,Mul,Div,Mod,ShiftLeft,ShiftRight,BitAnd,BitOr,Bitxor"), "set_assign_op", "get_assign_op"); | ||||
| 	BIND_CONSTANT(CALL_MODE_SELF); | ||||
| 	BIND_CONSTANT(CALL_MODE_NODE_PATH); | ||||
| 	BIND_CONSTANT(CALL_MODE_INSTANCE); | ||||
|  | @ -1426,11 +1503,72 @@ public: | |||
| 
 | ||||
| 	VisualScriptPropertySet *node; | ||||
| 	VisualScriptInstance *instance; | ||||
| 	VisualScriptPropertySet::AssignOp assign_op; | ||||
| 	StringName index; | ||||
| 	bool needs_get; | ||||
| 
 | ||||
| 	//virtual int get_working_memory_size() const { return 0; }
 | ||||
| 	//virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
 | ||||
| 	//virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return true; }
 | ||||
| 
 | ||||
| 	_FORCE_INLINE_ void _process_get(Variant &source, const Variant &p_argument, bool &valid) { | ||||
| 
 | ||||
| 		if (index != StringName() && assign_op == VisualScriptPropertySet::ASSIGN_OP_NONE) { | ||||
| 			source.set_named(index, p_argument, &valid); | ||||
| 		} else { | ||||
| 
 | ||||
| 			Variant value; | ||||
| 			if (index != StringName()) { | ||||
| 				value = source.get_named(index, &valid); | ||||
| 			} else { | ||||
| 				value = source; | ||||
| 			} | ||||
| 
 | ||||
| 			switch (assign_op) { | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_NONE: { | ||||
| 					//should never get here
 | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_ADD: { | ||||
| 					value = Variant::evaluate(Variant::OP_ADD, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_SUB: { | ||||
| 					value = Variant::evaluate(Variant::OP_SUBSTRACT, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_MUL: { | ||||
| 					value = Variant::evaluate(Variant::OP_MULTIPLY, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_DIV: { | ||||
| 					value = Variant::evaluate(Variant::OP_DIVIDE, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_MOD: { | ||||
| 					value = Variant::evaluate(Variant::OP_MODULE, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_SHIFT_LEFT: { | ||||
| 					value = Variant::evaluate(Variant::OP_SHIFT_LEFT, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_SHIFT_RIGHT: { | ||||
| 					value = Variant::evaluate(Variant::OP_SHIFT_RIGHT, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_BIT_AND: { | ||||
| 					value = Variant::evaluate(Variant::OP_BIT_AND, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_BIT_OR: { | ||||
| 					value = Variant::evaluate(Variant::OP_BIT_OR, value, p_argument); | ||||
| 				} break; | ||||
| 				case VisualScriptPropertySet::ASSIGN_OP_BIT_XOR: { | ||||
| 					value = Variant::evaluate(Variant::OP_BIT_XOR, value, p_argument); | ||||
| 				} break; | ||||
| 				default: {} | ||||
| 			} | ||||
| 
 | ||||
| 			if (index != StringName()) { | ||||
| 				source.set_named(index, value, &valid); | ||||
| 			} else { | ||||
| 				source = value; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	virtual int step(const Variant **p_inputs, Variant **p_outputs, StartMode p_start_mode, Variant *p_working_mem, Variant::CallError &r_error, String &r_error_str) { | ||||
| 
 | ||||
| 		switch (call_mode) { | ||||
|  | @ -1441,7 +1579,13 @@ public: | |||
| 
 | ||||
| 				bool valid; | ||||
| 
 | ||||
| 				object->set(property, *p_inputs[0], &valid); | ||||
| 				if (needs_get) { | ||||
| 					Variant value = object->get(property, &valid); | ||||
| 					_process_get(value, *p_inputs[0], valid); | ||||
| 					object->set(property, value, &valid); | ||||
| 				} else { | ||||
| 					object->set(property, *p_inputs[0], &valid); | ||||
| 				} | ||||
| 
 | ||||
| 				if (!valid) { | ||||
| 					r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; | ||||
|  | @ -1466,7 +1610,14 @@ public: | |||
| 
 | ||||
| 				bool valid; | ||||
| 
 | ||||
| 				another->set(property, *p_inputs[0], &valid); | ||||
| 				if (needs_get) { | ||||
| 
 | ||||
| 					Variant value = another->get(property, &valid); | ||||
| 					_process_get(value, *p_inputs[0], valid); | ||||
| 					another->set(property, value, &valid); | ||||
| 				} else { | ||||
| 					another->set(property, *p_inputs[0], &valid); | ||||
| 				} | ||||
| 
 | ||||
| 				if (!valid) { | ||||
| 					r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; | ||||
|  | @ -1481,7 +1632,14 @@ public: | |||
| 
 | ||||
| 				bool valid; | ||||
| 
 | ||||
| 				v.set(property, *p_inputs[1], &valid); | ||||
| 				if (needs_get) { | ||||
| 					Variant value = v.get_named(property, &valid); | ||||
| 					_process_get(value, *p_inputs[1], valid); | ||||
| 					v.set_named(property, value, &valid); | ||||
| 
 | ||||
| 				} else { | ||||
| 					v.set_named(property, *p_inputs[1], &valid); | ||||
| 				} | ||||
| 
 | ||||
| 				if (!valid) { | ||||
| 					r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; | ||||
|  | @ -1504,6 +1662,9 @@ VisualScriptNodeInstance *VisualScriptPropertySet::instance(VisualScriptInstance | |||
| 	instance->property = property; | ||||
| 	instance->call_mode = call_mode; | ||||
| 	instance->node_path = base_path; | ||||
| 	instance->assign_op = assign_op; | ||||
| 	instance->index = index; | ||||
| 	instance->needs_get = index != StringName() || assign_op != ASSIGN_OP_NONE; | ||||
| 	return instance; | ||||
| } | ||||
| 
 | ||||
|  | @ -1517,6 +1678,7 @@ VisualScriptPropertySet::TypeGuess VisualScriptPropertySet::guess_output_type(Ty | |||
| } | ||||
| VisualScriptPropertySet::VisualScriptPropertySet() { | ||||
| 
 | ||||
| 	assign_op = ASSIGN_OP_NONE; | ||||
| 	call_mode = CALL_MODE_SELF; | ||||
| 	base_type = "Object"; | ||||
| 	basic_type = Variant::NIL; | ||||
|  | @ -1641,6 +1803,15 @@ PropertyInfo VisualScriptPropertyGet::get_input_value_port_info(int p_idx) const | |||
| 
 | ||||
| PropertyInfo VisualScriptPropertyGet::get_output_value_port_info(int p_idx) const { | ||||
| 
 | ||||
| 	if (index != StringName()) { | ||||
| 
 | ||||
| 		Variant v; | ||||
| 		Variant::CallError ce; | ||||
| 		v = Variant::construct(type_cache, NULL, 0, ce); | ||||
| 		Variant i = v.get(index); | ||||
| 		return PropertyInfo(i.get_type(), "value." + String(index)); | ||||
| 	} | ||||
| 
 | ||||
| 	return PropertyInfo(type_cache, "value"); | ||||
| } | ||||
| 
 | ||||
|  | @ -1867,27 +2038,42 @@ Variant::Type VisualScriptPropertyGet::_get_type_cache() const { | |||
| 	return type_cache; | ||||
| } | ||||
| 
 | ||||
| void VisualScriptPropertyGet::set_index(const StringName &p_type) { | ||||
| 
 | ||||
| 	if (index == p_type) | ||||
| 		return; | ||||
| 	index = p_type; | ||||
| 	_update_cache(); | ||||
| 	_change_notify(); | ||||
| 	ports_changed_notify(); | ||||
| } | ||||
| 
 | ||||
| StringName VisualScriptPropertyGet::get_index() const { | ||||
| 
 | ||||
| 	return index; | ||||
| } | ||||
| 
 | ||||
| void VisualScriptPropertyGet::_validate_property(PropertyInfo &property) const { | ||||
| 
 | ||||
| 	if (property.name == "property/base_type") { | ||||
| 	if (property.name == "base_type") { | ||||
| 		if (call_mode != CALL_MODE_INSTANCE) { | ||||
| 			property.usage = PROPERTY_USAGE_NOEDITOR; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "property/base_script") { | ||||
| 	if (property.name == "base_script") { | ||||
| 		if (call_mode != CALL_MODE_INSTANCE) { | ||||
| 			property.usage = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "property/basic_type") { | ||||
| 	if (property.name == "basic_type") { | ||||
| 		if (call_mode != CALL_MODE_BASIC_TYPE) { | ||||
| 			property.usage = 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "property/node_path") { | ||||
| 	if (property.name == "node_path") { | ||||
| 		if (call_mode != CALL_MODE_NODE_PATH) { | ||||
| 			property.usage = 0; | ||||
| 		} else { | ||||
|  | @ -1900,7 +2086,7 @@ void VisualScriptPropertyGet::_validate_property(PropertyInfo &property) const { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "property/property") { | ||||
| 	if (property.name == "property") { | ||||
| 
 | ||||
| 		if (call_mode == CALL_MODE_BASIC_TYPE) { | ||||
| 
 | ||||
|  | @ -1941,6 +2127,24 @@ void VisualScriptPropertyGet::_validate_property(PropertyInfo &property) const { | |||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (property.name == "index") { | ||||
| 
 | ||||
| 		Variant::CallError ce; | ||||
| 		Variant v = Variant::construct(type_cache, NULL, 0, ce); | ||||
| 		List<PropertyInfo> plist; | ||||
| 		v.get_property_list(&plist); | ||||
| 		String options = ""; | ||||
| 		for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { | ||||
| 			options += "," + E->get().name; | ||||
| 		} | ||||
| 
 | ||||
| 		property.hint = PROPERTY_HINT_ENUM; | ||||
| 		property.hint_string = options; | ||||
| 		property.type = Variant::STRING; | ||||
| 		if (options == "") | ||||
| 			property.usage = 0; //hide if type has no usable index
 | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void VisualScriptPropertyGet::_bind_methods() { | ||||
|  | @ -1966,6 +2170,9 @@ void VisualScriptPropertyGet::_bind_methods() { | |||
| 	ClassDB::bind_method(D_METHOD("set_base_path", "base_path"), &VisualScriptPropertyGet::set_base_path); | ||||
| 	ClassDB::bind_method(D_METHOD("get_base_path"), &VisualScriptPropertyGet::get_base_path); | ||||
| 
 | ||||
| 	ClassDB::bind_method(D_METHOD("set_index", "index"), &VisualScriptPropertyGet::set_index); | ||||
| 	ClassDB::bind_method(D_METHOD("get_index"), &VisualScriptPropertyGet::get_index); | ||||
| 
 | ||||
| 	String bt; | ||||
| 	for (int i = 0; i < Variant::VARIANT_MAX; i++) { | ||||
| 		if (i > 0) | ||||
|  | @ -1986,13 +2193,14 @@ void VisualScriptPropertyGet::_bind_methods() { | |||
| 		script_ext_hint += "." + E->get(); | ||||
| 	} | ||||
| 
 | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "property/set_mode", PROPERTY_HINT_ENUM, "Self,Node Path,Instance,Basic Type"), "set_call_mode", "get_call_mode"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "property/base_type", PROPERTY_HINT_TYPE_STRING, "Object"), "set_base_type", "get_base_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "property/base_script", PROPERTY_HINT_FILE, script_ext_hint), "set_base_script", "get_base_script"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "property/type_cache", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_type_cache", "_get_type_cache"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "property/basic_type", PROPERTY_HINT_ENUM, bt), "set_basic_type", "get_basic_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "property/node_path", PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE), "set_base_path", "get_base_path"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "property/property"), "set_property", "get_property"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "set_mode", PROPERTY_HINT_ENUM, "Self,Node Path,Instance,Basic Type"), "set_call_mode", "get_call_mode"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_type", PROPERTY_HINT_TYPE_STRING, "Object"), "set_base_type", "get_base_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "base_script", PROPERTY_HINT_FILE, script_ext_hint), "set_base_script", "get_base_script"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "type_cache", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "_set_type_cache", "_get_type_cache"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::INT, "basic_type", PROPERTY_HINT_ENUM, bt), "set_basic_type", "get_basic_type"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "node_path", PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE), "set_base_path", "get_base_path"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "property"), "set_property", "get_property"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "index", PROPERTY_HINT_ENUM), "set_index", "get_index"); | ||||
| 
 | ||||
| 	BIND_CONSTANT(CALL_MODE_SELF); | ||||
| 	BIND_CONSTANT(CALL_MODE_NODE_PATH); | ||||
|  | @ -2004,6 +2212,7 @@ public: | |||
| 	VisualScriptPropertyGet::CallMode call_mode; | ||||
| 	NodePath node_path; | ||||
| 	StringName property; | ||||
| 	StringName index; | ||||
| 
 | ||||
| 	VisualScriptPropertyGet *node; | ||||
| 	VisualScriptInstance *instance; | ||||
|  | @ -2020,6 +2229,10 @@ public: | |||
| 
 | ||||
| 				*p_outputs[0] = object->get(property, &valid); | ||||
| 
 | ||||
| 				if (index != StringName()) { | ||||
| 					*p_outputs[0] = p_outputs[0]->get_named(index); | ||||
| 				} | ||||
| 
 | ||||
| 				if (!valid) { | ||||
| 					r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; | ||||
| 					r_error_str = RTR("Invalid index property name."); | ||||
|  | @ -2046,6 +2259,10 @@ public: | |||
| 
 | ||||
| 				*p_outputs[0] = another->get(property, &valid); | ||||
| 
 | ||||
| 				if (index != StringName()) { | ||||
| 					*p_outputs[0] = p_outputs[0]->get_named(index); | ||||
| 				} | ||||
| 
 | ||||
| 				if (!valid) { | ||||
| 					r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; | ||||
| 					r_error_str = vformat(RTR("Invalid index property name '%s' in node %s."), String(property), another->get_name()); | ||||
|  | @ -2059,6 +2276,9 @@ public: | |||
| 				Variant v = *p_inputs[0]; | ||||
| 
 | ||||
| 				*p_outputs[0] = v.get(property, &valid); | ||||
| 				if (index != StringName()) { | ||||
| 					*p_outputs[0] = p_outputs[0]->get_named(index); | ||||
| 				} | ||||
| 
 | ||||
| 				if (!valid) { | ||||
| 					r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; | ||||
|  | @ -2079,6 +2299,7 @@ VisualScriptNodeInstance *VisualScriptPropertyGet::instance(VisualScriptInstance | |||
| 	instance->property = property; | ||||
| 	instance->call_mode = call_mode; | ||||
| 	instance->node_path = base_path; | ||||
| 	instance->index = index; | ||||
| 
 | ||||
| 	return instance; | ||||
| } | ||||
|  | @ -2182,7 +2403,7 @@ StringName VisualScriptEmitSignal::get_signal() const { | |||
| 
 | ||||
| void VisualScriptEmitSignal::_validate_property(PropertyInfo &property) const { | ||||
| 
 | ||||
| 	if (property.name == "signal/signal") { | ||||
| 	if (property.name == "signal") { | ||||
| 		property.hint = PROPERTY_HINT_ENUM; | ||||
| 
 | ||||
| 		List<StringName> sigs; | ||||
|  | @ -2210,7 +2431,7 @@ void VisualScriptEmitSignal::_bind_methods() { | |||
| 	ClassDB::bind_method(D_METHOD("set_signal", "name"), &VisualScriptEmitSignal::set_signal); | ||||
| 	ClassDB::bind_method(D_METHOD("get_signal"), &VisualScriptEmitSignal::get_signal); | ||||
| 
 | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "signal/signal"), "set_signal", "get_signal"); | ||||
| 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "signal"), "set_signal", "get_signal"); | ||||
| } | ||||
| 
 | ||||
| class VisualScriptNodeInstanceEmitSignal : public VisualScriptNodeInstance { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Juan Linietsky
						Juan Linietsky