BsScriptRenderTexture2D.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptRenderTexture2D.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. #include "BsRenderTexture.h"
  9. #include "BsScriptTexture2D.h"
  10. #include "BsMultiRenderTexture.h"
  11. #include "BsMonoUtil.h"
  12. #include "BsScriptResourceManager.h"
  13. namespace BansheeEngine
  14. {
  15. ScriptRenderTexture2D::ScriptRenderTexture2D(const SPtr<RenderTarget>& target, bool isMulti, MonoObject* instance)
  16. :ScriptObject(instance), mRenderTarget(target), mIsMulti(isMulti)
  17. {
  18. }
  19. void ScriptRenderTexture2D::initRuntimeData()
  20. {
  21. metaData.scriptClass->addInternalCall("Internal_CreateDetailed", &ScriptRenderTexture2D::internal_createDetailed);
  22. metaData.scriptClass->addInternalCall("Internal_Create", &ScriptRenderTexture2D::internal_create);
  23. metaData.scriptClass->addInternalCall("Internal_GetColorSurfaces", &ScriptRenderTexture2D::internal_getColorSurfaces);
  24. metaData.scriptClass->addInternalCall("Internal_GetDepthStencilSurface", &ScriptRenderTexture2D::internal_getDepthStencilSurface);
  25. }
  26. SPtr<RenderTexture> ScriptRenderTexture2D::getRenderTexture() const
  27. {
  28. if (!mIsMulti)
  29. return std::static_pointer_cast<RenderTexture>(mRenderTarget);
  30. return nullptr;
  31. }
  32. SPtr<MultiRenderTexture> ScriptRenderTexture2D::getMultiRenderTexture() const
  33. {
  34. if (mIsMulti)
  35. return std::static_pointer_cast<MultiRenderTexture>(mRenderTarget);
  36. return nullptr;
  37. }
  38. void ScriptRenderTexture2D::internal_createDetailed(MonoObject* instance, PixelFormat format, UINT32 width, UINT32 height,
  39. UINT32 numSamples, bool gammaCorrection, bool createDepth, PixelFormat depthStencilFormat)
  40. {
  41. SPtr<RenderTexture> tex = RenderTexture::create(TEX_TYPE_2D, width, height, format, gammaCorrection, numSamples, createDepth, depthStencilFormat);
  42. new (bs_alloc<ScriptRenderTexture2D>()) ScriptRenderTexture2D(tex, false, instance);
  43. }
  44. void ScriptRenderTexture2D::internal_create(MonoObject* instance, MonoArray* colorSurfaces, MonoObject* depthStencilSurface)
  45. {
  46. ScriptArray colorSurfacesList(colorSurfaces);
  47. RENDER_SURFACE_DESC depthStencilSurfaceDesc;
  48. ScriptTexture2D* scriptDepthStencilSurface = ScriptTexture2D::toNative(depthStencilSurface);
  49. if (scriptDepthStencilSurface != nullptr)
  50. {
  51. depthStencilSurfaceDesc.face = 0;
  52. depthStencilSurfaceDesc.mipLevel = 0;
  53. depthStencilSurfaceDesc.numFaces = 1;
  54. HTexture textureHandle = scriptDepthStencilSurface->getHandle();
  55. if (!textureHandle.isLoaded())
  56. {
  57. LOGERR("Render texture must be created using a fully loaded texture.");
  58. }
  59. else
  60. depthStencilSurfaceDesc.texture = textureHandle;
  61. }
  62. SPtr<RenderTarget> tex;
  63. UINT32 numSurfaces = colorSurfacesList.size();
  64. bool isMulti = numSurfaces > 1;
  65. if (isMulti)
  66. {
  67. MULTI_RENDER_TEXTURE_DESC desc;
  68. for (UINT32 i = 0; i < numSurfaces; i++)
  69. {
  70. RENDER_SURFACE_DESC surfaceDesc;
  71. surfaceDesc.face = 0;
  72. surfaceDesc.mipLevel = 0;
  73. surfaceDesc.numFaces = 1;
  74. MonoObject* surfaceObj = colorSurfacesList.get<MonoObject*>(i);
  75. ScriptTexture2D* scriptSurface = ScriptTexture2D::toNative(surfaceObj);
  76. if (scriptSurface != nullptr)
  77. {
  78. HTexture textureHandle = scriptSurface->getHandle();
  79. if (!textureHandle.isLoaded())
  80. {
  81. LOGERR("Render texture must be created using a fully loaded texture.");
  82. }
  83. else
  84. surfaceDesc.texture = textureHandle;
  85. }
  86. desc.colorSurfaces.push_back(surfaceDesc);
  87. }
  88. desc.depthStencilSurface = depthStencilSurfaceDesc;
  89. tex = MultiRenderTexture::create(desc);
  90. }
  91. else
  92. {
  93. RENDER_SURFACE_DESC surfaceDesc;
  94. surfaceDesc.face = 0;
  95. surfaceDesc.mipLevel = 0;
  96. surfaceDesc.numFaces = 1;
  97. if (colorSurfacesList.size() > 0)
  98. {
  99. MonoObject* surfaceObj = colorSurfacesList.get<MonoObject*>(0);
  100. ScriptTexture2D* scriptSurface = ScriptTexture2D::toNative(surfaceObj);
  101. if (scriptSurface != nullptr)
  102. {
  103. HTexture textureHandle = scriptSurface->getHandle();
  104. if (!textureHandle.isLoaded())
  105. {
  106. LOGERR("Render texture must be created using a fully loaded texture.");
  107. }
  108. else
  109. surfaceDesc.texture = textureHandle;
  110. }
  111. }
  112. RENDER_TEXTURE_DESC desc;
  113. desc.colorSurface = surfaceDesc;
  114. desc.depthStencilSurface = depthStencilSurfaceDesc;
  115. tex = RenderTexture::create(desc);
  116. }
  117. new (bs_alloc<ScriptRenderTexture2D>()) ScriptRenderTexture2D(tex, isMulti, instance);
  118. }
  119. void ScriptRenderTexture2D::internal_getColorSurfaces(ScriptRenderTexture2D* thisPtr, MonoArray** value)
  120. {
  121. if (thisPtr->mIsMulti)
  122. {
  123. SPtr<MultiRenderTexture> tex = thisPtr->getMultiRenderTexture();
  124. UINT32 numColorSurfaces = tex->getColorSurfaceCount();
  125. ScriptArray outArray = ScriptArray::create<ScriptTexture2D>(numColorSurfaces);
  126. for (UINT32 i = 0; i < numColorSurfaces; i++)
  127. {
  128. HTexture colorTex = tex->getBindableColorTexture(i);
  129. ScriptTexture2D* scriptSurface;
  130. ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
  131. outArray.set(i, scriptSurface->getManagedInstance());
  132. *value = outArray.getInternal();
  133. }
  134. }
  135. else
  136. {
  137. SPtr<RenderTexture> tex = thisPtr->getRenderTexture();
  138. ScriptArray outArray = ScriptArray::create<ScriptTexture2D>(1);
  139. HTexture colorTex = tex->getBindableColorTexture();
  140. ScriptTexture2D* scriptSurface;
  141. ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
  142. outArray.set(0, scriptSurface->getManagedInstance());
  143. *value = outArray.getInternal();
  144. }
  145. }
  146. void ScriptRenderTexture2D::internal_getDepthStencilSurface(ScriptRenderTexture2D* thisPtr, MonoObject** value)
  147. {
  148. HTexture colorTex;
  149. if (thisPtr->mIsMulti)
  150. {
  151. SPtr<MultiRenderTexture> tex = thisPtr->getMultiRenderTexture();
  152. colorTex = tex->getBindableDepthStencilTexture();
  153. }
  154. else
  155. {
  156. SPtr<RenderTexture> tex = thisPtr->getRenderTexture();
  157. colorTex = tex->getBindableDepthStencilTexture();
  158. }
  159. ScriptTexture2D* scriptSurface;
  160. ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
  161. *value = scriptSurface->getManagedInstance();
  162. }
  163. }