Manual_Scene.h 21 KB

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