diff --git a/mesh.cpp b/mesh.cpp index 1ac93b4..1728d9b 100755 --- a/mesh.cpp +++ b/mesh.cpp @@ -95,7 +95,10 @@ namespace vb01{ void Mesh::updateVerts(MeshData meshData){ glBindBuffer(GL_ARRAY_BUFFER, VBO); - glBufferSubData(GL_ARRAY_BUFFER, 0, 3 * sizeof(MeshData::Vertex) * meshBase.numTris, meshData.vertices); + + MeshData::OldVertex *glVertData = meshBase.toGlVerts(); + glBufferSubData(GL_ARRAY_BUFFER, 0, 3 * sizeof(MeshData::OldVertex) * meshBase.numTris, glVertData); + delete glVertData; } void Mesh::update(){ diff --git a/quad.cpp b/quad.cpp index 96adad6..076b313 100755 --- a/quad.cpp +++ b/quad.cpp @@ -1,6 +1,10 @@ #include "quad.h" +#include + namespace vb01{ + using namespace std; + Quad::Quad(Vector3 size, bool spatial, int numVertDiv, int numHorDiv){ this->spatial = spatial; this->numVertDiv = numVertDiv; @@ -14,58 +18,72 @@ namespace vb01{ this->size = size; const int numHorQuads = numVertDiv + 1, numVertQuads = numHorDiv + 1; - const int numTris = 2 * numHorQuads * numVertQuads, numVerts = 3 * numTris; + const int numVertPos = (numHorQuads + 1) * (numVertQuads + 1), numTris = 2 * numHorQuads * numVertQuads, numVerts = 3 * numTris; Vector2 subQuadSize = Vector2(size.x / numHorQuads, size.y / numVertQuads); MeshData::Vertex *vertices = new MeshData::Vertex[numVerts]; - Vector3 *faceVertPos = new Vector3[6]; - Vector3 *norm = new Vector3(Vector3::VEC_J); + if(!meshBase.positions){ + meshBase.positions = new Vector3[numVertPos]; + meshBase.normals = new Vector3(Vector3::VEC_J); + meshBase.indices = new u32[numVerts]; + + for(int i = 0; i < numVerts; i++) + meshBase.indices[i] = i; + } + + Vector3 *faceVertPos = meshBase.positions; + Vector3 *norm = meshBase.normals; + u32 *indices = meshBase.indices; for(int i = 0; i < numHorQuads; i++){ for(int j = 0; j < numVertQuads; j++){ - int id = i * 6 * numHorQuads + j * 6; + int vertPosId = i * (numHorQuads + 1) + j; + int vertPosId2 = (i + 1) * (numHorQuads + 1) + j; Vector2 offset = Vector2(subQuadSize.x, subQuadSize.y); - faceVertPos[0] = Vector3(-.5 * size.x + offset.x * j, 0, -.5 * size.y + offset.y * i); - faceVertPos[1] = Vector3(-.5 * size.x + offset.x * (j + 1), 0, -.5 * size.y + offset.y * (i + 1)); - faceVertPos[2] = Vector3(-.5 * size.x + offset.x * (j + 1), 0, -.5 * size.y + offset.y * i); - faceVertPos[3] = Vector3(-.5 * size.x + offset.x * j, 0, -.5 * size.y + offset.y * i); - faceVertPos[4] = Vector3(-.5 * size.x + offset.x * j, 0, -.5 * size.y + offset.y * (i + 1)); - faceVertPos[5] = Vector3(-.5 * size.x + offset.x * (j + 1), 0, -.5 * size.y + offset.y * (i + 1)); + faceVertPos[vertPosId] = Vector3(-.5 * size.x + offset.x * i, 0, -.5 * size.y + offset.y * j); + faceVertPos[vertPosId + 1] = Vector3(-.5 * size.x + offset.x * i, 0, -.5 * size.y + offset.y * (j + 1)); + faceVertPos[vertPosId2] = Vector3(-.5 * size.x + offset.x * (i + 1), 0, -.5 * size.y + offset.y * j); + faceVertPos[vertPosId2 + 1] = Vector3(-.5 * size.x + offset.x * (i + 1), 0, -.5 * size.y + offset.y * (j + 1)); + + if(!spatial){ + int ids[4]{vertPosId, vertPosId + 1, vertPosId2, vertPosId2 + 1}; + + swap(faceVertPos[ids[0]].z, faceVertPos[ids[1]].z); + swap(faceVertPos[ids[2]].z, faceVertPos[ids[3]].z); + + for(int k = 0; k < 4; k++){ + faceVertPos[ids[k]].y = -faceVertPos[ids[k]].z; + faceVertPos[ids[k]].z = 0; + faceVertPos[ids[k]] += .5 * Vector3(size.x, size.y, 0); + } + } Vector2 faceVertUv[]{ - Vector2(float(j) / numHorQuads, float(i) / numVertQuads), - Vector2(float(j + 1) / numHorQuads, float(i + 1) / numVertQuads), - Vector2(float(j + 1) / numHorQuads, float(i) / numVertQuads), - Vector2(float(j) / numHorQuads, float(i) / numVertQuads), - Vector2(float(j) / numHorQuads, float(i + 1) / numVertQuads), - Vector2(float(j + 1) / numHorQuads, float(i + 1) / numVertQuads), + Vector2(float(i) / numHorQuads, 1 - float(j) / numVertQuads), + Vector2(float(i) / numHorQuads, 1 - float(j + 1) / numVertQuads), + Vector2(float(i + 1) / numHorQuads, 1 - float(j + 1) / numVertQuads), + Vector2(float(i + 1) / numHorQuads, 1 - float(j + 1) / numVertQuads), + Vector2(float(i + 1) / numHorQuads, 1 - float(j) / numVertQuads), + Vector2(float(i) / numHorQuads, 1 - float(j) / numVertQuads), }; - for(int k = 0; k < 6; k++){ - if(!spatial){ - faceVertPos[k].y = -faceVertPos[k].z; - faceVertPos[k].z = 0; - faceVertPos[k] += .5 * Vector3(size.x, size.y, 0); - } + int quadId = 6 * (i * numHorQuads + j); + int vertPosIds[6]{vertPosId, vertPosId + 1, vertPosId2 + 1, vertPosId2 + 1, vertPosId2, vertPosId}; + for(int k = 0; k < 6; k++){ MeshData::Vertex v; - v.pos = &faceVertPos[k]; + v.pos = &faceVertPos[vertPosIds[k]]; v.uv = faceVertUv[k]; v.tan = Vector3::VEC_I; v.norm = norm; v.biTan = Vector3::VEC_K; - vertices[id + k] = v; + vertices[quadId + k] = v; } } } - u32 *indices = new u32[numVerts]; - - for(int i = 0; i < numVerts; i++) - indices[i] = i; - - meshBase = MeshData((Vector3*)faceVertPos, nullptr, nullptr, nullptr, 6, nullptr, vertices, indices, numTris); + meshBase = MeshData(faceVertPos, nullptr, nullptr, nullptr, 6, norm, vertices, indices, numTris); } }