You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user