static void ProcessBlockVoxelMesh( ChunkEnvironment* env, int transparentNeighbors, MeshBuffer* materialMeshBuffer, float x, float y, float z, const BlockVoxelMesh* mesh ) { static const int dirCount = 6; static const int neighborDirs[dirCount] = { NEIGHBOR_POSITIVE_X, NEIGHBOR_NEGATIVE_X, NEIGHBOR_POSITIVE_Y, NEIGHBOR_NEGATIVE_Y, NEIGHBOR_POSITIVE_Z, NEIGHBOR_NEGATIVE_Z }; static const BlockVoxelMeshBuffers dirs[dirCount] = { POSITIVE_X, NEGATIVE_X, POSITIVE_Y, NEGATIVE_Y, POSITIVE_Z, NEGATIVE_Z }; const MeshBuffer* const* meshBuffers = &mesh->meshBuffers[0]; const Mat4* transformations = mesh->transformations; const Vec3 translationVector = {{x,y,z}}; const Mat4 voxelTransformation = TranslateMat4(Mat4Identity, translationVector); if(transparentNeighbors != 0 && meshBuffers[CENTER]) { const Mat4 transformation = MulMat4(voxelTransformation, transformations[CENTER]); AppendMeshBuffer(materialMeshBuffer, meshBuffers[CENTER], &transformation); } for(int i = 0; i < dirCount; i++) { if(transparentNeighbors & neighborDirs[i] && meshBuffers[dirs[i]]) { const Mat4 transformation = MulMat4(voxelTransformation, transformations[dirs[i]]); AppendMeshBuffer(materialMeshBuffer, meshBuffers[dirs[i]], &transformation); } } }
int main( int argc, char** argv ) { InitTests(argc, argv); Describe("MeshBuffer") .use(dummySignalSandbox) .it("can be created, modified and freed.", [](){ MeshBuffer* buffer = CreateMeshBuffer(); AddVertexToMeshBuffer(buffer, CreateVertex(0,0,0)); AddIndexToMeshBuffer(buffer, 0); FreeMeshBuffer(buffer); }) .it("can be transformed.", [](){ MeshBuffer* buffer = CreateMeshBuffer(); AddVertexToMeshBuffer(buffer, CreateVertex(0,0,0)); AddIndexToMeshBuffer(buffer, 0); AddVertexToMeshBuffer(buffer, CreateVertex(0,1,0)); AddIndexToMeshBuffer(buffer, 1); const Vec3 v = {{1,0,0}}; const Mat4 m = TranslateMat4(Mat4Identity, v); TransformMeshBuffer(buffer, m); const Vertex* vertices = GetMeshBufferVertices(buffer); const Vec3 v1 = {{1,0,0}}; const Vec3 v2 = {{1,1,0}}; Require(vertices[0].position == v1); Require(vertices[1].position == v2); // TODO: Test if normal and tangent are transformed correctly. FreeMeshBuffer(buffer); }) .it("can be appended to another buffer.", [](){ MeshBuffer* a = CreateMeshBuffer(); AddVertexToMeshBuffer(a, CreateVertex(0,0,0)); AddIndexToMeshBuffer(a, 0); AddVertexToMeshBuffer(a, CreateVertex(0,1,0)); AddIndexToMeshBuffer(a, 1); MeshBuffer* b = CreateMeshBuffer(); AddVertexToMeshBuffer(b, CreateVertex(2,3,4)); AddIndexToMeshBuffer(b, 0); AddVertexToMeshBuffer(b, CreateVertex(5,6,7)); AddIndexToMeshBuffer(b, 1); AppendMeshBuffer(a, b, NULL); const Vertex* vertices = GetMeshBufferVertices(a); const VertexIndex* indices = GetMeshBufferIndices(a); Require(GetMeshBufferVertexCount(a) == 4); const Vec3 v2 = {{2,3,4}}; const Vec3 v3 = {{5,6,7}}; Require(vertices[2].position == v2); Require(vertices[3].position == v3); Require(GetMeshBufferIndexCount(a) == 4); Require(indices[2] == 2); Require(indices[3] == 3); FreeMeshBuffer(a); FreeMeshBuffer(b); }) .it("can be appended to another buffer while transforming it.", [](){ MeshBuffer* a = CreateMeshBuffer(); AddVertexToMeshBuffer(a, CreateVertex(0,0,0)); AddIndexToMeshBuffer(a, 0); AddVertexToMeshBuffer(a, CreateVertex(0,1,0)); AddIndexToMeshBuffer(a, 1); MeshBuffer* b = CreateMeshBuffer(); AddVertexToMeshBuffer(b, CreateVertex(2,3,4)); AddIndexToMeshBuffer(b, 0); AddVertexToMeshBuffer(b, CreateVertex(5,6,7)); AddIndexToMeshBuffer(b, 1); const Vec3 v = {{1,0,0}}; const Mat4 m = TranslateMat4(Mat4Identity, v); AppendMeshBuffer(a, b, &m); const Vertex* vertices = GetMeshBufferVertices(a); const VertexIndex* indices = GetMeshBufferIndices(a); Require(GetMeshBufferVertexCount(a) == 4); const Vec3 v2 = {{3,3,4}}; const Vec3 v3 = {{6,6,7}}; Require(vertices[2].position == v2); Require(vertices[3].position == v3); Require(GetMeshBufferIndexCount(a) == 4); Require(indices[2] == 2); Require(indices[3] == 3); // TODO: Test if normal and tangent are transformed correctly. FreeMeshBuffer(a); FreeMeshBuffer(b); }); return RunTests(); }