Mesh.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "anki/resource/Mesh.h"
  2. #include "anki/resource/Material.h"
  3. #include "anki/resource/MeshLoader.h"
  4. #include "anki/gl/Vbo.h"
  5. #include "anki/util/Util.h"
  6. #include <fstream>
  7. #include <boost/lexical_cast.hpp>
  8. namespace anki {
  9. //==============================================================================
  10. void Mesh::load(const char* filename)
  11. {
  12. MeshLoader meshData(filename);
  13. vertIdsNum = meshData.getVertIndeces().size();
  14. vertsNum = meshData.getVertCoords().size();
  15. try
  16. {
  17. //
  18. // Sanity checks
  19. //
  20. if(meshData.getVertIndeces().size() < 1
  21. || meshData.getVertCoords().size() < 1
  22. || meshData.getVertNormals().size() < 1)
  23. {
  24. throw ANKI_EXCEPTION("Empty one of the required vectors");
  25. }
  26. createVbos(meshData);
  27. visibilityShape.set(meshData.getVertCoords());
  28. }
  29. catch(std::exception& e)
  30. {
  31. throw ANKI_EXCEPTION("Mesh \"" + filename + "\"") << e;
  32. }
  33. }
  34. //==============================================================================
  35. void Mesh::createVbos(const MeshLoader& meshData)
  36. {
  37. vbos[VBO_INDICES].create(
  38. GL_ELEMENT_ARRAY_BUFFER,
  39. Util::getVectorSizeInBytes(meshData.getVertIndeces()),
  40. &meshData.getVertIndeces()[0],
  41. GL_STATIC_DRAW);
  42. vbos[VBO_POSITIONS].create(
  43. GL_ARRAY_BUFFER,
  44. Util::getVectorSizeInBytes(meshData.getVertCoords()),
  45. &meshData.getVertCoords()[0],
  46. GL_STATIC_DRAW);
  47. vbos[VBO_NORMALS].create(
  48. GL_ARRAY_BUFFER,
  49. Util::getVectorSizeInBytes(meshData.getVertNormals()),
  50. &meshData.getVertNormals()[0],
  51. GL_STATIC_DRAW);
  52. if(meshData.getVertTangents().size() > 1)
  53. {
  54. vbos[VBO_TANGENTS].create(
  55. GL_ARRAY_BUFFER,
  56. Util::getVectorSizeInBytes(meshData.getVertTangents()),
  57. &meshData.getVertTangents()[0],
  58. GL_STATIC_DRAW);
  59. }
  60. if(meshData.getTexCoords().size() > 1)
  61. {
  62. vbos[VBO_TEX_COORDS].create(
  63. GL_ARRAY_BUFFER,
  64. Util::getVectorSizeInBytes(meshData.getTexCoords()),
  65. &meshData.getTexCoords()[0],
  66. GL_STATIC_DRAW);
  67. }
  68. if(meshData.getVertWeights().size() > 1)
  69. {
  70. vbos[VBO_WEIGHTS].create(
  71. GL_ARRAY_BUFFER,
  72. Util::getVectorSizeInBytes(meshData.getVertWeights()),
  73. &meshData.getVertWeights()[0],
  74. GL_STATIC_DRAW);
  75. }
  76. }
  77. } // end namespace