BsScriptTextureCube.cpp 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptTextureCube.h"
  4. #include "BsScriptResourceManager.h"
  5. #include "BsScriptMeta.h"
  6. #include "BsMonoField.h"
  7. #include "BsMonoClass.h"
  8. #include "BsMonoManager.h"
  9. #include "BsTexture.h"
  10. #include "BsPixelUtil.h"
  11. #include "BsScriptAsyncOp.h"
  12. #include "BsCoreThread.h"
  13. #include "BsScriptPixelData.generated.h"
  14. using namespace std::placeholders;
  15. namespace bs
  16. {
  17. ScriptTextureCube::ScriptTextureCube(MonoObject* instance, const HTexture& texture)
  18. :TScriptResource(instance, texture)
  19. {
  20. }
  21. void ScriptTextureCube::initRuntimeData()
  22. {
  23. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptTextureCube::internal_createInstance);
  24. metaData.scriptClass->addInternalCall("Internal_GetPixels", &ScriptTextureCube::internal_getPixels);
  25. metaData.scriptClass->addInternalCall("Internal_GetGPUPixels", &ScriptTextureCube::internal_getGPUPixels);
  26. metaData.scriptClass->addInternalCall("Internal_SetPixels", &ScriptTextureCube::internal_setPixels);
  27. }
  28. void ScriptTextureCube::internal_createInstance(MonoObject* instance, PixelFormat format, UINT32 width,
  29. UINT32 height, TextureUsage usage, UINT32 numSamples, bool hasMipmaps, bool gammaCorrection)
  30. {
  31. int numMips = 0;
  32. if (hasMipmaps)
  33. numMips = PixelUtil::getMaxMipmaps(width, height, 1, format);
  34. TEXTURE_DESC texDesc;
  35. texDesc.type = TEX_TYPE_CUBE_MAP;
  36. texDesc.width = width;
  37. texDesc.height = height;
  38. texDesc.numMips = numMips;
  39. texDesc.format = format;
  40. texDesc.usage = usage;
  41. texDesc.hwGamma = gammaCorrection;
  42. texDesc.numSamples = numSamples;
  43. HTexture texture = Texture::create(texDesc);
  44. ScriptTextureCube* scriptInstance;
  45. ScriptResourceManager::instance().createScriptResource(instance, texture, &scriptInstance);
  46. }
  47. MonoObject* ScriptTextureCube::internal_getPixels(ScriptTextureCube* thisPtr, UINT32 face, UINT32 mipLevel)
  48. {
  49. HTexture texture = thisPtr->getHandle();
  50. SPtr<PixelData> pixelData = texture->getProperties().allocBuffer(face, mipLevel);
  51. texture->readCachedData(*pixelData, face, mipLevel);
  52. return ScriptPixelData::create(pixelData);
  53. }
  54. MonoObject* ScriptTextureCube::internal_getGPUPixels(ScriptTextureCube* thisPtr, UINT32 face, UINT32 mipLevel)
  55. {
  56. HTexture texture = thisPtr->getHandle();
  57. SPtr<PixelData> readData = texture->getProperties().allocBuffer(face, mipLevel);
  58. AsyncOp asyncOp = texture->readData(readData, face, mipLevel);
  59. std::function<MonoObject*(const AsyncOp&, const SPtr<PixelData>&)> asyncOpToMono =
  60. [&](const AsyncOp& op, const SPtr<PixelData>& returnValue)
  61. {
  62. return ScriptPixelData::create(returnValue);
  63. };
  64. return ScriptAsyncOp::create(asyncOp, std::bind(asyncOpToMono, _1, readData));
  65. }
  66. void ScriptTextureCube::internal_setPixels(ScriptTextureCube* thisPtr, MonoObject* data, UINT32 face, UINT32 mipLevel)
  67. {
  68. ScriptPixelData* scriptPixelData = ScriptPixelData::toNative(data);
  69. if (scriptPixelData != nullptr)
  70. {
  71. HTexture texture = thisPtr->getHandle();
  72. texture->writeData(scriptPixelData->getInternal(), face, mipLevel, false);
  73. }
  74. }
  75. MonoObject* ScriptTextureCube::createInstance()
  76. {
  77. return metaData.scriptClass->createInstance();
  78. }
  79. }