static MeshBuffer* GetMeshBufferForMaterial( ChunkEnvironment* env, int materialId ) { int materialCount = env->materialCount; // Look if the material has already been used: for(int i = 0; i < materialCount; i++) if(env->materialIds[i] == materialId) return env->materialMeshBuffers[i]; // Create a new entry: // Extend the arrays by one: materialCount++; env->materialCount = materialCount; env->materialMeshBuffers = (MeshBuffer**)realloc(env->materialMeshBuffers, sizeof(MeshBuffer*)*materialCount); env->materialIds = (int*)realloc(env->materialIds, sizeof(int)*materialCount); // Insert the material: MeshBuffer* buffer = CreateMeshBuffer(); ReferenceMeshBuffer(buffer); env->materialIds[materialCount-1] = materialId; env->materialMeshBuffers[materialCount-1] = buffer; return buffer; }
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(); }