Manual_Scene.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. // Copyright (c) 2008-2022 the Urho3D project
  2. // License: MIT
  3. #pragma once
  4. #include "../Graphics/Skeleton.h"
  5. #include "../Scene/Scene.h"
  6. #include "../Graphics/Octree.h"
  7. #include "../Graphics/DebugRenderer.h"
  8. #include "../IO/PackageFile.h"
  9. namespace Urho3D
  10. {
  11. #ifdef URHO3D_NETWORK
  12. static const bool URHO3D_NETWORK_DEFINED = true;
  13. #else
  14. static const bool URHO3D_NETWORK_DEFINED = false;
  15. #endif
  16. static const AttributeInfo noAttributeInfo;
  17. template <class T> const AttributeInfo& Serializable_GetAttributeInfo(unsigned index, T* ptr)
  18. {
  19. const Vector<AttributeInfo>* attributes = ptr->GetAttributes();
  20. if (!attributes || index >= attributes->Size())
  21. {
  22. GetActiveASContext()->SetException("Index out of bounds");
  23. return noAttributeInfo;
  24. }
  25. else
  26. return attributes->At(index);
  27. }
  28. #define REGISTER_MEMBERS_MANUAL_PART_Serializable() \
  29. engine->RegisterObjectMethod(className, "const AttributeInfo& get_attributeInfos(uint) const", AS_FUNCTION_OBJLAST(Serializable_GetAttributeInfo<T>), AS_CALL_CDECL_OBJLAST);
  30. // ========================================================================================
  31. // bool Node::SaveXML(Serializer& dest, const String& indentation = "\t") const | File: ../Scene/Node.h
  32. template <class T> bool Node_SaveXML_File(File* file, const String& indentation, T* ptr)
  33. {
  34. return file && ptr->SaveXML(*file, indentation);
  35. }
  36. // bool Node::SaveXML(Serializer& dest, const String& indentation = "\t") const | File: ../Scene/Node.h
  37. template <class T> bool Node_SaveXML_VectorBuffer(VectorBuffer& buffer, const String& indentation, T* ptr)
  38. {
  39. return ptr->SaveXML(buffer, indentation);
  40. }
  41. // bool Node::SaveJSON(Serializer& dest, const String& indentation = "\t") const | File: ../Scene/Node.h
  42. template <class T> bool Node_SaveJSON_File(File* file, T* ptr)
  43. {
  44. return file && ptr->SaveJSON(*file);
  45. }
  46. // bool Node::SaveJSON(Serializer& dest, const String& indentation = "\t") const | File: ../Scene/Node.h
  47. template <class T> bool Node_SaveJSON_VectorBuffer(VectorBuffer& buffer, T* ptr)
  48. {
  49. return ptr->SaveJSON(buffer);
  50. }
  51. // template <class T> void Node::GetChildrenWithComponent(PODVector<Node*>& dest, bool recursive = false) const | File: ../Scene/Node.h
  52. template <class T> CScriptArray* Node_GetChildren_Script(bool recursive, T* ptr)
  53. {
  54. PODVector<Node*> nodes;
  55. ptr->template GetChildrenWithComponent<ScriptInstance>(nodes, recursive);
  56. return VectorToHandleArray<Node>(nodes, "Array<Node@>");
  57. }
  58. // template <class T> void Node::GetChildrenWithComponent(PODVector<Node*>& dest, bool recursive = false) const | File: ../Scene/Node.h
  59. template <class T> CScriptArray* Node_GetChildren_Script_ClassName(const String& className, bool recursive, T* ptr)
  60. {
  61. PODVector<Node*> nodes;
  62. ptr->template GetChildrenWithComponent<ScriptInstance>(nodes, recursive);
  63. PODVector<Node*> result;
  64. for (PODVector<Node*>::Iterator i = nodes.Begin(); i != nodes.End(); ++i)
  65. {
  66. Node* node = *i;
  67. const Vector<SharedPtr<Component>>& components = node->GetComponents();
  68. for (Vector<SharedPtr<Component>>::ConstIterator j = components.Begin(); j != components.End(); ++j)
  69. {
  70. if (auto* instance = (*j)->Cast<ScriptInstance>())
  71. {
  72. if (instance->IsA(className))
  73. result.Push(node);
  74. }
  75. }
  76. }
  77. return VectorToHandleArray<Node>(result, "Array<Node@>");
  78. }
  79. // void Node::GetComponents(PODVector<Component*>& dest, StringHash type, bool recursive = false) const | File: ../Scene/Node.h
  80. template <class T> CScriptArray* Node_GetComponents_Type(const String& typeName, bool recursive, T* ptr)
  81. {
  82. PODVector<Component*> components;
  83. ptr->GetComponents(components, typeName, recursive);
  84. return VectorToHandleArray<Component>(components, "Array<Component@>");
  85. }
  86. // unsigned Node::GetNumChildren(bool recursive = false) const | File: ../Scene/Node.h
  87. template <class T> unsigned Node_GetNumChildren_NonRecursive(T* ptr)
  88. {
  89. return ptr->GetNumChildren(false);
  90. }
  91. // unsigned Node::GetNumChildren(bool recursive = false) const | File: ../Scene/Node.h
  92. template <class T> unsigned Node_GetNumChildren_Recursive(T* ptr)
  93. {
  94. return ptr->GetNumChildren(true);
  95. }
  96. // Node* Node::GetChild(unsigned index) const | File: ../Scene/Node.h
  97. template <class T> Node* Node_GetChild(unsigned index, T* ptr)
  98. {
  99. const Vector<SharedPtr<Node>>& children = ptr->GetChildren();
  100. if (index >= children.Size())
  101. {
  102. GetActiveASContext()->SetException("Index out of bounds");
  103. return nullptr;
  104. }
  105. else
  106. return children[index].Get();
  107. }
  108. // Node* Node::GetChild(const String& name, bool recursive = false) const | File: ../Scene/Node.h
  109. template <class T> Node* Node_GetChild_Name_NonRecursive(const String& name, T* ptr)
  110. {
  111. return ptr->GetChild(name, false);
  112. }
  113. // Node* Node::GetChild(const String& name, bool recursive = false) const | File: ../Scene/Node.h
  114. template <class T> Node* Node_GetChild_Name_Recursive(const String& name, T* ptr)
  115. {
  116. return ptr->GetChild(name, true);
  117. }
  118. // const Vector<SharedPtr<Component>>& Node::GetComponents() const | File: ../Scene/Node.h
  119. template <class T> Component* Node_GetComponent(unsigned index, T* ptr)
  120. {
  121. const Vector<SharedPtr<Component>>& components = ptr->GetComponents();
  122. if (index >= components.Size())
  123. {
  124. GetActiveASContext()->SetException("Index out of bounds");
  125. return nullptr;
  126. }
  127. else
  128. return components[index];
  129. }
  130. // const VariantMap& Node::GetVars() const | File: ../Scene/Node.h
  131. template <class T> VariantMap& Node_GetVars(T* ptr)
  132. {
  133. // Assume that the vars will be modified and queue a network update attribute check
  134. ptr->MarkNetworkUpdate();
  135. return const_cast<VariantMap&>(ptr->GetVars());
  136. }
  137. #define REGISTER_MEMBERS_MANUAL_PART_Node() \
  138. RegisterNamedObjectConstructor<T>(engine, className); \
  139. \
  140. /* bool Node::SaveXML(Serializer& dest, const String& indentation = "\t") const | File: ../Scene/Node.h */ \
  141. engine->RegisterObjectMethod(className, "bool SaveXML(File@+, const String&in = \"\t\")", AS_FUNCTION_OBJLAST(Node_SaveXML_File<T>), AS_CALL_CDECL_OBJLAST); \
  142. engine->RegisterObjectMethod(className, "bool SaveXML(VectorBuffer&, const String&in = \"\t\")", AS_FUNCTION_OBJLAST(Node_SaveXML_VectorBuffer<T>), AS_CALL_CDECL_OBJLAST); \
  143. \
  144. /* bool Node::SaveJSON(Serializer& dest, const String& indentation = "\t") const | File: ../Scene/Node.h */ \
  145. engine->RegisterObjectMethod(className, "bool SaveJSON(File@+)", AS_FUNCTION_OBJLAST(Node_SaveJSON_File<T>), AS_CALL_CDECL_OBJLAST); \
  146. engine->RegisterObjectMethod(className, "bool SaveJSON(VectorBuffer&)", AS_FUNCTION_OBJLAST(Node_SaveJSON_VectorBuffer<T>), AS_CALL_CDECL_OBJLAST); \
  147. \
  148. /* template <class T> void Node::GetChildrenWithComponent(PODVector<Node*>& dest, bool recursive = false) const | File: ../Scene/Node.h */ \
  149. engine->RegisterObjectMethod(className, "Array<Node@>@ GetChildrenWithScript(bool = false) const", AS_FUNCTION_OBJLAST(Node_GetChildren_Script<T>), AS_CALL_CDECL_OBJLAST); \
  150. engine->RegisterObjectMethod(className, "Array<Node@>@ GetChildrenWithScript(const String&in, bool = false) const", AS_FUNCTION_OBJLAST(Node_GetChildren_Script_ClassName<T>), AS_CALL_CDECL_OBJLAST); \
  151. \
  152. /* void Node::GetComponents(PODVector<Component*>& dest, StringHash type, bool recursive = false) const | File: ../Scene/Node.h */ \
  153. engine->RegisterObjectMethod(className, "Array<Component@>@ GetComponents(const String&in, bool = false) const", AS_FUNCTION_OBJLAST(Node_GetComponents_Type<T>), AS_CALL_CDECL_OBJLAST); \
  154. \
  155. /* unsigned Node::GetNumChildren(bool recursive = false) const | File: ../Scene/Node.h */ \
  156. engine->RegisterObjectMethod(className, "uint get_numChildren() const", AS_FUNCTION_OBJLAST(Node_GetNumChildren_NonRecursive<T>), AS_CALL_CDECL_OBJLAST); \
  157. engine->RegisterObjectMethod(className, "uint get_numAllChildren() const", AS_FUNCTION_OBJLAST(Node_GetNumChildren_Recursive<T>), AS_CALL_CDECL_OBJLAST); \
  158. \
  159. /* Node* Node::GetChild(unsigned index) const | File: ../Scene/Node.h */ \
  160. engine->RegisterObjectMethod(className, "Node@+ get_children(uint) const", AS_FUNCTION_OBJLAST(Node_GetChild<T>), AS_CALL_CDECL_OBJLAST); \
  161. \
  162. /* Node* Node::GetChild(const String& name, bool recursive = false) const | File: ../Scene/Node.h */ \
  163. engine->RegisterObjectMethod(className, "Node@+ get_childrenByName(const String&in) const", AS_FUNCTION_OBJLAST(Node_GetChild_Name_NonRecursive<T>), AS_CALL_CDECL_OBJLAST); \
  164. engine->RegisterObjectMethod(className, "Node@+ get_allChildrenByName(const String&in) const", AS_FUNCTION_OBJLAST(Node_GetChild_Name_Recursive<T>), AS_CALL_CDECL_OBJLAST); \
  165. \
  166. /* const Vector<SharedPtr<Component>>& Node::GetComponents() const | File: ../Scene/Node.h */ \
  167. engine->RegisterObjectMethod(className, "Component@+ get_components(uint) const", AS_FUNCTION_OBJLAST(Node_GetComponent<T>), AS_CALL_CDECL_OBJLAST); \
  168. \
  169. /* const VariantMap& Node::GetVars() const | File: ../Scene/Node.h */ \
  170. engine->RegisterObjectMethod(className, "VariantMap& get_vars()", AS_FUNCTION_OBJLAST(Node_GetVars<T>), AS_CALL_CDECL_OBJLAST); \
  171. \
  172. /* Workarounds for Connection that used outside URHO3D_NETWORK define */ \
  173. if (URHO3D_NETWORK_DEFINED) \
  174. { \
  175. /* void Node::SetOwner(Connection* owner) | File: ../Scene/Node.h */ \
  176. engine->RegisterObjectMethod(className, "void SetOwner(Connection@+)", AS_METHOD(T, SetOwner), AS_CALL_THISCALL); \
  177. engine->RegisterObjectMethod(className, "void set_owner(Connection@+)", AS_METHOD(T, SetOwner), AS_CALL_THISCALL); \
  178. \
  179. /* Connection* Node::GetOwner() const | File: ../Scene/Node.h */ \
  180. engine->RegisterObjectMethod(className, "Connection@+ GetOwner() const", AS_METHOD(T, GetOwner), AS_CALL_THISCALL); \
  181. engine->RegisterObjectMethod(className, "Connection@+ get_owner() const", AS_METHOD(T, GetOwner), AS_CALL_THISCALL); \
  182. \
  183. /* void Node::CleanupConnection(Connection* connection) | File: ../Scene/Node.h */ \
  184. engine->RegisterObjectMethod(className, "void CleanupConnection(Connection@+)", AS_METHOD(T, CleanupConnection), AS_CALL_THISCALL); \
  185. }
  186. // ========================================================================================
  187. // bool Scene::LoadXML(Deserializer& source) | File: ../Scene/Scene.h
  188. template <class T> bool Scene_LoadXML_File(File* file, T* ptr)
  189. {
  190. return file && ptr->LoadXML(*file);
  191. }
  192. // bool Scene::LoadXML(Deserializer& source) | File: ../Scene/Scene.h
  193. template <class T> bool Scene_LoadXML_VectorBuffer(VectorBuffer& buffer, T* ptr)
  194. {
  195. return ptr->LoadXML(buffer);
  196. }
  197. // bool Scene::LoadJSON(Deserializer& source) | File: ../Scene/Scene.h
  198. template <class T> bool Scene_LoadJSON_File(File* file, T* ptr)
  199. {
  200. return file && ptr->LoadJSON(*file);
  201. }
  202. // bool Scene::LoadJSON(Deserializer& source) | File: ../Scene/Scene.h
  203. template <class T> bool Scene_LoadJSON_VectorBuffer(VectorBuffer& buffer, T* ptr)
  204. {
  205. return ptr->LoadJSON(buffer);
  206. }
  207. // Node* Scene::Instantiate(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h
  208. template <class T> Node* Scene_Instantiate_File(File* file, const Vector3& position, const Quaternion& rotation, CreateMode mode, T* ptr)
  209. {
  210. return file ? ptr->Instantiate(*file, position, rotation, mode) : nullptr;
  211. }
  212. // Node* Scene::Instantiate(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h
  213. template <class T> Node* Scene_Instantiate_VectorBuffer(VectorBuffer& buffer, const Vector3& position, const Quaternion& rotation, CreateMode mode, T* ptr)
  214. {
  215. return ptr->Instantiate(buffer, position, rotation, mode);
  216. }
  217. // Node* Scene::InstantiateXML(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h
  218. template <class T> Node* Scene_InstantiateXML_File(File* file, const Vector3& position, const Quaternion& rotation, CreateMode mode, T* ptr)
  219. {
  220. return file ? ptr->InstantiateXML(*file, position, rotation, mode) : nullptr;
  221. }
  222. // Node* Scene::InstantiateXML(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h
  223. template <class T> Node* Scene_InstantiateXML_VectorBuffer(VectorBuffer& buffer, const Vector3& position, const Quaternion& rotation, CreateMode mode, T* ptr)
  224. {
  225. return ptr->InstantiateXML(buffer, position, rotation, mode);
  226. }
  227. // Node* Scene::InstantiateJSON(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h
  228. template <class T> Node* Scene_InstantiateJSON_File(File* file, const Vector3& position, const Quaternion& rotation, CreateMode mode, T* ptr)
  229. {
  230. return file ? ptr->InstantiateJSON(*file, position, rotation, mode) : nullptr;
  231. }
  232. // Node* Scene::InstantiateJSON(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h
  233. template <class T> Node* Scene_InstantiateJSON_VectorBuffer(VectorBuffer& buffer, const Vector3& position, const Quaternion& rotation, CreateMode mode, T* ptr)
  234. {
  235. return ptr->InstantiateJSON(buffer, position, rotation, mode);
  236. }
  237. // Node* Scene::InstantiateXML(const XMLElement& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h
  238. template <class T> Node* Scene_InstantiateXML_XMLFile(XMLFile* xml, const Vector3& position, const Quaternion& rotation, CreateMode mode, T* ptr)
  239. {
  240. return xml ? ptr->InstantiateXML(xml->GetRoot(), position, rotation, mode) : nullptr;
  241. }
  242. // Node* Scene::InstantiateJSON(const JSONValue& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h
  243. template <class T> Node* Scene_InstantiateJSON_JSONFile(JSONFile* json, const Vector3& position, const Quaternion& rotation, CreateMode mode, T* ptr)
  244. {
  245. return json ? ptr->InstantiateJSON(json->GetRoot(), position, rotation, mode) : nullptr;
  246. }
  247. // bool Scene::GetNodesWithTag(PODVector<Node*>& dest, const String& tag) const | File: ../Scene/Scene.h
  248. template <class T> CScriptArray* Scene_GetNodesWithTag(const String& tag, T* ptr)
  249. {
  250. PODVector<Node*> nodes;
  251. ptr->GetNodesWithTag(nodes, tag);
  252. return VectorToHandleArray<Node>(nodes, "Array<Node@>");
  253. }
  254. // template <class T> T* Scene::GetComponent(bool recursive = false) const | File: ../Scene/Node.h
  255. template <class T> DebugRenderer* Scene_GetDebugRenderer(T* ptr)
  256. {
  257. return ptr->template GetComponent<DebugRenderer>();
  258. }
  259. // template <class T> T* Scene::GetComponent(bool recursive = false) const | File: ../Scene/Node.h
  260. template <class T> Octree* Scene_GetOctree(T* ptr)
  261. {
  262. return ptr->template GetComponent<Octree>();
  263. }
  264. #define REGISTER_MEMBERS_MANUAL_PART_Scene() \
  265. /* bool Scene::LoadXML(Deserializer& source) | File: ../Scene/Scene.h */ \
  266. engine->RegisterObjectMethod(className, "bool LoadXML(File@+)", AS_FUNCTION_OBJLAST(Scene_LoadXML_File<T>), AS_CALL_CDECL_OBJLAST); \
  267. engine->RegisterObjectMethod(className, "bool LoadXML(VectorBuffer&)", AS_FUNCTION_OBJLAST(Scene_LoadXML_VectorBuffer<T>), AS_CALL_CDECL_OBJLAST); \
  268. \
  269. /* bool Scene::LoadJSON(Deserializer& source) | File: ../Scene/Scene.h */ \
  270. engine->RegisterObjectMethod(className, "bool LoadJSON(File@+)", AS_FUNCTION_OBJLAST(Scene_LoadJSON_File<T>), AS_CALL_CDECL_OBJLAST); \
  271. engine->RegisterObjectMethod(className, "bool LoadJSON(VectorBuffer&)", AS_FUNCTION_OBJLAST(Scene_LoadJSON_VectorBuffer<T>), AS_CALL_CDECL_OBJLAST); \
  272. \
  273. /* Node* Scene::Instantiate(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h */ \
  274. engine->RegisterObjectMethod(className, "Node@+ Instantiate(File@+, const Vector3&in, const Quaternion&in, CreateMode = REPLICATED)", AS_FUNCTION_OBJLAST(Scene_Instantiate_File<T>), AS_CALL_CDECL_OBJLAST); \
  275. engine->RegisterObjectMethod(className, "Node@+ Instantiate(VectorBuffer&, const Vector3&in, const Quaternion&in, CreateMode = REPLICATED)", AS_FUNCTION_OBJLAST(Scene_Instantiate_VectorBuffer<T>), AS_CALL_CDECL_OBJLAST); \
  276. \
  277. /* Node* Scene::InstantiateXML(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h */ \
  278. engine->RegisterObjectMethod(className, "Node@+ InstantiateXML(File@+, const Vector3&in, const Quaternion&in, CreateMode = REPLICATED)", AS_FUNCTION_OBJLAST(Scene_InstantiateXML_File<T>), AS_CALL_CDECL_OBJLAST); \
  279. engine->RegisterObjectMethod(className, "Node@+ InstantiateXML(VectorBuffer&, const Vector3&in, const Quaternion&in, CreateMode = REPLICATED)", AS_FUNCTION_OBJLAST(Scene_InstantiateXML_VectorBuffer<T>), AS_CALL_CDECL_OBJLAST); \
  280. \
  281. /*Node* Scene::InstantiateJSON(Deserializer& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h */ \
  282. engine->RegisterObjectMethod(className, "Node@+ InstantiateJSON(File@+, const Vector3&in, const Quaternion&in, CreateMode = REPLICATED)", AS_FUNCTION_OBJLAST(Scene_InstantiateJSON_File<T>), AS_CALL_CDECL_OBJLAST); \
  283. engine->RegisterObjectMethod(className, "Node@+ InstantiateJSON(VectorBuffer&, const Vector3&in, const Quaternion&in, CreateMode = REPLICATED)", AS_FUNCTION_OBJLAST(Scene_InstantiateJSON_VectorBuffer<T>), AS_CALL_CDECL_OBJLAST); \
  284. \
  285. /* Node* Scene::InstantiateXML(const XMLElement& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h */ \
  286. engine->RegisterObjectMethod(className, "Node@+ InstantiateXML(XMLFile@+, const Vector3&in, const Quaternion&in, CreateMode = REPLICATED)", AS_FUNCTION_OBJLAST(Scene_InstantiateXML_XMLFile<T>), AS_CALL_CDECL_OBJLAST); \
  287. \
  288. /* Node* Scene::InstantiateJSON(const JSONValue& source, const Vector3& position, const Quaternion& rotation, CreateMode mode = REPLICATED) | File: ../Scene/Scene.h */ \
  289. engine->RegisterObjectMethod(className, "Node@+ InstantiateJSON(JSONFile@+, const Vector3&in, const Quaternion&in, CreateMode = REPLICATED)", AS_FUNCTION_OBJLAST(Scene_InstantiateJSON_JSONFile<T>), AS_CALL_CDECL_OBJLAST); \
  290. \
  291. /* bool Scene::GetNodesWithTag(PODVector<Node*>& dest, const String& tag) const | File: ../Scene/Scene.h */ \
  292. engine->RegisterObjectMethod(className, "Array<Node@>@ GetNodesWithTag(const String&in) const", AS_FUNCTION_OBJLAST(Scene_GetNodesWithTag<T>), AS_CALL_CDECL_OBJLAST); \
  293. \
  294. /* template <class T> T* Scene::GetComponent(bool recursive = false) const | File: ../Scene/Node.h */ \
  295. engine->RegisterObjectMethod(className, "DebugRenderer@+ get_debugRenderer() const", AS_FUNCTION_OBJLAST(Scene_GetDebugRenderer<T>), AS_CALL_CDECL_OBJLAST); \
  296. engine->RegisterObjectMethod(className, "Octree@+ get_octree() const", AS_FUNCTION_OBJLAST(Scene_GetOctree<T>), AS_CALL_CDECL_OBJLAST); \
  297. \
  298. /* Workaround Doxygen bug: have no const flag in xml (but already registered in template because string GetSignature(const MethodAnalyzer& method) ignores const) */ \
  299. /* Component* Node::GetComponent(StringHash type, bool recursive=false) const | File: ../Scene/Scene.h */ \
  300. /*engine->RegisterObjectMethod(className, "Component@+ GetComponent(StringHash, bool = false) const", AS_METHODPR(Scene, GetComponent, (StringHash, bool) const, Component*), AS_CALL_THISCALL);*/ \
  301. /* bool Node::SaveXML(XMLElement &dest) const override | File: ../Scene/Scene.h */ \
  302. /*engine->RegisterObjectMethod(className, "bool SaveXML(XMLElement&) const", AS_METHODPR(Scene, SaveXML, (XMLElement &) const, bool), AS_CALL_THISCALL);*/ \
  303. /* bool Node::SaveJSON(JSONValue &dest) const override | File: ../Scene/Scene.h */ \
  304. /*engine->RegisterObjectMethod(className, "bool SaveJSON(JSONValue&) const", AS_METHODPR(Scene, SaveJSON, (JSONValue &) const, bool), AS_CALL_THISCALL);*/
  305. // ========================================================================================
  306. // WeakPtr<Node> Bone::node_ | File: ../Graphics/Skeleton.h
  307. template <class T> Node* Bone_GetNode(T* ptr)
  308. {
  309. return ptr->node_;
  310. }
  311. // WeakPtr<Node> Bone::node_ | File: ../Graphics/Skeleton.h
  312. template <class T> void Bone_SetNode(Node* node, T* ptr)
  313. {
  314. ptr->node_ = node;
  315. }
  316. #define REGISTER_MEMBERS_MANUAL_PART_Bone() \
  317. /* WeakPtr<Node> Bone::node_ | File: ../Graphics/Skeleton.h */ \
  318. engine->RegisterObjectMethod(className, "void set_node(Node@+)", AS_FUNCTION_OBJLAST(Bone_SetNode<T>), AS_CALL_CDECL_OBJLAST); \
  319. engine->RegisterObjectMethod(className, "Node@+ get_node() const", AS_FUNCTION_OBJLAST(Bone_GetNode<T>), AS_CALL_CDECL_OBJLAST);
  320. // ========================================================================================
  321. #define REGISTER_MEMBERS_MANUAL_PART_Component() \
  322. /* Workarounds for Connection that used outside URHO3D_NETWORK define */ \
  323. if (URHO3D_NETWORK_DEFINED) \
  324. { \
  325. /* void Component::CleanupConnection(Connection* connection) | File: ../Scene/Component.h */ \
  326. engine->RegisterObjectMethod(className, "void CleanupConnection(Connection@+)", AS_METHODPR(T, CleanupConnection, (Connection*), void), AS_CALL_THISCALL); \
  327. }
  328. }