MeshNode.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "MeshNode.h"
  2. #include "Resource.h"
  3. #include "Mesh.h"
  4. #include "Material.h"
  5. #include "SkelNode.h"
  6. #include "Skeleton.h"
  7. #include "MeshSkelNodeCtrl.h"
  8. #include "SkelAnimCtrl.h"
  9. #include "App.h"
  10. #include "MainRenderer.h"
  11. #include "RsrcMngr.h"
  12. //======================================================================================================================
  13. // init =
  14. //======================================================================================================================
  15. void MeshNode::init(const char* filename)
  16. {
  17. mesh.loadRsrc(filename);
  18. material.loadRsrc(mesh->materialName.c_str());
  19. // sanity checks
  20. if(material->stdAttribVars[Material::SAV_TEX_COORDS]!=NULL && mesh->vbos.texCoords.getGlId()==0)
  21. {
  22. ERROR("The shader program (\"" << material->shaderProg->getRsrcName() <<
  23. "\") needs texture coord information that the mesh (\"" <<
  24. mesh->getRsrcName() << "\") doesn't have");
  25. }
  26. }
  27. //======================================================================================================================
  28. // deinit =
  29. //======================================================================================================================
  30. void MeshNode::deinit()
  31. {
  32. //RsrcMngr::meshes.unload(mesh);
  33. //RsrcMngr::materials.unload(material);
  34. }
  35. //======================================================================================================================
  36. // render =
  37. //======================================================================================================================
  38. void MeshNode::render(Material* mtl) const
  39. {
  40. GLint loc;
  41. GLint locs[64];
  42. int locsNum = 0;
  43. // if we have skeleton controller
  44. if(meshSkelCtrl)
  45. {
  46. DEBUG_ERR(!mtl->hasHWSkinning()); // it has skel controller but no skinning
  47. // first the uniforms
  48. mtl->stdUniVars[Material::SUV_SKINNING_ROTATIONS]->setMat3(&meshSkelCtrl->skelNode->skelAnimCtrl->boneRotations[0],
  49. meshSkelCtrl->skelNode->skeleton->bones.size());
  50. mtl->stdUniVars[Material::SUV_SKINNING_TRANSLATIONS]->setVec3(&meshSkelCtrl->skelNode->skelAnimCtrl->boneTranslations[0],
  51. meshSkelCtrl->skelNode->skeleton->bones.size());
  52. // then the attributes
  53. mesh->vbos.vertWeights.bind();
  54. loc = mtl->stdAttribVars[Material::SAV_VERT_WEIGHT_BONES_NUM]->getLoc();
  55. glEnableVertexAttribArray(loc);
  56. locs[locsNum++] = loc;
  57. glVertexAttribPointer(loc, 1, GL_FLOAT, GL_FALSE, sizeof(Mesh::VertexWeight), BUFFER_OFFSET(0));
  58. loc = mtl->stdAttribVars[Material::SAV_VERT_WEIGHT_BONE_IDS]->getLoc();
  59. glEnableVertexAttribArray(loc);
  60. locs[locsNum++] = loc;
  61. glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, sizeof(Mesh::VertexWeight), BUFFER_OFFSET(4));
  62. loc = mtl->stdAttribVars[Material::SAV_VERT_WEIGHT_WEIGHTS]->getLoc();
  63. glEnableVertexAttribArray(loc);
  64. locs[locsNum++] = loc;
  65. glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, sizeof(Mesh::VertexWeight), BUFFER_OFFSET(20));
  66. }
  67. if(mtl->stdAttribVars[Material::SAV_POSITION] != NULL)
  68. {
  69. mesh->vbos.vertCoords.bind();
  70. loc = mtl->stdAttribVars[Material::SAV_POSITION]->getLoc();
  71. glVertexAttribPointer(loc, 3, GL_FLOAT, false, 0, NULL);
  72. glEnableVertexAttribArray(loc);
  73. locs[locsNum++] = loc;
  74. }
  75. if(mtl->stdAttribVars[Material::SAV_NORMAL] != NULL)
  76. {
  77. mesh->vbos.vertNormals.bind();
  78. loc = mtl->stdAttribVars[Material::SAV_NORMAL]->getLoc();
  79. glVertexAttribPointer(loc, 3, GL_FLOAT, false, 0, NULL);
  80. glEnableVertexAttribArray(loc);
  81. locs[locsNum++] = loc;
  82. }
  83. if(mtl->stdAttribVars[Material::SAV_TEX_COORDS] != NULL)
  84. {
  85. mesh->vbos.texCoords.bind();
  86. loc = mtl->stdAttribVars[Material::SAV_TEX_COORDS]->getLoc();
  87. glVertexAttribPointer(loc, 2, GL_FLOAT, false, 0, NULL);
  88. glEnableVertexAttribArray(loc);
  89. locs[locsNum++] = loc;
  90. }
  91. if(mtl->stdAttribVars[Material::SAV_TANGENT] != NULL)
  92. {
  93. mesh->vbos.vertTangents.bind();
  94. loc = mtl->stdAttribVars[Material::SAV_TANGENT]->getLoc();
  95. glVertexAttribPointer(loc, 4, GL_FLOAT, false, 0, NULL);
  96. glEnableVertexAttribArray(loc);
  97. locs[locsNum++] = loc;
  98. }
  99. mesh->vbos.vertIndeces.bind();
  100. glDrawElements(GL_TRIANGLES, mesh->vertIndeces.size(), GL_UNSIGNED_SHORT, 0);
  101. // disable
  102. for(int i=0; i<locsNum; i++)
  103. {
  104. glDisableVertexAttribArray(locs[i]);
  105. }
  106. Vbo::unbindAllTargets();
  107. }