Skip to content

Commit

Permalink
GRAPHICS: Wrap vertex and index buffers into Mesh class
Browse files Browse the repository at this point in the history
  • Loading branch information
mirv-sillyfish authored and DrMcCoy committed Nov 17, 2018
1 parent b41ca4d commit f162e07
Show file tree
Hide file tree
Showing 10 changed files with 131 additions and 60 deletions.
3 changes: 2 additions & 1 deletion src/graphics/aurora/animation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,8 @@ void Animation::updateSkinnedModel(Model *model) {
// TODO: Use vertex shader

ModelNode::MeshData *meshData = node->_mesh->data;
uint32 vertexCount = meshData->vertexBuffer.getCount();
VertexBuffer &vertexBuffer = *(meshData->rawMesh->getVertexBuffer());
uint32 vertexCount = vertexBuffer.getCount();

std::vector<float> &vcb = node->_vertexCoordsBuffer;
vcb.resize(3 * vertexCount);
Expand Down
13 changes: 8 additions & 5 deletions src/graphics/aurora/model_dragonage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -498,8 +498,10 @@ void ModelNode_DragonAge::load(Model_DragonAge::ParserContext &ctx, const GFF4St
readTransformation(nodeGFF);

// If this is a mesh node, read the mesh
if (isType(nodeGFF, kMSHHID))
if (isType(nodeGFF, kMSHHID)) {
readMesh(ctx, nodeGFF);
_mesh->data->rawMesh->init();
}

// Read the children
readChildren(ctx, nodeGFF);
Expand Down Expand Up @@ -621,12 +623,12 @@ void ModelNode_DragonAge::createIndexBuffer(const GFF4Struct &meshChunk,
Common::SeekableReadStream &indexData) {

uint32 indexCount = meshChunk.getUint(kGFF4MeshChunkIndexCount);
_mesh->data->indexBuffer.setSize(indexCount, sizeof(uint16), GL_UNSIGNED_SHORT);
_mesh->data->rawMesh->getIndexBuffer()->setSize(indexCount, sizeof(uint16), GL_UNSIGNED_SHORT);

const uint32 startIndex = meshChunk.getUint(kGFF4MeshChunkStartIndex);
indexData.skip(startIndex * 2);

uint16 *indices = reinterpret_cast<uint16 *>(_mesh->data->indexBuffer.getData());
uint16 *indices = reinterpret_cast<uint16 *>(_mesh->data->rawMesh->getIndexBuffer()->getData());
while (indexCount-- > 0)
*indices++ = indexData.readUint16LE();
}
Expand Down Expand Up @@ -665,9 +667,9 @@ void ModelNode_DragonAge::createVertexBuffer(const GFF4Struct &meshChunk,
}
}

_mesh->data->vertexBuffer.setVertexDeclInterleave(vertexCount, vertexDecl);
_mesh->data->rawMesh->getVertexBuffer()->setVertexDeclInterleave(vertexCount, vertexDecl);

float *vData = reinterpret_cast<float *>(_mesh->data->vertexBuffer.getData());
float *vData = reinterpret_cast<float *>(_mesh->data->rawMesh->getVertexBuffer()->getData());
for (uint32 v = 0; v < vertexCount; v++) {

for (MeshDeclarations::const_iterator d = meshDecl.begin(); d != meshDecl.end(); ++d) {
Expand Down Expand Up @@ -965,6 +967,7 @@ void ModelNode_DragonAge::readMesh(Model_DragonAge::ParserContext &ctx, const GF
_mesh = new Mesh();
_render =_mesh->render = true;
_mesh->data = new MeshData();
_mesh->data->rawMesh = new Graphics::Mesh::Mesh();

createIndexBuffer (*meshChunk, *indexData);
createVertexBuffer(*meshChunk, *vertexData, meshDecl);
Expand Down
23 changes: 19 additions & 4 deletions src/graphics/aurora/model_jade.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,20 @@ void ModelNode_Jade::load(Model_Jade::ParserContext &ctx) {
ctx.mdl->seek(ctx.offModelData + *child);
childNode->load(ctx);
}

if (!_mesh) {
return;
}

if (!_mesh->data) {
return;
}

if (!_mesh->data->rawMesh) {
return;
}

_mesh->data->rawMesh->init();
}

void ModelNode_Jade::readMesh(Model_Jade::ParserContext &ctx) {
Expand Down Expand Up @@ -603,6 +617,7 @@ void ModelNode_Jade::createMesh(Model_Jade::ParserContext &ctx) {

_render = _mesh->render;
_mesh->data = new MeshData();
_mesh->data->rawMesh = new Graphics::Mesh::Mesh();

loadTextures(ctx.textures);

Expand All @@ -614,9 +629,9 @@ void ModelNode_Jade::createMesh(Model_Jade::ParserContext &ctx) {
for (uint t = 0; t < textureCount; t++)
vertexDecl.push_back(VertexAttrib(VTCOORD + t , 2, GL_FLOAT));

_mesh->data->vertexBuffer.setVertexDeclInterleave(vertexCount, vertexDecl);
_mesh->data->rawMesh->getVertexBuffer()->setVertexDeclInterleave(vertexCount, vertexDecl);

float *v = reinterpret_cast<float *>(_mesh->data->vertexBuffer.getData());
float *v = reinterpret_cast<float *>(_mesh->data->rawMesh->getVertexBuffer()->getData());
for (uint32 i = 0; i < vertexCount; i++) {
// Position
*v++ = ctx.vertices[i * 3 + 0];
Expand All @@ -630,9 +645,9 @@ void ModelNode_Jade::createMesh(Model_Jade::ParserContext &ctx) {
}
}

_mesh->data->indexBuffer.setSize(indexCount, sizeof(uint16), GL_UNSIGNED_SHORT);
_mesh->data->rawMesh->getIndexBuffer()->setSize(indexCount, sizeof(uint16), GL_UNSIGNED_SHORT);

uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->indexBuffer.getData());
uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->rawMesh->getIndexBuffer()->getData());
memcpy(f, &ctx.indices[0], indexCount * sizeof(uint16));

createBound();
Expand Down
15 changes: 10 additions & 5 deletions src/graphics/aurora/model_kotor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,10 @@ void ModelNode_KotOR::load(Model_KotOR::ParserContext &ctx) {
ctx.mdl->seek(ctx.offModelData + *child);
childNode->load(ctx);
}

if (_mesh && _mesh->data) {
_mesh->data->rawMesh->init();
}
}

void ModelNode_KotOR::readNodeControllers(Model_KotOR::ParserContext &ctx,
Expand Down Expand Up @@ -705,6 +709,7 @@ void ModelNode_KotOR::readMesh(Model_KotOR::ParserContext &ctx) {
_render = _mesh->render;
_mesh->data = new MeshData();
_mesh->data->envMapMode = kModeEnvironmentBlendedOver;
_mesh->data->rawMesh = new Graphics::Mesh::Mesh();

uint32 endPos = ctx.mdl->pos();

Expand All @@ -729,11 +734,11 @@ void ModelNode_KotOR::readMesh(Model_KotOR::ParserContext &ctx) {
for (uint t = 0; t < textureCount; t++)
vertexDecl.push_back(VertexAttrib(VTCOORD + t , 2, GL_FLOAT));

_mesh->data->vertexBuffer.setVertexDeclInterleave(ctx.vertexCount, vertexDecl);
_mesh->data->rawMesh->getVertexBuffer()->setVertexDeclInterleave(ctx.vertexCount, vertexDecl);
_mesh->data->initialVertexCoords.resize(3 * ctx.vertexCount);

float *v = reinterpret_cast<float *>(_mesh->data->vertexBuffer.getData());
float *iv = &_mesh->data->initialVertexCoords[0];
float *v = reinterpret_cast<float *>(_mesh->data->rawMesh->getVertexBuffer()->getData());
float *iv = _mesh->data->initialVertexCoords.data();

for (uint32 i = 0; i < ctx.vertexCount; i++) {
// Position
Expand Down Expand Up @@ -773,9 +778,9 @@ void ModelNode_KotOR::readMesh(Model_KotOR::ParserContext &ctx) {

ctx.mdl->seek(ctx.offModelData + offVerts);

_mesh->data->indexBuffer.setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);
_mesh->data->rawMesh->getIndexBuffer()->setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);

uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->indexBuffer.getData());
uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->rawMesh->getIndexBuffer()->getData());
for (uint32 i = 0; i < facesCount * 3; i++)
f[i] = ctx.mdl->readUint16LE();

Expand Down
38 changes: 28 additions & 10 deletions src/graphics/aurora/model_nwn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ void ModelNode_NWN_Binary::readMesh(Model_NWN::ParserContext &ctx) {

_render = _mesh->render;
_mesh->data = new MeshData();
_mesh->data->rawMesh = new Graphics::Mesh::Mesh();

textures.resize(textureCount);
loadTextures(textures);
Expand Down Expand Up @@ -883,9 +884,9 @@ void ModelNode_NWN_Binary::readMesh(Model_NWN::ParserContext &ctx) {
for (uint t = 0; t < textureCount; t++)
vertexDecl.push_back(VertexAttrib(VTCOORD + t, 2, GL_FLOAT));

_mesh->data->vertexBuffer.setVertexDeclInterleave(facesCount * 3, vertexDecl);
_mesh->data->rawMesh->getVertexBuffer()->setVertexDeclInterleave(facesCount * 3, vertexDecl);

float *v = reinterpret_cast<float *>(_mesh->data->vertexBuffer.getData());
float *v = reinterpret_cast<float *>(_mesh->data->rawMesh->getVertexBuffer()->getData());
for (uint32 i = 0; i < facesCount; i++) {
const Face &face = faces[i];

Expand Down Expand Up @@ -929,15 +930,17 @@ void ModelNode_NWN_Binary::readMesh(Model_NWN::ParserContext &ctx) {

// Create index buffer

_mesh->data->indexBuffer.setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);
_mesh->data->rawMesh->getIndexBuffer()->setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);

uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->indexBuffer.getData());
uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->rawMesh->getIndexBuffer()->getData());
for (uint16 i = 0; i < facesCount * 3; i++)
*f++ = i;

createBound();

ctx.mdl->seek(endPos);

_mesh->data->rawMesh->init();
}

void ModelNode_NWN_Binary::readAnim(Model_NWN::ParserContext &ctx) {
Expand Down Expand Up @@ -1080,7 +1083,7 @@ void ModelNode_NWN_ASCII::load(Model_NWN::ParserContext &ctx,
skipNode = true;
}

Mesh mesh;
ModelNode_NWN_ASCII::Mesh mesh;

while (!ctx.mdl->eos()) {
std::vector<Common::UString> line;
Expand Down Expand Up @@ -1159,6 +1162,20 @@ void ModelNode_NWN_ASCII::load(Model_NWN::ParserContext &ctx,
mesh.textures[0] = ctx.texture;

processMesh(mesh);

if (!_mesh) {
return;
}

if (!_mesh->data) {
return;
}

if (!_mesh->data->rawMesh) {
return;
}

_mesh->data->rawMesh->init();
}

void ModelNode_NWN_ASCII::readConstraints(Model_NWN::ParserContext &ctx, uint32 n) {
Expand Down Expand Up @@ -1310,12 +1327,13 @@ std::size_t hash_value(const FaceVert &b) {
return seed;
}

void ModelNode_NWN_ASCII::processMesh(Mesh &mesh) {
void ModelNode_NWN_ASCII::processMesh(ModelNode_NWN_ASCII::Mesh &mesh) {
if ((mesh.vCount == 0) || (mesh.tCount == 0) || (mesh.faceCount == 0))
return;

_render = _mesh->render;
_mesh->data = new MeshData();
_mesh->data->rawMesh = new Graphics::Mesh::Mesh();

loadTextures(mesh.textures);

Expand All @@ -1327,13 +1345,13 @@ void ModelNode_NWN_ASCII::processMesh(Mesh &mesh) {
// Read faces

uint32 facesCount = mesh.faceCount;
_mesh->data->indexBuffer.setSize(facesCount * 3, sizeof(uint32), GL_UNSIGNED_INT);
_mesh->data->rawMesh->getIndexBuffer()->setSize(facesCount * 3, sizeof(uint32), GL_UNSIGNED_INT);

boost::unordered_set<FaceVert> verts;
typedef boost::unordered_set<FaceVert>::iterator verts_set_it;

uint32 vertexCount = 0;
uint32 *f = reinterpret_cast<uint32 *>(_mesh->data->indexBuffer.getData());
uint32 *f = reinterpret_cast<uint32 *>(_mesh->data->rawMesh->getIndexBuffer()->getData());
for (uint32 i = 0; i < facesCount; i++) {
const uint32 v[3] = {mesh.vIA[i], mesh.vIB[i], mesh.vIC[i]};
const uint32 t[3] = {mesh.tIA[i], mesh.tIB[i], mesh.tIC[i]};
Expand Down Expand Up @@ -1369,10 +1387,10 @@ void ModelNode_NWN_ASCII::processMesh(Mesh &mesh) {
for (uint t = 0; t < textureCount; t++)
vertexDecl.push_back(VertexAttrib(VTCOORD + t, 2, GL_FLOAT));

_mesh->data->vertexBuffer.setVertexDeclInterleave(vertexCount, vertexDecl);
_mesh->data->rawMesh->getVertexBuffer()->setVertexDeclInterleave(vertexCount, vertexDecl);

for (verts_set_it i = verts.begin(); i != verts.end(); ++i) {
byte *vData = reinterpret_cast<byte *>(_mesh->data->vertexBuffer.getData()) + i->i * _mesh->data->vertexBuffer.getSize();
byte *vData = reinterpret_cast<byte *>(_mesh->data->rawMesh->getVertexBuffer()->getData()) + i->i * _mesh->data->rawMesh->getVertexBuffer()->getSize();
float *v = reinterpret_cast<float *>(vData);

// Position
Expand Down
2 changes: 1 addition & 1 deletion src/graphics/aurora/model_nwn.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ class ModelNode_NWN_ASCII : public ModelNode {

void readFaces(Model_NWN::ParserContext &ctx, Mesh &mesh);

void processMesh(Mesh &mesh);
void processMesh(ModelNode_NWN_ASCII::Mesh &mesh);
};

} // End of namespace Aurora
Expand Down
23 changes: 14 additions & 9 deletions src/graphics/aurora/model_nwn2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ bool ModelNode_NWN2::loadRigid(Model_NWN2::ParserContext &ctx) {

_render = _mesh->render = true;
_mesh->data = new MeshData();
_mesh->data->rawMesh = new Graphics::Mesh::Mesh();

std::vector<Common::UString> textures;
textures.push_back(diffuseMap);
Expand All @@ -260,9 +261,9 @@ bool ModelNode_NWN2::loadRigid(Model_NWN2::ParserContext &ctx) {
if (!_tintMap.empty())
vertexDecl.push_back(VertexAttrib(VTCOORD + 1, 3, GL_FLOAT));

_mesh->data->vertexBuffer.setVertexDeclInterleave(vertexCount, vertexDecl);
_mesh->data->rawMesh->getVertexBuffer()->setVertexDeclInterleave(vertexCount, vertexDecl);

float *v = reinterpret_cast<float *>(_mesh->data->vertexBuffer.getData());
float *v = reinterpret_cast<float *>(_mesh->data->rawMesh->getVertexBuffer()->getData());
for (uint32 i = 0; i < vertexCount; i++) {
// Position
*v++ = ctx.mdb->readIEEEFloatLE();
Expand Down Expand Up @@ -294,12 +295,14 @@ bool ModelNode_NWN2::loadRigid(Model_NWN2::ParserContext &ctx) {

// Read faces

_mesh->data->indexBuffer.setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);
_mesh->data->rawMesh->getIndexBuffer()->setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);

uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->indexBuffer.getData());
uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->rawMesh->getIndexBuffer()->getData());
for (uint32 i = 0; i < facesCount * 3; i++)
f[i] = ctx.mdb->readUint16LE();

_mesh->data->rawMesh->init();

createBound();

return true;
Expand Down Expand Up @@ -346,6 +349,7 @@ bool ModelNode_NWN2::loadSkin(Model_NWN2::ParserContext &ctx) {

_render = _mesh->render = true;
_mesh->data = new MeshData();
_mesh->data->rawMesh = new Graphics::Mesh::Mesh();

std::vector<Common::UString> textures;
textures.push_back(diffuseMap);
Expand All @@ -363,9 +367,9 @@ bool ModelNode_NWN2::loadSkin(Model_NWN2::ParserContext &ctx) {
if (!_tintMap.empty())
vertexDecl.push_back(VertexAttrib(VTCOORD + 1, 3, GL_FLOAT));

_mesh->data->vertexBuffer.setVertexDeclInterleave(vertexCount, vertexDecl);
_mesh->data->rawMesh->getVertexBuffer()->setVertexDeclInterleave(vertexCount, vertexDecl);

float *v = reinterpret_cast<float *>(_mesh->data->vertexBuffer.getData());
float *v = reinterpret_cast<float *>(_mesh->data->rawMesh->getVertexBuffer()->getData());
for (uint32 i = 0; i < vertexCount; i++) {
// Position
*v++ = ctx.mdb->readIEEEFloatLE();
Expand Down Expand Up @@ -400,15 +404,16 @@ bool ModelNode_NWN2::loadSkin(Model_NWN2::ParserContext &ctx) {


// Read faces
_mesh->data->rawMesh->getIndexBuffer()->setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);

_mesh->data->indexBuffer.setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);

uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->indexBuffer.getData());
uint16 *f = reinterpret_cast<uint16 *>(_mesh->data->rawMesh->getIndexBuffer()->getData());
for (uint32 i = 0; i < facesCount * 3; i++)
f[i] = ctx.mdb->readUint16LE();

createBound();

_mesh->data->rawMesh->init();

return true;
}

Expand Down

0 comments on commit f162e07

Please sign in to comment.