visual_script_flow_control.cpp 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871
  1. #include "visual_script_flow_control.h"
  2. #include "os/keyboard.h"
  3. #include "globals.h"
  4. //////////////////////////////////////////
  5. ////////////////RETURN////////////////////
  6. //////////////////////////////////////////
  7. int VisualScriptReturn::get_output_sequence_port_count() const {
  8. return 0;
  9. }
  10. bool VisualScriptReturn::has_input_sequence_port() const{
  11. return true;
  12. }
  13. int VisualScriptReturn::get_input_value_port_count() const{
  14. return with_value?1:0;
  15. }
  16. int VisualScriptReturn::get_output_value_port_count() const{
  17. return 0;
  18. }
  19. String VisualScriptReturn::get_output_sequence_port_text(int p_port) const {
  20. return String();
  21. }
  22. PropertyInfo VisualScriptReturn::get_input_value_port_info(int p_idx) const{
  23. PropertyInfo pinfo;
  24. pinfo.name="result";
  25. pinfo.type=type;
  26. return pinfo;
  27. }
  28. PropertyInfo VisualScriptReturn::get_output_value_port_info(int p_idx) const{
  29. return PropertyInfo();
  30. }
  31. String VisualScriptReturn::get_caption() const {
  32. return "Return";
  33. }
  34. String VisualScriptReturn::get_text() const {
  35. return get_name();
  36. }
  37. void VisualScriptReturn::set_return_type(Variant::Type p_type) {
  38. if (type==p_type)
  39. return;
  40. type=p_type;
  41. ports_changed_notify();
  42. }
  43. Variant::Type VisualScriptReturn::get_return_type() const{
  44. return type;
  45. }
  46. void VisualScriptReturn::set_enable_return_value(bool p_enable) {
  47. if (with_value==p_enable)
  48. return;
  49. with_value=p_enable;
  50. ports_changed_notify();
  51. }
  52. bool VisualScriptReturn::is_return_value_enabled() const {
  53. return with_value;
  54. }
  55. void VisualScriptReturn::_bind_methods() {
  56. ObjectTypeDB::bind_method(_MD("set_return_type","type"),&VisualScriptReturn::set_return_type);
  57. ObjectTypeDB::bind_method(_MD("get_return_type"),&VisualScriptReturn::get_return_type);
  58. ObjectTypeDB::bind_method(_MD("set_enable_return_value","enable"),&VisualScriptReturn::set_enable_return_value);
  59. ObjectTypeDB::bind_method(_MD("is_return_value_enabled"),&VisualScriptReturn::is_return_value_enabled);
  60. String argt="Variant";
  61. for(int i=1;i<Variant::VARIANT_MAX;i++) {
  62. argt+=","+Variant::get_type_name(Variant::Type(i));
  63. }
  64. ADD_PROPERTY(PropertyInfo(Variant::BOOL,"return_value/enabled"),_SCS("set_enable_return_value"),_SCS("is_return_value_enabled"));
  65. ADD_PROPERTY(PropertyInfo(Variant::INT,"return_value/type",PROPERTY_HINT_ENUM,argt),_SCS("set_return_type"),_SCS("get_return_type"));
  66. }
  67. class VisualScriptNodeInstanceReturn : public VisualScriptNodeInstance {
  68. public:
  69. VisualScriptReturn *node;
  70. VisualScriptInstance *instance;
  71. bool with_value;
  72. virtual int get_working_memory_size() const { return 1; }
  73. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  74. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return true; }
  75. 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) {
  76. if (with_value) {
  77. *p_working_mem = *p_inputs[0];
  78. } else {
  79. *p_working_mem = Variant();
  80. }
  81. return 0;
  82. }
  83. };
  84. VisualScriptNodeInstance* VisualScriptReturn::instance(VisualScriptInstance* p_instance) {
  85. VisualScriptNodeInstanceReturn * instance = memnew(VisualScriptNodeInstanceReturn );
  86. instance->node=this;
  87. instance->instance=p_instance;
  88. instance->with_value=with_value;
  89. return instance;
  90. }
  91. VisualScriptReturn::VisualScriptReturn() {
  92. with_value=false;
  93. type=Variant::NIL;
  94. }
  95. template<bool with_value>
  96. static Ref<VisualScriptNode> create_return_node(const String& p_name) {
  97. Ref<VisualScriptReturn> node;
  98. node.instance();
  99. node->set_enable_return_value(with_value);
  100. return node;
  101. }
  102. //////////////////////////////////////////
  103. ////////////////CONDITION/////////////////
  104. //////////////////////////////////////////
  105. int VisualScriptCondition::get_output_sequence_port_count() const {
  106. return 2;
  107. }
  108. bool VisualScriptCondition::has_input_sequence_port() const{
  109. return true;
  110. }
  111. int VisualScriptCondition::get_input_value_port_count() const{
  112. return 1;
  113. }
  114. int VisualScriptCondition::get_output_value_port_count() const{
  115. return 0;
  116. }
  117. String VisualScriptCondition::get_output_sequence_port_text(int p_port) const {
  118. if (p_port==0)
  119. return "true";
  120. else
  121. return "false";
  122. }
  123. PropertyInfo VisualScriptCondition::get_input_value_port_info(int p_idx) const{
  124. PropertyInfo pinfo;
  125. pinfo.name="cond";
  126. pinfo.type=Variant::BOOL;
  127. return pinfo;
  128. }
  129. PropertyInfo VisualScriptCondition::get_output_value_port_info(int p_idx) const{
  130. return PropertyInfo();
  131. }
  132. String VisualScriptCondition::get_caption() const {
  133. return "Condition";
  134. }
  135. String VisualScriptCondition::get_text() const {
  136. return "if (cond) is: ";
  137. }
  138. void VisualScriptCondition::_bind_methods() {
  139. }
  140. class VisualScriptNodeInstanceCondition : public VisualScriptNodeInstance {
  141. public:
  142. VisualScriptCondition *node;
  143. VisualScriptInstance *instance;
  144. //virtual int get_working_memory_size() const { return 1; }
  145. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  146. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return true; }
  147. 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) {
  148. if (p_inputs[0]->operator bool())
  149. return 0;
  150. else
  151. return 1;
  152. }
  153. };
  154. VisualScriptNodeInstance* VisualScriptCondition::instance(VisualScriptInstance* p_instance) {
  155. VisualScriptNodeInstanceCondition * instance = memnew(VisualScriptNodeInstanceCondition );
  156. instance->node=this;
  157. instance->instance=p_instance;
  158. return instance;
  159. }
  160. VisualScriptCondition::VisualScriptCondition() {
  161. }
  162. //////////////////////////////////////////
  163. ////////////////WHILE/////////////////
  164. //////////////////////////////////////////
  165. int VisualScriptWhile::get_output_sequence_port_count() const {
  166. return 2;
  167. }
  168. bool VisualScriptWhile::has_input_sequence_port() const{
  169. return true;
  170. }
  171. int VisualScriptWhile::get_input_value_port_count() const{
  172. return 1;
  173. }
  174. int VisualScriptWhile::get_output_value_port_count() const{
  175. return 0;
  176. }
  177. String VisualScriptWhile::get_output_sequence_port_text(int p_port) const {
  178. if (p_port==0)
  179. return "repeat";
  180. else
  181. return "exit";
  182. }
  183. PropertyInfo VisualScriptWhile::get_input_value_port_info(int p_idx) const{
  184. PropertyInfo pinfo;
  185. pinfo.name="cond";
  186. pinfo.type=Variant::BOOL;
  187. return pinfo;
  188. }
  189. PropertyInfo VisualScriptWhile::get_output_value_port_info(int p_idx) const{
  190. return PropertyInfo();
  191. }
  192. String VisualScriptWhile::get_caption() const {
  193. return "While";
  194. }
  195. String VisualScriptWhile::get_text() const {
  196. return "while (cond): ";
  197. }
  198. void VisualScriptWhile::_bind_methods() {
  199. }
  200. class VisualScriptNodeInstanceWhile : public VisualScriptNodeInstance {
  201. public:
  202. VisualScriptWhile *node;
  203. VisualScriptInstance *instance;
  204. //virtual int get_working_memory_size() const { return 1; }
  205. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  206. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return true; }
  207. 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) {
  208. bool keep_going = p_inputs[0]->operator bool();
  209. if (keep_going)
  210. return 0|STEP_FLAG_PUSH_STACK_BIT;
  211. else
  212. return 1;
  213. }
  214. };
  215. VisualScriptNodeInstance* VisualScriptWhile::instance(VisualScriptInstance* p_instance) {
  216. VisualScriptNodeInstanceWhile * instance = memnew(VisualScriptNodeInstanceWhile );
  217. instance->node=this;
  218. instance->instance=p_instance;
  219. return instance;
  220. }
  221. VisualScriptWhile::VisualScriptWhile() {
  222. }
  223. //////////////////////////////////////////
  224. ////////////////ITERATOR/////////////////
  225. //////////////////////////////////////////
  226. int VisualScriptIterator::get_output_sequence_port_count() const {
  227. return 2;
  228. }
  229. bool VisualScriptIterator::has_input_sequence_port() const{
  230. return true;
  231. }
  232. int VisualScriptIterator::get_input_value_port_count() const{
  233. return 1;
  234. }
  235. int VisualScriptIterator::get_output_value_port_count() const{
  236. return 1;
  237. }
  238. String VisualScriptIterator::get_output_sequence_port_text(int p_port) const {
  239. if (p_port==0)
  240. return "each";
  241. else
  242. return "exit";
  243. }
  244. PropertyInfo VisualScriptIterator::get_input_value_port_info(int p_idx) const{
  245. PropertyInfo pinfo;
  246. pinfo.name="input";
  247. pinfo.type=Variant::NIL;
  248. return pinfo;
  249. }
  250. PropertyInfo VisualScriptIterator::get_output_value_port_info(int p_idx) const{
  251. PropertyInfo pinfo;
  252. pinfo.name="elem";
  253. pinfo.type=Variant::NIL;
  254. return pinfo;
  255. }
  256. String VisualScriptIterator::get_caption() const {
  257. return "Iterator";
  258. }
  259. String VisualScriptIterator::get_text() const {
  260. return "for (elem) in (input): ";
  261. }
  262. void VisualScriptIterator::_bind_methods() {
  263. }
  264. class VisualScriptNodeInstanceIterator : public VisualScriptNodeInstance {
  265. public:
  266. VisualScriptIterator *node;
  267. VisualScriptInstance *instance;
  268. virtual int get_working_memory_size() const { return 2; }
  269. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  270. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return true; }
  271. 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) {
  272. if (p_start_mode==START_MODE_BEGIN_SEQUENCE) {
  273. p_working_mem[0]=*p_inputs[0];
  274. bool valid;
  275. bool can_iter = p_inputs[0]->iter_init(p_working_mem[1],valid);
  276. if (!valid) {
  277. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  278. r_error_str=RTR("Input type not iterable: ")+Variant::get_type_name(p_inputs[0]->get_type());
  279. return 0;
  280. }
  281. if (!can_iter)
  282. return 1; //nothing to iterate
  283. *p_outputs[0]=p_working_mem[0].iter_get( p_working_mem[1],valid);
  284. if (!valid) {
  285. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  286. r_error_str=RTR("Iterator became invalid");
  287. return 0;
  288. }
  289. } else { //continue sequence
  290. bool valid;
  291. bool can_iter = p_working_mem[0].iter_next(p_working_mem[1],valid);
  292. if (!valid) {
  293. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  294. r_error_str=RTR("Iterator became invalid: ")+Variant::get_type_name(p_inputs[0]->get_type());
  295. return 0;
  296. }
  297. if (!can_iter)
  298. return 1; //nothing to iterate
  299. *p_outputs[0]=p_working_mem[0].iter_get( p_working_mem[1],valid);
  300. if (!valid) {
  301. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  302. r_error_str=RTR("Iterator became invalid");
  303. return 0;
  304. }
  305. }
  306. return 0|STEP_FLAG_PUSH_STACK_BIT; //go around
  307. }
  308. };
  309. VisualScriptNodeInstance* VisualScriptIterator::instance(VisualScriptInstance* p_instance) {
  310. VisualScriptNodeInstanceIterator * instance = memnew(VisualScriptNodeInstanceIterator );
  311. instance->node=this;
  312. instance->instance=p_instance;
  313. return instance;
  314. }
  315. VisualScriptIterator::VisualScriptIterator() {
  316. }
  317. //////////////////////////////////////////
  318. ////////////////SEQUENCE/////////////////
  319. //////////////////////////////////////////
  320. int VisualScriptSequence::get_output_sequence_port_count() const {
  321. return steps;
  322. }
  323. bool VisualScriptSequence::has_input_sequence_port() const{
  324. return true;
  325. }
  326. int VisualScriptSequence::get_input_value_port_count() const{
  327. return 0;
  328. }
  329. int VisualScriptSequence::get_output_value_port_count() const{
  330. return 1;
  331. }
  332. String VisualScriptSequence::get_output_sequence_port_text(int p_port) const {
  333. return itos(p_port+1);
  334. }
  335. PropertyInfo VisualScriptSequence::get_input_value_port_info(int p_idx) const{
  336. return PropertyInfo();
  337. }
  338. PropertyInfo VisualScriptSequence::get_output_value_port_info(int p_idx) const{
  339. return PropertyInfo(Variant::INT,"current");
  340. }
  341. String VisualScriptSequence::get_caption() const {
  342. return "Sequence";
  343. }
  344. String VisualScriptSequence::get_text() const {
  345. return "in order: ";
  346. }
  347. void VisualScriptSequence::set_steps(int p_steps) {
  348. ERR_FAIL_COND(p_steps<1);
  349. if (steps==p_steps)
  350. return;
  351. steps=p_steps;
  352. ports_changed_notify();
  353. }
  354. int VisualScriptSequence::get_steps() const {
  355. return steps;
  356. }
  357. void VisualScriptSequence::_bind_methods() {
  358. ObjectTypeDB::bind_method(_MD("set_steps","steps"),&VisualScriptSequence::set_steps);
  359. ObjectTypeDB::bind_method(_MD("get_steps"),&VisualScriptSequence::get_steps);
  360. ADD_PROPERTY(PropertyInfo(Variant::INT,"steps",PROPERTY_HINT_RANGE,"1,64,1"),_SCS("set_steps"),_SCS("get_steps"));
  361. }
  362. class VisualScriptNodeInstanceSequence : public VisualScriptNodeInstance {
  363. public:
  364. VisualScriptSequence *node;
  365. VisualScriptInstance *instance;
  366. int steps;
  367. virtual int get_working_memory_size() const { return 1; }
  368. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  369. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return true; }
  370. 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) {
  371. if (p_start_mode==START_MODE_BEGIN_SEQUENCE) {
  372. p_working_mem[0]=0;
  373. }
  374. int step = p_working_mem[0];
  375. *p_outputs[0]=step;
  376. if (step+1==steps)
  377. return step;
  378. else {
  379. p_working_mem[0]=step+1;
  380. return step|STEP_FLAG_PUSH_STACK_BIT;
  381. }
  382. }
  383. };
  384. VisualScriptNodeInstance* VisualScriptSequence::instance(VisualScriptInstance* p_instance) {
  385. VisualScriptNodeInstanceSequence * instance = memnew(VisualScriptNodeInstanceSequence );
  386. instance->node=this;
  387. instance->instance=p_instance;
  388. instance->steps=steps;
  389. return instance;
  390. }
  391. VisualScriptSequence::VisualScriptSequence() {
  392. steps=1;
  393. }
  394. //////////////////////////////////////////
  395. ////////////////EVENT TYPE FILTER///////////
  396. //////////////////////////////////////////
  397. static const char* event_type_names[InputEvent::TYPE_MAX]={
  398. "None",
  399. "Key",
  400. "MouseMotion",
  401. "MouseButton",
  402. "JoystickMotion",
  403. "JoystickButton",
  404. "ScreenTouch",
  405. "ScreenDrag",
  406. "Action"
  407. };
  408. int VisualScriptInputSelector::get_output_sequence_port_count() const {
  409. return InputEvent::TYPE_MAX;
  410. }
  411. bool VisualScriptInputSelector::has_input_sequence_port() const{
  412. return true;
  413. }
  414. int VisualScriptInputSelector::get_input_value_port_count() const{
  415. return 1;
  416. }
  417. int VisualScriptInputSelector::get_output_value_port_count() const{
  418. return 1;
  419. }
  420. String VisualScriptInputSelector::get_output_sequence_port_text(int p_port) const {
  421. return event_type_names[p_port];
  422. }
  423. PropertyInfo VisualScriptInputSelector::get_input_value_port_info(int p_idx) const{
  424. return PropertyInfo(Variant::INPUT_EVENT,"event");
  425. }
  426. PropertyInfo VisualScriptInputSelector::get_output_value_port_info(int p_idx) const{
  427. return PropertyInfo(Variant::INPUT_EVENT,"");
  428. }
  429. String VisualScriptInputSelector::get_caption() const {
  430. return "InputSelector";
  431. }
  432. String VisualScriptInputSelector::get_text() const {
  433. return "";
  434. }
  435. class VisualScriptNodeInstanceInputSelector : public VisualScriptNodeInstance {
  436. public:
  437. VisualScriptInstance* instance;
  438. InputEvent::Type type;
  439. //virtual int get_working_memory_size() const { return 0; }
  440. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  441. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return false; }
  442. 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) {
  443. if (p_inputs[0]->get_type()!=Variant::INPUT_EVENT) {
  444. r_error_str="Input value not of type event";
  445. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  446. return 0;
  447. }
  448. InputEvent event = *p_inputs[0];
  449. *p_outputs[0] = event;
  450. return event.type;
  451. }
  452. };
  453. VisualScriptNodeInstance* VisualScriptInputSelector::instance(VisualScriptInstance* p_instance) {
  454. VisualScriptNodeInstanceInputSelector * instance = memnew(VisualScriptNodeInstanceInputSelector );
  455. instance->instance=p_instance;
  456. return instance;
  457. }
  458. void VisualScriptInputSelector::_bind_methods() {
  459. }
  460. VisualScriptInputSelector::VisualScriptInputSelector() {
  461. }
  462. //////////////////////////////////////////
  463. ////////////////EVENT ACTION FILTER///////////
  464. //////////////////////////////////////////
  465. int VisualScriptInputFilter::get_output_sequence_port_count() const {
  466. return filters.size();
  467. }
  468. bool VisualScriptInputFilter::has_input_sequence_port() const{
  469. return true;
  470. }
  471. int VisualScriptInputFilter::get_input_value_port_count() const{
  472. return 1;
  473. }
  474. int VisualScriptInputFilter::get_output_value_port_count() const{
  475. return 1;
  476. }
  477. String VisualScriptInputFilter::get_output_sequence_port_text(int p_port) const {
  478. String text;
  479. switch(filters[p_port].type) {
  480. case InputEvent::NONE: {
  481. text="None";
  482. } break;
  483. case InputEvent::KEY: {
  484. InputEventKey k = filters[p_port].key;
  485. if (k.scancode==0 && k.unicode==0) {
  486. text="No Key";
  487. } else {
  488. if (k.scancode!=0) {
  489. text="KeyCode: "+keycode_get_string(k.scancode);
  490. } else if (k.unicode!=0) {
  491. text="Uniode: "+String::chr(k.unicode);
  492. }
  493. if (k.pressed)
  494. text+=", Pressed";
  495. else
  496. text+=", Released";
  497. if (k.echo)
  498. text+=", Echo";
  499. if (k.mod.alt)
  500. text="Alt+"+text;
  501. if (k.mod.shift)
  502. text="Shift+"+text;
  503. if (k.mod.control)
  504. text="Ctrl+"+text;
  505. if (k.mod.meta)
  506. text="Meta+"+text;
  507. }
  508. } break;
  509. case InputEvent::MOUSE_MOTION: {
  510. InputEventMouseMotion mm = filters[p_port].mouse_motion;
  511. text="Mouse Motion";
  512. String b = "Left,Right,Middle,WheelUp,WheelDown,WheelLeft,WheelRight";
  513. for(int i=0;i<7;i++) {
  514. if (mm.button_mask&(1<<i)) {
  515. text=b.get_slice(",",i)+"+"+text;
  516. }
  517. }
  518. if (mm.mod.alt)
  519. text="Alt+"+text;
  520. if (mm.mod.shift)
  521. text="Shift+"+text;
  522. if (mm.mod.control)
  523. text="Ctrl+"+text;
  524. if (mm.mod.meta)
  525. text="Meta+"+text;
  526. } break;
  527. case InputEvent::MOUSE_BUTTON: {
  528. InputEventMouseButton mb = filters[p_port].mouse_button;
  529. String b = "Any,Left,Right,Middle,WheelUp,WheelDown,WheelLeft,WheelRight";
  530. text=b.get_slice(",",mb.button_index)+" Mouse Button";
  531. if (mb.pressed)
  532. text+=", Pressed";
  533. else
  534. text+=", Released";
  535. if (mb.doubleclick)
  536. text+=", DblClick";
  537. if (mb.mod.alt)
  538. text="Alt+"+text;
  539. if (mb.mod.shift)
  540. text="Shift+"+text;
  541. if (mb.mod.control)
  542. text="Ctrl+"+text;
  543. if (mb.mod.meta)
  544. text="Meta+"+text;
  545. } break;
  546. case InputEvent::JOYSTICK_MOTION: {
  547. InputEventJoystickMotion jm = filters[p_port].joy_motion;
  548. text="JoyMotion Axis "+itos(jm.axis>>1);
  549. if (jm.axis&1)
  550. text+=" > "+rtos(jm.axis_value);
  551. else
  552. text+=" < "+rtos(-jm.axis_value);
  553. } break;
  554. case InputEvent::JOYSTICK_BUTTON: {
  555. InputEventJoystickButton jb = filters[p_port].joy_button;
  556. text="JoyButton "+itos(jb.button_index);
  557. if (jb.pressed)
  558. text+=", Pressed";
  559. else
  560. text+=", Released";
  561. } break;
  562. case InputEvent::SCREEN_TOUCH: {
  563. InputEventScreenTouch sd = filters[p_port].screen_touch;
  564. text="Touch Finger "+itos(sd.index);
  565. if (sd.pressed)
  566. text+=", Pressed";
  567. else
  568. text+=", Released";
  569. } break;
  570. case InputEvent::SCREEN_DRAG: {
  571. InputEventScreenDrag sd = filters[p_port].screen_drag;
  572. text="Drag Finger "+itos(sd.index);
  573. } break;
  574. case InputEvent::ACTION: {
  575. List<PropertyInfo> pinfo;
  576. Globals::get_singleton()->get_property_list(&pinfo);
  577. int index=1;
  578. text="No Action";
  579. for(List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
  580. const PropertyInfo &pi=E->get();
  581. if (!pi.name.begins_with("input/"))
  582. continue;
  583. if (filters[p_port].action.action==index) {
  584. text="Action "+pi.name.substr(pi.name.find("/")+1,pi.name.length());
  585. break;
  586. }
  587. index++;
  588. }
  589. if (filters[p_port].action.pressed)
  590. text+=", Pressed";
  591. else
  592. text+=", Released";
  593. } break;
  594. }
  595. return text+" - "+itos(p_port);
  596. }
  597. PropertyInfo VisualScriptInputFilter::get_input_value_port_info(int p_idx) const{
  598. return PropertyInfo(Variant::INPUT_EVENT,"event");
  599. }
  600. PropertyInfo VisualScriptInputFilter::get_output_value_port_info(int p_idx) const{
  601. return PropertyInfo(Variant::INPUT_EVENT,"");
  602. }
  603. String VisualScriptInputFilter::get_caption() const {
  604. return "InputFilter";
  605. }
  606. String VisualScriptInputFilter::get_text() const {
  607. return "";
  608. }
  609. bool VisualScriptInputFilter::_set(const StringName& p_name, const Variant& p_value) {
  610. if (p_name=="filter_count") {
  611. filters.resize(p_value);
  612. _change_notify();
  613. ports_changed_notify();
  614. return true;
  615. }
  616. if (String(p_name).begins_with("filter_")) {
  617. int idx = String(p_name).replace_first("filters_","").get_slice("/",0).to_int();
  618. ERR_FAIL_INDEX_V(idx,filters.size(),false);
  619. String what = String(p_name).get_slice("/",1);
  620. if (what=="type") {
  621. filters[idx]=InputEvent();
  622. filters[idx].type=InputEvent::Type(int(p_value));
  623. if (filters[idx].type==InputEvent::JOYSTICK_MOTION) {
  624. filters[idx].joy_motion.axis_value=0.5; //for treshold
  625. } else if (filters[idx].type==InputEvent::KEY) {
  626. filters[idx].key.pressed=true; //put these as true to make it more user friendly
  627. } else if (filters[idx].type==InputEvent::MOUSE_BUTTON) {
  628. filters[idx].mouse_button.pressed=true;
  629. } else if (filters[idx].type==InputEvent::JOYSTICK_BUTTON) {
  630. filters[idx].joy_button.pressed=true;
  631. } else if (filters[idx].type==InputEvent::SCREEN_TOUCH) {
  632. filters[idx].screen_touch.pressed=true;
  633. } else if (filters[idx].type==InputEvent::ACTION) {
  634. filters[idx].action.pressed=true;
  635. }
  636. _change_notify();
  637. ports_changed_notify();
  638. return true;
  639. }
  640. if (what=="device") {
  641. filters[idx].device=p_value;
  642. ports_changed_notify();
  643. return true;
  644. }
  645. switch(filters[idx].type) {
  646. case InputEvent::KEY: {
  647. if (what=="scancode") {
  648. String sc = p_value;
  649. if (sc==String()) {
  650. filters[idx].key.scancode=0;
  651. } else {
  652. filters[idx].key.scancode=find_keycode(p_value);
  653. }
  654. } else if (what=="unicode") {
  655. String uc = p_value;
  656. if (uc==String()) {
  657. filters[idx].key.unicode=0;
  658. } else {
  659. filters[idx].key.unicode=uc[0];
  660. }
  661. } else if (what=="pressed") {
  662. filters[idx].key.pressed=p_value;
  663. } else if (what=="echo") {
  664. filters[idx].key.echo=p_value;
  665. } else if (what=="mod_alt") {
  666. filters[idx].key.mod.alt=p_value;
  667. } else if (what=="mod_shift") {
  668. filters[idx].key.mod.shift=p_value;
  669. } else if (what=="mod_ctrl") {
  670. filters[idx].key.mod.control=p_value;
  671. } else if (what=="mod_meta") {
  672. filters[idx].key.mod.meta=p_value;
  673. } else {
  674. return false;
  675. }
  676. ports_changed_notify();
  677. return true;
  678. } break;
  679. case InputEvent::MOUSE_MOTION: {
  680. if (what=="button_mask") {
  681. filters[idx].mouse_motion.button_mask=p_value;
  682. } else if (what=="mod_alt") {
  683. filters[idx].mouse_motion.mod.alt=p_value;
  684. } else if (what=="mod_shift") {
  685. filters[idx].mouse_motion.mod.shift=p_value;
  686. } else if (what=="mod_ctrl") {
  687. filters[idx].mouse_motion.mod.control=p_value;
  688. } else if (what=="mod_meta") {
  689. filters[idx].mouse_motion.mod.meta=p_value;
  690. } else {
  691. return false;
  692. }
  693. ports_changed_notify();
  694. return true;
  695. } break;
  696. case InputEvent::MOUSE_BUTTON: {
  697. if (what=="button_index") {
  698. filters[idx].mouse_button.button_index=p_value;
  699. } else if (what=="pressed") {
  700. filters[idx].mouse_button.pressed=p_value;
  701. } else if (what=="doubleclicked") {
  702. filters[idx].mouse_button.doubleclick=p_value;
  703. } else if (what=="mod_alt") {
  704. filters[idx].mouse_button.mod.alt=p_value;
  705. } else if (what=="mod_shift") {
  706. filters[idx].mouse_button.mod.shift=p_value;
  707. } else if (what=="mod_ctrl") {
  708. filters[idx].mouse_button.mod.control=p_value;
  709. } else if (what=="mod_meta") {
  710. filters[idx].mouse_button.mod.meta=p_value;
  711. } else {
  712. return false;
  713. }
  714. ports_changed_notify();
  715. return true;
  716. } break;
  717. case InputEvent::JOYSTICK_MOTION: {
  718. if (what=="axis") {
  719. filters[idx].joy_motion.axis=int(p_value)<<1|filters[idx].joy_motion.axis;
  720. } else if (what=="mode") {
  721. filters[idx].joy_motion.axis|=int(p_value);
  722. } else if (what=="treshold") {
  723. filters[idx].joy_motion.axis_value=p_value;
  724. } else {
  725. return false;
  726. }
  727. ports_changed_notify();
  728. return true;
  729. } break;
  730. case InputEvent::JOYSTICK_BUTTON: {
  731. if (what=="button_index") {
  732. filters[idx].joy_button.button_index=p_value;
  733. } else if (what=="pressed") {
  734. filters[idx].joy_button.pressed=p_value;
  735. } else {
  736. return false;
  737. }
  738. ports_changed_notify();
  739. return true;
  740. } break;
  741. case InputEvent::SCREEN_TOUCH: {
  742. if (what=="finger_index") {
  743. filters[idx].screen_touch.index=p_value;
  744. } else if (what=="pressed") {
  745. filters[idx].screen_touch.pressed=p_value;
  746. } else {
  747. return false;
  748. }
  749. ports_changed_notify();
  750. return true;
  751. } break;
  752. case InputEvent::SCREEN_DRAG: {
  753. if (what=="finger_index") {
  754. filters[idx].screen_drag.index=p_value;
  755. } else {
  756. return false;
  757. }
  758. ports_changed_notify();
  759. return true;
  760. } break;
  761. case InputEvent::ACTION: {
  762. if (what=="action_name") {
  763. List<PropertyInfo> pinfo;
  764. Globals::get_singleton()->get_property_list(&pinfo);
  765. int index=1;
  766. for(List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
  767. const PropertyInfo &pi=E->get();
  768. if (!pi.name.begins_with("input/"))
  769. continue;
  770. String name = pi.name.substr(pi.name.find("/")+1,pi.name.length());
  771. if (name==String(p_value)) {
  772. filters[idx].action.action=index;
  773. ports_changed_notify();
  774. return true;
  775. }
  776. index++;
  777. }
  778. filters[idx].action.action=0;
  779. ports_changed_notify();
  780. return false;
  781. } else if (what=="pressed") {
  782. filters[idx].action.pressed=p_value;
  783. ports_changed_notify();
  784. return true;
  785. }
  786. } break;
  787. }
  788. }
  789. return false;
  790. }
  791. bool VisualScriptInputFilter::_get(const StringName& p_name,Variant &r_ret) const{
  792. if (p_name=="filter_count") {
  793. r_ret=filters.size();
  794. return true;
  795. }
  796. if (String(p_name).begins_with("filter_")) {
  797. int idx = String(p_name).replace_first("filters_","").get_slice("/",0).to_int();
  798. ERR_FAIL_INDEX_V(idx,filters.size(),false);
  799. String what = String(p_name).get_slice("/",1);
  800. if (what=="type") {
  801. r_ret=filters[idx].type;
  802. return true;
  803. }
  804. if (what=="device") {
  805. r_ret=filters[idx].device;
  806. return true;
  807. }
  808. switch(filters[idx].type) {
  809. case InputEvent::KEY: {
  810. if (what=="scancode") {
  811. if (filters[idx].key.scancode==0)
  812. r_ret=String();
  813. else {
  814. r_ret=keycode_get_string(filters[idx].key.scancode);
  815. }
  816. } else if (what=="unicode") {
  817. if (filters[idx].key.unicode==0) {
  818. r_ret=String();
  819. } else {
  820. CharType str[2]={ (CharType)filters[idx].key.unicode, 0};
  821. r_ret=String(str);
  822. }
  823. } else if (what=="pressed") {
  824. r_ret=filters[idx].key.pressed;
  825. } else if (what=="echo") {
  826. r_ret=filters[idx].key.echo;
  827. } else if (what=="mod_alt") {
  828. r_ret=filters[idx].key.mod.alt;
  829. } else if (what=="mod_shift") {
  830. r_ret=filters[idx].key.mod.shift;
  831. } else if (what=="mod_ctrl") {
  832. r_ret=filters[idx].key.mod.control;
  833. } else if (what=="mod_meta") {
  834. r_ret=filters[idx].key.mod.meta;
  835. } else {
  836. return false;
  837. }
  838. return true;
  839. } break;
  840. case InputEvent::MOUSE_MOTION: {
  841. if (what=="button_mask") {
  842. r_ret=filters[idx].mouse_motion.button_mask;
  843. } else if (what=="mod_alt") {
  844. r_ret=filters[idx].mouse_motion.mod.alt;
  845. } else if (what=="mod_shift") {
  846. r_ret=filters[idx].mouse_motion.mod.shift;
  847. } else if (what=="mod_ctrl") {
  848. r_ret=filters[idx].mouse_motion.mod.control;
  849. } else if (what=="mod_meta") {
  850. r_ret=filters[idx].mouse_motion.mod.meta;
  851. } else {
  852. return false;
  853. }
  854. return true;
  855. } break;
  856. case InputEvent::MOUSE_BUTTON: {
  857. if (what=="button_index") {
  858. r_ret=filters[idx].mouse_button.button_index;
  859. } else if (what=="pressed") {
  860. r_ret=filters[idx].mouse_button.pressed;
  861. } else if (what=="doubleclicked") {
  862. r_ret=filters[idx].mouse_button.doubleclick;
  863. } else if (what=="mod_alt") {
  864. r_ret=filters[idx].mouse_button.mod.alt;
  865. } else if (what=="mod_shift") {
  866. r_ret=filters[idx].mouse_button.mod.shift;
  867. } else if (what=="mod_ctrl") {
  868. r_ret=filters[idx].mouse_button.mod.control;
  869. } else if (what=="mod_meta") {
  870. r_ret=filters[idx].mouse_button.mod.meta;
  871. } else {
  872. return false;
  873. }
  874. return true;
  875. } break;
  876. case InputEvent::JOYSTICK_MOTION: {
  877. if (what=="axis_index") {
  878. r_ret=filters[idx].joy_motion.axis>>1;
  879. } else if (what=="mode") {
  880. r_ret=filters[idx].joy_motion.axis&1;
  881. } else if (what=="treshold") {
  882. r_ret=filters[idx].joy_motion.axis_value;
  883. } else {
  884. return false;
  885. }
  886. return true;
  887. } break;
  888. case InputEvent::JOYSTICK_BUTTON: {
  889. if (what=="button_index") {
  890. r_ret=filters[idx].joy_button.button_index;
  891. } else if (what=="pressed") {
  892. r_ret=filters[idx].joy_button.pressed;
  893. } else {
  894. return false;
  895. }
  896. return true;
  897. } break;
  898. case InputEvent::SCREEN_TOUCH: {
  899. if (what=="finger_index") {
  900. r_ret=filters[idx].screen_touch.index;
  901. } else if (what=="pressed") {
  902. r_ret=filters[idx].screen_touch.pressed;
  903. } else {
  904. return false;
  905. }
  906. return true;
  907. } break;
  908. case InputEvent::SCREEN_DRAG: {
  909. if (what=="finger_index") {
  910. r_ret=filters[idx].screen_drag.index;
  911. } else {
  912. return false;
  913. }
  914. return true;
  915. } break;
  916. case InputEvent::ACTION: {
  917. if (what=="action_name") {
  918. List<PropertyInfo> pinfo;
  919. Globals::get_singleton()->get_property_list(&pinfo);
  920. int index=1;
  921. for(List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
  922. const PropertyInfo &pi=E->get();
  923. if (!pi.name.begins_with("input/"))
  924. continue;
  925. if (filters[idx].action.action==index) {
  926. r_ret=pi.name.substr(pi.name.find("/")+1,pi.name.length());
  927. return true;
  928. }
  929. index++;
  930. }
  931. r_ret="None"; //no index
  932. return false;
  933. } else if (what=="pressed") {
  934. r_ret=filters[idx].action.pressed;
  935. return true;
  936. }
  937. } break;
  938. }
  939. }
  940. return false;
  941. }
  942. void VisualScriptInputFilter::_get_property_list( List<PropertyInfo> *p_list) const {
  943. p_list->push_back(PropertyInfo(Variant::INT,"filter_count",PROPERTY_HINT_RANGE,"0,64"));
  944. String et;
  945. for(int i=0;i<InputEvent::TYPE_MAX;i++) {
  946. if (i>0)
  947. et+=",";
  948. et+=event_type_names[i];
  949. }
  950. String kc;
  951. String actions;
  952. for(int i=0;i<filters.size();i++) {
  953. String base = "filter_"+itos(i)+"/";
  954. p_list->push_back(PropertyInfo(Variant::INT,base+"type",PROPERTY_HINT_ENUM,et));
  955. p_list->push_back(PropertyInfo(Variant::INT,base+"device"));
  956. switch(filters[i].type) {
  957. case InputEvent::NONE: {
  958. } break;
  959. case InputEvent::KEY: {
  960. if (kc==String()) {
  961. int kcc = keycode_get_count();
  962. kc="None";
  963. for(int i=0;i<kcc;i++) {
  964. kc+=",";
  965. kc+=String(keycode_get_name_by_index(i));
  966. }
  967. }
  968. p_list->push_back(PropertyInfo(Variant::STRING,base+"scancode",PROPERTY_HINT_ENUM,kc));
  969. p_list->push_back(PropertyInfo(Variant::STRING,base+"unicode"));
  970. p_list->push_back(PropertyInfo(Variant::BOOL,base+"pressed"));
  971. p_list->push_back(PropertyInfo(Variant::BOOL,base+"echo"));
  972. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_alt"));
  973. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_shift"));
  974. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_ctrl"));
  975. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_meta"));
  976. } break;
  977. case InputEvent::MOUSE_MOTION: {
  978. p_list->push_back(PropertyInfo(Variant::INT,base+"button_mask",PROPERTY_HINT_FLAGS,"Left,Right,Middle,WheelUp,WheelDown,WheelLeft,WheelRight"));
  979. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_alt"));
  980. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_shift"));
  981. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_ctrl"));
  982. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_meta"));
  983. } break;
  984. case InputEvent::MOUSE_BUTTON: {
  985. p_list->push_back(PropertyInfo(Variant::INT,base+"button_index",PROPERTY_HINT_ENUM,"Any,Left,Right,Middle,WheelUp,WheelDown,WheelLeft,WheelRight"));
  986. p_list->push_back(PropertyInfo(Variant::BOOL,base+"pressed"));
  987. p_list->push_back(PropertyInfo(Variant::BOOL,base+"doubleclicked"));
  988. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_alt"));
  989. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_shift"));
  990. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_ctrl"));
  991. p_list->push_back(PropertyInfo(Variant::BOOL,base+"mod_meta"));
  992. } break;
  993. case InputEvent::JOYSTICK_MOTION: {
  994. p_list->push_back(PropertyInfo(Variant::INT,base+"axis_index"));
  995. p_list->push_back(PropertyInfo(Variant::INT,base+"mode",PROPERTY_HINT_ENUM,"Min,Max"));
  996. p_list->push_back(PropertyInfo(Variant::REAL,base+"treshold",PROPERTY_HINT_RANGE,"0,1,0.01"));
  997. } break;
  998. case InputEvent::JOYSTICK_BUTTON: {
  999. p_list->push_back(PropertyInfo(Variant::INT,base+"button_index"));
  1000. p_list->push_back(PropertyInfo(Variant::BOOL,base+"pressed"));
  1001. } break;
  1002. case InputEvent::SCREEN_TOUCH: {
  1003. p_list->push_back(PropertyInfo(Variant::INT,base+"finger_index"));
  1004. p_list->push_back(PropertyInfo(Variant::BOOL,base+"pressed"));
  1005. } break;
  1006. case InputEvent::SCREEN_DRAG: {
  1007. p_list->push_back(PropertyInfo(Variant::INT,base+"finger_index"));
  1008. } break;
  1009. case InputEvent::ACTION: {
  1010. if (actions==String()) {
  1011. actions="None";
  1012. List<PropertyInfo> pinfo;
  1013. Globals::get_singleton()->get_property_list(&pinfo);
  1014. Vector<String> al;
  1015. for(List<PropertyInfo>::Element *E=pinfo.front();E;E=E->next()) {
  1016. const PropertyInfo &pi=E->get();
  1017. if (!pi.name.begins_with("input/"))
  1018. continue;
  1019. String name = pi.name.substr(pi.name.find("/")+1,pi.name.length());
  1020. al.push_back(name);
  1021. }
  1022. for(int i=0;i<al.size();i++) {
  1023. actions+=",";
  1024. actions+=al[i];
  1025. }
  1026. }
  1027. p_list->push_back(PropertyInfo(Variant::STRING,base+"action_name",PROPERTY_HINT_ENUM,actions));
  1028. p_list->push_back(PropertyInfo(Variant::BOOL,base+"pressed"));
  1029. } break;
  1030. }
  1031. }
  1032. }
  1033. class VisualScriptNodeInstanceInputFilter : public VisualScriptNodeInstance {
  1034. public:
  1035. VisualScriptInstance* instance;
  1036. Vector<InputEvent> filters;
  1037. //virtual int get_working_memory_size() const { return 0; }
  1038. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  1039. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return false; }
  1040. 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) {
  1041. if (p_inputs[0]->get_type()!=Variant::INPUT_EVENT) {
  1042. r_error_str="Input value not of type event";
  1043. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  1044. return 0;
  1045. }
  1046. InputEvent event = *p_inputs[0];
  1047. for(int i=0;i<filters.size();i++) {
  1048. const InputEvent &ie = filters[i];
  1049. if (ie.type!=event.type)
  1050. continue;
  1051. bool match=false;
  1052. switch(ie.type) {
  1053. case InputEvent::NONE: {
  1054. match=true;
  1055. } break;
  1056. case InputEvent::KEY: {
  1057. InputEventKey k = ie.key;
  1058. InputEventKey k2 = event.key;
  1059. if (k.scancode==0 && k.unicode==0 && k2.scancode==0 && k2.unicode==0) {
  1060. match=true;
  1061. } else {
  1062. if ( (k.scancode!=0 && k.scancode==k2.scancode) || (k.unicode!=0 && k.unicode==k2.unicode)) {
  1063. //key valid
  1064. if (
  1065. k.pressed==k2.pressed &&
  1066. k.echo==k2.echo &&
  1067. k.mod == k2.mod
  1068. ) {
  1069. match=true;
  1070. }
  1071. }
  1072. }
  1073. } break;
  1074. case InputEvent::MOUSE_MOTION: {
  1075. InputEventMouseMotion mm = ie.mouse_motion;
  1076. InputEventMouseMotion mm2 = event.mouse_motion;
  1077. if ( mm.button_mask==mm2.button_mask &&
  1078. mm.mod==mm2.mod
  1079. ) {
  1080. match=true;
  1081. }
  1082. } break;
  1083. case InputEvent::MOUSE_BUTTON: {
  1084. InputEventMouseButton mb = ie.mouse_button;
  1085. InputEventMouseButton mb2 = event.mouse_button;
  1086. if ( mb.button_index==mb2.button_index &&
  1087. mb.pressed==mb2.pressed &&
  1088. mb.doubleclick==mb2.doubleclick &&
  1089. mb.mod==mb2.mod) {
  1090. match=true;
  1091. }
  1092. } break;
  1093. case InputEvent::JOYSTICK_MOTION: {
  1094. InputEventJoystickMotion jm = ie.joy_motion;
  1095. InputEventJoystickMotion jm2 = event.joy_motion;
  1096. int axis = jm.axis>>1;
  1097. if (axis==jm2.axis) {
  1098. if (jm.axis&1) {
  1099. //greater
  1100. if (jm2.axis_value > jm.axis_value) {
  1101. match=true;
  1102. }
  1103. } else {
  1104. //less
  1105. if (jm2.axis_value < -jm.axis_value) {
  1106. match=true;
  1107. }
  1108. }
  1109. }
  1110. } break;
  1111. case InputEvent::JOYSTICK_BUTTON: {
  1112. InputEventJoystickButton jb = ie.joy_button;
  1113. InputEventJoystickButton jb2 = event.joy_button;
  1114. if ( jb.button_index==jb2.button_index &&
  1115. jb.pressed == jb2.pressed
  1116. ) {
  1117. match=true;
  1118. }
  1119. } break;
  1120. case InputEvent::SCREEN_TOUCH: {
  1121. InputEventScreenTouch st = ie.screen_touch;
  1122. InputEventScreenTouch st2 = event.screen_touch;
  1123. if ( st.index==st2.index &&
  1124. st.pressed==st2.pressed) {
  1125. match=true;
  1126. }
  1127. } break;
  1128. case InputEvent::SCREEN_DRAG: {
  1129. InputEventScreenDrag sd = ie.screen_drag;
  1130. InputEventScreenDrag sd2 = event.screen_drag;
  1131. if (sd.index==sd2.index) {
  1132. match=true;
  1133. }
  1134. } break;
  1135. case InputEvent::ACTION: {
  1136. InputEventAction ia = ie.action;
  1137. InputEventAction ia2 = event.action;
  1138. if ( ia.action==ia2.action &&
  1139. ia.pressed==ia2.pressed) {
  1140. match=true;
  1141. }
  1142. } break;
  1143. }
  1144. *p_outputs[0] = event;
  1145. if (match)
  1146. return i; //go through match output
  1147. }
  1148. return STEP_NO_ADVANCE_BIT; //none found, don't advance
  1149. }
  1150. };
  1151. VisualScriptNodeInstance* VisualScriptInputFilter::instance(VisualScriptInstance* p_instance) {
  1152. VisualScriptNodeInstanceInputFilter * instance = memnew(VisualScriptNodeInstanceInputFilter );
  1153. instance->instance=p_instance;
  1154. instance->filters=filters;
  1155. return instance;
  1156. }
  1157. VisualScriptInputFilter::VisualScriptInputFilter() {
  1158. }
  1159. //////////////////////////////////////////
  1160. ////////////////EVENT TYPE FILTER///////////
  1161. //////////////////////////////////////////
  1162. int VisualScriptTypeCast::get_output_sequence_port_count() const {
  1163. return 2;
  1164. }
  1165. bool VisualScriptTypeCast::has_input_sequence_port() const{
  1166. return true;
  1167. }
  1168. int VisualScriptTypeCast::get_input_value_port_count() const{
  1169. return 1;
  1170. }
  1171. int VisualScriptTypeCast::get_output_value_port_count() const{
  1172. return 1;
  1173. }
  1174. String VisualScriptTypeCast::get_output_sequence_port_text(int p_port) const {
  1175. return p_port==0 ? "yes" : "no";
  1176. }
  1177. PropertyInfo VisualScriptTypeCast::get_input_value_port_info(int p_idx) const{
  1178. return PropertyInfo(Variant::OBJECT,"instance");
  1179. }
  1180. PropertyInfo VisualScriptTypeCast::get_output_value_port_info(int p_idx) const{
  1181. return PropertyInfo(Variant::OBJECT,"");
  1182. }
  1183. String VisualScriptTypeCast::get_caption() const {
  1184. return "TypeCast";
  1185. }
  1186. String VisualScriptTypeCast::get_text() const {
  1187. if (script!=String())
  1188. return "Is "+script.get_file()+"?";
  1189. else
  1190. return "Is "+base_type+"?";
  1191. }
  1192. void VisualScriptTypeCast::set_base_type(const StringName& p_type) {
  1193. if (base_type==p_type)
  1194. return;
  1195. base_type=p_type;
  1196. _change_notify();
  1197. ports_changed_notify();
  1198. }
  1199. StringName VisualScriptTypeCast::get_base_type() const{
  1200. return base_type;
  1201. }
  1202. void VisualScriptTypeCast::set_base_script(const String& p_path){
  1203. if (script==p_path)
  1204. return;
  1205. script=p_path;
  1206. _change_notify();
  1207. ports_changed_notify();
  1208. }
  1209. String VisualScriptTypeCast::get_base_script() const{
  1210. return script;
  1211. }
  1212. class VisualScriptNodeInstanceTypeCast : public VisualScriptNodeInstance {
  1213. public:
  1214. VisualScriptInstance* instance;
  1215. StringName base_type;
  1216. String script;
  1217. //virtual int get_working_memory_size() const { return 0; }
  1218. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  1219. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return false; }
  1220. 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) {
  1221. Object *obj = *p_inputs[0];
  1222. *p_outputs[0]=Variant();
  1223. if (!obj) {
  1224. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  1225. r_error_str="Instance is null";
  1226. return 0;
  1227. }
  1228. if (script!=String()) {
  1229. Ref<Script> obj_script = obj->get_script();
  1230. if (!obj_script.is_valid()) {
  1231. return 1; //well, definitely not the script because object we got has no script.
  1232. }
  1233. if (!ResourceCache::has(script)) {
  1234. //if the script is not in use by anyone, we can safely assume whathever we got is not casting to it.
  1235. return 1;
  1236. }
  1237. Ref<Script> cast_script = Ref<Resource>(ResourceCache::get(script));
  1238. if (!cast_script.is_valid()) {
  1239. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  1240. r_error_str="Script path is not a script: "+script;
  1241. return 1;
  1242. }
  1243. while(obj_script.is_valid()) {
  1244. if (cast_script==obj_script) {
  1245. *p_outputs[0]=*p_inputs[0]; //copy
  1246. return 0; // it is the script, yey
  1247. }
  1248. obj_script=obj_script->get_base_script();
  1249. }
  1250. return 1; //not found sorry
  1251. }
  1252. if (ObjectTypeDB::is_type(obj->get_type_name(),base_type)) {
  1253. *p_outputs[0]=*p_inputs[0]; //copy
  1254. return 0;
  1255. } else
  1256. return 1;
  1257. }
  1258. };
  1259. VisualScriptNodeInstance* VisualScriptTypeCast::instance(VisualScriptInstance* p_instance) {
  1260. VisualScriptNodeInstanceTypeCast * instance = memnew(VisualScriptNodeInstanceTypeCast );
  1261. instance->instance=p_instance;
  1262. instance->base_type=base_type;
  1263. instance->script=script;
  1264. return instance;
  1265. }
  1266. void VisualScriptTypeCast::_bind_methods() {
  1267. ObjectTypeDB::bind_method(_MD("set_base_type","type"),&VisualScriptTypeCast::set_base_type);
  1268. ObjectTypeDB::bind_method(_MD("get_base_type"),&VisualScriptTypeCast::get_base_type);
  1269. ObjectTypeDB::bind_method(_MD("set_base_script","path"),&VisualScriptTypeCast::set_base_script);
  1270. ObjectTypeDB::bind_method(_MD("get_base_script"),&VisualScriptTypeCast::get_base_script);
  1271. List<String> script_extensions;
  1272. for(int i=0;i>ScriptServer::get_language_count();i++) {
  1273. ScriptServer::get_language(i)->get_recognized_extensions(&script_extensions);
  1274. }
  1275. String script_ext_hint;
  1276. for (List<String>::Element *E=script_extensions.front();E;E=E->next()) {
  1277. if (script_ext_hint!=String())
  1278. script_ext_hint+=",";
  1279. script_ext_hint+="*."+E->get();
  1280. }
  1281. ADD_PROPERTY(PropertyInfo(Variant::STRING,"function/base_type",PROPERTY_HINT_TYPE_STRING,"Object"),_SCS("set_base_type"),_SCS("get_base_type"));
  1282. ADD_PROPERTY(PropertyInfo(Variant::STRING,"property/base_script",PROPERTY_HINT_FILE,script_ext_hint),_SCS("set_base_script"),_SCS("get_base_script"));
  1283. }
  1284. VisualScriptTypeCast::VisualScriptTypeCast() {
  1285. base_type="Object";
  1286. }
  1287. void register_visual_script_flow_control_nodes() {
  1288. VisualScriptLanguage::singleton->add_register_func("flow_control/return",create_return_node<false>);
  1289. VisualScriptLanguage::singleton->add_register_func("flow_control/return_with_value",create_return_node<true>);
  1290. VisualScriptLanguage::singleton->add_register_func("flow_control/condition",create_node_generic<VisualScriptCondition>);
  1291. VisualScriptLanguage::singleton->add_register_func("flow_control/while",create_node_generic<VisualScriptWhile>);
  1292. VisualScriptLanguage::singleton->add_register_func("flow_control/iterator",create_node_generic<VisualScriptIterator>);
  1293. VisualScriptLanguage::singleton->add_register_func("flow_control/sequence",create_node_generic<VisualScriptSequence>);
  1294. VisualScriptLanguage::singleton->add_register_func("flow_control/input_select",create_node_generic<VisualScriptInputSelector>);
  1295. VisualScriptLanguage::singleton->add_register_func("flow_control/input_filter",create_node_generic<VisualScriptInputFilter>);
  1296. VisualScriptLanguage::singleton->add_register_func("flow_control/type_cast",create_node_generic<VisualScriptTypeCast>);
  1297. }