SkinPatchNode.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "SkinPatchNode.h"
  2. #include "SkinNode.h"
  3. #include "Renderer/SkinsDeformer.h"
  4. #define BUFFER_OFFSET(i) ((char *)NULL + (i))
  5. //==============================================================================
  6. // Constructor =
  7. //==============================================================================
  8. SkinPatchNode::SkinPatchNode(const ModelPatch& modelPatch_, SkinNode* parent):
  9. PatchNode(modelPatch_, parent)
  10. {
  11. boost::array<const Vbo*, Mesh::VBOS_NUM> vboArr;
  12. for(uint i = 0; i < Mesh::VBOS_NUM; i++)
  13. {
  14. vboArr[i] = &rsrc.getMesh().getVbo((Mesh::Vbos)i);
  15. }
  16. const Mesh& mesh = rsrc.getMesh();
  17. //
  18. // Create the VAOs
  19. //
  20. tfVao.create();
  21. // Positions
  22. if(mesh.getVbo(Mesh::VBO_VERT_POSITIONS).isCreated())
  23. {
  24. tfVbos[TFV_POSITIONS].create(GL_ARRAY_BUFFER,
  25. mesh.getVbo(Mesh::VBO_VERT_POSITIONS).getSizeInBytes(),
  26. NULL,
  27. GL_STATIC_DRAW);
  28. vboArr[Mesh::VBO_VERT_POSITIONS] = &tfVbos[TFV_POSITIONS];
  29. tfVao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_POSITIONS),
  30. SkinsDeformer::TFSPA_POSITION,
  31. 3,
  32. GL_FLOAT,
  33. false,
  34. 0,
  35. NULL);
  36. }
  37. // Normals
  38. if(mesh.getVbo(Mesh::VBO_VERT_NORMALS).isCreated())
  39. {
  40. tfVbos[TFV_NORMALS].create(GL_ARRAY_BUFFER,
  41. mesh.getVbo(Mesh::VBO_VERT_NORMALS).getSizeInBytes(),
  42. NULL,
  43. GL_STATIC_DRAW);
  44. vboArr[Mesh::VBO_VERT_NORMALS] = &tfVbos[TFV_NORMALS];
  45. tfVao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_NORMALS),
  46. SkinsDeformer::TFSPA_NORMAL,
  47. 3,
  48. GL_FLOAT,
  49. false,
  50. 0,
  51. NULL);
  52. }
  53. // Tangents
  54. if(mesh.getVbo(Mesh::VBO_VERT_TANGENTS).isCreated())
  55. {
  56. tfVbos[TFV_TANGENTS].create(GL_ARRAY_BUFFER,
  57. mesh.getVbo(Mesh::VBO_VERT_TANGENTS).getSizeInBytes(),
  58. NULL,
  59. GL_STATIC_DRAW);
  60. vboArr[Mesh::VBO_VERT_TANGENTS] = &tfVbos[TFV_TANGENTS];
  61. tfVao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_TANGENTS),
  62. SkinsDeformer::TFSPA_TANGENT,
  63. 4,
  64. GL_FLOAT,
  65. false,
  66. 0,
  67. NULL);
  68. }
  69. // Attach some extra stuff to the tfVao
  70. ASSERT(mesh.getVbo(Mesh::VBO_VERT_WEIGHTS).isCreated());
  71. tfVao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_WEIGHTS),
  72. SkinsDeformer::TFSPA_VERT_WEIGHT_BONES_NUM,
  73. 1,
  74. GL_FLOAT,
  75. GL_FALSE,
  76. sizeof(MeshData::VertexWeight),
  77. BUFFER_OFFSET(0));
  78. tfVao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_WEIGHTS),
  79. SkinsDeformer::TFSPA_VERT_WEIGHT_BONE_IDS,
  80. 4,
  81. GL_FLOAT,
  82. GL_FALSE,
  83. sizeof(MeshData::VertexWeight),
  84. BUFFER_OFFSET(4));
  85. tfVao.attachArrayBufferVbo(mesh.getVbo(Mesh::VBO_VERT_WEIGHTS),
  86. SkinsDeformer::TFSPA_VERT_WEIGHT_WEIGHTS,
  87. 4,
  88. GL_FLOAT,
  89. GL_FALSE,
  90. sizeof(MeshData::VertexWeight),
  91. BUFFER_OFFSET(20));
  92. // Rendering VAOs
  93. createVao(rsrc.getCpMtl(), vboArr, cpVao);
  94. createVao(rsrc.getDpMtl(), vboArr, dpVao);
  95. }