MaterialBuildinVariable.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "anki/resource/MaterialBuildinVariable.h"
  2. #include "anki/util/Exception.h"
  3. #include "anki/util/Assert.h"
  4. #include <cstring>
  5. #include <boost/lexical_cast.hpp>
  6. #include <boost/assign/list_of.hpp>
  7. namespace anki {
  8. //==============================================================================
  9. // Statics =
  10. //==============================================================================
  11. MaterialBuildinVariable::StrToMatchingVariable
  12. MaterialBuildinVariable::strToMatchingVariable = boost::assign::map_list_of
  13. ("position", MV_POSITION)
  14. ("tangent", MV_TANGENT)
  15. ("normal", MV_NORMAL)
  16. ("texCoords", MV_TEX_COORDS)
  17. ("modelMat", MV_MODEL_MAT)
  18. ("viewMat", MV_VIEW_MAT)
  19. ("projectionMat", MV_PROJECTION_MAT)
  20. ("modelViewMat", MV_MODELVIEW_MAT)
  21. ("viewProjectionMat", MV_VIEWPROJECTION_MAT)
  22. ("normalMat", MV_NORMAL_MAT)
  23. ("modelViewProjectionMat", MV_MODELVIEWPROJECTION_MAT)
  24. ("msNormalFai", MV_MS_NORMAL_FAI)
  25. ("msDiffuseFai", MV_MS_DIFFUSE_FAI)
  26. ("msSpecularFai", MV_MS_SPECULAR_FAI)
  27. ("msDepthFai", MV_MS_DEPTH_FAI)
  28. ("isFai", MV_IS_FAI)
  29. ("ppsPrePassFai", MV_PPS_PRE_PASS_FAI)
  30. ("ppsPostPassFai", MV_PPS_POST_PASS_FAI)
  31. ("rendererSize", MV_RENDERER_SIZE)
  32. ("sceneAmbientColor", MV_SCENE_AMBIENT_COLOR)
  33. ("blurring", MV_BLURRING);
  34. MaterialBuildinVariable::MatchingVariableToGlType
  35. MaterialBuildinVariable::matchingVariableToGlType =
  36. boost::assign::map_list_of
  37. (MV_POSITION, GL_FLOAT_VEC3)
  38. (MV_TANGENT, GL_FLOAT_VEC4)
  39. (MV_NORMAL, GL_FLOAT_VEC3)
  40. (MV_TEX_COORDS, GL_FLOAT_VEC2)
  41. (MV_MODEL_MAT, GL_FLOAT_MAT4)
  42. (MV_VIEW_MAT, GL_FLOAT_MAT4)
  43. (MV_PROJECTION_MAT, GL_FLOAT_MAT4)
  44. (MV_MODELVIEW_MAT, GL_FLOAT_MAT4)
  45. (MV_VIEWPROJECTION_MAT, GL_FLOAT_MAT4)
  46. (MV_NORMAL_MAT, GL_FLOAT_MAT3)
  47. (MV_MODELVIEWPROJECTION_MAT, GL_FLOAT_MAT4)
  48. (MV_MS_NORMAL_FAI, GL_SAMPLER_2D)
  49. (MV_MS_DIFFUSE_FAI, GL_SAMPLER_2D)
  50. (MV_MS_SPECULAR_FAI, GL_SAMPLER_2D)
  51. (MV_MS_DEPTH_FAI, GL_SAMPLER_2D)
  52. (MV_IS_FAI, GL_SAMPLER_2D)
  53. (MV_PPS_PRE_PASS_FAI, GL_SAMPLER_2D)
  54. (MV_PPS_POST_PASS_FAI, GL_SAMPLER_2D)
  55. (MV_RENDERER_SIZE, GL_FLOAT_VEC2)
  56. (MV_SCENE_AMBIENT_COLOR, GL_FLOAT_VEC3)
  57. (MV_BLURRING, GL_FLOAT);
  58. //==============================================================================
  59. // Constructor =
  60. //==============================================================================
  61. MaterialBuildinVariable::MaterialBuildinVariable(
  62. const char* shaderProgVarName,
  63. const ShaderPrograms& shaderProgsArr)
  64. : MaterialVariable(T_BUILDIN, shaderProgVarName, shaderProgsArr),
  65. bEnum(MV_NUM)
  66. {
  67. GLenum dataType;
  68. // Sanity checks
  69. if(!isBuildin(shaderProgVarName, &bEnum, &dataType))
  70. {
  71. throw ANKI_EXCEPTION("The variable is not buildin: " +
  72. shaderProgVarName);
  73. }
  74. if(dataType != getGlDataType())
  75. {
  76. throw ANKI_EXCEPTION("The buildin variable \"" + shaderProgVarName +
  77. "\" should be of type: " +
  78. boost::lexical_cast<std::string>(dataType));
  79. }
  80. }
  81. //==============================================================================
  82. // isBuildin =
  83. //==============================================================================
  84. bool MaterialBuildinVariable::isBuildin(const char* name,
  85. MatchingVariable* var, GLenum* dataType)
  86. {
  87. StrToMatchingVariable::const_iterator it = strToMatchingVariable.find(name);
  88. if(it == strToMatchingVariable.end())
  89. {
  90. return false;
  91. }
  92. MatchingVariable mv = it->second;
  93. if(var)
  94. {
  95. *var = mv;
  96. }
  97. if(dataType)
  98. {
  99. MatchingVariableToGlType::const_iterator it2 =
  100. matchingVariableToGlType.find(mv);
  101. ANKI_ASSERT(it2 != matchingVariableToGlType.end());
  102. *dataType = it2->second;
  103. }
  104. return true;
  105. }
  106. } // end namespace