BsScriptPixelUtility.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptPixelUtility.h"
  4. #include "BsMonoManager.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoUtil.h"
  7. #include "Debug/BsDebug.h"
  8. #include "BsScriptPixelData.generated.h"
  9. namespace bs
  10. {
  11. ScriptPixelUtility::ScriptPixelUtility(MonoObject* instance)
  12. :ScriptObject(instance)
  13. { }
  14. void ScriptPixelUtility::initRuntimeData()
  15. {
  16. metaData.scriptClass->addInternalCall("Internal_GetMemorySize", (void*)&ScriptPixelUtility::internal_getMemorySize);
  17. metaData.scriptClass->addInternalCall("Internal_HasAlpha", (void*)&ScriptPixelUtility::internal_hasAlpha);
  18. metaData.scriptClass->addInternalCall("Internal_IsFloatingPoint", (void*)&ScriptPixelUtility::internal_isFloatingPoint);
  19. metaData.scriptClass->addInternalCall("Internal_IsCompressed", (void*)&ScriptPixelUtility::internal_isCompressed);
  20. metaData.scriptClass->addInternalCall("Internal_IsDepth", (void*)&ScriptPixelUtility::internal_isDepth);
  21. metaData.scriptClass->addInternalCall("Internal_GetMaxMipmaps", (void*)&ScriptPixelUtility::internal_getMaxMipmaps);
  22. metaData.scriptClass->addInternalCall("Internal_ConvertFormat", (void*)&ScriptPixelUtility::internal_convertFormat);
  23. metaData.scriptClass->addInternalCall("Internal_Compress", (void*)&ScriptPixelUtility::internal_compress);
  24. metaData.scriptClass->addInternalCall("Internal_GenerateMipmaps", (void*)&ScriptPixelUtility::internal_generateMipmaps);
  25. metaData.scriptClass->addInternalCall("Internal_Scale", (void*)&ScriptPixelUtility::internal_scale);
  26. metaData.scriptClass->addInternalCall("Internal_ApplyGamma", (void*)&ScriptPixelUtility::internal_applyGamma);
  27. }
  28. void ScriptPixelUtility::internal_getMemorySize(UINT32 width, UINT32 height, UINT32 depth, PixelFormat format, UINT32* value)
  29. {
  30. *value = PixelUtil::getMemorySize(width, height, depth, format);
  31. }
  32. void ScriptPixelUtility::internal_hasAlpha(PixelFormat format, bool* value)
  33. {
  34. *value = PixelUtil::hasAlpha(format);
  35. }
  36. void ScriptPixelUtility::internal_isFloatingPoint(PixelFormat format, bool* value)
  37. {
  38. *value = PixelUtil::isFloatingPoint(format);
  39. }
  40. void ScriptPixelUtility::internal_isCompressed(PixelFormat format, bool* value)
  41. {
  42. *value = PixelUtil::isCompressed(format);
  43. }
  44. void ScriptPixelUtility::internal_isDepth(PixelFormat format, bool* value)
  45. {
  46. *value = PixelUtil::isDepth(format);
  47. }
  48. void ScriptPixelUtility::internal_getMaxMipmaps(UINT32 width, UINT32 height, UINT32 depth, PixelFormat format, UINT32* value)
  49. {
  50. *value = PixelUtil::getMaxMipmaps(width, height, depth, format);
  51. }
  52. MonoObject* ScriptPixelUtility::internal_convertFormat(MonoObject* source, PixelFormat newFormat)
  53. {
  54. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  55. if (sourceScriptPixelData == nullptr)
  56. return nullptr;
  57. SPtr<PixelData> sourcePixelData = sourceScriptPixelData->getInternal();
  58. SPtr<PixelData> outputData = bs_shared_ptr_new<PixelData>(sourcePixelData->getWidth(), sourcePixelData->getHeight(),
  59. sourcePixelData->getDepth(), newFormat);
  60. outputData->allocateInternalBuffer();
  61. PixelUtil::bulkPixelConversion(*sourcePixelData, *outputData);
  62. return ScriptPixelData::create(outputData);
  63. }
  64. MonoObject* ScriptPixelUtility::internal_compress(MonoObject* source, CompressionOptions* options)
  65. {
  66. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  67. if (sourceScriptPixelData == nullptr)
  68. return nullptr;
  69. SPtr<PixelData> sourcePixelData = sourceScriptPixelData->getInternal();
  70. SPtr<PixelData> outputData = bs_shared_ptr_new<PixelData>(sourcePixelData->getWidth(), sourcePixelData->getHeight(),
  71. sourcePixelData->getDepth(), options->format);
  72. outputData->allocateInternalBuffer();
  73. PixelUtil::compress(*sourcePixelData, *outputData, *options);
  74. return ScriptPixelData::create(outputData);
  75. }
  76. MonoArray* ScriptPixelUtility::internal_generateMipmaps(MonoObject* source, MipMapGenOptions* options)
  77. {
  78. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  79. if (sourceScriptPixelData == nullptr)
  80. return nullptr;
  81. SPtr<PixelData> sourcePixelData = sourceScriptPixelData->getInternal();
  82. Vector<SPtr<PixelData>> mipmaps = PixelUtil::genMipmaps(*sourcePixelData, *options);
  83. UINT32 numElements = (UINT32)mipmaps.size();
  84. ScriptArray scriptArray(ScriptPixelData::getMetaData()->scriptClass->_getInternalClass(), numElements);
  85. for (UINT32 i = 0; i < numElements; i++)
  86. {
  87. MonoObject* managedPixelData = ScriptPixelData::create(mipmaps[i]);
  88. scriptArray.set(i, managedPixelData);
  89. }
  90. return scriptArray.getInternal();
  91. }
  92. MonoObject* ScriptPixelUtility::internal_scale(MonoObject* source, PixelVolume* newSize, PixelUtil::Filter filter)
  93. {
  94. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  95. if (sourceScriptPixelData == nullptr)
  96. return nullptr;
  97. SPtr<PixelData> sourcePixelData = sourceScriptPixelData->getInternal();
  98. SPtr<PixelData> outputData = bs_shared_ptr_new<PixelData>(newSize->getWidth(), newSize->getHeight(),
  99. newSize->getDepth(), sourcePixelData->getFormat());
  100. outputData->allocateInternalBuffer();
  101. PixelUtil::scale(*sourcePixelData, *outputData, filter);
  102. return ScriptPixelData::create(outputData);
  103. }
  104. void ScriptPixelUtility::internal_applyGamma(MonoObject* source, float gamma)
  105. {
  106. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  107. if (sourceScriptPixelData == nullptr)
  108. return;
  109. SPtr<PixelData> pixelData = sourceScriptPixelData->getInternal();
  110. PixelUtil::applyGamma(pixelData->getData(), gamma, pixelData->getSize(), PixelUtil::getNumElemBits(pixelData->getFormat()));
  111. }
  112. }