BsMaterialParam.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsGpuParam.h"
  4. namespace BansheeEngine
  5. {
  6. /**
  7. * @brief A wrapper class that allows you to manage multiple GPU parameters
  8. * at once.
  9. *
  10. * @see TGpuDataParam
  11. */
  12. template<class T, bool Core>
  13. class BS_CORE_EXPORT TMaterialDataParam
  14. {
  15. public:
  16. TMaterialDataParam() { }
  17. /**
  18. * @copydoc TGpuDataParam::set
  19. */
  20. void set(const T& value, UINT32 arrayIdx = 0)
  21. {
  22. for (auto& param : mParams)
  23. param.set(value, arrayIdx);
  24. }
  25. /**
  26. * @copydoc TGpuDataParam::set
  27. */
  28. T get(UINT32 arrayIdx = 0)
  29. {
  30. if (mParams.size() == 0)
  31. return T();
  32. return mParams[0].get(arrayIdx); // They should all have the same value
  33. }
  34. private:
  35. friend class Material;
  36. TMaterialDataParam(const Vector<TGpuDataParam<T, Core>>& params)
  37. :mParams(params)
  38. { }
  39. protected:
  40. Vector<TGpuDataParam<T, Core>> mParams;
  41. };
  42. typedef TMaterialDataParam<float, false> MaterialParamFloat;
  43. typedef TMaterialDataParam<Color, false> MaterialParamColor;
  44. typedef TMaterialDataParam<Vector2, false> MaterialParamVec2;
  45. typedef TMaterialDataParam<Vector3, false> MaterialParamVec3;
  46. typedef TMaterialDataParam<Vector4, false> MaterialParamVec4;
  47. typedef TMaterialDataParam<Matrix3, false> MaterialParamMat3;
  48. typedef TMaterialDataParam<Matrix4, false> MaterialParamMat4;
  49. typedef TMaterialDataParam<float, true> MaterialParamFloatCore;
  50. typedef TMaterialDataParam<Color, true> MaterialParamColorCore;
  51. typedef TMaterialDataParam<Vector2, true> MaterialParamVec2Core;
  52. typedef TMaterialDataParam<Vector3, true> MaterialParamVec3Core;
  53. typedef TMaterialDataParam<Vector4, true> MaterialParamVec4Core;
  54. typedef TMaterialDataParam<Matrix3, true> MaterialParamMat3Core;
  55. typedef TMaterialDataParam<Matrix4, true> MaterialParamMat4Core;
  56. /**
  57. * @copydoc TMaterialDataParam
  58. */
  59. class BS_CORE_EXPORT MaterialParamStruct
  60. {
  61. public:
  62. MaterialParamStruct() { }
  63. /**
  64. * @copydoc GpuParamStruct::set
  65. */
  66. void set(const void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0);
  67. /**
  68. * @copydoc GpuParamStruct::get
  69. */
  70. void get(void* value, UINT32 sizeBytes, UINT32 arrayIdx = 0);
  71. /**
  72. * @copydoc GpuParamStruct::getElementSize
  73. */
  74. UINT32 getElementSize() const;
  75. private:
  76. friend class Material;
  77. MaterialParamStruct(const Vector<GpuParamStruct>& params);
  78. protected:
  79. Vector<GpuParamStruct> mParams;
  80. };
  81. /**
  82. * @copydoc TMaterialDataParam
  83. */
  84. class BS_CORE_EXPORT MaterialParamTexture
  85. {
  86. public:
  87. MaterialParamTexture() { }
  88. /**
  89. * @copydoc GpuParamTexture::set
  90. */
  91. void set(const HTexture& texture);
  92. /**
  93. * @copydoc GpuParamTexture::get
  94. */
  95. HTexture get();
  96. private:
  97. friend class Material;
  98. MaterialParamTexture(const Vector<GpuParamTexture>& params);
  99. protected:
  100. Vector<GpuParamTexture> mParams;
  101. };
  102. /**
  103. * @copydoc TMaterialDataParam
  104. */
  105. class BS_CORE_EXPORT MaterialParamLoadStoreTexture
  106. {
  107. public:
  108. MaterialParamLoadStoreTexture() { }
  109. /**
  110. * @copydoc GpuParamLoadStoreTexture::set
  111. */
  112. void set(const HTexture& texture, const TextureSurface& surface);
  113. /**
  114. * @copydoc GpuParamLoadStoreTexture::get
  115. */
  116. HTexture get();
  117. private:
  118. friend class Material;
  119. MaterialParamLoadStoreTexture(const Vector<GpuParamLoadStoreTexture>& params);
  120. protected:
  121. Vector<GpuParamLoadStoreTexture> mParams;
  122. };
  123. /**
  124. * @copydoc TMaterialDataParam
  125. */
  126. class BS_CORE_EXPORT MaterialParamSampState
  127. {
  128. public:
  129. MaterialParamSampState() { }
  130. /**
  131. * @copydoc GpuParamSampState::set
  132. */
  133. void set(const HSamplerState& sampState);
  134. /**
  135. * @copydoc GpuParamSampState::get
  136. */
  137. HSamplerState get();
  138. private:
  139. friend class Material;
  140. MaterialParamSampState(const Vector<GpuParamSampState>& params);
  141. protected:
  142. Vector<GpuParamSampState> mParams;
  143. };
  144. }