RegisterEngine.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2011 Lasse Öörni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #include "Precompiled.h"
  24. #include "Client.h"
  25. #include "Connection.h"
  26. #include "DebugHud.h"
  27. #include "Engine.h"
  28. #include "ParticleEmitter.h"
  29. #include "RegisterTemplates.h"
  30. #include "Scene.h"
  31. #include "ScriptInstance.h"
  32. #include "Server.h"
  33. static void SendRemoteEventToAll(const std::string& eventType, const VariantMap& eventData)
  34. {
  35. Scene* scene = getScriptContextScene();
  36. if (scene)
  37. scene->sendRemoteEvent(StringHash(eventType), eventData);
  38. }
  39. static void SendRemoteEvent(const std::string& eventType, const VariantMap& eventData, Connection* receiver)
  40. {
  41. Scene* scene = getScriptContextScene();
  42. if (scene)
  43. scene->sendRemoteEvent(StringHash(eventType), eventData, receiver);
  44. }
  45. static void SendRemoteEventDelayTTL(const std::string& eventType, const VariantMap& eventData, Connection* receiver, float delay, unsigned short timeToLive)
  46. {
  47. Scene* scene = getScriptContextScene();
  48. if (scene)
  49. scene->sendRemoteEvent(StringHash(eventType), eventData, receiver, delay, timeToLive);
  50. }
  51. static void SendRemoteEntityEventToAll(Entity* entity, const std::string& eventType, const VariantMap& eventData)
  52. {
  53. Scene* scene = getScriptContextScene();
  54. if (scene)
  55. scene->sendRemoteEvent(entity, StringHash(eventType), eventData);
  56. }
  57. static void SendRemoteEntityEvent(Entity* entity, const std::string& eventType, const VariantMap& eventData, Connection* receiver)
  58. {
  59. Scene* scene = getScriptContextScene();
  60. if (scene)
  61. scene->sendRemoteEvent(entity, StringHash(eventType), eventData, receiver);
  62. }
  63. static void SendRemoteEntityEventDelayTTL(Entity* entity, const std::string& eventType, const VariantMap& eventData, Connection* receiver, float delay, unsigned short timeToLive)
  64. {
  65. Scene* scene = getScriptContextScene();
  66. if (scene)
  67. scene->sendRemoteEvent(entity, StringHash(eventType), eventData, receiver, delay, timeToLive);
  68. }
  69. static void ConstructNetUpdateInfo(NetUpdateInfo* ptr)
  70. {
  71. ptr->mConnection = 0;
  72. ptr->mFrameNumber = 0;
  73. ptr->mFrameAck = 0;
  74. ptr->mRemoteFrameNumber = 0;
  75. ptr->mRoundTripTime = 0.0f;
  76. }
  77. static Connection* NetUpdateInfoGetConnection(NetUpdateInfo* ptr)
  78. {
  79. return ptr->mConnection;
  80. }
  81. static void registerConnection(asIScriptEngine* engine)
  82. {
  83. engine->RegisterEnum("JoinState");
  84. engine->RegisterEnumValue("JoinState", "JS_NOTINSCENE", JS_NOTINSCENE);
  85. engine->RegisterEnumValue("JoinState", "JS_PREPARESCENE", JS_PREPARESCENE);
  86. engine->RegisterEnumValue("JoinState", "JS_SENDFULLUPDATE", JS_SENDFULLUPDATE);
  87. engine->RegisterEnumValue("JoinState", "JS_WAITFORACK", JS_WAITFORACK);
  88. engine->RegisterEnumValue("JoinState", "JS_SENDDELTAS", JS_SENDDELTAS);
  89. engine->RegisterObjectType("Connection", 0, asOBJ_REF);
  90. engine->RegisterObjectBehaviour("Connection", asBEHAVE_ADDREF, "void f()", asMETHOD(Connection, addRef), asCALL_THISCALL);
  91. engine->RegisterObjectBehaviour("Connection", asBEHAVE_RELEASE, "void f()", asMETHOD(Connection, releaseRef), asCALL_THISCALL);
  92. engine->RegisterObjectMethod("Connection", "void disconnect()", asMETHOD(Connection, disconnect), asCALL_THISCALL);
  93. engine->RegisterObjectMethod("Connection", "void forceDisconnect()", asMETHOD(Connection, forceDisconnect), asCALL_THISCALL);
  94. engine->RegisterObjectMethod("Connection", "void setUserName(const string& in)", asMETHOD(Connection, setUserName), asCALL_THISCALL);
  95. engine->RegisterObjectMethod("Connection", "void setControls(const Controls& in)", asMETHOD(Connection, setControls), asCALL_THISCALL);
  96. engine->RegisterObjectMethod("Connection", "Scene@+ getScene() const", asMETHOD(Connection, getScene), asCALL_THISCALL);
  97. engine->RegisterObjectMethod("Connection", "const string& getUserName() const", asMETHOD(Connection, getUserName), asCALL_THISCALL);
  98. engine->RegisterObjectMethod("Connection", "bool isConnected() const", asMETHOD(Connection, isConnected), asCALL_THISCALL);
  99. engine->RegisterObjectMethod("Connection", "JoinState getJoinState() const", asMETHOD(Connection, getJoinState), asCALL_THISCALL);
  100. engine->RegisterObjectMethod("Connection", "uint16 getFrameNumber() const", asMETHOD(Connection, getFrameNumber), asCALL_THISCALL);
  101. engine->RegisterObjectMethod("Connection", "uint16 getFrameAck() const", asMETHOD(Connection, getFrameAck), asCALL_THISCALL);
  102. engine->RegisterObjectMethod("Connection", "float getRoundTripTime() const", asMETHOD(Connection, getRoundTripTime), asCALL_THISCALL);
  103. engine->RegisterObjectMethod("Connection", "const Controls& getControls() const", asMETHOD(Connection, getControls), asCALL_THISCALL);
  104. engine->RegisterObjectMethod("Connection", "const Vector3& getPosition() const", asMETHOD(Connection, getPosition), asCALL_THISCALL);
  105. // Register Variant getPtr() for Connection
  106. engine->RegisterObjectMethod("Variant", "Connection@+ getConnection() const", asFUNCTION(getVariantPtr<Connection>), asCALL_CDECL_OBJLAST);
  107. engine->RegisterObjectType("NetUpdateInfo", sizeof(NetUpdateInfo), asOBJ_VALUE | asOBJ_POD | asOBJ_APP_CLASS_C);
  108. engine->RegisterObjectBehaviour("NetUpdateInfo", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructNetUpdateInfo), asCALL_CDECL_OBJLAST);
  109. engine->RegisterObjectMethod("NetUpdateInfo", "Connection@+ get_connection()", asFUNCTION(NetUpdateInfoGetConnection), asCALL_CDECL_OBJLAST);
  110. engine->RegisterObjectProperty("NetUpdateInfo", "uint16 frameNumber", offsetof(NetUpdateInfo, mFrameNumber));
  111. engine->RegisterObjectProperty("NetUpdateInfo", "uint16 frameAck", offsetof(NetUpdateInfo, mFrameAck));
  112. engine->RegisterObjectProperty("NetUpdateInfo", "uint16 remoteFrameNumber", offsetof(NetUpdateInfo, mRemoteFrameNumber));
  113. engine->RegisterObjectProperty("NetUpdateInfo", "float roundTripTime", offsetof(NetUpdateInfo, mRoundTripTime));
  114. // Add missing Scene & Entity methods that have to do with Connection
  115. engine->RegisterObjectMethod("Scene", "void resetOwner(Connection@+)", asMETHOD(Scene, resetOwner), asCALL_THISCALL);
  116. engine->RegisterObjectMethod("Entity", "bool checkSync(Connection@+) const", asMETHOD(Entity, checkSync), asCALL_THISCALL);
  117. engine->RegisterObjectMethod("Entity", "bool checkPrediction(Connection@+) const", asMETHOD(Entity, checkPrediction), asCALL_THISCALL);
  118. // Add remote event functionality as global functions because the Scene can be found out through the context
  119. engine->RegisterGlobalFunction("void sendRemoteEvent(const string& in, const VariantMap& in)", asFUNCTION(SendRemoteEventToAll), asCALL_CDECL);
  120. engine->RegisterGlobalFunction("void sendRemoteEvent(const string& in, const VariantMap& in, Connection@+)", asFUNCTION(SendRemoteEvent), asCALL_CDECL);
  121. engine->RegisterGlobalFunction("void sendRemoteEvent(const string& in, const VariantMap& in, Connection@+, float, uint16)", asFUNCTION(SendRemoteEventDelayTTL), asCALL_CDECL);
  122. engine->RegisterGlobalFunction("void sendRemoteEvent(Entity@+, const string& in, const VariantMap& in)", asFUNCTION(SendRemoteEntityEventToAll), asCALL_CDECL);
  123. engine->RegisterGlobalFunction("void sendRemoteEvent(Entity@+, const string& in, const VariantMap& in, Connection@+)", asFUNCTION(SendRemoteEntityEvent), asCALL_CDECL);
  124. engine->RegisterGlobalFunction("void sendRemoteEvent(Entity@+, const string& in, const VariantMap& in, Connection@+, float, uint16)", asFUNCTION(SendRemoteEntityEventDelayTTL), asCALL_CDECL);
  125. engine->RegisterGlobalFunction("Connection@+ getRemoteEventSender()", asFUNCTION(getRemoteEventSender), asCALL_CDECL);
  126. }
  127. static void ConstructSceneInfo(SceneInfo* ptr)
  128. {
  129. new(ptr) SceneInfo();
  130. }
  131. static void ConstructSceneInfoCopy(const SceneInfo& info, SceneInfo* ptr)
  132. {
  133. new(ptr) SceneInfo(info);
  134. }
  135. static void DestructSceneInfo(SceneInfo* ptr)
  136. {
  137. ptr->~SceneInfo();
  138. }
  139. static bool ClientConnectAddress(const std::string& address, unsigned short port, Client* ptr)
  140. {
  141. return ptr->connect(address, port);
  142. }
  143. static bool ClientConnectAddressUserName(const std::string& address, unsigned short port, const std::string& userName, Client* ptr)
  144. {
  145. return ptr->connect(address, port, userName);
  146. }
  147. static Client* GetClient()
  148. {
  149. return getEngine()->getClient();
  150. }
  151. static bool IsClient()
  152. {
  153. return GetClient() != 0;
  154. }
  155. static void registerClient(asIScriptEngine* engine)
  156. {
  157. engine->RegisterObjectType("SceneInfo", sizeof(SceneInfo), asOBJ_VALUE | asOBJ_APP_CLASS_CDA);
  158. engine->RegisterObjectBehaviour("SceneInfo", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructSceneInfo), asCALL_CDECL_OBJLAST);
  159. engine->RegisterObjectBehaviour("SceneInfo", asBEHAVE_CONSTRUCT, "void f(const SceneInfo& in)", asFUNCTION(ConstructSceneInfoCopy), asCALL_CDECL_OBJLAST);
  160. engine->RegisterObjectBehaviour("SceneInfo", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(DestructSceneInfo), asCALL_CDECL_OBJLAST);
  161. engine->RegisterObjectMethod("SceneInfo", "SceneInfo &opAssign(const SceneInfo& in)", asMETHOD(SceneInfo, operator =), asCALL_THISCALL);
  162. engine->RegisterObjectProperty("SceneInfo", "string name", offsetof(SceneInfo, mName));
  163. engine->RegisterObjectProperty("SceneInfo", "uint numUsers", offsetof(SceneInfo, mNumUsers));
  164. engine->RegisterObjectProperty("SceneInfo", "int netFps", offsetof(SceneInfo, mNetFps));
  165. engine->RegisterObjectProperty("SceneInfo", "string fileName", offsetof(SceneInfo, mFileName));
  166. engine->RegisterObjectType("Client", 0, asOBJ_REF);
  167. engine->RegisterObjectBehaviour("Client", asBEHAVE_ADDREF, "void f()", asMETHOD(Client, addRef), asCALL_THISCALL);
  168. engine->RegisterObjectBehaviour("Client", asBEHAVE_RELEASE, "void f()", asMETHOD(Client, releaseRef), asCALL_THISCALL);
  169. engine->RegisterObjectMethod("Client", "void setScene(Scene@+)", asMETHOD(Client, setScene), asCALL_THISCALL);
  170. engine->RegisterObjectMethod("Client", "void setMaxPredictionTime(float)", asMETHOD(Client, setMaxPredictionTime), asCALL_THISCALL);
  171. engine->RegisterObjectMethod("Client", "bool connect(const string& in, uint16)", asFUNCTION(ClientConnectAddress), asCALL_CDECL_OBJLAST);
  172. engine->RegisterObjectMethod("Client", "bool connect(const string& in, uint16, const string& in)", asFUNCTION(ClientConnectAddressUserName), asCALL_CDECL_OBJLAST);
  173. engine->RegisterObjectMethod("Client", "bool connect(const string& in, uint16, const string& in, const VariantMap& in)", asMETHOD(Client, connect), asCALL_THISCALL);
  174. engine->RegisterObjectMethod("Client", "void disconnect()", asMETHOD(Client, disconnect), asCALL_THISCALL);
  175. engine->RegisterObjectMethod("Client", "void setControls(const Controls& in)", asMETHOD(Client, setControls), asCALL_THISCALL);
  176. engine->RegisterObjectMethod("Client", "void setPosition(const Vector3& in)", asMETHOD(Client, setPosition), asCALL_THISCALL);
  177. engine->RegisterObjectMethod("Client", "Scene@+ getScene() const", asMETHOD(Client, getScene), asCALL_THISCALL);
  178. engine->RegisterObjectMethod("Client", "Connection@+ getServerConnection() const", asMETHOD(Client, getServerConnection), asCALL_THISCALL);
  179. engine->RegisterObjectMethod("Client", "bool isConnected() const", asMETHOD(Client, isConnected), asCALL_THISCALL);
  180. engine->RegisterObjectMethod("Client", "bool isJoinPending() const", asMETHOD(Client, isJoinPending), asCALL_THISCALL);
  181. engine->RegisterObjectMethod("Client", "bool isJoined() const", asMETHOD(Client, isJoined), asCALL_THISCALL);
  182. engine->RegisterObjectMethod("Client", "int getNetFps() const", asMETHOD(Client, getNetFps), asCALL_THISCALL);
  183. engine->RegisterObjectMethod("Client", "float getMaxPredictionTime() const", asMETHOD(Client, getMaxPredictionTime), asCALL_THISCALL);
  184. engine->RegisterObjectMethod("Client", "const Controls& getControls() const", asMETHOD(Client, getControls), asCALL_THISCALL);
  185. engine->RegisterObjectMethod("Client", "const Vector3& getPosition() const", asMETHOD(Client, getPosition), asCALL_THISCALL);
  186. engine->RegisterObjectMethod("Client", "uint getNumFileTransfers() const", asMETHOD(Client, getNumFileTransfers), asCALL_THISCALL);
  187. engine->RegisterObjectMethod("Client", "const string& getDownloadDirectory() const", asMETHOD(Client, getDownloadDirectory), asCALL_THISCALL);
  188. engine->RegisterObjectMethod("Client", "string getFileTransferStatus() const", asMETHOD(Client, getFileTransferStatus), asCALL_THISCALL);
  189. engine->RegisterObjectMethod("Client", "const SceneInfo& getSceneInfo() const", asMETHOD(Client, getSceneInfo), asCALL_THISCALL);
  190. engine->RegisterGlobalFunction("Client@+ getClient()", asFUNCTION(GetClient), asCALL_CDECL);
  191. engine->RegisterGlobalFunction("Client@+ get_client()", asFUNCTION(GetClient), asCALL_CDECL);
  192. engine->RegisterGlobalFunction("bool isClient()", asFUNCTION(IsClient), asCALL_CDECL);
  193. }
  194. static CScriptArray* ServerGetScenes(Server* ptr)
  195. {
  196. const std::vector<SharedPtr<Scene> >& scenes = ptr->getScenes();
  197. std::vector<Scene*> result;
  198. for (unsigned i = 0; i < scenes.size(); ++i)
  199. result.push_back(scenes[i]);
  200. return vectorToHandleArray<Scene*>(result, "array<Scene@>");
  201. }
  202. static CScriptArray* ServerGetConnections(Server* ptr)
  203. {
  204. const std::vector<SharedPtr<Connection> >& connections = ptr->getConnections();
  205. std::vector<Connection*> result;
  206. for (unsigned i = 0; i < connections.size(); ++i)
  207. result.push_back(connections[i]);
  208. return vectorToHandleArray<Connection*>(result, "array<Connection@>");
  209. }
  210. static Server* GetServer()
  211. {
  212. return getEngine()->getServer();
  213. }
  214. static bool IsServer()
  215. {
  216. return GetServer() != 0;
  217. }
  218. static void registerServer(asIScriptEngine* engine)
  219. {
  220. engine->RegisterObjectType("Server", 0, asOBJ_REF);
  221. engine->RegisterObjectBehaviour("Server", asBEHAVE_ADDREF, "void f()", asMETHOD(Server, addRef), asCALL_THISCALL);
  222. engine->RegisterObjectBehaviour("Server", asBEHAVE_RELEASE, "void f()", asMETHOD(Server, releaseRef), asCALL_THISCALL);
  223. engine->RegisterObjectMethod("Server", "void setNetFps(int)", asMETHOD(Server, setNetFps), asCALL_THISCALL);
  224. engine->RegisterObjectMethod("Server", "void setMaxSceneRevisions(int)", asMETHOD(Server, setMaxSceneRevisions), asCALL_THISCALL);
  225. engine->RegisterObjectMethod("Server", "void setStayRelevantTime(int)", asMETHOD(Server, setStayRelevantTime), asCALL_THISCALL);
  226. engine->RegisterObjectMethod("Server", "void addScene(Scene@+)", asMETHOD(Server, addScene), asCALL_THISCALL);
  227. engine->RegisterObjectMethod("Server", "void removeScene(Scene@+)", asMETHOD(Server, removeScene), asCALL_THISCALL);
  228. engine->RegisterObjectMethod("Server", "bool start(uint16)", asMETHOD(Server, start), asCALL_THISCALL);
  229. engine->RegisterObjectMethod("Server", "void stop()", asMETHOD(Server, stop), asCALL_THISCALL);
  230. engine->RegisterObjectMethod("Server", "bool setClientScene(Connection@+, Scene@+)", asMETHOD(Server, setClientScene), asCALL_THISCALL);
  231. engine->RegisterObjectMethod("Server", "int getNetFps() const", asMETHOD(Server, getNetFps), asCALL_THISCALL);
  232. engine->RegisterObjectMethod("Server", "int getMaxSceneRevisions() const", asMETHOD(Server, getMaxSceneRevisions), asCALL_THISCALL);
  233. engine->RegisterObjectMethod("Server", "int getStayRelevantTime() const", asMETHOD(Server, getStayRelevantTime), asCALL_THISCALL);
  234. engine->RegisterObjectMethod("Server", "bool isRunning() const", asMETHOD(Server, isRunning), asCALL_THISCALL);
  235. engine->RegisterObjectMethod("Server", "bool hasScene(Scene@+) const", asMETHOD(Server, hasScene), asCALL_THISCALL);
  236. engine->RegisterObjectMethod("Server", "array<Scene@>@ getScenes() const", asFUNCTION(ServerGetScenes), asCALL_CDECL_OBJLAST);
  237. engine->RegisterObjectMethod("Server", "array<Connection@>@ getConnections() const", asFUNCTION(ServerGetConnections), asCALL_CDECL_OBJLAST);
  238. engine->RegisterObjectMethod("Server", "uint getNumUsersInScene(Scene@+) const", asMETHOD(Server, getNumUsersInScene), asCALL_THISCALL);
  239. engine->RegisterGlobalFunction("Server@+ getServer()", asFUNCTION(GetServer), asCALL_CDECL);
  240. engine->RegisterGlobalFunction("Server@+ get_server()", asFUNCTION(GetServer), asCALL_CDECL);
  241. engine->RegisterGlobalFunction("bool isServer()", asFUNCTION(IsServer), asCALL_CDECL);
  242. }
  243. static void ParticleEmitterLoadParameters(XMLFile* file, ParticleEmitter* ptr)
  244. {
  245. try
  246. {
  247. ptr->loadParameters(file, getEngine()->getResourceCache());
  248. }
  249. catch (Exception& e)
  250. {
  251. SAFE_RETHROW(e);
  252. }
  253. }
  254. static void registerParticleEmitter(asIScriptEngine* engine)
  255. {
  256. registerGeometryNode<ParticleEmitter>(engine, "ParticleEmitter");
  257. engine->RegisterObjectMethod("ParticleEmitter", "void setMaterial(Material@+)", asMETHODPR(ParticleEmitter, setMaterial, (Material*), void), asCALL_THISCALL);
  258. engine->RegisterObjectMethod("ParticleEmitter", "void setBillboardsRelative(bool)", asMETHODPR(ParticleEmitter, setBillboardsRelative, (bool), void), asCALL_THISCALL);
  259. engine->RegisterObjectMethod("ParticleEmitter", "void setBillboardsSorted(bool)", asMETHODPR(ParticleEmitter, setBillboardsSorted, (bool), void), asCALL_THISCALL);
  260. engine->RegisterObjectMethod("ParticleEmitter", "void setScaleBillboards(bool)", asMETHODPR(ParticleEmitter, setScaleBillboards, (bool), void), asCALL_THISCALL);
  261. engine->RegisterObjectMethod("ParticleEmitter", "void setAnimationLodBias(float)", asMETHODPR(ParticleEmitter, setAnimationLodBias, (float), void), asCALL_THISCALL);
  262. engine->RegisterObjectMethod("ParticleEmitter", "Material@+ getMaterial() const", asMETHODPR(ParticleEmitter, getMaterial, () const, Material*), asCALL_THISCALL);
  263. engine->RegisterObjectMethod("ParticleEmitter", "bool getBillboardsRelative() const", asMETHODPR(ParticleEmitter, getBillboardsRelative, () const, bool), asCALL_THISCALL);
  264. engine->RegisterObjectMethod("ParticleEmitter", "bool getBillboardsSorted() const", asMETHODPR(ParticleEmitter, getBillboardsSorted, () const, bool), asCALL_THISCALL);
  265. engine->RegisterObjectMethod("ParticleEmitter", "bool getScaleBillboards() const", asMETHODPR(ParticleEmitter, getScaleBillboards, () const, bool), asCALL_THISCALL);
  266. engine->RegisterObjectMethod("ParticleEmitter", "float getAnimationLodBias() const", asMETHODPR(ParticleEmitter, getAnimationLodBias, () const, float), asCALL_THISCALL);
  267. engine->RegisterObjectMethod("ParticleEmitter", "void loadParameters(XMLFile@+ file)", asFUNCTION(ParticleEmitterLoadParameters), asCALL_CDECL_OBJLAST);
  268. engine->RegisterObjectMethod("ParticleEmitter", "void setActive(bool, bool)", asMETHOD(ParticleEmitter, setActive), asCALL_THISCALL);
  269. engine->RegisterObjectMethod("ParticleEmitter", "XMLFile@+ getParameterSource() const", asMETHOD(ParticleEmitter, getParameterSource), asCALL_THISCALL);
  270. engine->RegisterObjectMethod("ParticleEmitter", "bool isActive() const", asMETHOD(ParticleEmitter, isActive), asCALL_THISCALL);
  271. engine->RegisterObjectMethod("ParticleEmitter", "uint getNumParticles() const", asMETHOD(ParticleEmitter, getNumParticles), asCALL_THISCALL);
  272. registerRefCasts<Component, ParticleEmitter>(engine, "Component", "ParticleEmitter");
  273. registerRefCasts<Node, ParticleEmitter>(engine, "Node", "ParticleEmitter");
  274. }
  275. static DebugHud* GetDebugHud()
  276. {
  277. return getEngine()->getDebugHud();
  278. }
  279. static void registerDebugHud(asIScriptEngine* engine)
  280. {
  281. engine->RegisterGlobalProperty("const uint DEBUGHUD_SHOW_NONE", (void*)&DEBUGHUD_SHOW_NONE);
  282. engine->RegisterGlobalProperty("const uint DEBUGHUD_SHOW_STATS", (void*)&DEBUGHUD_SHOW_STATS);
  283. engine->RegisterGlobalProperty("const uint DEBUGHUD_SHOW_MODE", (void*)&DEBUGHUD_SHOW_MODE);
  284. engine->RegisterGlobalProperty("const uint DEBUGHUD_SHOW_PROFILER", (void*)&DEBUGHUD_SHOW_PROFILER);
  285. engine->RegisterObjectType("DebugHud", 0, asOBJ_REF);
  286. engine->RegisterObjectBehaviour("DebugHud", asBEHAVE_ADDREF, "void f()", asMETHOD(DebugHud, addRef), asCALL_THISCALL);
  287. engine->RegisterObjectBehaviour("DebugHud", asBEHAVE_RELEASE, "void f()", asMETHOD(DebugHud, releaseRef), asCALL_THISCALL);
  288. engine->RegisterObjectMethod("DebugHud", "void setFont(Font@+, int)", asMETHOD(DebugHud, setFont), asCALL_THISCALL);
  289. engine->RegisterObjectMethod("DebugHud", "void setMode(uint)", asMETHOD(DebugHud, setMode), asCALL_THISCALL);
  290. engine->RegisterObjectMethod("DebugHud", "void setProfilerInterval(float)", asMETHOD(DebugHud, setProfilerInterval), asCALL_THISCALL);
  291. engine->RegisterObjectMethod("DebugHud", "void toggle(uint)", asMETHOD(DebugHud, toggle), asCALL_THISCALL);
  292. engine->RegisterObjectMethod("DebugHud", "void toggleAll()", asMETHOD(DebugHud, toggleAll), asCALL_THISCALL);
  293. engine->RegisterObjectMethod("DebugHud", "uint getMode() const", asMETHOD(DebugHud, getMode), asCALL_THISCALL);
  294. engine->RegisterObjectMethod("DebugHud", "float getProfilerInterval() const", asMETHOD(DebugHud, getProfilerInterval), asCALL_THISCALL);
  295. engine->RegisterGlobalFunction("DebugHud@+ getDebugHud()", asFUNCTION(GetDebugHud), asCALL_CDECL);
  296. engine->RegisterGlobalFunction("DebugHud@+ get_debugHud()", asFUNCTION(GetDebugHud), asCALL_CDECL);
  297. }
  298. static Scene* EngineCreateScene(const std::string& name, const BoundingBox& octreeSize, unsigned octreeLevels, bool usePhysics, Engine* ptr)
  299. {
  300. SharedPtr<Scene> newScene = ptr->createScene(name, octreeSize, octreeLevels, usePhysics);
  301. // The shared pointer will go out of scope, so have to increment the reference count
  302. // (here an auto handle can not be used)
  303. newScene->addRef();
  304. return newScene.getPtr();
  305. }
  306. static void registerEngine(asIScriptEngine* engine)
  307. {
  308. engine->RegisterGlobalProperty("const int DEBUGDRAW_NONE", (void*)&DEBUGDRAW_NONE);
  309. engine->RegisterGlobalProperty("const int DEBUGDRAW_RENDERING", (void*)&DEBUGDRAW_RENDERING);
  310. engine->RegisterGlobalProperty("const int DEBUGDRAW_PHYSICS", (void*)&DEBUGDRAW_PHYSICS);
  311. engine->RegisterObjectType("Engine", 0, asOBJ_REF);
  312. engine->RegisterObjectBehaviour("Engine", asBEHAVE_ADDREF, "void f()", asMETHOD(Engine, addRef), asCALL_THISCALL);
  313. engine->RegisterObjectBehaviour("Engine", asBEHAVE_RELEASE, "void f()", asMETHOD(Engine, releaseRef), asCALL_THISCALL);
  314. engine->RegisterObjectMethod("Engine", "Scene@ createScene(const string& in, const BoundingBox& in, uint, bool)", asFUNCTION(EngineCreateScene), asCALL_CDECL_OBJLAST);
  315. engine->RegisterObjectMethod("Engine", "Client@ createClient(const string& in)", asMETHOD(Engine, createClient), asCALL_THISCALL);
  316. engine->RegisterObjectMethod("Engine", "Server@ createServer()", asMETHOD(Engine, createServer), asCALL_THISCALL);
  317. engine->RegisterObjectMethod("Engine", "DebugHud@ createDebugHud()", asMETHOD(Engine, createDebugHud), asCALL_THISCALL);
  318. engine->RegisterObjectMethod("Engine", "void removeClient()", asMETHOD(Engine, removeClient), asCALL_THISCALL);
  319. engine->RegisterObjectMethod("Engine", "void removeServer()", asMETHOD(Engine, removeServer), asCALL_THISCALL);
  320. engine->RegisterObjectMethod("Engine", "void setMinFps(int)", asMETHOD(Engine, setMinFps), asCALL_THISCALL);
  321. engine->RegisterObjectMethod("Engine", "void setMaxFps(int)", asMETHOD(Engine, setMaxFps), asCALL_THISCALL);
  322. engine->RegisterObjectMethod("Engine", "void setMaxInactiveFps(int)", asMETHOD(Engine, setMaxInactiveFps), asCALL_THISCALL);
  323. engine->RegisterObjectMethod("Engine", "void setDebugDrawMode(int)", asMETHOD(Engine, setDebugDrawMode), asCALL_THISCALL);
  324. engine->RegisterObjectMethod("Engine", "void setFlushGPU(bool)", asMETHOD(Engine, setFlushGPU), asCALL_THISCALL);
  325. engine->RegisterObjectMethod("Engine", "void exit()", asMETHOD(Engine, exit), asCALL_THISCALL);
  326. engine->RegisterObjectMethod("Engine", "void dumpProfilingData()", asMETHOD(Engine, dumpProfilingData), asCALL_THISCALL);
  327. engine->RegisterObjectMethod("Engine", "void dumpResources()", asMETHOD(Engine, dumpResources), asCALL_THISCALL);
  328. engine->RegisterObjectMethod("Engine", "int getMinFps() const", asMETHOD(Engine, getMinFps), asCALL_THISCALL);
  329. engine->RegisterObjectMethod("Engine", "int getMaxFps() const", asMETHOD(Engine, getMaxFps), asCALL_THISCALL);
  330. engine->RegisterObjectMethod("Engine", "int getMaxInactiveFps() const", asMETHOD(Engine, getMaxInactiveFps), asCALL_THISCALL);
  331. engine->RegisterObjectMethod("Engine", "int getDebugDrawMode() const", asMETHOD(Engine, getDebugDrawMode), asCALL_THISCALL);
  332. engine->RegisterObjectMethod("Engine", "bool getFlushGPU() const", asMETHOD(Engine, getFlushGPU), asCALL_THISCALL);
  333. engine->RegisterObjectMethod("Engine", "bool isInitialized() const", asMETHOD(Engine, isInitialized), asCALL_THISCALL);
  334. engine->RegisterObjectMethod("Engine", "bool isExiting() const", asMETHOD(Engine, isExiting), asCALL_THISCALL);
  335. engine->RegisterObjectMethod("Engine", "bool isHeadless() const", asMETHOD(Engine, isHeadless), asCALL_THISCALL);
  336. engine->RegisterGlobalFunction("Engine@+ getEngine()", asFUNCTION(getEngine), asCALL_CDECL);
  337. engine->RegisterGlobalFunction("Engine@+ get_engine()", asFUNCTION(getEngine), asCALL_CDECL);
  338. }
  339. void registerEngineLibrary(asIScriptEngine* engine)
  340. {
  341. registerConnection(engine);
  342. registerClient(engine);
  343. registerServer(engine);
  344. registerParticleEmitter(engine);
  345. registerDebugHud(engine);
  346. registerEngine(engine);
  347. }