ModelNodePatch.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "ModelNodePatch.h"
  2. #include "Material.h"
  3. #include "MeshData.h"
  4. #include "ModelPatch.h"
  5. #define BUFFER_OFFSET(i) ((char *)NULL + (i))
  6. //======================================================================================================================
  7. // Constructor =
  8. //======================================================================================================================
  9. ModelNodePatch::ModelNodePatch(const ModelPatch& modelPatch_, bool isSkinPatch):
  10. modelPatchRsrc(modelPatch_)
  11. {
  12. RASSERT_THROW_EXCEPTION(isSkinPatch && !modelPatchRsrc.supportsHwSkinning());
  13. if(!isSkinPatch)
  14. {
  15. for(uint i = 0; i < Mesh::VBOS_NUM; i++)
  16. {
  17. vbos[i] = &modelPatchRsrc.getMesh().getVbo((Mesh::Vbos)i);
  18. }
  19. }
  20. else
  21. {
  22. //
  23. // Create the TF VBOs
  24. //
  25. tfVbos[TF_VBO_POSITIONS].create(GL_ARRAY_BUFFER,
  26. modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_POSITIONS).getSizeInBytes(),
  27. NULL,
  28. GL_STATIC_DRAW);
  29. tfVbos[TF_VBO_NORMALS].create(GL_ARRAY_BUFFER,
  30. modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_NORMALS).getSizeInBytes(),
  31. NULL,
  32. GL_STATIC_DRAW);
  33. tfVbos[TF_VBO_TANGENTS].create(GL_ARRAY_BUFFER,
  34. modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_TANGENTS).getSizeInBytes(),
  35. NULL,
  36. GL_STATIC_DRAW);
  37. //
  38. // Set the new VBOs array
  39. //
  40. for(uint i = 0; i < Mesh::VBOS_NUM; i++)
  41. {
  42. vbos[i] = &modelPatchRsrc.getMesh().getVbo((Mesh::Vbos)i);
  43. }
  44. vbos[Mesh::VBO_VERT_POSITIONS] = &tfVbos[TF_VBO_POSITIONS];
  45. vbos[Mesh::VBO_VERT_NORMALS] = &tfVbos[TF_VBO_NORMALS];
  46. vbos[Mesh::VBO_VERT_TANGENTS] = &tfVbos[TF_VBO_TANGENTS];
  47. //
  48. // Create the TF VAO
  49. //
  50. /// @todo check what are the needed VBOs
  51. tfVao.create();
  52. const Vbo& tmpVbo = modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_POSITIONS);
  53. tfVao.attachArrayBufferVbo(tmpVbo, 0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  54. const Vbo& tmpVbo = modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_NORMALS);
  55. tfVao.attachArrayBufferVbo(tmpVbo, 1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
  56. const Vbo& tmpVbo = modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_TANGENTS);
  57. tfVao.attachArrayBufferVbo(tmpVbo, 2, 4, GL_FLOAT, GL_FALSE, 0, NULL);
  58. }
  59. createVao(modelPatchRsrc.getCpMtl(), vbos, cpVao);
  60. createVao(modelPatchRsrc.getDpMtl(), vbos, dpVao);
  61. }
  62. //======================================================================================================================
  63. // createVao =
  64. //======================================================================================================================
  65. void ModelNodePatch::createVao(const Material& mtl, const boost::array<const Vbo*, Mesh::VBOS_NUM>& vbos, Vao& vao)
  66. {
  67. vao.create();
  68. if(mtl.getStdAttribVar(Material::SAV_POSITION) != NULL)
  69. {
  70. vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_POSITIONS], *mtl.getStdAttribVar(Material::SAV_POSITION),
  71. 3, GL_FLOAT, GL_FALSE, 0, NULL);
  72. }
  73. if(mtl.getStdAttribVar(Material::SAV_NORMAL) != NULL)
  74. {
  75. vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_NORMALS], *mtl.getStdAttribVar(Material::SAV_NORMAL),
  76. 3, GL_FLOAT, GL_FALSE, 0, NULL);
  77. }
  78. if(mtl.getStdAttribVar(Material::SAV_TANGENT) != NULL)
  79. {
  80. vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_TANGENTS], *mtl.getStdAttribVar(Material::SAV_TANGENT),
  81. 4, GL_FLOAT, GL_FALSE, 0, NULL);
  82. }
  83. if(mtl.getStdAttribVar(Material::SAV_TEX_COORDS) != NULL)
  84. {
  85. vao.attachArrayBufferVbo(*vbos[Mesh::VBO_TEX_COORDS], *mtl.getStdAttribVar(Material::SAV_TEX_COORDS),
  86. 2, GL_FLOAT, GL_FALSE, 0, NULL);
  87. }
  88. /*if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONES_NUM) != NULL)
  89. {
  90. vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_WEIGHTS],
  91. *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONES_NUM), 1,
  92. GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(0));
  93. }
  94. if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONE_IDS) != NULL)
  95. {
  96. vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_WEIGHTS],
  97. *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONE_IDS), 4,
  98. GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(4));
  99. }
  100. if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_WEIGHTS) != NULL)
  101. {
  102. vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_WEIGHTS],
  103. *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_WEIGHTS), 4,
  104. GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(20));
  105. }*/
  106. vao.attachElementArrayBufferVbo(*vbos[Mesh::VBO_VERT_INDECES]);
  107. }