MaterialBuildinVariable.cpp 3.6 KB

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