Mesh* COLMeshConverter::convert(const COLSphere& sphere)
{
	MeshGenerator gen;
	float* vertices;
	float* normals;
	uint32_t* indices;
	unsigned int vertexCount, indexCount;
	gen.createSphere(vertices, normals, vertexCount, indices, indexCount, sphere.getRadius(), 4, 4);

	const COLSurface& surface = sphere.getSurface();
	uint8_t matNum = surface.getMaterial();
	uint8_t* colors = new uint8_t[vertexCount*4];
	uint8_t r, g, b;
	getMaterialColors(matNum, r, g, b);

	for (unsigned int i = 0 ; i < vertexCount ; i++) {
		colors[i*4] = r;
		colors[i*4 + 1] = g;
		colors[i*4 + 2] = b;
		colors[i*4 + 3] = 255;
	}

	//printf("glBufferData COLMeshConverter 1\n");

	GLuint dataBuffer;
	glGenBuffers(1, &dataBuffer);
	glBindBuffer(GL_ARRAY_BUFFER, dataBuffer);

	glBufferData(GL_ARRAY_BUFFER, vertexCount*3*4 + vertexCount*4, NULL, GL_STATIC_DRAW);
	Engine::getInstance()->increaseTestMem(vertexCount*3*4 + vertexCount*4, __FILE__, __LINE__);

	glBufferSubData(GL_ARRAY_BUFFER, 0, vertexCount*3*4, vertices);
	glBufferSubData(GL_ARRAY_BUFFER, vertexCount*3*4, vertexCount*4, colors);

	Mesh* mesh = new Mesh(vertexCount, VertexFormatTriangles, 0, dataBuffer, -1, -1, vertexCount*3*4);

	Submesh* submesh = new Submesh(mesh, indexCount, indices);
	mesh->link();

	const Vector3& center = sphere.getCenter();
	mesh->setBounds(center[0], center[1], center[2], sphere.getRadius());

	delete[] vertices;
	delete[] normals;
	delete[] indices;

	return mesh;
}
Mesh* COLMeshConverter::convert(const COLModel& model)
{
	const COLSphere* spheres = model.getSphereCount() != 0 ? &model.getSpheres()[0] : NULL;
	const COLBox* boxes = model.getBoxCount() != 0 ? &model.getBoxes()[0] : NULL;

	GLuint dataBuffer;
    glGenBuffers(1, &dataBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, dataBuffer);

    unsigned int vertexCount = 0;
    uint32_t sphereCount = model.getSphereCount();
    uint32_t boxCount = model.getBoxCount();

    float** boxVertexArrays = new float*[boxCount];
    float** sphereVertexArrays = new float*[sphereCount];
    uint32_t** boxIndexArrays = new uint32_t*[boxCount];
    uint32_t** sphereIndexArrays = new uint32_t*[sphereCount];
    unsigned int* boxVertexCounts = new unsigned int[boxCount];
    unsigned int* sphereVertexCounts = new unsigned int[sphereCount];
    unsigned int* boxIndexCounts = new unsigned int[boxCount];
    unsigned int* sphereIndexCounts = new unsigned int[sphereCount];

    MeshGenerator gen;

    for (uint32_t i = 0 ; i < sphereCount ; i++) {
		const COLSphere& sphere = spheres[i];
		float* tmpNormals;
		gen.createSphere(sphereVertexArrays[i], tmpNormals, sphereVertexCounts[i], sphereIndexArrays[i],
				sphereIndexCounts[i], sphere.getRadius(), 4, 4, sphere.getCenter());
		delete[] tmpNormals;
        vertexCount += sphereVertexCounts[i];
    }

    for (uint32_t i = 0 ; i < boxCount ; i++) {
        const COLBox& box = boxes[i];
        gen.createBox(boxVertexArrays[i], boxVertexCounts[i], boxIndexArrays[i], boxIndexCounts[i],
                  box.getMinimum(), box.getMaximum());
        vertexCount += boxVertexCounts[i];
    }

    unsigned int modelVertexCount;
    float* modelVertices;
    uint8_t* modelColors;
    uint32_t* modelIndices;
    unsigned int modelIndexCount;

    convertVertexModel(model.getVertices(), model.getVertexCount(),
    		model.getFaceCount() != 0 ? &model.getFaces()[0] : NULL, model.getFaceCount(),
    		modelVertexCount, modelVertices, modelColors, modelIndices, modelIndexCount);
    vertexCount += modelVertexCount;

    //printf("glBufferData COLMeshConverter 3\n");

    glBufferData(GL_ARRAY_BUFFER, vertexCount*3*4 + vertexCount*4, NULL, GL_STATIC_DRAW);
    Engine::getInstance()->increaseTestMem(vertexCount*3*4 + vertexCount*4, __FILE__, __LINE__);
    int vertexOffset = 0;
    int colorOffset = vertexCount*3*4;

    glBufferSubData(GL_ARRAY_BUFFER, 0, modelVertexCount*3*4, modelVertices);
    glBufferSubData(GL_ARRAY_BUFFER, colorOffset, modelVertexCount*4, modelColors);
    vertexOffset = modelVertexCount;

    /*Mesh* mesh = new Mesh(vertexCount, VertexFormatTriangles, MeshVertexColors, dataBuffer, -1, -1,
    		colorOffset);*/

    Mesh* mesh = new Mesh(vertexCount, VertexFormatTriangles, 0, dataBuffer, vertexCount*3*4 + vertexCount*4,
			0, 0, -1, -1, -1, -1, vertexCount*3*4, 0);

    delete[] modelVertices;
    delete[] modelColors;

    uint8_t r, g, b;

    for (uint32_t i = 0 ; i < sphereCount ; i++) {
    	const COLSphere& sphere = spheres[i];
    	unsigned int vertexCount = sphereVertexCounts[i];

    	// Create the vertex colors array
    	uint8_t* colors = new uint8_t[vertexCount*4];
    	const COLSurface& surface = sphere.getSurface();
    	uint8_t matNum = surface.getMaterial();
    	getMaterialColors(matNum, r, g, b);

        for (unsigned int j = 0 ; j < vertexCount ; j++) {
        	colors[j*4] = r;
        	colors[j*4+1] = g;
        	colors[j*4+2] = b;
        	colors[j*4+3] = 255;
        }

        // Fill the buffers with vertex data
        glBufferSubData(GL_ARRAY_BUFFER, vertexOffset*3*4, vertexCount*3*4, sphereVertexArrays[i]);
        glBufferSubData(GL_ARRAY_BUFFER, colorOffset + vertexOffset*4, vertexCount*4, colors);
        vertexOffset += vertexCount;

        delete[] colors;
    }

    for (uint32_t i = 0 ; i < boxCount ; i++) {
        const COLBox& box = boxes[i];
    	unsigned int vertexCount = boxVertexCounts[i];

    	// Create the vertex colors array
    	uint8_t* colors = new uint8_t[vertexCount*4];
    	const COLSurface& surface = box.getSurface();
    	uint8_t matNum = surface.getMaterial();
    	getMaterialColors(matNum, r, g, b);

        for (unsigned int j = 0 ; j < vertexCount ; j++) {
        	colors[j*4] = r;
        	colors[j*4+1] = g;
        	colors[j*4+2] = b;
        	colors[j*4+3] = 255;
        }

        // Fill the buffers with vertex data
        glBufferSubData(GL_ARRAY_BUFFER, vertexOffset*3*4, vertexCount*3*4, boxVertexArrays[i]);
        glBufferSubData(GL_ARRAY_BUFFER, colorOffset + vertexOffset*4, vertexCount*4, colors);
        vertexOffset += vertexCount;

        delete[] colors;
    }

    Submesh* submesh = new Submesh(mesh, modelIndexCount, modelIndices);
    vertexOffset = modelVertexCount;

    delete[] modelIndices;

    for (uint32_t i = 0 ; i < sphereCount ; i++) {
    	unsigned int indexCount = sphereIndexCounts[i];
    	uint32_t* indices = sphereIndexArrays[i];
    	for (unsigned int j = 0 ; j < indexCount ; j++) {
    		indices[j] += vertexOffset;
    	}

    	Submesh* submesh = new Submesh(mesh, indexCount, indices);
    	vertexOffset += sphereVertexCounts[i];

    	delete[] sphereVertexArrays[i];
    	delete[] sphereIndexArrays[i];
    }

    delete[] sphereVertexArrays;
    delete[] sphereIndexArrays;
    delete[] sphereVertexCounts;
    delete[] sphereIndexCounts;

    for (uint32_t i = 0 ; i < boxCount ; i++) {
    	unsigned int indexCount = boxIndexCounts[i];
    	uint32_t* indices = boxIndexArrays[i];
    	for (unsigned int j = 0 ; j < indexCount ; j++) {
    		indices[j] += vertexOffset;
    	}

        Submesh* submesh = new Submesh(mesh, indexCount, indices);
        vertexOffset += boxVertexCounts[i];

        delete[] boxVertexArrays[i];
        delete[] boxIndexArrays[i];
    }

    delete[] boxVertexArrays;
    delete[] boxIndexArrays;
    delete[] boxVertexCounts;
    delete[] boxIndexCounts;

    mesh->link();

    const COLBounds& bounds = model.getBounds();
    const Vector3& center = bounds.getCenter();
    mesh->setBounds(center.getX(), center.getY(), center.getZ(), bounds.getRadius());

    return mesh;
}