BsBlendStateRTTI.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsCorePrerequisites.h"
  5. #include "BsRTTIType.h"
  6. #include "BsBlendState.h"
  7. #include "BsRenderStateManager.h"
  8. namespace BansheeEngine
  9. {
  10. /** @cond RTTI */
  11. /** @addtogroup RTTI-Impl-Core
  12. * @{
  13. */
  14. template<> struct RTTIPlainType<BLEND_STATE_DESC>
  15. {
  16. enum { id = TID_BLEND_STATE_DESC }; enum { hasDynamicSize = 1 };
  17. static void toMemory(const BLEND_STATE_DESC& data, char* memory)
  18. {
  19. UINT32 size = getDynamicSize(data);
  20. memcpy(memory, &size, sizeof(UINT32));
  21. memory += sizeof(UINT32);
  22. size -= sizeof(UINT32);
  23. memcpy(memory, &data, size);
  24. }
  25. static UINT32 fromMemory(BLEND_STATE_DESC& data, char* memory)
  26. {
  27. UINT32 size;
  28. memcpy(&size, memory, sizeof(UINT32));
  29. memory += sizeof(UINT32);
  30. UINT32 dataSize = size - sizeof(UINT32);
  31. memcpy((void*)&data, memory, dataSize);
  32. return size;
  33. }
  34. static UINT32 getDynamicSize(const BLEND_STATE_DESC& data)
  35. {
  36. UINT64 dataSize = sizeof(data) + sizeof(UINT32);
  37. #if BS_DEBUG_MODE
  38. if(dataSize > std::numeric_limits<UINT32>::max())
  39. {
  40. BS_EXCEPT(InternalErrorException, "Data overflow! Size doesn't fit into 32 bits.");
  41. }
  42. #endif
  43. return (UINT32)dataSize;
  44. }
  45. };
  46. class BS_CORE_EXPORT BlendStateRTTI : public RTTIType<BlendState, IReflectable, BlendStateRTTI>
  47. {
  48. private:
  49. BLEND_STATE_DESC& getData(BlendState* obj) { return obj->mProperties.mData; }
  50. void setData(BlendState* obj, BLEND_STATE_DESC& val) { obj->mProperties.mData = val; }
  51. public:
  52. BlendStateRTTI()
  53. {
  54. addPlainField("mData", 0, &BlendStateRTTI::getData, &BlendStateRTTI::setData);
  55. }
  56. void onDeserializationEnded(IReflectable* obj, const UnorderedMap<String, UINT64>& params) override
  57. {
  58. BlendState* blendState = static_cast<BlendState*>(obj);
  59. blendState->initialize();
  60. }
  61. const String& getRTTIName() override
  62. {
  63. static String name = "BlendState";
  64. return name;
  65. }
  66. UINT32 getRTTIId() override
  67. {
  68. return TID_BlendState;
  69. }
  70. SPtr<IReflectable> newRTTIObject() override
  71. {
  72. return RenderStateManager::instance()._createBlendStatePtr(BLEND_STATE_DESC());
  73. }
  74. };
  75. /** @} */
  76. /** @endcond */
  77. }