BsScriptRenderTexture2D.cpp 6.2 KB

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