visual_script_nodes.cpp 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451
  1. #include "visual_script_nodes.h"
  2. #include "global_constants.h"
  3. #include "globals.h"
  4. #include "scene/main/scene_main_loop.h"
  5. #include "os/os.h"
  6. #include "scene/main/node.h"
  7. //////////////////////////////////////////
  8. ////////////////FUNCTION//////////////////
  9. //////////////////////////////////////////
  10. bool VisualScriptFunction::_set(const StringName& p_name, const Variant& p_value) {
  11. if (p_name=="argument_count") {
  12. int new_argc=p_value;
  13. int argc = arguments.size();
  14. if (argc==new_argc)
  15. return true;
  16. arguments.resize(new_argc);
  17. for(int i=argc;i<new_argc;i++) {
  18. arguments[i].name="arg"+itos(i+1);
  19. arguments[i].type=Variant::NIL;
  20. }
  21. ports_changed_notify();
  22. _change_notify();
  23. return true;
  24. }
  25. if (String(p_name).begins_with("argument/")) {
  26. int idx = String(p_name).get_slice("/",1).to_int()-1;
  27. ERR_FAIL_INDEX_V(idx,arguments.size(),false);
  28. String what = String(p_name).get_slice("/",2);
  29. if (what=="type") {
  30. Variant::Type new_type = Variant::Type(int(p_value));
  31. arguments[idx].type=new_type;
  32. ports_changed_notify();
  33. return true;
  34. }
  35. if (what=="name") {
  36. arguments[idx].name=p_value;
  37. ports_changed_notify();
  38. return true;
  39. }
  40. }
  41. return false;
  42. }
  43. bool VisualScriptFunction::_get(const StringName& p_name,Variant &r_ret) const {
  44. if (p_name=="argument_count") {
  45. r_ret = arguments.size();
  46. return true;
  47. }
  48. if (String(p_name).begins_with("argument/")) {
  49. int idx = String(p_name).get_slice("/",1).to_int()-1;
  50. ERR_FAIL_INDEX_V(idx,arguments.size(),false);
  51. String what = String(p_name).get_slice("/",2);
  52. if (what=="type") {
  53. r_ret = arguments[idx].type;
  54. return true;
  55. }
  56. if (what=="name") {
  57. r_ret = arguments[idx].name;
  58. return true;
  59. }
  60. }
  61. return false;
  62. }
  63. void VisualScriptFunction::_get_property_list( List<PropertyInfo> *p_list) const {
  64. p_list->push_back(PropertyInfo(Variant::INT,"argument_count",PROPERTY_HINT_RANGE,"0,256"));
  65. String argt="Variant";
  66. for(int i=1;i<Variant::VARIANT_MAX;i++) {
  67. argt+=","+Variant::get_type_name(Variant::Type(i));
  68. }
  69. for(int i=0;i<arguments.size();i++) {
  70. p_list->push_back(PropertyInfo(Variant::INT,"argument/"+itos(i+1)+"/type",PROPERTY_HINT_ENUM,argt));
  71. p_list->push_back(PropertyInfo(Variant::STRING,"argument/"+itos(i+1)+"/name"));
  72. }
  73. }
  74. int VisualScriptFunction::get_output_sequence_port_count() const {
  75. return 1;
  76. }
  77. bool VisualScriptFunction::has_input_sequence_port() const{
  78. return false;
  79. }
  80. int VisualScriptFunction::get_input_value_port_count() const{
  81. return 0;
  82. }
  83. int VisualScriptFunction::get_output_value_port_count() const{
  84. return arguments.size();
  85. }
  86. String VisualScriptFunction::get_output_sequence_port_text(int p_port) const {
  87. return String();
  88. }
  89. PropertyInfo VisualScriptFunction::get_input_value_port_info(int p_idx) const{
  90. ERR_FAIL_V(PropertyInfo());
  91. return PropertyInfo();
  92. }
  93. PropertyInfo VisualScriptFunction::get_output_value_port_info(int p_idx) const{
  94. ERR_FAIL_INDEX_V(p_idx,arguments.size(),PropertyInfo());
  95. PropertyInfo out;
  96. out.type=arguments[p_idx].type;
  97. out.name=arguments[p_idx].name;
  98. return out;
  99. }
  100. String VisualScriptFunction::get_caption() const {
  101. return "Function";
  102. }
  103. String VisualScriptFunction::get_text() const {
  104. return get_name(); //use name as function name I guess
  105. }
  106. void VisualScriptFunction::add_argument(Variant::Type p_type,const String& p_name,int p_index){
  107. Argument arg;
  108. arg.name=p_name;
  109. arg.type=p_type;
  110. if (p_index>=0)
  111. arguments.insert(p_index,arg);
  112. else
  113. arguments.push_back(arg);
  114. ports_changed_notify();
  115. }
  116. void VisualScriptFunction::set_argument_type(int p_argidx,Variant::Type p_type){
  117. ERR_FAIL_INDEX(p_argidx,arguments.size());
  118. arguments[p_argidx].type=p_type;
  119. ports_changed_notify();
  120. }
  121. Variant::Type VisualScriptFunction::get_argument_type(int p_argidx) const {
  122. ERR_FAIL_INDEX_V(p_argidx,arguments.size(),Variant::NIL);
  123. return arguments[p_argidx].type;
  124. }
  125. void VisualScriptFunction::set_argument_name(int p_argidx,const String& p_name) {
  126. ERR_FAIL_INDEX(p_argidx,arguments.size());
  127. arguments[p_argidx].name=p_name;
  128. ports_changed_notify();
  129. }
  130. String VisualScriptFunction::get_argument_name(int p_argidx) const {
  131. ERR_FAIL_INDEX_V(p_argidx,arguments.size(),String());
  132. return arguments[p_argidx].name;
  133. }
  134. void VisualScriptFunction::remove_argument(int p_argidx) {
  135. ERR_FAIL_INDEX(p_argidx,arguments.size());
  136. arguments.remove(p_argidx);
  137. ports_changed_notify();
  138. }
  139. int VisualScriptFunction::get_argument_count() const {
  140. return arguments.size();
  141. }
  142. VisualScriptNodeInstance* VisualScriptFunction::instance(VScriptInstance* p_instance) {
  143. return NULL;
  144. }
  145. VisualScriptFunction::VisualScriptFunction() {
  146. }
  147. //////////////////////////////////////////
  148. ////////////////OPERATOR//////////////////
  149. //////////////////////////////////////////
  150. int VisualScriptOperator::get_output_sequence_port_count() const {
  151. return 1;
  152. }
  153. bool VisualScriptOperator::has_input_sequence_port() const{
  154. return true;
  155. }
  156. int VisualScriptOperator::get_input_value_port_count() const{
  157. return (op==Variant::OP_BIT_NEGATE || op==Variant::OP_NOT || op==Variant::OP_NEGATE) ? 1 : 2;
  158. }
  159. int VisualScriptOperator::get_output_value_port_count() const{
  160. return 1;
  161. }
  162. String VisualScriptOperator::get_output_sequence_port_text(int p_port) const {
  163. return String();
  164. }
  165. PropertyInfo VisualScriptOperator::get_input_value_port_info(int p_idx) const{
  166. static const Variant::Type port_types[Variant::OP_MAX][2]={
  167. {Variant::NIL,Variant::NIL}, //OP_EQUAL,
  168. {Variant::NIL,Variant::NIL}, //OP_NOT_EQUAL,
  169. {Variant::NIL,Variant::NIL}, //OP_LESS,
  170. {Variant::NIL,Variant::NIL}, //OP_LESS_EQUAL,
  171. {Variant::NIL,Variant::NIL}, //OP_GREATER,
  172. {Variant::NIL,Variant::NIL}, //OP_GREATER_EQUAL,
  173. //mathematic
  174. {Variant::NIL,Variant::NIL}, //OP_ADD,
  175. {Variant::NIL,Variant::NIL}, //OP_SUBSTRACT,
  176. {Variant::NIL,Variant::NIL}, //OP_MULTIPLY,
  177. {Variant::NIL,Variant::NIL}, //OP_DIVIDE,
  178. {Variant::NIL,Variant::NIL}, //OP_NEGATE,
  179. {Variant::INT,Variant::INT}, //OP_MODULE,
  180. {Variant::STRING,Variant::STRING}, //OP_STRING_CONCAT,
  181. //bitwise
  182. {Variant::INT,Variant::INT}, //OP_SHIFT_LEFT,
  183. {Variant::INT,Variant::INT}, //OP_SHIFT_RIGHT,
  184. {Variant::INT,Variant::INT}, //OP_BIT_AND,
  185. {Variant::INT,Variant::INT}, //OP_BIT_OR,
  186. {Variant::INT,Variant::INT}, //OP_BIT_XOR,
  187. {Variant::INT,Variant::INT}, //OP_BIT_NEGATE,
  188. //logic
  189. {Variant::BOOL,Variant::BOOL}, //OP_AND,
  190. {Variant::BOOL,Variant::BOOL}, //OP_OR,
  191. {Variant::BOOL,Variant::BOOL}, //OP_XOR,
  192. {Variant::BOOL,Variant::BOOL}, //OP_NOT,
  193. //containment
  194. {Variant::NIL,Variant::NIL} //OP_IN,
  195. };
  196. ERR_FAIL_INDEX_V(p_idx,Variant::OP_MAX,PropertyInfo());
  197. PropertyInfo pinfo;
  198. pinfo.name=p_idx==0?"A":"B";
  199. pinfo.type=port_types[op][p_idx];
  200. return pinfo;
  201. }
  202. PropertyInfo VisualScriptOperator::get_output_value_port_info(int p_idx) const{
  203. static const Variant::Type port_types[Variant::OP_MAX]={
  204. //comparation
  205. Variant::BOOL, //OP_EQUAL,
  206. Variant::BOOL, //OP_NOT_EQUAL,
  207. Variant::BOOL, //OP_LESS,
  208. Variant::BOOL, //OP_LESS_EQUAL,
  209. Variant::BOOL, //OP_GREATER,
  210. Variant::BOOL, //OP_GREATER_EQUAL,
  211. //mathematic
  212. Variant::NIL, //OP_ADD,
  213. Variant::NIL, //OP_SUBSTRACT,
  214. Variant::NIL, //OP_MULTIPLY,
  215. Variant::NIL, //OP_DIVIDE,
  216. Variant::NIL, //OP_NEGATE,
  217. Variant::INT, //OP_MODULE,
  218. Variant::STRING, //OP_STRING_CONCAT,
  219. //bitwise
  220. Variant::INT, //OP_SHIFT_LEFT,
  221. Variant::INT, //OP_SHIFT_RIGHT,
  222. Variant::INT, //OP_BIT_AND,
  223. Variant::INT, //OP_BIT_OR,
  224. Variant::INT, //OP_BIT_XOR,
  225. Variant::INT, //OP_BIT_NEGATE,
  226. //logic
  227. Variant::BOOL, //OP_AND,
  228. Variant::BOOL, //OP_OR,
  229. Variant::BOOL, //OP_XOR,
  230. Variant::BOOL, //OP_NOT,
  231. //containment
  232. Variant::BOOL //OP_IN,
  233. };
  234. PropertyInfo pinfo;
  235. pinfo.name="";
  236. pinfo.type=port_types[op];
  237. return pinfo;
  238. }
  239. static const char* op_names[]={
  240. //comparation
  241. "Equal", //OP_EQUAL,
  242. "NotEqual", //OP_NOT_EQUAL,
  243. "Less", //OP_LESS,
  244. "LessEqual", //OP_LESS_EQUAL,
  245. "Greater", //OP_GREATER,
  246. "GreaterEq", //OP_GREATER_EQUAL,
  247. //mathematic
  248. "Add", //OP_ADD,
  249. "Subtract", //OP_SUBSTRACT,
  250. "Multiply", //OP_MULTIPLY,
  251. "Divide", //OP_DIVIDE,
  252. "Negate", //OP_NEGATE,
  253. "Remainder", //OP_MODULE,
  254. "Concat", //OP_STRING_CONCAT,
  255. //bitwise
  256. "ShiftLeft", //OP_SHIFT_LEFT,
  257. "ShiftRight", //OP_SHIFT_RIGHT,
  258. "BitAnd", //OP_BIT_AND,
  259. "BitOr", //OP_BIT_OR,
  260. "BitXor", //OP_BIT_XOR,
  261. "BitNeg", //OP_BIT_NEGATE,
  262. //logic
  263. "And", //OP_AND,
  264. "Or", //OP_OR,
  265. "Xor", //OP_XOR,
  266. "Not", //OP_NOT,
  267. //containment
  268. "In", //OP_IN,
  269. };
  270. String VisualScriptOperator::get_caption() const {
  271. return op_names[op];
  272. }
  273. String VisualScriptOperator::get_text() const {
  274. static const wchar_t* op_names[]={
  275. //comparation
  276. L"A = B", //OP_EQUAL,
  277. L"A \u2260 B", //OP_NOT_EQUAL,
  278. L"A < B", //OP_LESS,
  279. L"A \u2264 B", //OP_LESS_EQUAL,
  280. L"A > B", //OP_GREATER,
  281. L"A \u2265 B", //OP_GREATER_EQUAL,
  282. //mathematic
  283. L"A + B", //OP_ADD,
  284. L"A - B", //OP_SUBSTRACT,
  285. L"A x B", //OP_MULTIPLY,
  286. L"A \u00F7 B", //OP_DIVIDE,
  287. L"\u00AC A", //OP_NEGATE,
  288. L"A mod B", //OP_MODULE,
  289. L"A .. B", //OP_STRING_CONCAT,
  290. //bitwise
  291. L"A << B", //OP_SHIFT_LEFT,
  292. L"A >> B", //OP_SHIFT_RIGHT,
  293. L"A & B", //OP_BIT_AND,
  294. L"A | B", //OP_BIT_OR,
  295. L"A ^ B", //OP_BIT_XOR,
  296. L"~A", //OP_BIT_NEGATE,
  297. //logic
  298. L"A and B", //OP_AND,
  299. L"A or B", //OP_OR,
  300. L"A xor B", //OP_XOR,
  301. L"not A", //OP_NOT,
  302. };
  303. return op_names[op];
  304. }
  305. void VisualScriptOperator::set_operator(Variant::Operator p_op) {
  306. if (op==p_op)
  307. return;
  308. op=p_op;
  309. ports_changed_notify();
  310. }
  311. Variant::Operator VisualScriptOperator::get_operator() const{
  312. return op;
  313. }
  314. void VisualScriptOperator::_bind_methods() {
  315. ObjectTypeDB::bind_method(_MD("set_operator","op"),&VisualScriptOperator::set_operator);
  316. ObjectTypeDB::bind_method(_MD("get_operator"),&VisualScriptOperator::get_operator);
  317. String types;
  318. for(int i=0;i<Variant::OP_MAX;i++) {
  319. if (i>0)
  320. types+=",";
  321. types+=op_names[i];
  322. }
  323. ADD_PROPERTY(PropertyInfo(Variant::INT,"operator_value/type",PROPERTY_HINT_ENUM,types),_SCS("set_operator"),_SCS("get_operator"));
  324. }
  325. VisualScriptNodeInstance* VisualScriptOperator::instance(VScriptInstance* p_instance) {
  326. return NULL;
  327. }
  328. VisualScriptOperator::VisualScriptOperator() {
  329. op=Variant::OP_ADD;
  330. }
  331. template<Variant::Operator OP>
  332. static Ref<VisualScriptNode> create_op_node(const String& p_name) {
  333. Ref<VisualScriptOperator> node;
  334. node.instance();
  335. node->set_operator(OP);
  336. return node;
  337. }
  338. //////////////////////////////////////////
  339. ////////////////VARIABLE//////////////////
  340. //////////////////////////////////////////
  341. int VisualScriptVariable::get_output_sequence_port_count() const {
  342. return 1;
  343. }
  344. bool VisualScriptVariable::has_input_sequence_port() const{
  345. return true;
  346. }
  347. int VisualScriptVariable::get_input_value_port_count() const{
  348. return 1;
  349. }
  350. int VisualScriptVariable::get_output_value_port_count() const{
  351. return 1;
  352. }
  353. String VisualScriptVariable::get_output_sequence_port_text(int p_port) const {
  354. return String();
  355. }
  356. PropertyInfo VisualScriptVariable::get_input_value_port_info(int p_idx) const{
  357. PropertyInfo pinfo;
  358. pinfo.name="set";
  359. if (get_visual_script().is_valid() && get_visual_script()->has_variable(variable)) {
  360. PropertyInfo vinfo = get_visual_script()->get_variable_info(variable);
  361. pinfo.type=vinfo.type;
  362. pinfo.hint=vinfo.hint;
  363. pinfo.hint_string=vinfo.hint_string;
  364. }
  365. return pinfo;
  366. }
  367. PropertyInfo VisualScriptVariable::get_output_value_port_info(int p_idx) const{
  368. PropertyInfo pinfo;
  369. pinfo.name="get";
  370. if (get_visual_script().is_valid() && get_visual_script()->has_variable(variable)) {
  371. PropertyInfo vinfo = get_visual_script()->get_variable_info(variable);
  372. pinfo.type=vinfo.type;
  373. pinfo.hint=vinfo.hint;
  374. pinfo.hint_string=vinfo.hint_string;
  375. }
  376. return pinfo;
  377. }
  378. String VisualScriptVariable::get_caption() const {
  379. return "Variable";
  380. }
  381. String VisualScriptVariable::get_text() const {
  382. return variable;
  383. }
  384. void VisualScriptVariable::set_variable(StringName p_variable) {
  385. if (variable==p_variable)
  386. return;
  387. variable=p_variable;
  388. ports_changed_notify();
  389. }
  390. StringName VisualScriptVariable::get_variable() const{
  391. return variable;
  392. }
  393. void VisualScriptVariable::_validate_property(PropertyInfo& property) const {
  394. if (property.name=="variable/name" && get_visual_script().is_valid()) {
  395. Ref<VisualScript> vs = get_visual_script();
  396. List<StringName> vars;
  397. vs->get_variable_list(&vars);
  398. String vhint;
  399. for (List<StringName>::Element *E=vars.front();E;E=E->next()) {
  400. if (vhint!=String())
  401. vhint+=",";
  402. vhint+=E->get().operator String();
  403. }
  404. property.hint=PROPERTY_HINT_ENUM;
  405. property.hint_string=vhint;
  406. }
  407. }
  408. void VisualScriptVariable::_bind_methods() {
  409. ObjectTypeDB::bind_method(_MD("set_variable","name"),&VisualScriptVariable::set_variable);
  410. ObjectTypeDB::bind_method(_MD("get_variable"),&VisualScriptVariable::get_variable);
  411. ADD_PROPERTY(PropertyInfo(Variant::STRING,"variable/name"),_SCS("set_variable"),_SCS("get_variable"));
  412. }
  413. VisualScriptNodeInstance* VisualScriptVariable::instance(VScriptInstance* p_instance) {
  414. return NULL;
  415. }
  416. VisualScriptVariable::VisualScriptVariable() {
  417. }
  418. //////////////////////////////////////////
  419. ////////////////CONSTANT//////////////////
  420. //////////////////////////////////////////
  421. int VisualScriptConstant::get_output_sequence_port_count() const {
  422. return 0;
  423. }
  424. bool VisualScriptConstant::has_input_sequence_port() const{
  425. return false;
  426. }
  427. int VisualScriptConstant::get_input_value_port_count() const{
  428. return 0;
  429. }
  430. int VisualScriptConstant::get_output_value_port_count() const{
  431. return 1;
  432. }
  433. String VisualScriptConstant::get_output_sequence_port_text(int p_port) const {
  434. return String();
  435. }
  436. PropertyInfo VisualScriptConstant::get_input_value_port_info(int p_idx) const{
  437. return PropertyInfo();
  438. }
  439. PropertyInfo VisualScriptConstant::get_output_value_port_info(int p_idx) const{
  440. PropertyInfo pinfo;
  441. pinfo.name="get";
  442. pinfo.type=type;
  443. return pinfo;
  444. }
  445. String VisualScriptConstant::get_caption() const {
  446. return "Constant";
  447. }
  448. String VisualScriptConstant::get_text() const {
  449. return String(value);
  450. }
  451. void VisualScriptConstant::set_constant_type(Variant::Type p_type) {
  452. if (type==p_type)
  453. return;
  454. type=p_type;
  455. ports_changed_notify();
  456. Variant::CallError ce;
  457. value=Variant::construct(type,NULL,0,ce);
  458. _change_notify();
  459. }
  460. Variant::Type VisualScriptConstant::get_constant_type() const{
  461. return type;
  462. }
  463. void VisualScriptConstant::set_constant_value(Variant p_value){
  464. if (value==p_value)
  465. return;
  466. value=p_value;
  467. ports_changed_notify();
  468. }
  469. Variant VisualScriptConstant::get_constant_value() const{
  470. return value;
  471. }
  472. void VisualScriptConstant::_validate_property(PropertyInfo& property) const {
  473. if (property.name=="constant/value") {
  474. property.type=type;
  475. if (type==Variant::NIL)
  476. property.usage=0; //do not save if nil
  477. }
  478. }
  479. void VisualScriptConstant::_bind_methods() {
  480. ObjectTypeDB::bind_method(_MD("set_constant_type","type"),&VisualScriptConstant::set_constant_type);
  481. ObjectTypeDB::bind_method(_MD("get_constant_type"),&VisualScriptConstant::get_constant_type);
  482. ObjectTypeDB::bind_method(_MD("set_constant_value","value"),&VisualScriptConstant::set_constant_value);
  483. ObjectTypeDB::bind_method(_MD("get_constant_value"),&VisualScriptConstant::get_constant_value);
  484. String argt="Null";
  485. for(int i=1;i<Variant::VARIANT_MAX;i++) {
  486. argt+=","+Variant::get_type_name(Variant::Type(i));
  487. }
  488. ADD_PROPERTY(PropertyInfo(Variant::INT,"constant/type",PROPERTY_HINT_ENUM,argt),_SCS("set_constant_type"),_SCS("get_constant_type"));
  489. ADD_PROPERTY(PropertyInfo(Variant::NIL,"constant/value"),_SCS("set_constant_value"),_SCS("get_constant_value"));
  490. }
  491. VisualScriptNodeInstance* VisualScriptConstant::instance(VScriptInstance* p_instance) {
  492. return NULL;
  493. }
  494. VisualScriptConstant::VisualScriptConstant() {
  495. type=Variant::NIL;
  496. }
  497. //////////////////////////////////////////
  498. ////////////////INDEX////////////////////
  499. //////////////////////////////////////////
  500. int VisualScriptIndexGet::get_output_sequence_port_count() const {
  501. return 1;
  502. }
  503. bool VisualScriptIndexGet::has_input_sequence_port() const{
  504. return true;
  505. }
  506. int VisualScriptIndexGet::get_input_value_port_count() const{
  507. return 2;
  508. }
  509. int VisualScriptIndexGet::get_output_value_port_count() const{
  510. return 1;
  511. }
  512. String VisualScriptIndexGet::get_output_sequence_port_text(int p_port) const {
  513. return String();
  514. }
  515. PropertyInfo VisualScriptIndexGet::get_input_value_port_info(int p_idx) const{
  516. if (p_idx==0) {
  517. return PropertyInfo(Variant::NIL,"base");
  518. } else {
  519. return PropertyInfo(Variant::NIL,"index");
  520. }
  521. }
  522. PropertyInfo VisualScriptIndexGet::get_output_value_port_info(int p_idx) const{
  523. return PropertyInfo();
  524. }
  525. String VisualScriptIndexGet::get_caption() const {
  526. return "IndexGet";
  527. }
  528. String VisualScriptIndexGet::get_text() const {
  529. return String("get");
  530. }
  531. VisualScriptNodeInstance* VisualScriptIndexGet::instance(VScriptInstance* p_instance) {
  532. return NULL;
  533. }
  534. VisualScriptIndexGet::VisualScriptIndexGet() {
  535. }
  536. //////////////////////////////////////////
  537. ////////////////INDEXSET//////////////////
  538. //////////////////////////////////////////
  539. int VisualScriptIndexSet::get_output_sequence_port_count() const {
  540. return 1;
  541. }
  542. bool VisualScriptIndexSet::has_input_sequence_port() const{
  543. return true;
  544. }
  545. int VisualScriptIndexSet::get_input_value_port_count() const{
  546. return 3;
  547. }
  548. int VisualScriptIndexSet::get_output_value_port_count() const{
  549. return 0;
  550. }
  551. String VisualScriptIndexSet::get_output_sequence_port_text(int p_port) const {
  552. return String();
  553. }
  554. PropertyInfo VisualScriptIndexSet::get_input_value_port_info(int p_idx) const{
  555. if (p_idx==0) {
  556. return PropertyInfo(Variant::NIL,"base");
  557. } else if (p_idx==1){
  558. return PropertyInfo(Variant::NIL,"index");
  559. } else {
  560. return PropertyInfo(Variant::NIL,"value");
  561. }
  562. }
  563. PropertyInfo VisualScriptIndexSet::get_output_value_port_info(int p_idx) const{
  564. return PropertyInfo();
  565. }
  566. String VisualScriptIndexSet::get_caption() const {
  567. return "IndexSet";
  568. }
  569. String VisualScriptIndexSet::get_text() const {
  570. return String("set");
  571. }
  572. VisualScriptNodeInstance* VisualScriptIndexSet::instance(VScriptInstance* p_instance) {
  573. return NULL;
  574. }
  575. VisualScriptIndexSet::VisualScriptIndexSet() {
  576. }
  577. //////////////////////////////////////////
  578. ////////////////GLOBALCONSTANT///////////
  579. //////////////////////////////////////////
  580. int VisualScriptGlobalConstant::get_output_sequence_port_count() const {
  581. return 0;
  582. }
  583. bool VisualScriptGlobalConstant::has_input_sequence_port() const{
  584. return false;
  585. }
  586. int VisualScriptGlobalConstant::get_input_value_port_count() const{
  587. return 0;
  588. }
  589. int VisualScriptGlobalConstant::get_output_value_port_count() const{
  590. return 1;
  591. }
  592. String VisualScriptGlobalConstant::get_output_sequence_port_text(int p_port) const {
  593. return String();
  594. }
  595. PropertyInfo VisualScriptGlobalConstant::get_input_value_port_info(int p_idx) const{
  596. return PropertyInfo();
  597. }
  598. PropertyInfo VisualScriptGlobalConstant::get_output_value_port_info(int p_idx) const{
  599. return PropertyInfo(Variant::REAL,"value");
  600. }
  601. String VisualScriptGlobalConstant::get_caption() const {
  602. return "GlobalConst";
  603. }
  604. String VisualScriptGlobalConstant::get_text() const {
  605. return GlobalConstants::get_global_constant_name(index);
  606. }
  607. void VisualScriptGlobalConstant::set_global_constant(int p_which) {
  608. index=p_which;
  609. _change_notify();
  610. ports_changed_notify();
  611. }
  612. int VisualScriptGlobalConstant::get_global_constant() {
  613. return index;
  614. }
  615. VisualScriptNodeInstance* VisualScriptGlobalConstant::instance(VScriptInstance* p_instance) {
  616. return NULL;
  617. }
  618. void VisualScriptGlobalConstant::_bind_methods() {
  619. ObjectTypeDB::bind_method(_MD("set_global_constant","index"),&VisualScriptGlobalConstant::set_global_constant);
  620. ObjectTypeDB::bind_method(_MD("get_global_constant"),&VisualScriptGlobalConstant::get_global_constant);
  621. String cc;
  622. for(int i=0;i<GlobalConstants::get_global_constant_count();i++) {
  623. if (i>0)
  624. cc+=",";
  625. cc+=GlobalConstants::get_global_constant_name(i);
  626. }
  627. ADD_PROPERTY(PropertyInfo(Variant::INT,"constant",PROPERTY_HINT_ENUM,cc),_SCS("set_global_constant"),_SCS("get_global_constant"));
  628. }
  629. VisualScriptGlobalConstant::VisualScriptGlobalConstant() {
  630. index=0;
  631. }
  632. //////////////////////////////////////////
  633. ////////////////MATHCONSTANT///////////
  634. //////////////////////////////////////////
  635. const char* VisualScriptMathConstant::const_name[MATH_CONSTANT_MAX]={
  636. "One",
  637. "PI",
  638. "PIx2",
  639. "PI/2",
  640. "E",
  641. "Sqrt2",
  642. };
  643. int VisualScriptMathConstant::get_output_sequence_port_count() const {
  644. return 0;
  645. }
  646. bool VisualScriptMathConstant::has_input_sequence_port() const{
  647. return false;
  648. }
  649. int VisualScriptMathConstant::get_input_value_port_count() const{
  650. return 0;
  651. }
  652. int VisualScriptMathConstant::get_output_value_port_count() const{
  653. return 1;
  654. }
  655. String VisualScriptMathConstant::get_output_sequence_port_text(int p_port) const {
  656. return String();
  657. }
  658. PropertyInfo VisualScriptMathConstant::get_input_value_port_info(int p_idx) const{
  659. return PropertyInfo();
  660. }
  661. PropertyInfo VisualScriptMathConstant::get_output_value_port_info(int p_idx) const{
  662. return PropertyInfo(Variant::INT,"value");
  663. }
  664. String VisualScriptMathConstant::get_caption() const {
  665. return "MathConst";
  666. }
  667. String VisualScriptMathConstant::get_text() const {
  668. return const_name[constant];
  669. }
  670. void VisualScriptMathConstant::set_math_constant(MathConstant p_which) {
  671. constant=p_which;
  672. _change_notify();
  673. ports_changed_notify();
  674. }
  675. VisualScriptMathConstant::MathConstant VisualScriptMathConstant::get_math_constant() {
  676. return constant;
  677. }
  678. VisualScriptNodeInstance* VisualScriptMathConstant::instance(VScriptInstance* p_instance) {
  679. return NULL;
  680. }
  681. void VisualScriptMathConstant::_bind_methods() {
  682. ObjectTypeDB::bind_method(_MD("set_math_constant","which"),&VisualScriptMathConstant::set_math_constant);
  683. ObjectTypeDB::bind_method(_MD("get_math_constant"),&VisualScriptMathConstant::get_math_constant);
  684. String cc;
  685. for(int i=0;i<MATH_CONSTANT_MAX;i++) {
  686. if (i>0)
  687. cc+=",";
  688. cc+=const_name[i];
  689. }
  690. ADD_PROPERTY(PropertyInfo(Variant::INT,"constant",PROPERTY_HINT_ENUM,cc),_SCS("set_math_constant"),_SCS("get_math_constant"));
  691. }
  692. VisualScriptMathConstant::VisualScriptMathConstant() {
  693. constant=MATH_CONSTANT_ONE;
  694. }
  695. //////////////////////////////////////////
  696. ////////////////GLOBALSINGLETON///////////
  697. //////////////////////////////////////////
  698. int VisualScriptEngineSingleton::get_output_sequence_port_count() const {
  699. return 0;
  700. }
  701. bool VisualScriptEngineSingleton::has_input_sequence_port() const{
  702. return false;
  703. }
  704. int VisualScriptEngineSingleton::get_input_value_port_count() const{
  705. return 0;
  706. }
  707. int VisualScriptEngineSingleton::get_output_value_port_count() const{
  708. return 1;
  709. }
  710. String VisualScriptEngineSingleton::get_output_sequence_port_text(int p_port) const {
  711. return String();
  712. }
  713. PropertyInfo VisualScriptEngineSingleton::get_input_value_port_info(int p_idx) const{
  714. return PropertyInfo();
  715. }
  716. PropertyInfo VisualScriptEngineSingleton::get_output_value_port_info(int p_idx) const{
  717. return PropertyInfo(Variant::OBJECT,"instance");
  718. }
  719. String VisualScriptEngineSingleton::get_caption() const {
  720. return "EngineSingleton";
  721. }
  722. String VisualScriptEngineSingleton::get_text() const {
  723. return singleton;
  724. }
  725. void VisualScriptEngineSingleton::set_singleton(const String& p_string) {
  726. singleton=p_string;
  727. _change_notify();
  728. ports_changed_notify();
  729. }
  730. String VisualScriptEngineSingleton::get_singleton() {
  731. return singleton;
  732. }
  733. VisualScriptNodeInstance* VisualScriptEngineSingleton::instance(VScriptInstance* p_instance) {
  734. return NULL;
  735. }
  736. void VisualScriptEngineSingleton::_bind_methods() {
  737. ObjectTypeDB::bind_method(_MD("set_singleton","name"),&VisualScriptEngineSingleton::set_singleton);
  738. ObjectTypeDB::bind_method(_MD("get_singleton"),&VisualScriptEngineSingleton::get_singleton);
  739. String cc;
  740. List<Globals::Singleton> singletons;
  741. Globals::get_singleton()->get_singletons(&singletons);
  742. for (List<Globals::Singleton>::Element *E=singletons.front();E;E=E->next()) {
  743. if (E->get().name=="VS" || E->get().name=="PS" || E->get().name=="PS2D" || E->get().name=="AS" || E->get().name=="TS" || E->get().name=="SS" || E->get().name=="SS2D")
  744. continue; //skip these, too simple named
  745. if (cc!=String())
  746. cc+=",";
  747. cc+=E->get().name;
  748. }
  749. ADD_PROPERTY(PropertyInfo(Variant::STRING,"constant",PROPERTY_HINT_ENUM,cc),_SCS("set_singleton"),_SCS("get_singleton"));
  750. }
  751. VisualScriptEngineSingleton::VisualScriptEngineSingleton() {
  752. singleton=String();
  753. }
  754. //////////////////////////////////////////
  755. ////////////////GETNODE///////////
  756. //////////////////////////////////////////
  757. int VisualScriptSceneNode::get_output_sequence_port_count() const {
  758. return 0;
  759. }
  760. bool VisualScriptSceneNode::has_input_sequence_port() const{
  761. return false;
  762. }
  763. int VisualScriptSceneNode::get_input_value_port_count() const{
  764. return 0;
  765. }
  766. int VisualScriptSceneNode::get_output_value_port_count() const{
  767. return 1;
  768. }
  769. String VisualScriptSceneNode::get_output_sequence_port_text(int p_port) const {
  770. return String();
  771. }
  772. PropertyInfo VisualScriptSceneNode::get_input_value_port_info(int p_idx) const{
  773. return PropertyInfo();
  774. }
  775. PropertyInfo VisualScriptSceneNode::get_output_value_port_info(int p_idx) const{
  776. return PropertyInfo(Variant::OBJECT,"node");
  777. }
  778. String VisualScriptSceneNode::get_caption() const {
  779. return "SceneNode";
  780. }
  781. String VisualScriptSceneNode::get_text() const {
  782. return path.simplified();
  783. }
  784. void VisualScriptSceneNode::set_node_path(const NodePath& p_path) {
  785. path=p_path;
  786. _change_notify();
  787. ports_changed_notify();
  788. }
  789. NodePath VisualScriptSceneNode::get_node_path() {
  790. return path;
  791. }
  792. VisualScriptNodeInstance* VisualScriptSceneNode::instance(VScriptInstance* p_instance) {
  793. return NULL;
  794. }
  795. #ifdef TOOLS_ENABLED
  796. static Node* _find_script_node(Node* p_edited_scene,Node* p_current_node,const Ref<Script> &script) {
  797. if (p_edited_scene!=p_current_node && p_current_node->get_owner()!=p_edited_scene)
  798. return NULL;
  799. Ref<Script> scr = p_current_node->get_script();
  800. if (scr.is_valid() && scr==script)
  801. return p_current_node;
  802. for(int i=0;i<p_current_node->get_child_count();i++) {
  803. Node *n = _find_script_node(p_edited_scene,p_current_node->get_child(i),script);
  804. if (n)
  805. return n;
  806. }
  807. return NULL;
  808. }
  809. #endif
  810. void VisualScriptSceneNode::_validate_property(PropertyInfo& property) const {
  811. #ifdef TOOLS_ENABLED
  812. if (property.name=="node_path") {
  813. Ref<Script> script = get_visual_script();
  814. if (!script.is_valid())
  815. return;
  816. MainLoop * main_loop = OS::get_singleton()->get_main_loop();
  817. if (!main_loop)
  818. return;
  819. SceneTree *scene_tree = main_loop->cast_to<SceneTree>();
  820. if (!scene_tree)
  821. return;
  822. Node *edited_scene = scene_tree->get_edited_scene_root();
  823. if (!edited_scene)
  824. return;
  825. Node* script_node = _find_script_node(edited_scene,edited_scene,script);
  826. if (!script_node)
  827. return;
  828. property.hint_string=script_node->get_path();
  829. }
  830. #endif
  831. }
  832. void VisualScriptSceneNode::_bind_methods() {
  833. ObjectTypeDB::bind_method(_MD("set_node_path","path"),&VisualScriptSceneNode::set_node_path);
  834. ObjectTypeDB::bind_method(_MD("get_node_path"),&VisualScriptSceneNode::get_node_path);
  835. ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH,"node_path",PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE),_SCS("set_node_path"),_SCS("get_node_path"));
  836. }
  837. VisualScriptSceneNode::VisualScriptSceneNode() {
  838. path=String(".");
  839. }
  840. //////////////////////////////////////////
  841. ////////////////SceneTree///////////
  842. //////////////////////////////////////////
  843. int VisualScriptSceneTree::get_output_sequence_port_count() const {
  844. return 0;
  845. }
  846. bool VisualScriptSceneTree::has_input_sequence_port() const{
  847. return false;
  848. }
  849. int VisualScriptSceneTree::get_input_value_port_count() const{
  850. return 0;
  851. }
  852. int VisualScriptSceneTree::get_output_value_port_count() const{
  853. return 1;
  854. }
  855. String VisualScriptSceneTree::get_output_sequence_port_text(int p_port) const {
  856. return String();
  857. }
  858. PropertyInfo VisualScriptSceneTree::get_input_value_port_info(int p_idx) const{
  859. return PropertyInfo();
  860. }
  861. PropertyInfo VisualScriptSceneTree::get_output_value_port_info(int p_idx) const{
  862. return PropertyInfo(Variant::OBJECT,"instance");
  863. }
  864. String VisualScriptSceneTree::get_caption() const {
  865. return "SceneTree";
  866. }
  867. String VisualScriptSceneTree::get_text() const {
  868. return "";
  869. }
  870. VisualScriptNodeInstance* VisualScriptSceneTree::instance(VScriptInstance* p_instance) {
  871. return NULL;
  872. }
  873. void VisualScriptSceneTree::_validate_property(PropertyInfo& property) const {
  874. }
  875. void VisualScriptSceneTree::_bind_methods() {
  876. }
  877. VisualScriptSceneTree::VisualScriptSceneTree() {
  878. }
  879. //////////////////////////////////////////
  880. ////////////////RESPATH///////////
  881. //////////////////////////////////////////
  882. int VisualScriptResourcePath::get_output_sequence_port_count() const {
  883. return 0;
  884. }
  885. bool VisualScriptResourcePath::has_input_sequence_port() const{
  886. return false;
  887. }
  888. int VisualScriptResourcePath::get_input_value_port_count() const{
  889. return 0;
  890. }
  891. int VisualScriptResourcePath::get_output_value_port_count() const{
  892. return 1;
  893. }
  894. String VisualScriptResourcePath::get_output_sequence_port_text(int p_port) const {
  895. return String();
  896. }
  897. PropertyInfo VisualScriptResourcePath::get_input_value_port_info(int p_idx) const{
  898. return PropertyInfo();
  899. }
  900. PropertyInfo VisualScriptResourcePath::get_output_value_port_info(int p_idx) const{
  901. return PropertyInfo(Variant::STRING,"path");
  902. }
  903. String VisualScriptResourcePath::get_caption() const {
  904. return "ResourcePath";
  905. }
  906. String VisualScriptResourcePath::get_text() const {
  907. return path;
  908. }
  909. void VisualScriptResourcePath::set_resource_path(const String& p_path) {
  910. path=p_path;
  911. _change_notify();
  912. ports_changed_notify();
  913. }
  914. String VisualScriptResourcePath::get_resource_path() {
  915. return path;
  916. }
  917. VisualScriptNodeInstance* VisualScriptResourcePath::instance(VScriptInstance* p_instance) {
  918. return NULL;
  919. }
  920. void VisualScriptResourcePath::_bind_methods() {
  921. ObjectTypeDB::bind_method(_MD("set_resource_path","path"),&VisualScriptResourcePath::set_resource_path);
  922. ObjectTypeDB::bind_method(_MD("get_resource_path"),&VisualScriptResourcePath::get_resource_path);
  923. ADD_PROPERTY(PropertyInfo(Variant::STRING,"path",PROPERTY_HINT_FILE),_SCS("set_resource_path"),_SCS("get_resource_path"));
  924. }
  925. VisualScriptResourcePath::VisualScriptResourcePath() {
  926. path="";
  927. }
  928. void register_visual_script_nodes() {
  929. VisualScriptLanguage::singleton->add_register_func("data/variable",create_node_generic<VisualScriptVariable>);
  930. VisualScriptLanguage::singleton->add_register_func("data/constant",create_node_generic<VisualScriptConstant>);
  931. VisualScriptLanguage::singleton->add_register_func("data/global_constant",create_node_generic<VisualScriptGlobalConstant>);
  932. VisualScriptLanguage::singleton->add_register_func("data/math_constant",create_node_generic<VisualScriptMathConstant>);
  933. VisualScriptLanguage::singleton->add_register_func("data/engine_singleton",create_node_generic<VisualScriptEngineSingleton>);
  934. VisualScriptLanguage::singleton->add_register_func("data/scene_node",create_node_generic<VisualScriptSceneNode>);
  935. VisualScriptLanguage::singleton->add_register_func("data/scene_tree",create_node_generic<VisualScriptSceneTree>);
  936. VisualScriptLanguage::singleton->add_register_func("data/resource_path",create_node_generic<VisualScriptResourcePath>);
  937. VisualScriptLanguage::singleton->add_register_func("index/get_index",create_node_generic<VisualScriptIndexGet>);
  938. VisualScriptLanguage::singleton->add_register_func("index/set_index",create_node_generic<VisualScriptIndexSet>);
  939. VisualScriptLanguage::singleton->add_register_func("operators/compare/equal",create_op_node<Variant::OP_EQUAL>);
  940. VisualScriptLanguage::singleton->add_register_func("operators/compare/not_equal",create_op_node<Variant::OP_NOT_EQUAL>);
  941. VisualScriptLanguage::singleton->add_register_func("operators/compare/less",create_op_node<Variant::OP_LESS>);
  942. VisualScriptLanguage::singleton->add_register_func("operators/compare/less_equal",create_op_node<Variant::OP_LESS_EQUAL>);
  943. VisualScriptLanguage::singleton->add_register_func("operators/compare/greater",create_op_node<Variant::OP_GREATER>);
  944. VisualScriptLanguage::singleton->add_register_func("operators/compare/greater_equal",create_op_node<Variant::OP_GREATER_EQUAL>);
  945. //mathematic
  946. VisualScriptLanguage::singleton->add_register_func("operators/math/add",create_op_node<Variant::OP_ADD>);
  947. VisualScriptLanguage::singleton->add_register_func("operators/math/subtract",create_op_node<Variant::OP_SUBSTRACT>);
  948. VisualScriptLanguage::singleton->add_register_func("operators/math/multiply",create_op_node<Variant::OP_MULTIPLY>);
  949. VisualScriptLanguage::singleton->add_register_func("operators/math/divide",create_op_node<Variant::OP_DIVIDE>);
  950. VisualScriptLanguage::singleton->add_register_func("operators/math/negate",create_op_node<Variant::OP_NEGATE>);
  951. VisualScriptLanguage::singleton->add_register_func("operators/math/remainder",create_op_node<Variant::OP_MODULE>);
  952. VisualScriptLanguage::singleton->add_register_func("operators/math/string_concat",create_op_node<Variant::OP_STRING_CONCAT>);
  953. //bitwise
  954. VisualScriptLanguage::singleton->add_register_func("operators/bitwise/shift_left",create_op_node<Variant::OP_SHIFT_LEFT>);
  955. VisualScriptLanguage::singleton->add_register_func("operators/bitwise/shift_right",create_op_node<Variant::OP_SHIFT_RIGHT>);
  956. VisualScriptLanguage::singleton->add_register_func("operators/bitwise/bit_and",create_op_node<Variant::OP_BIT_AND>);
  957. VisualScriptLanguage::singleton->add_register_func("operators/bitwise/bit_or",create_op_node<Variant::OP_BIT_OR>);
  958. VisualScriptLanguage::singleton->add_register_func("operators/bitwise/bit_xor",create_op_node<Variant::OP_BIT_XOR>);
  959. VisualScriptLanguage::singleton->add_register_func("operators/bitwise/bit_negate",create_op_node<Variant::OP_BIT_NEGATE>);
  960. //logic
  961. VisualScriptLanguage::singleton->add_register_func("operators/logic/and",create_op_node<Variant::OP_AND>);
  962. VisualScriptLanguage::singleton->add_register_func("operators/logic/or",create_op_node<Variant::OP_OR>);
  963. VisualScriptLanguage::singleton->add_register_func("operators/logic/xor",create_op_node<Variant::OP_XOR>);
  964. VisualScriptLanguage::singleton->add_register_func("operators/logic/not",create_op_node<Variant::OP_NOT>);
  965. VisualScriptLanguage::singleton->add_register_func("operators/logic/in",create_op_node<Variant::OP_IN>);
  966. }