mirror of
https://github.com/godotengine/godot.git
synced 2025-10-22 17:33:33 +00:00
More visual script work
-Block switches to 2d/3d editor if editing visual script -Added cast node in flow control -Added ability to do RPC in visual script -Comment nodes -Fix bug with inverted cable in connecting backwards -Copy and paste nodes, including from different scripts
This commit is contained in:
parent
41a58f7935
commit
9c6175db11
35 changed files with 1707 additions and 252 deletions
|
@ -2,6 +2,7 @@
|
|||
#include "os/keyboard.h"
|
||||
#include "globals.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////
|
||||
////////////////RETURN////////////////////
|
||||
//////////////////////////////////////////
|
||||
|
@ -1660,6 +1661,197 @@ VisualScriptInputFilter::VisualScriptInputFilter() {
|
|||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////
|
||||
////////////////EVENT TYPE FILTER///////////
|
||||
//////////////////////////////////////////
|
||||
|
||||
|
||||
int VisualScriptTypeCast::get_output_sequence_port_count() const {
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
bool VisualScriptTypeCast::has_input_sequence_port() const{
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int VisualScriptTypeCast::get_input_value_port_count() const{
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
int VisualScriptTypeCast::get_output_value_port_count() const{
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
String VisualScriptTypeCast::get_output_sequence_port_text(int p_port) const {
|
||||
|
||||
return p_port==0 ? "yes" : "no";
|
||||
}
|
||||
|
||||
PropertyInfo VisualScriptTypeCast::get_input_value_port_info(int p_idx) const{
|
||||
|
||||
return PropertyInfo(Variant::OBJECT,"instance");
|
||||
}
|
||||
|
||||
PropertyInfo VisualScriptTypeCast::get_output_value_port_info(int p_idx) const{
|
||||
|
||||
return PropertyInfo(Variant::OBJECT,"");
|
||||
}
|
||||
|
||||
|
||||
String VisualScriptTypeCast::get_caption() const {
|
||||
|
||||
return "TypeCast";
|
||||
}
|
||||
|
||||
String VisualScriptTypeCast::get_text() const {
|
||||
|
||||
if (script!=String())
|
||||
return "Is "+script.get_file()+"?";
|
||||
else
|
||||
return "Is "+base_type+"?";
|
||||
}
|
||||
|
||||
void VisualScriptTypeCast::set_base_type(const StringName& p_type) {
|
||||
|
||||
if (base_type==p_type)
|
||||
return;
|
||||
|
||||
base_type=p_type;
|
||||
_change_notify();
|
||||
ports_changed_notify();
|
||||
}
|
||||
|
||||
StringName VisualScriptTypeCast::get_base_type() const{
|
||||
|
||||
return base_type;
|
||||
}
|
||||
|
||||
void VisualScriptTypeCast::set_base_script(const String& p_path){
|
||||
|
||||
if (script==p_path)
|
||||
return;
|
||||
|
||||
script=p_path;
|
||||
_change_notify();
|
||||
ports_changed_notify();
|
||||
|
||||
}
|
||||
String VisualScriptTypeCast::get_base_script() const{
|
||||
|
||||
return script;
|
||||
}
|
||||
|
||||
|
||||
class VisualScriptNodeInstanceTypeCast : public VisualScriptNodeInstance {
|
||||
public:
|
||||
|
||||
VisualScriptInstance* instance;
|
||||
StringName base_type;
|
||||
String script;
|
||||
|
||||
//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 false; }
|
||||
|
||||
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) {
|
||||
|
||||
Object *obj = *p_inputs[0];
|
||||
|
||||
*p_outputs[0]=Variant();
|
||||
|
||||
if (!obj) {
|
||||
r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
|
||||
r_error_str="Instance is null";
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (script!=String()) {
|
||||
|
||||
Ref<Script> obj_script = obj->get_script();
|
||||
if (!obj_script.is_valid()) {
|
||||
return 1; //well, definitely not the script because object we got has no script.
|
||||
}
|
||||
|
||||
if (!ResourceCache::has(script)) {
|
||||
//if the script is not in use by anyone, we can safely assume whathever we got is not casting to it.
|
||||
return 1;
|
||||
}
|
||||
Ref<Script> cast_script = Ref<Resource>(ResourceCache::get(script));
|
||||
if (!cast_script.is_valid()) {
|
||||
r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
|
||||
r_error_str="Script path is not a script: "+script;
|
||||
return 1;
|
||||
}
|
||||
|
||||
while(obj_script.is_valid()) {
|
||||
|
||||
if (cast_script==obj_script) {
|
||||
*p_outputs[0]=*p_inputs[0]; //copy
|
||||
return 0; // it is the script, yey
|
||||
}
|
||||
|
||||
obj_script=obj_script->get_base_script();
|
||||
}
|
||||
|
||||
return 1; //not found sorry
|
||||
}
|
||||
|
||||
if (ObjectTypeDB::is_type(obj->get_type_name(),base_type)) {
|
||||
*p_outputs[0]=*p_inputs[0]; //copy
|
||||
return 0;
|
||||
} else
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
VisualScriptNodeInstance* VisualScriptTypeCast::instance(VisualScriptInstance* p_instance) {
|
||||
|
||||
VisualScriptNodeInstanceTypeCast * instance = memnew(VisualScriptNodeInstanceTypeCast );
|
||||
instance->instance=p_instance;
|
||||
instance->base_type=base_type;
|
||||
instance->script=script;
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void VisualScriptTypeCast::_bind_methods() {
|
||||
|
||||
ObjectTypeDB::bind_method(_MD("set_base_type","type"),&VisualScriptTypeCast::set_base_type);
|
||||
ObjectTypeDB::bind_method(_MD("get_base_type"),&VisualScriptTypeCast::get_base_type);
|
||||
|
||||
ObjectTypeDB::bind_method(_MD("set_base_script","path"),&VisualScriptTypeCast::set_base_script);
|
||||
ObjectTypeDB::bind_method(_MD("get_base_script"),&VisualScriptTypeCast::get_base_script);
|
||||
|
||||
|
||||
List<String> script_extensions;
|
||||
for(int i=0;i>ScriptServer::get_language_count();i++) {
|
||||
ScriptServer::get_language(i)->get_recognized_extensions(&script_extensions);
|
||||
}
|
||||
|
||||
String script_ext_hint;
|
||||
for (List<String>::Element *E=script_extensions.front();E;E=E->next()) {
|
||||
if (script_ext_hint!=String())
|
||||
script_ext_hint+=",";
|
||||
script_ext_hint+="*."+E->get();
|
||||
}
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::STRING,"function/base_type",PROPERTY_HINT_TYPE_STRING,"Object"),_SCS("set_base_type"),_SCS("get_base_type"));
|
||||
ADD_PROPERTY(PropertyInfo(Variant::STRING,"property/base_script",PROPERTY_HINT_FILE,script_ext_hint),_SCS("set_base_script"),_SCS("get_base_script"));
|
||||
|
||||
}
|
||||
|
||||
VisualScriptTypeCast::VisualScriptTypeCast() {
|
||||
|
||||
base_type="Object";
|
||||
}
|
||||
|
||||
|
||||
void register_visual_script_flow_control_nodes() {
|
||||
|
@ -1672,6 +1864,7 @@ void register_visual_script_flow_control_nodes() {
|
|||
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/input_filter",create_node_generic<VisualScriptInputFilter>);
|
||||
VisualScriptLanguage::singleton->add_register_func("flow_control/type_cast",create_node_generic<VisualScriptTypeCast>);
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue