MaterialVariable.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. : type(T_USER)
  22. {
  23. init(shaderProgVarName, sProgs);
  24. ANKI_ASSERT(getShaderProgramVariableType() ==
  25. ShaderProgramVariable::T_UNIFORM);
  26. data = TextureResourcePointer();
  27. boost::get<TextureResourcePointer>(data).load(val.c_str());
  28. }
  29. //==============================================================================
  30. void MaterialVariable::init(const char* shaderProgVarName,
  31. const PassLevelToShaderProgramHashMap& sProgs)
  32. {
  33. oneSProgVar = NULL;
  34. PassLevelToShaderProgramHashMap::const_iterator it = sProgs.begin();
  35. for(; it != sProgs.end(); ++it)
  36. {
  37. const ShaderProgram& sProg = *(it->second);
  38. const PassLevelKey& key = it->first;
  39. if(sProg.variableExists(shaderProgVarName))
  40. {
  41. const ShaderProgramVariable& sProgVar =
  42. sProg.getVariableByName(shaderProgVarName);
  43. sProgVars[key] = &sProgVar;
  44. if(!oneSProgVar)
  45. {
  46. oneSProgVar = &sProgVar;
  47. }
  48. // Sanity check: All the sprog vars need to have same GL data type
  49. if(oneSProgVar->getGlDataType() != sProgVar.getGlDataType() ||
  50. oneSProgVar->getType() != sProgVar.getType())
  51. {
  52. throw ANKI_EXCEPTION("Incompatible shader "
  53. "program variables: " +
  54. shaderProgVarName);
  55. }
  56. }
  57. else
  58. {
  59. sProgVars[key] = NULL;
  60. }
  61. }
  62. // Extra sanity checks
  63. if(!oneSProgVar)
  64. {
  65. throw ANKI_EXCEPTION("Variable not found in "
  66. "any of the shader programs: " +
  67. shaderProgVarName);
  68. }
  69. }
  70. } // end namespace