SkinPatchNode.cpp 2.7 KB

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