CmTextureRTTI.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #pragma once
  2. #include "CmPrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "CmTexture.h"
  5. #include "CmManagedDataBlock.h"
  6. #include "CmMath.h"
  7. // DEBUG ONLY
  8. #include "CmTextureManager.h"
  9. namespace CamelotEngine
  10. {
  11. class CM_EXPORT TextureRTTI : public RTTIType<Texture, Resource, TextureRTTI>
  12. {
  13. private:
  14. CM_SETGET_MEMBER(mSize, UINT32, Texture)
  15. CM_SETGET_MEMBER(mUUID, String, Texture);
  16. CM_SETGET_MEMBER(mHeight, UINT32, Texture)
  17. CM_SETGET_MEMBER(mWidth, UINT32, Texture)
  18. CM_SETGET_MEMBER(mDepth, UINT32, Texture)
  19. CM_SETGET_MEMBER(mNumMipmaps, UINT32, Texture)
  20. CM_SETGET_MEMBER(mHwGamma, bool, Texture)
  21. CM_SETGET_MEMBER(mFSAA, UINT32, Texture)
  22. CM_SETGET_MEMBER(mFSAAHint, String, Texture)
  23. CM_SETGET_MEMBER(mTextureType, TextureType, Texture)
  24. CM_SETGET_MEMBER(mFormat, PixelFormat, Texture)
  25. CM_SETGET_MEMBER(mUsage, INT32, Texture)
  26. PixelDataPtr getPixelData(Texture* obj, UINT32 idx)
  27. {
  28. UINT32 face = (size_t)Math::Floor(idx / (float)(obj->getNumMipmaps() + 1));
  29. UINT32 mipmap = idx % (obj->getNumMipmaps() + 1);
  30. return obj->getRawPixels(face, mipmap);
  31. }
  32. void setPixelData(Texture* obj, UINT32 idx, PixelDataPtr data)
  33. {
  34. vector<PixelDataPtr>::type* pixelData = boost::any_cast<vector<PixelDataPtr>::type*>(obj->mRTTIData);
  35. (*pixelData)[idx] = data;
  36. }
  37. UINT32 getPixelDataArraySize(Texture* obj)
  38. {
  39. return obj->getNumFaces() * (obj->getNumMipmaps() + 1);
  40. }
  41. void setPixelDataArraySize(Texture* obj, UINT32 size)
  42. {
  43. vector<PixelDataPtr>::type* pixelData = boost::any_cast<vector<PixelDataPtr>::type*>(obj->mRTTIData);
  44. pixelData->resize(size);
  45. }
  46. public:
  47. TextureRTTI()
  48. {
  49. CM_ADD_PLAINFIELD(mSize, 0, TextureRTTI)
  50. CM_ADD_PLAINFIELD(mUUID, 1, TextureRTTI)
  51. CM_ADD_PLAINFIELD(mHeight, 2, TextureRTTI)
  52. CM_ADD_PLAINFIELD(mWidth, 3, TextureRTTI)
  53. CM_ADD_PLAINFIELD(mDepth, 4, TextureRTTI)
  54. CM_ADD_PLAINFIELD(mNumMipmaps, 5, TextureRTTI)
  55. CM_ADD_PLAINFIELD(mHwGamma, 6, TextureRTTI)
  56. CM_ADD_PLAINFIELD(mFSAA, 7, TextureRTTI)
  57. CM_ADD_PLAINFIELD(mFSAAHint, 8, TextureRTTI)
  58. CM_ADD_PLAINFIELD(mTextureType, 9, TextureRTTI)
  59. CM_ADD_PLAINFIELD(mFormat, 10, TextureRTTI)
  60. CM_ADD_PLAINFIELD(mUsage, 11, TextureRTTI)
  61. addReflectablePtrArrayField("mPixelData", 12, &TextureRTTI::getPixelData, &TextureRTTI::getPixelDataArraySize,
  62. &TextureRTTI::setPixelData, &TextureRTTI::setPixelDataArraySize);
  63. }
  64. virtual void onDeserializationStarted(IReflectable* obj)
  65. {
  66. Texture* texture = static_cast<Texture*>(obj);
  67. texture->mRTTIData = new vector<PixelDataPtr>::type();
  68. }
  69. virtual void onDeserializationEnded(IReflectable* obj)
  70. {
  71. Texture* texture = static_cast<Texture*>(obj);
  72. if(texture->mRTTIData.empty())
  73. return;
  74. // A bit clumsy initializing with already set values, but I feel its better than complicating things and storing the values
  75. // in mRTTIData.
  76. texture->initialize(texture->getTextureType(), texture->getWidth(), texture->getHeight(), texture->getDepth(),
  77. texture->getNumMipmaps(), texture->getFormat(), texture->getUsage(), texture->isHardwareGammaEnabled(),
  78. texture->getFSAA(), texture->getFSAAHint());
  79. vector<PixelDataPtr>::type* pixelData = boost::any_cast<vector<PixelDataPtr>::type*>(texture->mRTTIData);
  80. for(size_t i = 0; i < pixelData->size(); i++)
  81. {
  82. UINT32 face = (size_t)Math::Floor(i / (float)(texture->getNumMipmaps() + 1));
  83. UINT32 mipmap = i % (texture->getNumMipmaps() + 1);
  84. PixelData data(*pixelData->at(i));
  85. data.ownsData = false;
  86. texture->setRawPixels(data, face, mipmap);
  87. }
  88. delete pixelData;
  89. texture->mRTTIData = nullptr;
  90. }
  91. virtual const String& getRTTIName()
  92. {
  93. static String name = "Texture";
  94. return name;
  95. }
  96. virtual UINT32 getRTTIId()
  97. {
  98. return TID_Texture;
  99. }
  100. virtual std::shared_ptr<IReflectable> newRTTIObject()
  101. {
  102. return TextureManager::instance().createEmpty();
  103. }
  104. };
  105. }