MaterialVariable.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "anki/resource/MaterialVariable.h"
  2. #include "anki/resource/ShaderProgramVariable.h"
  3. #include "anki/resource/ShaderProgram.h"
  4. #include "anki/util/Assert.h"
  5. #include "anki/util/Exception.h"
  6. namespace anki {
  7. //==============================================================================
  8. MaterialVariable::MaterialVariable(
  9. const char* shaderProgVarName,
  10. const PassLevelToShaderProgramHashMap& sProgs)
  11. : type(T_BUILDIN)
  12. {
  13. init(shaderProgVarName, sProgs);
  14. }
  15. //==============================================================================
  16. template <>
  17. MaterialVariable::MaterialVariable(
  18. const char* shaderProgVarName,
  19. const PassLevelToShaderProgramHashMap& sProgs,
  20. const std::string& val)
  21. : initialized(true)
  22. {
  23. init(shaderProgVarName, sProgs);
  24. data = TextureResourcePointer();
  25. boost::get<TextureResourcePointer>(data).load(val.c_str());
  26. }
  27. //==============================================================================
  28. void MaterialVariable::init(const char* shaderProgVarName,
  29. const PassLevelToShaderProgramHashMap& sProgs)
  30. {
  31. oneSProgVar = NULL;
  32. // For all sprogs
  33. PassLevelToShaderProgramHashMap::const_iterator it = sProgs.begin();
  34. for(; it != sProgs.end(); ++it)
  35. {
  36. const ShaderProgram& sProg = *(it->second);
  37. const PassLevelKey& key = it->first;
  38. if(sProg.uniformVariableExists(shaderProgVarName))
  39. {
  40. const ShaderProgramUniformVariable& sProgVar =
  41. sProg.findUniformVariableByName(shaderProgVarName);
  42. sProgVars[key] = &sProgVar;
  43. if(!oneSProgVar)
  44. {
  45. oneSProgVar = &sProgVar;
  46. }
  47. // Sanity check: All the sprog vars need to have same GL data type
  48. if(oneSProgVar->getGlDataType() != sProgVar.getGlDataType() ||
  49. oneSProgVar->getType() != sProgVar.getType())
  50. {
  51. throw ANKI_EXCEPTION("Incompatible shader "
  52. "program variables: " +
  53. shaderProgVarName);
  54. }
  55. }
  56. else
  57. {
  58. sProgVars[key] = NULL;
  59. }
  60. }
  61. // Extra sanity checks
  62. if(!oneSProgVar)
  63. {
  64. throw ANKI_EXCEPTION("Variable not found in "
  65. "any of the shader programs: " +
  66. shaderProgVarName);
  67. }
  68. }
  69. } // end namespace