BsScriptCamera.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptCamera.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoManager.h"
  7. #include "BsMonoUtil.h"
  8. #include "Renderer/BsCamera.h"
  9. #include "Wrappers/BsScriptSceneObject.h"
  10. #include "Scene/BsSceneObject.h"
  11. #include "Wrappers/BsScriptRenderTarget.h"
  12. #include "Scene/BsSceneManager.h"
  13. #include "RenderAPI/BsViewport.h"
  14. #include "RenderAPI/BsRenderTarget.h"
  15. #include "RenderAPI/BsRenderWindow.h"
  16. #include "RenderAPI/BsRenderTexture.h"
  17. #include "GUI/BsGUIManager.h"
  18. #include "Renderer/BsRenderSettings.h"
  19. #include "Wrappers/BsScriptRenderSettings.h"
  20. namespace bs
  21. {
  22. ScriptCamera::ScriptCamera(MonoObject* managedInstance, const HSceneObject& parentSO)
  23. :ScriptObject(managedInstance), mCamera(nullptr), mLastUpdateHash(0)
  24. {
  25. mCamera = Camera::create(nullptr);
  26. gSceneManager()._registerCamera(mCamera, parentSO);
  27. }
  28. ScriptCamera::~ScriptCamera()
  29. {
  30. }
  31. void ScriptCamera::initRuntimeData()
  32. {
  33. metaData.scriptClass->addInternalCall("Internal_Create", (void*)&ScriptCamera::internal_Create);
  34. metaData.scriptClass->addInternalCall("Internal_GetAspect", (void*)&ScriptCamera::internal_GetAspect);
  35. metaData.scriptClass->addInternalCall("Internal_SetAspect", (void*)&ScriptCamera::internal_SetAspect);
  36. metaData.scriptClass->addInternalCall("Internal_GetNearClip", (void*)&ScriptCamera::internal_GetNearClip);
  37. metaData.scriptClass->addInternalCall("Internal_SetNearClip", (void*)&ScriptCamera::internal_SetNearClip);
  38. metaData.scriptClass->addInternalCall("Internal_GetFarClip", (void*)&ScriptCamera::internal_GetFarClip);
  39. metaData.scriptClass->addInternalCall("Internal_SetFarClip", (void*)&ScriptCamera::internal_SetFarClip);
  40. metaData.scriptClass->addInternalCall("Internal_GetFieldOfView", (void*)&ScriptCamera::internal_GetFieldOfView);
  41. metaData.scriptClass->addInternalCall("Internal_SetFieldOfView", (void*)&ScriptCamera::internal_SetFieldOfView);
  42. metaData.scriptClass->addInternalCall("Internal_GetViewportRect", (void*)&ScriptCamera::internal_GetViewportRect);
  43. metaData.scriptClass->addInternalCall("Internal_SetViewportRect", (void*)&ScriptCamera::internal_SetViewportRect);
  44. metaData.scriptClass->addInternalCall("Internal_GetProjectionType", (void*)&ScriptCamera::internal_GetProjectionType);
  45. metaData.scriptClass->addInternalCall("Internal_SetProjectionType", (void*)&ScriptCamera::internal_SetProjectionType);
  46. metaData.scriptClass->addInternalCall("Internal_GetOrthographicHeight", (void*)&ScriptCamera::internal_GetOrthographicHeight);
  47. metaData.scriptClass->addInternalCall("Internal_SetOrthographicHeight", (void*)&ScriptCamera::internal_SetOrthographicHeight);
  48. metaData.scriptClass->addInternalCall("Internal_GetOrthographicWidth", (void*)&ScriptCamera::internal_GetOrthographicWidth);
  49. metaData.scriptClass->addInternalCall("Internal_GetClearColor", (void*)&ScriptCamera::internal_GetClearColor);
  50. metaData.scriptClass->addInternalCall("Internal_SetClearColor", (void*)&ScriptCamera::internal_SetClearColor);
  51. metaData.scriptClass->addInternalCall("Internal_GetDepthClearValue", (void*)&ScriptCamera::internal_GetDepthClearValue);
  52. metaData.scriptClass->addInternalCall("Internal_SetDepthClearValue", (void*)&ScriptCamera::internal_SetDepthClearValue);
  53. metaData.scriptClass->addInternalCall("Internal_GetStencilClearValue", (void*)&ScriptCamera::internal_GetStencilClearValue);
  54. metaData.scriptClass->addInternalCall("Internal_SetStencilClearValue", (void*)&ScriptCamera::internal_SetStencilClearValue);
  55. metaData.scriptClass->addInternalCall("Internal_GetClearFlags", (void*)&ScriptCamera::internal_GetClearFlags);
  56. metaData.scriptClass->addInternalCall("Internal_SetClearFlags", (void*)&ScriptCamera::internal_SetClearFlags);
  57. metaData.scriptClass->addInternalCall("Internal_GetPriority", (void*)&ScriptCamera::internal_GetPriority);
  58. metaData.scriptClass->addInternalCall("Internal_SetPriority", (void*)&ScriptCamera::internal_SetPriority);
  59. metaData.scriptClass->addInternalCall("Internal_GetRenderSettings", (void*)&ScriptCamera::internal_GetRenderSettings);
  60. metaData.scriptClass->addInternalCall("Internal_SetRenderSettings", (void*)&ScriptCamera::internal_SetRenderSettings);
  61. metaData.scriptClass->addInternalCall("Internal_GetLayers", (void*)&ScriptCamera::internal_GetLayers);
  62. metaData.scriptClass->addInternalCall("Internal_SetLayers", (void*)&ScriptCamera::internal_SetLayers);
  63. metaData.scriptClass->addInternalCall("Internal_GetProjMatrix", (void*)&ScriptCamera::internal_GetProjMatrix);
  64. metaData.scriptClass->addInternalCall("Internal_GetProjMatrixInv", (void*)&ScriptCamera::internal_GetProjMatrixInv);
  65. metaData.scriptClass->addInternalCall("Internal_GetViewMatrix", (void*)&ScriptCamera::internal_GetViewMatrix);
  66. metaData.scriptClass->addInternalCall("Internal_GetViewMatrixInv", (void*)&ScriptCamera::internal_GetViewMatrixInv);
  67. metaData.scriptClass->addInternalCall("Internal_GetWidthPixels", (void*)&ScriptCamera::internal_GetWidthPixels);
  68. metaData.scriptClass->addInternalCall("Internal_GetHeightPixels", (void*)&ScriptCamera::internal_GetHeightPixels);
  69. metaData.scriptClass->addInternalCall("Internal_WorldToViewport", (void*)&ScriptCamera::internal_WorldToViewport);
  70. metaData.scriptClass->addInternalCall("Internal_WorldToNDC", (void*)&ScriptCamera::internal_WorldToNDC);
  71. metaData.scriptClass->addInternalCall("Internal_WorldToView", (void*)&ScriptCamera::internal_WorldToView);
  72. metaData.scriptClass->addInternalCall("Internal_ScreenToViewport", (void*)&ScriptCamera::internal_ScreenToViewport);
  73. metaData.scriptClass->addInternalCall("Internal_ViewportToWorld", (void*)&ScriptCamera::internal_ViewportToWorld);
  74. metaData.scriptClass->addInternalCall("Internal_ViewportToView", (void*)&ScriptCamera::internal_ViewportToView);
  75. metaData.scriptClass->addInternalCall("Internal_ViewportToNDC", (void*)&ScriptCamera::internal_ViewportToNDC);
  76. metaData.scriptClass->addInternalCall("Internal_ViewToWorld", (void*)&ScriptCamera::internal_ViewToWorld);
  77. metaData.scriptClass->addInternalCall("Internal_ViewToViewport", (void*)&ScriptCamera::internal_ViewToViewport);
  78. metaData.scriptClass->addInternalCall("Internal_ViewToNDC", (void*)&ScriptCamera::internal_ViewToNDC);
  79. metaData.scriptClass->addInternalCall("Internal_NDCToWorld", (void*)&ScriptCamera::internal_NDCToWorld);
  80. metaData.scriptClass->addInternalCall("Internal_NDCToView", (void*)&ScriptCamera::internal_NDCToView);
  81. metaData.scriptClass->addInternalCall("Internal_NDCToViewport", (void*)&ScriptCamera::internal_NDCToViewport);
  82. metaData.scriptClass->addInternalCall("Internal_ViewportToWorldRay", (void*)&ScriptCamera::internal_ViewportToWorldRay);
  83. metaData.scriptClass->addInternalCall("Internal_ScreenToWorldRay", (void*)&ScriptCamera::internal_ScreenToWorldRay);
  84. metaData.scriptClass->addInternalCall("Internal_ProjectPoint", (void*)&ScriptCamera::internal_ProjectPoint);
  85. metaData.scriptClass->addInternalCall("Internal_UnprojectPoint", (void*)&ScriptCamera::internal_UnprojectPoint);
  86. metaData.scriptClass->addInternalCall("Internal_SetRenderTarget", (void*)&ScriptCamera::internal_SetRenderTarget);
  87. metaData.scriptClass->addInternalCall("Internal_GetMain", (void*)&ScriptCamera::internal_GetMain);
  88. metaData.scriptClass->addInternalCall("Internal_SetMain", (void*)&ScriptCamera::internal_SetMain);
  89. metaData.scriptClass->addInternalCall("Internal_UpdateView", (void*)&ScriptCamera::internal_UpdateView);
  90. metaData.scriptClass->addInternalCall("Internal_OnDestroy", (void*)&ScriptCamera::internal_OnDestroy);
  91. }
  92. void ScriptCamera::updateView(const HSceneObject& parent)
  93. {
  94. if (parent.isDestroyed())
  95. return;
  96. UINT32 curHash = parent->getTransformHash();
  97. if (curHash != mLastUpdateHash)
  98. {
  99. mCamera->setPosition(parent->getWorldPosition());
  100. mCamera->setRotation(parent->getWorldRotation());
  101. mLastUpdateHash = curHash;
  102. }
  103. if (parent->getActive() != mCamera->getIsActive())
  104. {
  105. mCamera->setIsActive(parent->getActive());
  106. }
  107. }
  108. void ScriptCamera::internal_Create(MonoObject* managedInstance, ScriptSceneObject* parentSO)
  109. {
  110. HSceneObject so;
  111. if (parentSO != nullptr)
  112. so = parentSO->getNativeHandle();
  113. new (bs_alloc<ScriptCamera>()) ScriptCamera(managedInstance, so);
  114. }
  115. float ScriptCamera::internal_GetAspect(ScriptCamera* instance)
  116. {
  117. return instance->mCamera->getAspectRatio();
  118. }
  119. void ScriptCamera::internal_SetAspect(ScriptCamera* instance, float value)
  120. {
  121. instance->mCamera->setAspectRatio(value);
  122. }
  123. float ScriptCamera::internal_GetNearClip(ScriptCamera* instance)
  124. {
  125. return instance->mCamera->getNearClipDistance();
  126. }
  127. void ScriptCamera::internal_SetNearClip(ScriptCamera* instance, float value)
  128. {
  129. instance->mCamera->setNearClipDistance(value);
  130. }
  131. float ScriptCamera::internal_GetFarClip(ScriptCamera* instance)
  132. {
  133. return instance->mCamera->getFarClipDistance();
  134. }
  135. void ScriptCamera::internal_SetFarClip(ScriptCamera* instance, float value)
  136. {
  137. instance->mCamera->setFarClipDistance(value);
  138. }
  139. void ScriptCamera::internal_GetFieldOfView(ScriptCamera* instance, Degree* value)
  140. {
  141. *value = instance->mCamera->getHorzFOV();
  142. }
  143. void ScriptCamera::internal_SetFieldOfView(ScriptCamera* instance, Degree* value)
  144. {
  145. instance->mCamera->setHorzFOV(*value);
  146. }
  147. void ScriptCamera::internal_GetViewportRect(ScriptCamera* instance, Rect2* value)
  148. {
  149. *value = instance->mCamera->getViewport()->getNormArea();
  150. }
  151. void ScriptCamera::internal_SetViewportRect(ScriptCamera* instance, Rect2* value)
  152. {
  153. instance->mCamera->getViewport()->setArea(value->x, value->y, value->width, value->height);
  154. }
  155. UINT32 ScriptCamera::internal_GetProjectionType(ScriptCamera* instance)
  156. {
  157. return instance->mCamera->getProjectionType();
  158. }
  159. void ScriptCamera::internal_SetProjectionType(ScriptCamera* instance, UINT32 value)
  160. {
  161. instance->mCamera->setProjectionType((ProjectionType)value);
  162. }
  163. float ScriptCamera::internal_GetOrthographicHeight(ScriptCamera* instance)
  164. {
  165. return instance->mCamera->getOrthoWindowHeight();
  166. }
  167. void ScriptCamera::internal_SetOrthographicHeight(ScriptCamera* instance, float value)
  168. {
  169. instance->mCamera->setOrthoWindowHeight(value);
  170. }
  171. float ScriptCamera::internal_GetOrthographicWidth(ScriptCamera* instance)
  172. {
  173. return instance->mCamera->getOrthoWindowWidth();
  174. }
  175. void ScriptCamera::internal_GetClearColor(ScriptCamera* instance, Color* value)
  176. {
  177. *value = instance->mCamera->getViewport()->getClearColor();
  178. }
  179. void ScriptCamera::internal_SetClearColor(ScriptCamera* instance, Color* value)
  180. {
  181. SPtr<Viewport> vp = instance->mCamera->getViewport();
  182. vp->setClearValues(*value, vp->getClearDepthValue(), vp->getClearStencilValue());
  183. }
  184. float ScriptCamera::internal_GetDepthClearValue(ScriptCamera* instance)
  185. {
  186. return instance->mCamera->getViewport()->getClearDepthValue();
  187. }
  188. void ScriptCamera::internal_SetDepthClearValue(ScriptCamera* instance, float value)
  189. {
  190. SPtr<Viewport> vp = instance->mCamera->getViewport();
  191. vp->setClearValues(vp->getClearColor(), value, vp->getClearStencilValue());
  192. }
  193. UINT16 ScriptCamera::internal_GetStencilClearValue(ScriptCamera* instance)
  194. {
  195. return instance->mCamera->getViewport()->getClearStencilValue();
  196. }
  197. void ScriptCamera::internal_SetStencilClearValue(ScriptCamera* instance, UINT16 value)
  198. {
  199. SPtr<Viewport> vp = instance->mCamera->getViewport();
  200. vp->setClearValues(vp->getClearColor(), vp->getClearDepthValue(), value);
  201. }
  202. UINT32 ScriptCamera::internal_GetClearFlags(ScriptCamera* instance)
  203. {
  204. SPtr<Viewport> vp = instance->mCamera->getViewport();
  205. UINT32 clearFlags = 0;
  206. clearFlags |= vp->getRequiresColorClear() ? 0x01 : 0;
  207. clearFlags |= vp->getRequiresDepthClear() ? 0x02 : 0;
  208. clearFlags |= vp->getRequiresStencilClear() ? 0x04 : 0;
  209. return clearFlags;
  210. }
  211. void ScriptCamera::internal_SetClearFlags(ScriptCamera* instance, UINT32 value)
  212. {
  213. SPtr<Viewport> vp = instance->mCamera->getViewport();
  214. vp->setRequiresClear((value & 0x01) != 0,
  215. (value & 0x02) != 0, (value & 0x04) != 0);
  216. }
  217. int ScriptCamera::internal_GetPriority(ScriptCamera* instance)
  218. {
  219. return instance->mCamera->getPriority();
  220. }
  221. void ScriptCamera::internal_SetPriority(ScriptCamera* instance, int value)
  222. {
  223. instance->mCamera->setPriority(value);
  224. }
  225. MonoObject* ScriptCamera::internal_GetRenderSettings(ScriptCamera* instance)
  226. {
  227. SPtr<RenderSettings> settings = instance->mCamera->getRenderSettings();
  228. if (settings == nullptr)
  229. settings = bs_shared_ptr_new<RenderSettings>();
  230. return ScriptRenderSettings::toManaged(settings);
  231. }
  232. void ScriptCamera::internal_SetRenderSettings(ScriptCamera* instance, MonoObject* value)
  233. {
  234. instance->mCamera->setRenderSettings(ScriptRenderSettings::toNative(value));
  235. }
  236. UINT64 ScriptCamera::internal_GetLayers(ScriptCamera* instance)
  237. {
  238. return instance->mCamera->getLayers();
  239. }
  240. void ScriptCamera::internal_SetLayers(ScriptCamera* instance, UINT64 value)
  241. {
  242. instance->mCamera->setLayers(value);
  243. }
  244. void ScriptCamera::internal_GetProjMatrix(ScriptCamera* instance, Matrix4* output)
  245. {
  246. *output = instance->mCamera->getProjectionMatrixRS();
  247. }
  248. void ScriptCamera::internal_GetProjMatrixInv(ScriptCamera* instance, Matrix4* output)
  249. {
  250. *output = instance->mCamera->getProjectionMatrixRSInv();
  251. }
  252. void ScriptCamera::internal_GetViewMatrix(ScriptCamera* instance, Matrix4* output)
  253. {
  254. *output = instance->mCamera->getViewMatrix();
  255. }
  256. void ScriptCamera::internal_GetViewMatrixInv(ScriptCamera* instance, Matrix4* output)
  257. {
  258. *output = instance->mCamera->getViewMatrixInv();
  259. }
  260. int ScriptCamera::internal_GetWidthPixels(ScriptCamera* instance)
  261. {
  262. SPtr<Viewport> vp = instance->mCamera->getViewport();
  263. return vp->getWidth();
  264. }
  265. int ScriptCamera::internal_GetHeightPixels(ScriptCamera* instance)
  266. {
  267. SPtr<Viewport> vp = instance->mCamera->getViewport();
  268. return vp->getHeight();
  269. }
  270. void ScriptCamera::internal_WorldToViewport(ScriptCamera* instance, Vector3* value, Vector2I* output)
  271. {
  272. *output = instance->mCamera->worldToScreenPoint(*value);
  273. }
  274. void ScriptCamera::internal_WorldToNDC(ScriptCamera* instance, Vector3* value, Vector2* output)
  275. {
  276. *output = instance->mCamera->worldToNdcPoint(*value);
  277. }
  278. void ScriptCamera::internal_WorldToView(ScriptCamera* instance, Vector3* value, Vector3* output)
  279. {
  280. *output = instance->mCamera->worldToViewPoint(*value);
  281. }
  282. void ScriptCamera::internal_ScreenToViewport(ScriptCamera* instance, Vector2I* value, Vector2I* output)
  283. {
  284. SceneCameraData mainCamera = gSceneManager().getMainCamera();
  285. if (mainCamera.camera == nullptr)
  286. return;
  287. // The main camera could be rendering to a standalone window, or be a part of the editor GUI. Find out which
  288. // and transform the pointer position appropriately.
  289. SPtr<RenderTarget> target = mainCamera.camera->getViewport()->getTarget();
  290. if (target == nullptr)
  291. return;
  292. if (target->getProperties().isWindow)
  293. {
  294. SPtr<RenderWindow> window = std::static_pointer_cast<RenderWindow>(target);
  295. *output = window->screenToWindowPos(*value);
  296. }
  297. else
  298. {
  299. SPtr<RenderTexture> texture = std::static_pointer_cast<RenderTexture>(target);
  300. SPtr<RenderWindow> window = GUIManager::instance().getBridgeWindow(texture);
  301. if (window == nullptr)
  302. return;
  303. *output = window->screenToWindowPos(*value);
  304. *output = GUIManager::instance().windowToBridgedCoords(target, *output);
  305. }
  306. }
  307. void ScriptCamera::internal_ViewportToWorld(ScriptCamera* instance, Vector2I* value, float depth, Vector3* output)
  308. {
  309. *output = instance->mCamera->screenToWorldPoint(*value, depth);
  310. }
  311. void ScriptCamera::internal_ViewportToView(ScriptCamera* instance, Vector2I* value, float depth, Vector3* output)
  312. {
  313. *output = instance->mCamera->screenToViewPoint(*value, depth);
  314. }
  315. void ScriptCamera::internal_ViewportToNDC(ScriptCamera* instance, Vector2I* value, Vector2* output)
  316. {
  317. *output = instance->mCamera->screenToNdcPoint(*value);
  318. }
  319. void ScriptCamera::internal_ViewToWorld(ScriptCamera* instance, Vector3* value, Vector3* output)
  320. {
  321. *output = instance->mCamera->viewToWorldPoint(*value);
  322. }
  323. void ScriptCamera::internal_ViewToViewport(ScriptCamera* instance, Vector3* value, Vector2I* output)
  324. {
  325. *output = instance->mCamera->viewToScreenPoint(*value);
  326. }
  327. void ScriptCamera::internal_ViewToNDC(ScriptCamera* instance, Vector3* value, Vector2* output)
  328. {
  329. *output = instance->mCamera->viewToNdcPoint(*value);
  330. }
  331. void ScriptCamera::internal_NDCToWorld(ScriptCamera* instance, Vector2* value, float depth, Vector3* output)
  332. {
  333. *output = instance->mCamera->ndcToWorldPoint(*value, depth);
  334. }
  335. void ScriptCamera::internal_NDCToView(ScriptCamera* instance, Vector2* value, float depth, Vector3* output)
  336. {
  337. *output = instance->mCamera->ndcToViewPoint(*value, depth);
  338. }
  339. void ScriptCamera::internal_NDCToViewport(ScriptCamera* instance, Vector2* value, Vector2I* output)
  340. {
  341. *output = instance->mCamera->ndcToScreenPoint(*value);
  342. }
  343. void ScriptCamera::internal_ScreenToWorldRay(ScriptCamera* instance, Vector2I* value, Ray* output)
  344. {
  345. Vector2I viewportPos;
  346. internal_ScreenToViewport(instance, value, &viewportPos);
  347. internal_ViewportToWorldRay(instance, &viewportPos, output);
  348. }
  349. void ScriptCamera::internal_ViewportToWorldRay(ScriptCamera* instance, Vector2I* value, Ray* output)
  350. {
  351. *output = instance->mCamera->screenPointToRay(*value);
  352. }
  353. void ScriptCamera::internal_ProjectPoint(ScriptCamera* instance, Vector3* value, Vector3* output)
  354. {
  355. *output = instance->mCamera->projectPoint(*value);
  356. }
  357. void ScriptCamera::internal_UnprojectPoint(ScriptCamera* instance, Vector3* value, Vector3* output)
  358. {
  359. *output = instance->mCamera->unprojectPoint(*value);
  360. }
  361. void ScriptCamera::internal_SetRenderTarget(ScriptCamera* instance, ScriptRenderTarget* target)
  362. {
  363. if (target == nullptr)
  364. instance->mCamera->getViewport()->setTarget(nullptr);
  365. else
  366. instance->mCamera->getViewport()->setTarget(target->getNativeValue());
  367. }
  368. bool ScriptCamera::internal_GetMain(ScriptCamera* instance)
  369. {
  370. return instance->mCamera->isMain();
  371. }
  372. void ScriptCamera::internal_SetMain(ScriptCamera* instance, bool main)
  373. {
  374. instance->mCamera->setMain(main);
  375. gSceneManager()._notifyMainCameraStateChanged(instance->mCamera);
  376. }
  377. void ScriptCamera::internal_UpdateView(ScriptCamera* instance, ScriptSceneObject* parent)
  378. {
  379. HSceneObject parentSO = parent->getNativeSceneObject();
  380. instance->updateView(parentSO);
  381. }
  382. void ScriptCamera::internal_OnDestroy(ScriptCamera* instance)
  383. {
  384. instance->destroy();
  385. }
  386. void ScriptCamera::destroy()
  387. {
  388. if (mCamera->isDestroyed())
  389. return;
  390. gSceneManager()._unregisterCamera(mCamera);
  391. mCamera->destroy();
  392. }
  393. void ScriptCamera::_onManagedInstanceDeleted()
  394. {
  395. destroy();
  396. ScriptObject::_onManagedInstanceDeleted();
  397. }
  398. }