ModelPatch.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "anki/resource/ModelPatch.h"
  2. #include "anki/resource/Mesh.h"
  3. #include "anki/resource/Material.h"
  4. #include "anki/resource/ShaderProgram.h"
  5. namespace anki {
  6. //==============================================================================
  7. ModelPatch::ModelPatch(const char* meshFName, const char* mtlFName)
  8. {
  9. // Load
  10. mesh.load(meshFName);
  11. mtl.load(mtlFName);
  12. // Create VAOs
  13. VboArray vboArr;
  14. for(uint i = 0; i < Mesh::VBOS_NUM; i++)
  15. {
  16. vboArr[i] = &mesh->getVbo((Mesh::Vbos)i);
  17. }
  18. createVaos(*mtl, vboArr, vaos, vaosHashMap);
  19. }
  20. //==============================================================================
  21. ModelPatch::~ModelPatch()
  22. {}
  23. //==============================================================================
  24. bool ModelPatch::supportsHwSkinning() const
  25. {
  26. return mesh->hasVertWeights();
  27. }
  28. //==============================================================================
  29. Vao* ModelPatch::createVao(const Material& mtl,
  30. const VboArray& vbos,
  31. const PassLevelKey& key)
  32. {
  33. Vao* vao = new Vao;
  34. if(mtl.getShaderProgram(key).uniformVariableExists("position"))
  35. {
  36. ANKI_ASSERT(vbos[Mesh::VBO_VERT_POSITIONS] != NULL);
  37. vao->attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_POSITIONS],
  38. 0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  39. }
  40. if(mtl.getShaderProgram(key).uniformVariableExists("normal"))
  41. {
  42. ANKI_ASSERT(vbos[Mesh::VBO_VERT_NORMALS] != NULL);
  43. vao->attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_NORMALS],
  44. 1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  45. }
  46. if(mtl.getShaderProgram(key).uniformVariableExists("tangent"))
  47. {
  48. ANKI_ASSERT(vbos[Mesh::VBO_VERT_TANGENTS] != NULL);
  49. vao->attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_TANGENTS],
  50. 2, 4, GL_FLOAT, GL_FALSE, 0, NULL);
  51. }
  52. if(mtl.getShaderProgram(key).uniformVariableExists("texCoords"))
  53. {
  54. vao->attachArrayBufferVbo(*vbos[Mesh::VBO_TEX_COORDS],
  55. 3, 2, GL_FLOAT, GL_FALSE, 0, NULL);
  56. }
  57. vao->attachElementArrayBufferVbo(*vbos[Mesh::VBO_VERT_INDECES]);
  58. return vao;
  59. }
  60. //==============================================================================
  61. void ModelPatch::createVaos(const Material& mtl,
  62. const VboArray& vbos,
  63. VaosContainer& vaos,
  64. PassLevelToVaoHashMap& vaosHashMap)
  65. {
  66. for(uint level = 0; level < mtl.getLevelsOfDetail(); ++level)
  67. {
  68. for(uint pass = 0; pass < mtl.getPasses().size(); ++pass)
  69. {
  70. PassLevelKey key(pass, level);
  71. Vao* vao = createVao(mtl, vbos, key);
  72. vaos.push_back(vao);
  73. vaosHashMap[key] = vao;
  74. }
  75. }
  76. }
  77. } // end namespace