visual_script.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. #ifndef VSCRIPT_H
  2. #define VSCRIPT_H
  3. #include "script_language.h"
  4. class VScriptInstance;
  5. class VisualScriptNodeInstance;
  6. class VisualScript;
  7. class VisualScriptNode : public Resource {
  8. OBJ_TYPE(VisualScriptNode,Resource)
  9. friend class VisualScript;
  10. Set<VisualScript*> scripts_used;
  11. Array default_input_values;
  12. void _set_default_input_values(Array p_values);
  13. Array _get_default_input_values() const;
  14. protected:
  15. void _notification(int p_what);
  16. void ports_changed_notify();
  17. static void _bind_methods();
  18. public:
  19. Ref<VisualScript> get_visual_script() const;
  20. virtual int get_output_sequence_port_count() const=0;
  21. virtual bool has_input_sequence_port() const=0;
  22. virtual String get_output_sequence_port_text(int p_port) const=0;
  23. virtual int get_input_value_port_count() const=0;
  24. virtual int get_output_value_port_count() const=0;
  25. virtual PropertyInfo get_input_value_port_info(int p_idx) const=0;
  26. virtual PropertyInfo get_output_value_port_info(int p_idx) const=0;
  27. void set_default_input_value(int p_port,const Variant& p_value);
  28. Variant get_default_input_value(int p_port) const;
  29. virtual String get_caption() const=0;
  30. virtual String get_text() const=0;
  31. virtual VisualScriptNodeInstance* instance(VScriptInstance* p_instance)=0;
  32. };
  33. class VisualScriptNodeInstance {
  34. public:
  35. virtual int step()=0; //do a step, return which sequence port to go out
  36. virtual Variant get_input_value(int p_idx)=0;
  37. virtual Variant get_output_value(int p_idx)=0;
  38. virtual VisualScriptNode* get_node()=0;
  39. virtual ~VisualScriptNodeInstance();
  40. };
  41. class VisualScript : public Script {
  42. OBJ_TYPE( VisualScript, Script )
  43. RES_BASE_EXTENSION("vs");
  44. public:
  45. struct SequenceConnection {
  46. union {
  47. struct {
  48. uint64_t from_node : 24;
  49. uint64_t from_output : 16;
  50. uint64_t to_node : 24;
  51. };
  52. uint64_t id;
  53. };
  54. bool operator<(const SequenceConnection& p_connection) const {
  55. return id<p_connection.id;
  56. }
  57. };
  58. struct DataConnection {
  59. union {
  60. struct {
  61. uint64_t from_node : 24;
  62. uint64_t from_port : 8;
  63. uint64_t to_node : 24;
  64. uint64_t to_port : 8;
  65. };
  66. uint64_t id;
  67. };
  68. bool operator<(const DataConnection& p_connection) const {
  69. return id<p_connection.id;
  70. }
  71. };
  72. private:
  73. StringName base_type;
  74. struct Argument {
  75. String name;
  76. Variant::Type type;
  77. };
  78. struct Function {
  79. struct NodeData {
  80. Point2 pos;
  81. Ref<VisualScriptNode> node;
  82. };
  83. Map<int,NodeData> nodes;
  84. Set<SequenceConnection> sequence_connections;
  85. Set<DataConnection> data_connections;
  86. int function_id;
  87. Function() { function_id=-1; }
  88. };
  89. struct Variable {
  90. PropertyInfo info;
  91. Variant default_value;
  92. };
  93. Map<StringName,Function> functions;
  94. Map<StringName,Variable> variables;
  95. Map<StringName,Vector<Argument> > custom_signals;
  96. void _set_variable_info(const StringName& p_name,const Dictionary& p_info);
  97. Dictionary _get_variable_info(const StringName& p_name) const;
  98. void _set_data(const Dictionary& p_data);
  99. Dictionary _get_data() const;
  100. protected:
  101. void _node_ports_changed(int p_id);
  102. static void _bind_methods();
  103. public:
  104. void add_function(const StringName& p_name);
  105. bool has_function(const StringName& p_name) const;
  106. void remove_function(const StringName& p_name);
  107. void rename_function(const StringName& p_name,const StringName& p_new_name);
  108. void get_function_list(List<StringName> *r_functions) const;
  109. int get_function_node_id(const StringName& p_name) const;
  110. void add_node(const StringName& p_func,int p_id,const Ref<VisualScriptNode>& p_node,const Point2& p_pos=Point2());
  111. void remove_node(const StringName& p_func,int p_id);
  112. Ref<VisualScriptNode> get_node(const StringName& p_func,int p_id) const;
  113. void set_node_pos(const StringName& p_func,int p_id,const Point2& p_pos);
  114. Point2 get_node_pos(const StringName& p_func,int p_id) const;
  115. void get_node_list(const StringName& p_func,List<int> *r_nodes) const;
  116. void sequence_connect(const StringName& p_func,int p_from_node,int p_from_output,int p_to_node);
  117. void sequence_disconnect(const StringName& p_func,int p_from_node,int p_from_output,int p_to_node);
  118. bool has_sequence_connection(const StringName& p_func,int p_from_node,int p_from_output,int p_to_node) const;
  119. void get_sequence_connection_list(const StringName& p_func,List<SequenceConnection> *r_connection) const;
  120. void data_connect(const StringName& p_func,int p_from_node,int p_from_port,int p_to_node,int p_to_port);
  121. void data_disconnect(const StringName& p_func,int p_from_node,int p_from_port,int p_to_node,int p_to_port);
  122. bool has_data_connection(const StringName& p_func,int p_from_node,int p_from_port,int p_to_node,int p_to_port) const;
  123. void get_data_connection_list(const StringName& p_func,List<DataConnection> *r_connection) const;
  124. bool is_input_value_port_connected(const StringName& p_name,int p_node,int p_port) const;
  125. void add_variable(const StringName& p_name,const Variant& p_default_value=Variant());
  126. bool has_variable(const StringName& p_name) const;
  127. void remove_variable(const StringName& p_name);
  128. void set_variable_default_value(const StringName& p_name,const Variant& p_value);
  129. Variant get_variable_default_value(const StringName& p_name) const;
  130. void set_variable_info(const StringName& p_name,const PropertyInfo& p_info);
  131. PropertyInfo get_variable_info(const StringName& p_name) const;
  132. void get_variable_list(List<StringName> *r_variables);
  133. void rename_variable(const StringName& p_name,const StringName& p_new_name);
  134. void add_custom_signal(const StringName& p_name);
  135. bool has_custom_signal(const StringName& p_name) const;
  136. void custom_signal_add_argument(const StringName& p_func,Variant::Type p_type,const String& p_name,int p_index=-1);
  137. void custom_signal_set_argument_type(const StringName& p_func,int p_argidx,Variant::Type p_type);
  138. Variant::Type custom_signal_get_argument_type(const StringName& p_func,int p_argidx) const;
  139. void custom_signal_set_argument_name(const StringName& p_func,int p_argidx,const String& p_name);
  140. String custom_signal_get_argument_name(const StringName& p_func,int p_argidx) const;
  141. void custom_signal_remove_argument(const StringName& p_func,int p_argidx);
  142. int custom_signal_get_argument_count(const StringName& p_func) const;
  143. void custom_signal_swap_argument(const StringName& p_func,int p_argidx,int p_with_argidx);
  144. void remove_custom_signal(const StringName& p_name);
  145. void rename_custom_signal(const StringName& p_name,const StringName& p_new_name);
  146. void get_custom_signal_list(List<StringName> *r_custom_signals) const;
  147. int get_available_id() const;
  148. void set_instance_base_type(const StringName& p_type);
  149. virtual bool can_instance() const;
  150. virtual StringName get_instance_base_type() const;
  151. virtual ScriptInstance* instance_create(Object *p_this);
  152. virtual bool instance_has(const Object *p_this) const;
  153. virtual bool has_source_code() const;
  154. virtual String get_source_code() const;
  155. virtual void set_source_code(const String& p_code);
  156. virtual Error reload(bool p_keep_state=false);
  157. virtual bool is_tool() const;
  158. virtual String get_node_type() const;
  159. virtual ScriptLanguage *get_language() const;
  160. virtual bool has_script_signal(const StringName& p_signal) const;
  161. virtual void get_script_signal_list(List<MethodInfo> *r_signals) const;
  162. virtual bool get_property_default_value(const StringName& p_property,Variant& r_value) const;
  163. virtual void get_method_list(List<MethodInfo> *p_list) const;
  164. VisualScript();
  165. ~VisualScript();
  166. };
  167. typedef Ref<VisualScriptNode> (*VisualScriptNodeRegisterFunc)(const String& p_type);
  168. class VisualScriptLanguage : public ScriptLanguage {
  169. Map<String,VisualScriptNodeRegisterFunc> register_funcs;
  170. public:
  171. static VisualScriptLanguage* singleton;
  172. virtual String get_name() const;
  173. /* LANGUAGE FUNCTIONS */
  174. virtual void init();
  175. virtual String get_type() const;
  176. virtual String get_extension() const;
  177. virtual Error execute_file(const String& p_path) ;
  178. virtual void finish();
  179. /* EDITOR FUNCTIONS */
  180. virtual void get_reserved_words(List<String> *p_words) const;
  181. virtual void get_comment_delimiters(List<String> *p_delimiters) const;
  182. virtual void get_string_delimiters(List<String> *p_delimiters) const;
  183. virtual String get_template(const String& p_class_name, const String& p_base_class_name) const;
  184. virtual bool validate(const String& p_script, int &r_line_error,int &r_col_error,String& r_test_error, const String& p_path="",List<String> *r_functions=NULL) const;
  185. virtual Script *create_script() const;
  186. virtual bool has_named_classes() const;
  187. virtual int find_function(const String& p_function,const String& p_code) const;
  188. virtual String make_function(const String& p_class,const String& p_name,const StringArray& p_args) const;
  189. virtual void auto_indent_code(String& p_code,int p_from_line,int p_to_line) const;
  190. virtual void add_global_constant(const StringName& p_variable,const Variant& p_value);
  191. /* DEBUGGER FUNCTIONS */
  192. virtual String debug_get_error() const;
  193. virtual int debug_get_stack_level_count() const;
  194. virtual int debug_get_stack_level_line(int p_level) const;
  195. virtual String debug_get_stack_level_function(int p_level) const;
  196. virtual String debug_get_stack_level_source(int p_level) const;
  197. virtual void debug_get_stack_level_locals(int p_level,List<String> *p_locals, List<Variant> *p_values, int p_max_subitems=-1,int p_max_depth=-1);
  198. virtual void debug_get_stack_level_members(int p_level,List<String> *p_members, List<Variant> *p_values, int p_max_subitems=-1,int p_max_depth=-1);
  199. virtual void debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems=-1,int p_max_depth=-1);
  200. virtual String debug_parse_stack_level_expression(int p_level,const String& p_expression,int p_max_subitems=-1,int p_max_depth=-1);
  201. virtual void reload_all_scripts();
  202. virtual void reload_tool_script(const Ref<Script>& p_script,bool p_soft_reload);
  203. /* LOADER FUNCTIONS */
  204. virtual void get_recognized_extensions(List<String> *p_extensions) const;
  205. virtual void get_public_functions(List<MethodInfo> *p_functions) const;
  206. virtual void get_public_constants(List<Pair<String,Variant> > *p_constants) const;
  207. virtual void profiling_start();
  208. virtual void profiling_stop();
  209. virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr,int p_info_max);
  210. virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr,int p_info_max);
  211. void add_register_func(const String& p_name,VisualScriptNodeRegisterFunc p_func);
  212. Ref<VisualScriptNode> create_node_from_name(const String& p_name);
  213. void get_registered_node_names(List<String> *r_names);
  214. VisualScriptLanguage();
  215. };
  216. //aid for registering
  217. template<class T>
  218. static Ref<VisualScriptNode> create_node_generic(const String& p_name) {
  219. Ref<T> node;
  220. node.instance();
  221. return node;
  222. }
  223. #endif // VSCRIPT_H