BsScriptRenderTexture2D.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptRenderTexture2D.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. #include "RenderAPI/BsRenderTexture.h"
  9. #include "BsMonoUtil.h"
  10. #include "BsScriptResourceManager.h"
  11. #include "BsScriptTexture.generated.h"
  12. namespace bs
  13. {
  14. ScriptRenderTexture2D::ScriptRenderTexture2D(const SPtr<RenderTarget>& target, MonoObject* instance)
  15. :ScriptObject(instance), mRenderTarget(target)
  16. {
  17. }
  18. void ScriptRenderTexture2D::initRuntimeData()
  19. {
  20. metaData.scriptClass->addInternalCall("Internal_CreateDetailed", (void*)&ScriptRenderTexture2D::internal_createDetailed);
  21. metaData.scriptClass->addInternalCall("Internal_Create", (void*)&ScriptRenderTexture2D::internal_create);
  22. metaData.scriptClass->addInternalCall("Internal_GetColorSurfaces", (void*)&ScriptRenderTexture2D::internal_getColorSurfaces);
  23. metaData.scriptClass->addInternalCall("Internal_GetDepthStencilSurface", (void*)&ScriptRenderTexture2D::internal_getDepthStencilSurface);
  24. }
  25. SPtr<RenderTexture> ScriptRenderTexture2D::getRenderTexture() const
  26. {
  27. return std::static_pointer_cast<RenderTexture>(mRenderTarget);
  28. }
  29. void ScriptRenderTexture2D::internal_createDetailed(MonoObject* instance, PixelFormat format, UINT32 width, UINT32 height,
  30. UINT32 numSamples, bool gammaCorrection, bool createDepth, PixelFormat depthStencilFormat)
  31. {
  32. TEXTURE_DESC texDesc;
  33. texDesc.type = TEX_TYPE_2D;
  34. texDesc.width = width;
  35. texDesc.height = height;
  36. texDesc.format = format;
  37. texDesc.hwGamma = gammaCorrection;
  38. texDesc.numSamples = numSamples;
  39. SPtr<RenderTexture> tex = RenderTexture::create(texDesc, createDepth, depthStencilFormat);
  40. new (bs_alloc<ScriptRenderTexture2D>()) ScriptRenderTexture2D(tex, instance);
  41. }
  42. void ScriptRenderTexture2D::internal_create(MonoObject* instance, MonoArray* colorSurfaces, ScriptTexture* depthStencilSurface)
  43. {
  44. ScriptArray colorSurfacesList(colorSurfaces);
  45. RENDER_SURFACE_DESC depthStencilSurfaceDesc;
  46. if (depthStencilSurface != nullptr)
  47. {
  48. depthStencilSurfaceDesc.face = 0;
  49. depthStencilSurfaceDesc.mipLevel = 0;
  50. depthStencilSurfaceDesc.numFaces = 1;
  51. HTexture textureHandle = depthStencilSurface->getHandle();
  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. UINT32 numSurfaces = std::min(colorSurfacesList.size(), (UINT32)BS_MAX_MULTIPLE_RENDER_TARGETS);
  60. RENDER_TEXTURE_DESC desc;
  61. for (UINT32 i = 0; i < numSurfaces; i++)
  62. {
  63. RENDER_SURFACE_DESC surfaceDesc;
  64. surfaceDesc.face = 0;
  65. surfaceDesc.mipLevel = 0;
  66. surfaceDesc.numFaces = 1;
  67. ScriptTexture* scriptSurface = colorSurfacesList.get<ScriptTexture*>(i);
  68. if (scriptSurface != nullptr)
  69. {
  70. HTexture textureHandle = scriptSurface->getHandle();
  71. if (!textureHandle.isLoaded())
  72. {
  73. LOGERR("Render texture must be created using a fully loaded texture.");
  74. }
  75. else
  76. surfaceDesc.texture = textureHandle;
  77. }
  78. desc.colorSurfaces[i] = surfaceDesc;
  79. }
  80. desc.depthStencilSurface = depthStencilSurfaceDesc;
  81. SPtr<RenderTarget> tex = RenderTexture::create(desc);
  82. new (bs_alloc<ScriptRenderTexture2D>()) ScriptRenderTexture2D(tex, instance);
  83. }
  84. void ScriptRenderTexture2D::internal_getColorSurfaces(ScriptRenderTexture2D* thisPtr, MonoArray** value)
  85. {
  86. SPtr<RenderTexture> tex = thisPtr->getRenderTexture();
  87. UINT32 numColorSurfaces = BS_MAX_MULTIPLE_RENDER_TARGETS;
  88. ScriptArray outArray = ScriptArray::create<ScriptTexture>(numColorSurfaces);
  89. for (UINT32 i = 0; i < numColorSurfaces; i++)
  90. {
  91. HTexture colorTex = tex->getColorTexture(i);
  92. if (colorTex != nullptr)
  93. {
  94. ScriptResourceBase* scriptSurface = ScriptResourceManager::instance().getScriptResource(colorTex, true);
  95. outArray.set<MonoObject*>(i, scriptSurface->getManagedInstance());
  96. }
  97. else
  98. outArray.set<MonoObject*>(i, nullptr);
  99. }
  100. *value = outArray.getInternal();
  101. }
  102. void ScriptRenderTexture2D::internal_getDepthStencilSurface(ScriptRenderTexture2D* thisPtr, MonoObject** value)
  103. {
  104. SPtr<RenderTexture> tex = thisPtr->getRenderTexture();
  105. HTexture depthTex = tex->getDepthStencilTexture();
  106. ScriptResourceBase* scriptSurface = ScriptResourceManager::instance().getScriptResource(depthTex, true);
  107. *value = scriptSurface->getManagedInstance();
  108. }
  109. }