2
0

BsScriptRenderTexture2D.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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 RenderTargetPtr& 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. RenderTexturePtr ScriptRenderTexture2D::getRenderTexture() const
  27. {
  28. if (!mIsMulti)
  29. return std::static_pointer_cast<RenderTexture>(mRenderTarget);
  30. return nullptr;
  31. }
  32. MultiRenderTexturePtr 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. RenderTexturePtr tex = RenderTexture::create(TEX_TYPE_2D, width, height, format, gammaCorrection, numSamples, createDepth, depthStencilFormat);
  42. ScriptRenderTexture2D* scriptResource = 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. HTexture textureHandle = scriptDepthStencilSurface->getHandle();
  54. if (!textureHandle.isLoaded())
  55. {
  56. LOGERR("Render texture must be created using a fully loaded texture.");
  57. }
  58. else
  59. depthStencilSurfaceDesc.texture = textureHandle;
  60. }
  61. RenderTargetPtr tex;
  62. UINT32 numSurfaces = colorSurfacesList.size();
  63. bool isMulti = numSurfaces > 1;
  64. if (isMulti)
  65. {
  66. MULTI_RENDER_TEXTURE_DESC desc;
  67. for (UINT32 i = 0; i < numSurfaces; i++)
  68. {
  69. RENDER_SURFACE_DESC surfaceDesc;
  70. surfaceDesc.face = 0;
  71. surfaceDesc.mipLevel = 0;
  72. MonoObject* surfaceObj = colorSurfacesList.get<MonoObject*>(i);
  73. ScriptTexture2D* scriptSurface = ScriptTexture2D::toNative(surfaceObj);
  74. if (scriptSurface != nullptr)
  75. {
  76. HTexture textureHandle = scriptSurface->getHandle();
  77. if (!textureHandle.isLoaded())
  78. {
  79. LOGERR("Render texture must be created using a fully loaded texture.");
  80. }
  81. else
  82. surfaceDesc.texture = textureHandle;
  83. }
  84. desc.colorSurfaces.push_back(surfaceDesc);
  85. }
  86. desc.depthStencilSurface = depthStencilSurfaceDesc;
  87. tex = MultiRenderTexture::create(desc);
  88. }
  89. else
  90. {
  91. RENDER_SURFACE_DESC surfaceDesc;
  92. surfaceDesc.face = 0;
  93. surfaceDesc.mipLevel = 0;
  94. if (colorSurfacesList.size() > 0)
  95. {
  96. MonoObject* surfaceObj = colorSurfacesList.get<MonoObject*>(0);
  97. ScriptTexture2D* scriptSurface = ScriptTexture2D::toNative(surfaceObj);
  98. if (scriptSurface != nullptr)
  99. {
  100. HTexture textureHandle = scriptSurface->getHandle();
  101. if (!textureHandle.isLoaded())
  102. {
  103. LOGERR("Render texture must be created using a fully loaded texture.");
  104. }
  105. else
  106. surfaceDesc.texture = textureHandle;
  107. }
  108. }
  109. RENDER_TEXTURE_DESC desc;
  110. desc.colorSurface = surfaceDesc;
  111. desc.depthStencilSurface = depthStencilSurfaceDesc;
  112. tex = RenderTexture::create(desc);
  113. }
  114. ScriptRenderTexture2D* scriptResource = new (bs_alloc<ScriptRenderTexture2D>()) ScriptRenderTexture2D(tex, isMulti, instance);
  115. }
  116. void ScriptRenderTexture2D::internal_getColorSurfaces(ScriptRenderTexture2D* thisPtr, MonoArray** value)
  117. {
  118. if (thisPtr->mIsMulti)
  119. {
  120. MultiRenderTexturePtr tex = thisPtr->getMultiRenderTexture();
  121. UINT32 numColorSurfaces = tex->getColorSurfaceCount();
  122. ScriptArray outArray = ScriptArray::create<ScriptTexture2D>(numColorSurfaces);
  123. for (UINT32 i = 0; i < numColorSurfaces; i++)
  124. {
  125. HTexture colorTex = tex->getBindableColorTexture(i);
  126. ScriptTexture2D* scriptSurface;
  127. ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
  128. outArray.set(i, scriptSurface->getManagedInstance());
  129. *value = outArray.getInternal();
  130. }
  131. }
  132. else
  133. {
  134. RenderTexturePtr tex = thisPtr->getRenderTexture();
  135. ScriptArray outArray = ScriptArray::create<ScriptTexture2D>(1);
  136. HTexture colorTex = tex->getBindableColorTexture();
  137. ScriptTexture2D* scriptSurface;
  138. ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
  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;
  157. ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
  158. *value = scriptSurface->getManagedInstance();
  159. }
  160. }