ParseEvents.pl 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. # These contains the pre-mapped events
  2. $events{"ReloadStarted"} = "Urho.Resources";
  3. $events{"ReloadFinished"} = "Urho.Resources";
  4. $events{"ReloadFailed"} = "Urho.Resources";
  5. $events{"FileChanged"} = "Urho.Resources";
  6. $events{"LoadFailed"} = "Urho.Resources";
  7. $events{"ResourceNotFound"} = "Urho.Resources";
  8. $events{"UnknownResourceType"} = "Urho.Resources";
  9. $events{"ResourceBackgroundLoaded"} = "Urho.Resources";
  10. $events{"ChangeLanguage"} = "Urho.Resources";
  11. $events{"LogMessage"} = "Urho.IO";
  12. $events{"AsyncExecFinished"} = "Urho.IO";
  13. $events{"UIMouseClick"} = "Urho.Gui";
  14. $events{"UIMouseClickEnd"} = "Urho.Gui";
  15. $events{"UIMouseDoubleClick"} = "Urho.Gui";
  16. $events{"DragDropTest"} = "Urho.Gui";
  17. $events{"DragDropFinish"} = "Urho.Gui";
  18. $events{"FocusChanged"} = "Urho.Gui";
  19. $events{"NameChanged"} = "Urho.Gui";
  20. $events{"Resized"} = "Urho.Gui";
  21. $events{"Positioned"} = "Urho.Gui";
  22. $events{"VisibleChanged"} = "Urho.Gui";
  23. $events{"Focused"} = "Urho.Gui";
  24. $events{"Defocused"} = "Urho.Gui";
  25. $events{"LayoutUpdated"} = "Urho.Gui";
  26. $events{"Pressed"} = "Urho.Gui";
  27. $events{"Released"} = "Urho.Gui";
  28. $events{"Toggled"} = "Urho.Gui";
  29. $events{"SliderChanged"} = "Urho.Gui";
  30. $events{"SliderPaged"} = "Urho.Gui";
  31. $events{"ScrollBarChanged"} = "Urho.Gui";
  32. $events{"ViewChanged"} = "Urho.Gui";
  33. $events{"ModalChanged"} = "Urho.Gui";
  34. $events{"CharEntry"} = "Urho.Gui";
  35. $events{"TextChanged"} = "Urho.Gui";
  36. $events{"TextFinished"} = "Urho.Gui";
  37. $events{"MenuSelected"} = "Urho.Gui";
  38. $events{"ItemSelected"} = "Urho.Gui";
  39. $events{"ItemDeselected"} = "Urho.Gui";
  40. $events{"SelectionChanged"} = "Urho.Gui";
  41. $events{"ItemClicked"} = "Urho.Gui";
  42. $events{"ItemDoubleClicked"} = "Urho.Gui";
  43. $events{"UnhandledKey"} = "Urho.Gui";
  44. $events{"FileSelected"} = "Urho.Gui";
  45. $events{"MessageACK"} = "Urho.Gui";
  46. $events{"ElementAdded"} = "Urho.Gui";
  47. $events{"ElementRemoved"} = "Urho.Gui";
  48. $events{"HoverBegin"} = "Urho.Gui";
  49. $events{"HoverEnd"} = "Urho.Gui";
  50. $events{"DragBegin"} = "Urho.Gui";
  51. $events{"DragMove"} = "Urho.Gui";
  52. $events{"DragEnd"} = "Urho.Gui";
  53. $events{"DragCancel"} = "Urho.Gui";
  54. $events{"UIDropFile"} = "Urho.Gui";
  55. $events{"PhysicsPreStep2D"} = "Urho.Urho2D";
  56. $events{"PhysicsPostStep2D"} = "Urho.Urho2D";
  57. $events{"PhysicsBeginContact2D"} = "Urho.Urho2D";
  58. $events{"PhysicsEndContact2D"} = "Urho.Urho2D";
  59. $events{"PhysicsPreStep"} = "Urho.Physics";
  60. $events{"PhysicsPostStep"} = "Urho.Physics";
  61. $events{"PhysicsCollisionStart"} = "Urho.Physics";
  62. $events{"PhysicsCollision"} = "Urho.Physics";
  63. $events{"PhysicsCollisionEnd"} = "Urho.Physics";
  64. $events{"NavigationMeshRebuilt"} = "Urho.Navigation";
  65. $events{"NavigationAreaRebuilt"} = "Urho.Navigation";
  66. $events{"CrowdAgentFormation"} = "Urho.Navigation";
  67. $events{"CrowdAgentReposition"} = "Urho.Navigation";
  68. $events{"CrowdAgentFailure"} = "Urho.Navigation";
  69. $events{"CrowdAgentStateChanged"} = "Urho.Navigation";
  70. $events{"NavigationObstacleAdded"} = "Urho.Navigation";
  71. $events{"NavigationObstacleRemoved"} = "Urho.Navigation";
  72. $events{"ServerConnected"} = "Urho.Network";
  73. $events{"ServerDisconnected"} = "Urho.Network";
  74. $events{"ConnectFailed"} = "Urho.Network";
  75. $events{"ClientConnected"} = "Urho.Network";
  76. $events{"ClientDisconnected"} = "Urho.Network";
  77. $events{"ClientIdentity"} = "Urho.Network";
  78. $events{"ClientSceneLoaded"} = "Urho.Network";
  79. $events{"NetworkMessage"} = "Urho.Network";
  80. $events{"NetworkUpdate"} = "Urho.Network";
  81. $events{"NetworkUpdateSent"} = "Urho.Network";
  82. $events{"NetworkSceneLoadFailed"} = "Urho.Network";
  83. $events{"RemoteEventData"} = "Urho.Network";
  84. open CS,">Portable/Generated/Object.Events.cs" || die;
  85. open CPP,">Portable/Generated/events.cpp" || die;
  86. print CS "using System;\n";
  87. print CS "using System.Runtime.InteropServices;\n";
  88. print CS "using Urho.Physics;\n";
  89. print CS "using Urho.Navigation;\n";
  90. print CS "using Urho.Network;\n";
  91. print CS "using Urho.Urho2D;\n";
  92. print CS "using Urho.Gui;\n";
  93. print CS "using Urho.Actions;\n";
  94. print CS "using Urho.Audio;\n";
  95. print CS "using Urho.Resources;\n";
  96. print CS "using Urho.IO;\n";
  97. print CS "namespace Urho {\n\n";
  98. print CS "\t[UnmanagedFunctionPointer(CallingConvention.Cdecl)]";
  99. print CS "\tpublic delegate void ObjectCallbackSignature (IntPtr data, int stringhash, IntPtr variantMap);\n";
  100. print CS "}\n\n";
  101. print CPP "#include \"../../Native/AllUrho.h\"\n";
  102. print CPP "#include \"../../Native/glue.h\"\n";
  103. print CPP "extern \"C\" {\n";
  104. print CPP "void urho_unsubscribe (NotificationProxy *proxy);\n";
  105. sub mapType {
  106. my ($pt) = @_;
  107. ($t,$st) = split (/ /, $pt);
  108. if ($st eq "pointer"){
  109. return "$t";
  110. }
  111. if ($st eq "ptr"){
  112. return "$t";
  113. }
  114. return "uint" if $t eq "unsigned";
  115. return "bool" if $t eq "Bool";
  116. return "float" if $t eq "Float";
  117. return "IntPtr" if $t eq "User-defined";
  118. return "CollisionData []" if $pt eq "Buffer containing";
  119. return "byte []" if $t eq "Buffer";
  120. return $t;
  121. }
  122. open EVENTS, "events.txt" || die "Need the file events.txt to figure out where to generate events";
  123. while (<EVENTS>){
  124. ($event, $classes) = split;
  125. @events{$event} = $classes;
  126. }
  127. $hasNamespace = 0;
  128. RESTART:
  129. while (<>){
  130. chop;
  131. next if (/#define/);
  132. if (/EVENT\(/){
  133. ($ec,$en) = $_ =~ /EVENT\((\w+), ?(\w+)/;
  134. if ($en ne "DbCursor"){
  135. $eventName = $en;
  136. $eventName = "MouseMoved" if ($en eq "MouseMove");
  137. $eventName = "FrameStarted" if ($en eq "BeginFrame");
  138. $eventName = "FrameEnded" if ($en eq "EndFrame");
  139. if (exists $events{$en}){
  140. print CS "namespace ${events{$en}} {\n"
  141. } else {
  142. print CS "namespace Urho {\n";
  143. }
  144. print CS " public partial struct ${eventName}EventArgs {\n";
  145. print CS " internal IntPtr handle;\n";
  146. print CPP "DllExport void *urho_subscribe_$eventName (void *_receiver, HandlerFunctionPtr callback, void *data)\n";
  147. print CPP "{\n";
  148. print CPP "\tUrho3D::Object *receiver = (Urho3D::Object *) _receiver;\n";
  149. print CPP "\tNotificationProxy *proxy = new NotificationProxy (receiver, callback, data, Urho3D::$ec);\n";
  150. print CPP "\treceiver->SubscribeToEvent (receiver, Urho3D::$ec, proxy);\n";
  151. print CPP "\treturn proxy;\n";
  152. print CPP "}\n\n";
  153. while (<>){
  154. chop;
  155. $cast = "";
  156. if (/PARAM/){
  157. ($pc,$pn,$pt) = $_ =~ /PARAM\((\w+), ?(\w+).*\/\/\W*(\w+(\W+\w+)?)/;
  158. $cspt = $plain = &mapType ($pt);
  159. if (/P_KEY.*Key/){
  160. $cspt = "Key";
  161. $cast = "(Key)";
  162. }
  163. $plain =~ s/ .*//;
  164. if ($plain eq "byte"){
  165. $plain = "Buffer";
  166. }
  167. $hashgetters{$pc} = $en;
  168. print CS " public $cspt $pn =>$cast UrhoMap.get_$plain (handle, UrhoHash.$pc);\n";
  169. }
  170. if (/}/){
  171. print CS " } /* struct ${eventName}EventArgs */\n\n";
  172. for $type (split /,/,$events{$ec}){
  173. print CS " public partial class $type {\n";
  174. print CS " ObjectCallbackSignature callback${eventName};\n";
  175. print CS " [DllImport(Consts.NativeImport, CallingConvention=CallingConvention.Cdecl)]\n";
  176. print CS " extern static IntPtr urho_subscribe_$eventName (IntPtr target, ObjectCallbackSignature act, IntPtr data);\n";
  177. print CS " @{[$en eq 'Update' ? 'internal' : 'public']} Subscription SubscribeTo${eventName} (Action<${eventName}EventArgs> handler)\n";
  178. print CS " {\n";
  179. print CS " Action<IntPtr> proxy = (x)=> { var d = new ${eventName}EventArgs () { handle = x }; handler (d); };\n";
  180. print CS " var s = new Subscription (proxy);\n";
  181. print CS " callback${eventName} = ObjectCallback;\n";
  182. print CS " s.UnmanagedProxy = urho_subscribe_$eventName (handle, callback${eventName}, GCHandle.ToIntPtr (s.gch));\n";
  183. print CS " return s;\n";
  184. print CS " }\n\n";
  185. print CS " static UrhoEventAdapter<${eventName}EventArgs> eventAdapterFor${eventName};\n";
  186. print CS " public event Action<${eventName}EventArgs> ${eventName}\n";
  187. print CS " {\n";
  188. print CS " add\n";
  189. print CS " {\n";
  190. print CS " if (eventAdapterFor${eventName} == null)\n";
  191. print CS " eventAdapterFor${eventName} = new UrhoEventAdapter<${eventName}EventArgs>();\n";
  192. print CS " eventAdapterFor${eventName}.AddManagedSubscriber(handle, value, SubscribeTo${eventName});\n";
  193. print CS " }\n";
  194. print CS " remove { eventAdapterFor${eventName}.RemoveManagedSubscriber(handle, value); }\n";
  195. print CS " }\n";
  196. print CS " } /* class $type */ \n\n";
  197. }
  198. }
  199. if (/}/){
  200. print CS "} /* namespace */\n\n";
  201. }
  202. next RESTART if (/}/);
  203. }
  204. }
  205. }
  206. }
  207. print CPP "// Hash Getters\n";
  208. print CS "// Hash Getters\n";
  209. print CS "namespace Urho {";
  210. print CS " internal class UrhoHash {\n";
  211. foreach $pc (keys %hashgetters){
  212. $en = $hashgetters{$pc};
  213. print CPP "DllExport int urho_hash_get_$pc ()\n{\n";
  214. print CPP "\treturn Urho3D::$en::$pc.Value ();\n}\n\n";
  215. print CS " [DllImport(Consts.NativeImport, CallingConvention=CallingConvention.Cdecl)]\n";
  216. print CS " extern static int urho_hash_get_$pc ();\n";
  217. print CS " static int _$pc;\n";
  218. print CS " internal static int $pc { get { if (_$pc == 0){ _$pc = urho_hash_get_$pc (); } return _$pc; }}\n\n";
  219. }
  220. print CPP "}\n";
  221. print CS " }\n }";
  222. close CS;
  223. close CPP;