CmMaterial.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include "CmMaterial.h"
  2. #include "CmException.h"
  3. #include "CmShader.h"
  4. #include "CmTechnique.h"
  5. #include "CmPass.h"
  6. #include "CmRenderSystemManager.h"
  7. #include "CmRenderSystem.h"
  8. #include "CmGpuProgramParams.h"
  9. #include "CmGpuProgram.h"
  10. namespace CamelotEngine
  11. {
  12. void Material::setShader(ShaderPtr shader)
  13. {
  14. mShader = shader;
  15. mBestTechnique = nullptr;
  16. mParameters.clear();
  17. if(shader)
  18. {
  19. mBestTechnique = shader->getBestTechnique();
  20. if(mBestTechnique)
  21. {
  22. for(UINT32 i = 0; i < mBestTechnique->getNumPasses(); i++)
  23. {
  24. PassPtr curPass = mBestTechnique->getPass(i);
  25. ParamsPerPass params;
  26. GpuProgramRef vertProgram = curPass->getVertexProgram();
  27. if(vertProgram)
  28. params.mVertParams = vertProgram->createParameters();
  29. GpuProgramRef fragProgram = curPass->getFragmentProgram();
  30. if(fragProgram)
  31. params.mFragParams = fragProgram->createParameters();
  32. GpuProgramRef geomProgram = curPass->getGeometryProgram();
  33. if(geomProgram)
  34. params.mGeomParams = geomProgram->createParameters();
  35. mParameters.push_back(params);
  36. }
  37. }
  38. }
  39. }
  40. void Material::throwIfNotInitialized() const
  41. {
  42. if(mShader == nullptr)
  43. {
  44. CM_EXCEPT(InternalErrorException, "Material does not have shader set.");
  45. }
  46. if(mBestTechnique == nullptr)
  47. {
  48. CM_EXCEPT(InternalErrorException, "Shader does not contain a supported technique.");
  49. }
  50. }
  51. void Material::setTexture(const String& name, TextureRef& value)
  52. {
  53. throwIfNotInitialized();
  54. setParam(name, value);
  55. }
  56. void Material::setFloat(const String& name, float value)
  57. {
  58. throwIfNotInitialized();
  59. setParam(name, value);
  60. }
  61. void Material::setColor(const String& name, const Color& value)
  62. {
  63. throwIfNotInitialized();
  64. setParam(name, value);
  65. }
  66. void Material::setVec2(const String& name, const Vector2& value)
  67. {
  68. throwIfNotInitialized();
  69. setParam(name, value);
  70. }
  71. void Material::setVec3(const String& name, const Vector3& value)
  72. {
  73. throwIfNotInitialized();
  74. setParam(name, value);
  75. }
  76. void Material::setVec4(const String& name, const Vector4& value)
  77. {
  78. throwIfNotInitialized();
  79. setParam(name, value);
  80. }
  81. void Material::setMat3(const String& name, const Matrix3& value)
  82. {
  83. throwIfNotInitialized();
  84. setParam(name, value);
  85. }
  86. void Material::setMat4(const String& name, const Matrix4& value)
  87. {
  88. throwIfNotInitialized();
  89. setParam(name, value);
  90. }
  91. UINT32 Material::getNumPasses() const
  92. {
  93. throwIfNotInitialized();
  94. return mShader->getBestTechnique()->getNumPasses();
  95. }
  96. void Material::applyPass(UINT32 passIdx)
  97. {
  98. throwIfNotInitialized();
  99. // TODO - I need to take care to minimize shader and shader constant (especially texture) changes
  100. RenderSystem* renderSystem = RenderSystemManager::getActive();
  101. PassPtr curPass = mBestTechnique->getPass(passIdx);
  102. ParamsPerPass params = mParameters[passIdx];
  103. GpuProgramRef vertProgram = curPass->getVertexProgram();
  104. if(vertProgram)
  105. {
  106. renderSystem->bindGpuProgram(vertProgram->_getBindingDelegate());
  107. renderSystem->bindGpuProgramParameters(GPT_VERTEX_PROGRAM, params.mVertParams, GPV_ALL);
  108. }
  109. GpuProgramRef fragProgram = curPass->getFragmentProgram();
  110. if(fragProgram)
  111. {
  112. renderSystem->bindGpuProgram(fragProgram->_getBindingDelegate());
  113. renderSystem->bindGpuProgramParameters(GPT_FRAGMENT_PROGRAM, params.mFragParams, GPV_ALL);
  114. }
  115. GpuProgramRef geomProgram = curPass->getGeometryProgram();
  116. if(geomProgram)
  117. {
  118. renderSystem->bindGpuProgram(geomProgram->_getBindingDelegate());
  119. renderSystem->bindGpuProgramParameters(GPT_GEOMETRY_PROGRAM, params.mGeomParams, GPV_ALL);
  120. }
  121. }
  122. }