| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- #include "ModelNodePatch.h"
- #include "Material.h"
- #include "MeshData.h"
- #include "ModelPatch.h"
- #define BUFFER_OFFSET(i) ((char *)NULL + (i))
- //======================================================================================================================
- // Constructor =
- //======================================================================================================================
- ModelNodePatch::ModelNodePatch(const ModelPatch& modelPatch_, bool isSkinPatch):
- modelPatchRsrc(modelPatch_)
- {
- RASSERT_THROW_EXCEPTION(isSkinPatch && !modelPatchRsrc.supportsHwSkinning());
- if(!isSkinPatch)
- {
- for(uint i = 0; i < Mesh::VBOS_NUM; i++)
- {
- vbos[i] = &modelPatchRsrc.getMesh().getVbo((Mesh::Vbos)i);
- }
- }
- else
- {
- //
- // Create the TF VBOs
- //
- tfVbos[TF_VBO_POSITIONS].create(GL_ARRAY_BUFFER,
- modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_POSITIONS).getSizeInBytes(),
- NULL,
- GL_STATIC_DRAW);
- tfVbos[TF_VBO_NORMALS].create(GL_ARRAY_BUFFER,
- modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_NORMALS).getSizeInBytes(),
- NULL,
- GL_STATIC_DRAW);
- tfVbos[TF_VBO_TANGENTS].create(GL_ARRAY_BUFFER,
- modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_TANGENTS).getSizeInBytes(),
- NULL,
- GL_STATIC_DRAW);
- //
- // Set the new VBOs array
- //
- for(uint i = 0; i < Mesh::VBOS_NUM; i++)
- {
- vbos[i] = &modelPatchRsrc.getMesh().getVbo((Mesh::Vbos)i);
- }
- vbos[Mesh::VBO_VERT_POSITIONS] = &tfVbos[TF_VBO_POSITIONS];
- vbos[Mesh::VBO_VERT_NORMALS] = &tfVbos[TF_VBO_NORMALS];
- vbos[Mesh::VBO_VERT_TANGENTS] = &tfVbos[TF_VBO_TANGENTS];
- //
- // Create the TF VAO
- //
- /// @todo check what are the needed VBOs
- tfVao.create();
- const Vbo& tmpVbo = modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_POSITIONS);
- tfVao.attachArrayBufferVbo(tmpVbo, 0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
- const Vbo& tmpVbo = modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_NORMALS);
- tfVao.attachArrayBufferVbo(tmpVbo, 1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
- const Vbo& tmpVbo = modelPatchRsrc.getMesh().getVbo(Mesh::VBO_VERT_TANGENTS);
- tfVao.attachArrayBufferVbo(tmpVbo, 2, 4, GL_FLOAT, GL_FALSE, 0, NULL);
- }
- createVao(modelPatchRsrc.getCpMtl(), vbos, cpVao);
- createVao(modelPatchRsrc.getDpMtl(), vbos, dpVao);
- }
- //======================================================================================================================
- // createVao =
- //======================================================================================================================
- void ModelNodePatch::createVao(const Material& mtl, const boost::array<const Vbo*, Mesh::VBOS_NUM>& vbos, Vao& vao)
- {
- vao.create();
- if(mtl.getStdAttribVar(Material::SAV_POSITION) != NULL)
- {
- vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_POSITIONS], *mtl.getStdAttribVar(Material::SAV_POSITION),
- 3, GL_FLOAT, GL_FALSE, 0, NULL);
- }
- if(mtl.getStdAttribVar(Material::SAV_NORMAL) != NULL)
- {
- vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_NORMALS], *mtl.getStdAttribVar(Material::SAV_NORMAL),
- 3, GL_FLOAT, GL_FALSE, 0, NULL);
- }
- if(mtl.getStdAttribVar(Material::SAV_TANGENT) != NULL)
- {
- vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_TANGENTS], *mtl.getStdAttribVar(Material::SAV_TANGENT),
- 4, GL_FLOAT, GL_FALSE, 0, NULL);
- }
- if(mtl.getStdAttribVar(Material::SAV_TEX_COORDS) != NULL)
- {
- vao.attachArrayBufferVbo(*vbos[Mesh::VBO_TEX_COORDS], *mtl.getStdAttribVar(Material::SAV_TEX_COORDS),
- 2, GL_FLOAT, GL_FALSE, 0, NULL);
- }
- /*if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONES_NUM) != NULL)
- {
- vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_WEIGHTS],
- *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONES_NUM), 1,
- GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(0));
- }
- if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONE_IDS) != NULL)
- {
- vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_WEIGHTS],
- *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_BONE_IDS), 4,
- GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(4));
- }
- if(mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_WEIGHTS) != NULL)
- {
- vao.attachArrayBufferVbo(*vbos[Mesh::VBO_VERT_WEIGHTS],
- *mtl.getStdAttribVar(Material::SAV_VERT_WEIGHT_WEIGHTS), 4,
- GL_FLOAT, GL_FALSE, sizeof(MeshData::VertexWeight), BUFFER_OFFSET(20));
- }*/
- vao.attachElementArrayBufferVbo(*vbos[Mesh::VBO_VERT_INDECES]);
- }
|