CmShader.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "CmShader.h"
  2. #include "CmTechnique.h"
  3. #include "CmException.h"
  4. #include "CmDebug.h"
  5. #include "CmShaderRTTI.h"
  6. namespace CamelotEngine
  7. {
  8. Shader::Shader(const String& name)
  9. :mName(name)
  10. {
  11. }
  12. void Shader::initialize_internal()
  13. { }
  14. TechniquePtr Shader::addTechnique(const String& renderSystem, const String& renderer)
  15. {
  16. TechniquePtr technique = TechniquePtr(new Technique(renderSystem, renderer));
  17. mTechniques.push_back(technique);
  18. return technique;
  19. }
  20. void Shader::removeTechnique(UINT32 idx)
  21. {
  22. if(idx < 0 || idx >= mTechniques.size())
  23. CM_EXCEPT(InvalidParametersException, "Index out of range: " + toString(idx));
  24. int count = 0;
  25. auto iter = mTechniques.begin();
  26. while(count != idx)
  27. {
  28. ++count;
  29. ++iter;
  30. }
  31. mTechniques.erase(iter);
  32. }
  33. void Shader::removeTechnique(TechniquePtr technique)
  34. {
  35. auto iterFind = std::find(mTechniques.begin(), mTechniques.end(), technique);
  36. if(iterFind == mTechniques.end())
  37. CM_EXCEPT(InvalidParametersException, "Cannot remove specified technique because it wasn't found in this shader.");
  38. mTechniques.erase(iterFind);
  39. }
  40. TechniquePtr Shader::getBestTechnique() const
  41. {
  42. for(auto iter = mTechniques.begin(); iter != mTechniques.end(); ++iter)
  43. {
  44. if((*iter)->isSupported())
  45. {
  46. return *iter;
  47. }
  48. }
  49. CM_EXCEPT(InternalErrorException, "No techniques are supported!");
  50. // TODO - Low priority. Instead of throwing an exception use an extremely simple technique that will be supported almost everywhere as a fallback.
  51. }
  52. void Shader::addParameter(const String& name, const String& gpuVariableName, GpuParamDataType type, UINT32 arraySize, bool hidden)
  53. {
  54. SHADER_DATA_PARAM_DESC desc;
  55. desc.name = name;
  56. desc.gpuVariableName = gpuVariableName;
  57. desc.type = type;
  58. desc.arraySize = arraySize;
  59. desc.hidden = hidden;
  60. mDataParams[name] = desc;
  61. mObjectParams.erase(name);
  62. }
  63. void Shader::addParameter(const String& name, const String& gpuVariableName, GpuParamObjectType type, bool hidden)
  64. {
  65. SHADER_OBJECT_PARAM_DESC desc;
  66. desc.name = name;
  67. desc.gpuVariableName = gpuVariableName;
  68. desc.type = type;
  69. desc.hidden = hidden;
  70. mObjectParams[name] = desc;
  71. mDataParams.erase(name);
  72. }
  73. void Shader::removeParameter(const String& name)
  74. {
  75. mDataParams.erase(name);
  76. mObjectParams.erase(name);
  77. }
  78. void Shader::setParamBlockAttribs(const String& name, bool shared, GpuParamBlockUsage usage)
  79. {
  80. SHADER_PARAM_BLOCK_DESC desc;
  81. desc.shared = shared;
  82. desc.usage = usage;
  83. mParamBlocks[name] = desc;
  84. }
  85. RTTITypeBase* Shader::getRTTIStatic()
  86. {
  87. return ShaderRTTI::instance();
  88. }
  89. RTTITypeBase* Shader::getRTTI() const
  90. {
  91. return Shader::getRTTIStatic();
  92. }
  93. }