1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-05 12:10:55 +00:00

-Reworked constant nodes better

-Added simple switch node, removed InputEventFilter
This commit is contained in:
Juan Linietsky
2016-08-31 12:49:45 -03:00
parent 028171845f
commit 5567350e1b
8 changed files with 359 additions and 53 deletions

View File

@@ -603,70 +603,60 @@ VisualScriptSequence::VisualScriptSequence() {
////////////////EVENT TYPE FILTER///////////
//////////////////////////////////////////
static const char* event_type_names[InputEvent::TYPE_MAX]={
"None",
"Key",
"MouseMotion",
"MouseButton",
"JoystickMotion",
"JoystickButton",
"ScreenTouch",
"ScreenDrag",
"Action"
};
int VisualScriptSwitch::get_output_sequence_port_count() const {
int VisualScriptInputSelector::get_output_sequence_port_count() const {
return InputEvent::TYPE_MAX;
return case_values.size();
}
bool VisualScriptInputSelector::has_input_sequence_port() const{
bool VisualScriptSwitch::has_input_sequence_port() const{
return true;
}
int VisualScriptInputSelector::get_input_value_port_count() const{
int VisualScriptSwitch::get_input_value_port_count() const{
return 1;
}
int VisualScriptInputSelector::get_output_value_port_count() const{
int VisualScriptSwitch::get_output_value_port_count() const{
return 1;
return 0;
}
String VisualScriptInputSelector::get_output_sequence_port_text(int p_port) const {
String VisualScriptSwitch::get_output_sequence_port_text(int p_port) const {
return event_type_names[p_port];
if (case_values[p_port].value.get_type()==Variant::NIL)
return "null";
return case_values[p_port].value;
}
PropertyInfo VisualScriptInputSelector::get_input_value_port_info(int p_idx) const{
PropertyInfo VisualScriptSwitch::get_input_value_port_info(int p_idx) const{
return PropertyInfo(Variant::INPUT_EVENT,"event");
return PropertyInfo(Variant::NIL,"input");
}
PropertyInfo VisualScriptInputSelector::get_output_value_port_info(int p_idx) const{
PropertyInfo VisualScriptSwitch::get_output_value_port_info(int p_idx) const{
return PropertyInfo(Variant::INPUT_EVENT,"");
return PropertyInfo();
}
String VisualScriptInputSelector::get_caption() const {
String VisualScriptSwitch::get_caption() const {
return "InputSelector";
return "Switch";
}
String VisualScriptInputSelector::get_text() const {
String VisualScriptSwitch::get_text() const {
return "";
return "'input' is:";
}
class VisualScriptNodeInstanceInputSelector : public VisualScriptNodeInstance {
class VisualScriptNodeInstanceSwitch : public VisualScriptNodeInstance {
public:
VisualScriptInstance* instance;
InputEvent::Type type;
Vector<Variant> case_values;
//virtual int get_working_memory_size() const { return 0; }
//virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
@@ -680,31 +670,114 @@ public:
return 0;
}
InputEvent event = *p_inputs[0];
for(int i=0;i<case_values.size();i++) {
*p_outputs[0] = event;
if (*p_inputs[0]==case_values[i]) {
return i;
}
}
return event.type;
return STEP_NO_ADVANCE_BIT;
}
};
VisualScriptNodeInstance* VisualScriptInputSelector::instance(VisualScriptInstance* p_instance) {
VisualScriptNodeInstance* VisualScriptSwitch::instance(VisualScriptInstance* p_instance) {
VisualScriptNodeInstanceInputSelector * instance = memnew(VisualScriptNodeInstanceInputSelector );
VisualScriptNodeInstanceSwitch * instance = memnew(VisualScriptNodeInstanceSwitch );
instance->instance=p_instance;
instance->case_values.resize(case_values.size());
for(int i=0;i<case_values.size();i++) {
instance->case_values[i]=case_values[i].value;
}
return instance;
}
bool VisualScriptSwitch::_set(const StringName& p_name, const Variant& p_value) {
if (String(p_name)=="case_count") {
case_values.resize(p_value);
_change_notify();
ports_changed_notify();
return true;
}
if (String(p_name).begins_with("case/")) {
int idx = String(p_name).get_slice("/",1).to_int();
ERR_FAIL_INDEX_V(idx,case_values.size(),false);
String what = String(p_name).get_slice("/",2);
if (what=="type") {
case_values[idx].type=Variant::Type(int(p_value));
Variant::CallError ce;
case_values[idx].value=Variant::construct(case_values[idx].type,NULL,0,ce);
_change_notify();
ports_changed_notify();
return true;
}
if (what=="value") {
case_values[idx].value=p_value;
ports_changed_notify();
return true;
}
}
return false;
}
bool VisualScriptSwitch::_get(const StringName& p_name,Variant &r_ret) const {
if (String(p_name)=="case_count") {
r_ret=case_values.size();
return true;
}
if (String(p_name).begins_with("case/")) {
int idx = String(p_name).get_slice("/",1).to_int();
ERR_FAIL_INDEX_V(idx,case_values.size(),false);
String what = String(p_name).get_slice("/",2);
if (what=="type") {
r_ret=case_values[idx].type;
return true;
}
if (what=="value") {
r_ret=case_values[idx].value;
return true;
}
}
return false;
}
void VisualScriptSwitch::_get_property_list( List<PropertyInfo> *p_list) const {
p_list->push_back(PropertyInfo(Variant::INT,"case_count",PROPERTY_HINT_RANGE,"0,128"));
String argt="Any";
for(int i=1;i<Variant::VARIANT_MAX;i++) {
argt+=","+Variant::get_type_name(Variant::Type(i));
}
for(int i=0;i<case_values.size();i++) {
p_list->push_back(PropertyInfo(Variant::INT,"case/"+itos(i)+"/type",PROPERTY_HINT_ENUM,argt));
p_list->push_back(PropertyInfo(case_values[i].type,"case/"+itos(i)+"/value"));
}
}
void VisualScriptInputSelector::_bind_methods() {
void VisualScriptSwitch::_bind_methods() {
}
VisualScriptInputSelector::VisualScriptInputSelector() {
VisualScriptSwitch::VisualScriptSwitch() {
}
@@ -1359,6 +1432,19 @@ bool VisualScriptInputFilter::_get(const StringName& p_name,Variant &r_ret) cons
}
return false;
}
static const char* event_type_names[InputEvent::TYPE_MAX]={
"None",
"Key",
"MouseMotion",
"MouseButton",
"JoystickMotion",
"JoystickButton",
"ScreenTouch",
"ScreenDrag",
"Action"
};
void VisualScriptInputFilter::_get_property_list( List<PropertyInfo> *p_list) const {
p_list->push_back(PropertyInfo(Variant::INT,"filter_count",PROPERTY_HINT_RANGE,"0,64"));
@@ -1866,7 +1952,7 @@ void register_visual_script_flow_control_nodes() {
VisualScriptLanguage::singleton->add_register_func("flow_control/while",create_node_generic<VisualScriptWhile>);
VisualScriptLanguage::singleton->add_register_func("flow_control/iterator",create_node_generic<VisualScriptIterator>);
VisualScriptLanguage::singleton->add_register_func("flow_control/sequence",create_node_generic<VisualScriptSequence>);
VisualScriptLanguage::singleton->add_register_func("flow_control/input_select",create_node_generic<VisualScriptInputSelector>);
VisualScriptLanguage::singleton->add_register_func("flow_control/switch",create_node_generic<VisualScriptSwitch>);
VisualScriptLanguage::singleton->add_register_func("flow_control/input_filter",create_node_generic<VisualScriptInputFilter>);
VisualScriptLanguage::singleton->add_register_func("flow_control/type_cast",create_node_generic<VisualScriptTypeCast>);