| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include "anki/resource/MaterialVariable.h"
- #include "anki/resource/ShaderProgramVariable.h"
- #include "anki/resource/ShaderProgram.h"
- #include "anki/util/Assert.h"
- #include "anki/util/Exception.h"
- namespace anki {
- //==============================================================================
- MaterialVariable::MaterialVariable(
- const char* shaderProgVarName,
- const PassLevelToShaderProgramHashMap& sProgs)
- : type(T_BUILDIN)
- {
- init(shaderProgVarName, sProgs);
- }
- //==============================================================================
- template <>
- MaterialVariable::MaterialVariable(
- const char* shaderProgVarName,
- const PassLevelToShaderProgramHashMap& sProgs,
- const std::string& val)
- : initialized(true)
- {
- init(shaderProgVarName, sProgs);
- data = TextureResourcePointer();
- boost::get<TextureResourcePointer>(data).load(val.c_str());
- }
- //==============================================================================
- void MaterialVariable::init(const char* shaderProgVarName,
- const PassLevelToShaderProgramHashMap& sProgs)
- {
- oneSProgVar = NULL;
- // For all sprogs
- PassLevelToShaderProgramHashMap::const_iterator it = sProgs.begin();
- for(; it != sProgs.end(); ++it)
- {
- const ShaderProgram& sProg = *(it->second);
- const PassLevelKey& key = it->first;
- if(sProg.uniformVariableExists(shaderProgVarName))
- {
- const ShaderProgramUniformVariable& sProgVar =
- sProg.findUniformVariableByName(shaderProgVarName);
- sProgVars[key] = &sProgVar;
- if(!oneSProgVar)
- {
- oneSProgVar = &sProgVar;
- }
- // Sanity check: All the sprog vars need to have same GL data type
- if(oneSProgVar->getGlDataType() != sProgVar.getGlDataType() ||
- oneSProgVar->getType() != sProgVar.getType())
- {
- throw ANKI_EXCEPTION("Incompatible shader "
- "program variables: " +
- shaderProgVarName);
- }
- }
- else
- {
- sProgVars[key] = NULL;
- }
- }
- // Extra sanity checks
- if(!oneSProgVar)
- {
- throw ANKI_EXCEPTION("Variable not found in "
- "any of the shader programs: " +
- shaderProgVarName);
- }
- }
- } // end namespace
|