BsScriptCamera.cpp 16 KB

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