shaderMaterialParameters.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #include "platform/platform.h"
  23. #include "materials/shaderMaterialParameters.h"
  24. #include "console/console.h"
  25. //
  26. // ShaderMaterialParameters
  27. //
  28. ShaderMaterialParameterHandle::ShaderMaterialParameterHandle(const String& name)
  29. {
  30. VECTOR_SET_ASSOCIATION( mHandles );
  31. mName = name;
  32. }
  33. ShaderMaterialParameterHandle::ShaderMaterialParameterHandle(const String& name, Vector<GFXShader*>& shaders)
  34. {
  35. VECTOR_SET_ASSOCIATION( mHandles );
  36. mName = name;
  37. mHandles.setSize(shaders.size());
  38. for (U32 i = 0; i < shaders.size(); i++)
  39. mHandles[i] = shaders[i]->getShaderConstHandle(name);
  40. }
  41. ShaderMaterialParameterHandle::~ShaderMaterialParameterHandle()
  42. {
  43. }
  44. S32 ShaderMaterialParameterHandle::getSamplerRegister( U32 pass ) const
  45. {
  46. AssertFatal( mHandles.size() > pass, "ShaderMaterialParameterHandle::getSamplerRegister - out of bounds" );
  47. return mHandles[pass]->getSamplerRegister();
  48. }
  49. //
  50. // ShaderMaterialParameters
  51. //
  52. ShaderMaterialParameters::ShaderMaterialParameters()
  53. : MaterialParameters()
  54. {
  55. VECTOR_SET_ASSOCIATION( mBuffers );
  56. }
  57. ShaderMaterialParameters::~ShaderMaterialParameters()
  58. {
  59. releaseBuffers();
  60. }
  61. void ShaderMaterialParameters::setBuffers(Vector<GFXShaderConstDesc>& constDesc, Vector<GFXShaderConstBufferRef>& buffers)
  62. {
  63. mShaderConstDesc = constDesc;
  64. mBuffers = buffers;
  65. }
  66. void ShaderMaterialParameters::releaseBuffers()
  67. {
  68. for (U32 i = 0; i < mBuffers.size(); i++)
  69. {
  70. mBuffers[i] = NULL;
  71. }
  72. mBuffers.setSize(0);
  73. }
  74. U32 ShaderMaterialParameters::getAlignmentValue(const GFXShaderConstType constType)
  75. {
  76. if (mBuffers.size() > 0)
  77. return mBuffers[0]->getShader()->getAlignmentValue(constType);
  78. else
  79. return 0;
  80. }
  81. #define SHADERMATPARAM_SET(handle, f) \
  82. AssertFatal(handle, "Handle is NULL!" ); \
  83. AssertFatal(handle->isValid(), "Handle is not valid!" ); \
  84. AssertFatal(dynamic_cast<ShaderMaterialParameterHandle*>(handle), "Invalid handle type!"); \
  85. ShaderMaterialParameterHandle* h = static_cast<ShaderMaterialParameterHandle*>(handle); \
  86. AssertFatal(h->mHandles.size() == mBuffers.size(), "Handle length differs from buffer length!"); \
  87. for (U32 i = 0; i < h->mHandles.size(); i++) \
  88. { \
  89. GFXShaderConstHandle* shaderHandle = h->mHandles[i]; \
  90. if (shaderHandle->isValid()) \
  91. mBuffers[i]->set(shaderHandle, f); \
  92. }
  93. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const F32 f)
  94. {
  95. SHADERMATPARAM_SET(handle, f);
  96. }
  97. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const Point2F& fv)
  98. {
  99. SHADERMATPARAM_SET(handle, fv);
  100. }
  101. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const Point3F& fv)
  102. {
  103. SHADERMATPARAM_SET(handle, fv);
  104. }
  105. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const Point4F& fv)
  106. {
  107. SHADERMATPARAM_SET(handle, fv);
  108. }
  109. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const PlaneF& fv)
  110. {
  111. SHADERMATPARAM_SET(handle, fv);
  112. }
  113. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const LinearColorF& fv)
  114. {
  115. SHADERMATPARAM_SET(handle, fv);
  116. }
  117. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const S32 f)
  118. {
  119. SHADERMATPARAM_SET(handle, f);
  120. }
  121. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const Point2I& fv)
  122. {
  123. SHADERMATPARAM_SET(handle, fv);
  124. }
  125. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const Point3I& fv)
  126. {
  127. SHADERMATPARAM_SET(handle, fv);
  128. }
  129. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const Point4I& fv)
  130. {
  131. SHADERMATPARAM_SET(handle, fv);
  132. }
  133. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const AlignedArray<F32>& fv)
  134. {
  135. SHADERMATPARAM_SET(handle, fv);
  136. }
  137. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const AlignedArray<Point2F>& fv)
  138. {
  139. SHADERMATPARAM_SET(handle, fv);
  140. }
  141. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const AlignedArray<Point3F>& fv)
  142. {
  143. SHADERMATPARAM_SET(handle, fv);
  144. }
  145. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const AlignedArray<Point4F>& fv)
  146. {
  147. SHADERMATPARAM_SET(handle, fv);
  148. }
  149. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const AlignedArray<S32>& fv)
  150. {
  151. SHADERMATPARAM_SET(handle, fv);
  152. }
  153. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const AlignedArray<Point2I>& fv)
  154. {
  155. SHADERMATPARAM_SET(handle, fv);
  156. }
  157. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const AlignedArray<Point3I>& fv)
  158. {
  159. SHADERMATPARAM_SET(handle, fv);
  160. }
  161. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const AlignedArray<Point4I>& fv)
  162. {
  163. SHADERMATPARAM_SET(handle, fv);
  164. }
  165. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const MatrixF& mat, const GFXShaderConstType matrixType)
  166. {
  167. if ((!handle) || !handle->isValid())
  168. return;
  169. AssertFatal(dynamic_cast<ShaderMaterialParameterHandle*>(handle), "Invalid handle type!");
  170. ShaderMaterialParameterHandle* h = static_cast<ShaderMaterialParameterHandle*>(handle);
  171. AssertFatal(h->mHandles.size() == mBuffers.size(), "Handle length differs from buffer length!");
  172. for (U32 i = 0; i < h->mHandles.size(); i++)
  173. {
  174. GFXShaderConstHandle* shaderHandle = h->mHandles[i];
  175. if (shaderHandle && shaderHandle->isValid())
  176. mBuffers[i]->set(shaderHandle, mat, matrixType);
  177. }
  178. }
  179. void ShaderMaterialParameters::set(MaterialParameterHandle* handle, const MatrixF* mat, const U32 arraySize, const GFXShaderConstType matrixType)
  180. {
  181. if ((!handle) || !handle->isValid())
  182. return;
  183. AssertFatal(dynamic_cast<ShaderMaterialParameterHandle*>(handle), "Invalid handle type!");
  184. ShaderMaterialParameterHandle* h = static_cast<ShaderMaterialParameterHandle*>(handle);
  185. AssertFatal(h->mHandles.size() == mBuffers.size(), "Handle length differs from buffer length!");
  186. for (U32 i = 0; i < h->mHandles.size(); i++)
  187. {
  188. GFXShaderConstHandle* shaderHandle = h->mHandles[i];
  189. if (shaderHandle && shaderHandle->isValid())
  190. mBuffers[i]->set(shaderHandle, mat, arraySize, matrixType);
  191. }
  192. }
  193. #undef SHADERMATPARAM_SET