Exemple #1
0
bool Model::EndLoad()
{
    // Upload vertex buffer data
    for (unsigned i = 0; i < vertexBuffers_.Size(); ++i)
    {
        VertexBuffer* buffer = vertexBuffers_[i];
        VertexBufferDesc& desc = loadVBData_[i];
        if (desc.data_)
        {
            buffer->SetShadowed(true);
            buffer->SetSize(desc.vertexCount_, desc.vertexElements_);
            buffer->SetData(desc.data_.Get());
        }
    }

    // Upload index buffer data
    for (unsigned i = 0; i < indexBuffers_.Size(); ++i)
    {
        IndexBuffer* buffer = indexBuffers_[i];
        IndexBufferDesc& desc = loadIBData_[i];
        if (desc.data_)
        {
            buffer->SetShadowed(true);
            buffer->SetSize(desc.indexCount_, desc.indexSize_ > sizeof(unsigned short));
            buffer->SetData(desc.data_.Get());
        }
    }

    // Set up geometries
    for (unsigned i = 0; i < geometries_.Size(); ++i)
    {
        for (unsigned j = 0; j < geometries_[i].Size(); ++j)
        {
            Geometry* geometry = geometries_[i][j];
            GeometryDesc& desc = loadGeometries_[i][j];
            geometry->SetVertexBuffer(0, vertexBuffers_[desc.vbRef_]);
            geometry->SetIndexBuffer(indexBuffers_[desc.ibRef_]);
            geometry->SetDrawRange(desc.type_, desc.indexStart_, desc.indexCount_);
        }
    }

    loadVBData_.Clear();
    loadIBData_.Clear();
    loadGeometries_.Clear();
    return true;
}
//[-------------------------------------------------------]
//[ Public virtual SPK::BufferHandler functions           ]
//[-------------------------------------------------------]
void SPK_PLQuadRenderer::createBuffers(const SPK::Group &group)
{
	// Create the SPK_PLBuffer instance
	m_pSPK_PLBuffer = static_cast<SPK_PLBuffer*>(group.createBuffer(PLBufferName, PLBufferCreator(GetPLRenderer(), NumOfVerticesPerParticle, NumOfIndicesPerParticle, texturingMode), 0U, false));

	// Is there a valid m_pSPK_PLBuffer instance?
	if (m_pSPK_PLBuffer && m_pSPK_PLBuffer->GetVertexBuffer()) {
		switch (texturingMode) {
			case SPK::TEXTURE_2D:
				if (!group.getModel()->isEnabled(SPK::PARAM_TEXTURE_INDEX)) {
					// Get the vertex buffer instance from m_pSPK_PLBuffer and lock it
					VertexBuffer *pVertexBuffer = m_pSPK_PLBuffer->GetVertexBuffer();
					if (pVertexBuffer->Lock(Lock::WriteOnly)) {
						// Set correct data
						const uint32 nVertexSize = pVertexBuffer->GetVertexSize();
						float *pfTexCoord = static_cast<float*>(pVertexBuffer->GetData(0, VertexBuffer::TexCoord));
						for (size_t i=0; i<group.getParticles().getNbReserved(); i++) {
							// Top right vertex
							pfTexCoord[0] = 1.0f;
							pfTexCoord[1] = 0.0f;
							pfTexCoord = reinterpret_cast<float*>(reinterpret_cast<char*>(pfTexCoord) + nVertexSize);	// Next, please!

							// Top left vertex
							pfTexCoord[0] = 0.0f;
							pfTexCoord[1] = 0.0f;
							pfTexCoord = reinterpret_cast<float*>(reinterpret_cast<char*>(pfTexCoord) + nVertexSize);	// Next, please!

							// Bottom left
							pfTexCoord[0] = 0.0f;
							pfTexCoord[1] = 1.0f;
							pfTexCoord = reinterpret_cast<float*>(reinterpret_cast<char*>(pfTexCoord) + nVertexSize);	// Next, please!

							// Bottom right
							pfTexCoord[0] = 1.0f;
							pfTexCoord[1] = 1.0f;
							pfTexCoord = reinterpret_cast<float*>(reinterpret_cast<char*>(pfTexCoord) + nVertexSize);	// Next, please!
						}

						// Unlock the vertex buffer
						pVertexBuffer->Unlock();
					}
				}
				break;

			case SPK::TEXTURE_3D:
			{
				// Get the vertex buffer instance from m_pSPK_PLBuffer and lock it
				VertexBuffer *pVertexBuffer = m_pSPK_PLBuffer->GetVertexBuffer();
				if (pVertexBuffer->Lock(Lock::WriteOnly)) {
					// Set correct data
					const uint32 nVertexSize = pVertexBuffer->GetVertexSize();
					float *pfTexCoord = static_cast<float*>(pVertexBuffer->GetData(0, VertexBuffer::TexCoord));
					for (size_t i=0; i<group.getParticles().getNbReserved(); i++) {
						// Top right vertex
						pfTexCoord[0] = 1.0f;
						pfTexCoord[1] = 0.0f;
						pfTexCoord[2] = 0.0f;
						pfTexCoord = reinterpret_cast<float*>(reinterpret_cast<char*>(pfTexCoord) + nVertexSize);	// Next, please!

						// Top left vertex
						pfTexCoord[0] = 0.0f;
						pfTexCoord[1] = 0.0f;
						pfTexCoord[2] = 0.0f;
						pfTexCoord = reinterpret_cast<float*>(reinterpret_cast<char*>(pfTexCoord) + nVertexSize);	// Next, please!

						// Bottom left
						pfTexCoord[0] = 0.0f;
						pfTexCoord[1] = 1.0f;
						pfTexCoord[2] = 0.0f;
						pfTexCoord = reinterpret_cast<float*>(reinterpret_cast<char*>(pfTexCoord) + nVertexSize);	// Next, please!

						// Bottom right
						pfTexCoord[0] = 1.0f;
						pfTexCoord[1] = 1.0f;
						pfTexCoord[2] = 0.0f;
						pfTexCoord = reinterpret_cast<float*>(reinterpret_cast<char*>(pfTexCoord) + nVertexSize);	// Next, please!
					}

					// Unlock the vertex buffer
					pVertexBuffer->Unlock();
				}
				break;
			}
		}
	}

	// Is there a valid m_pSPK_PLBuffer instance?
	if (m_pSPK_PLBuffer && m_pSPK_PLBuffer->GetIndexBuffer()) {
		// Get the index buffer instance from m_pSPK_PLBuffer and lock it
		IndexBuffer *pIndexBuffer = m_pSPK_PLBuffer->GetIndexBuffer();
		if (pIndexBuffer && pIndexBuffer->Lock(Lock::WriteOnly)) {
			// Fill the index buffer with valid data
			for (uint32 i=0, nVertices=4, nIndex=0; i<group.getParticles().getNbReserved(); i++, nVertices+=4) {
				// Triangle 1
				pIndexBuffer->SetData(nIndex++, nVertices-4);
				pIndexBuffer->SetData(nIndex++, nVertices-3);
				pIndexBuffer->SetData(nIndex++, nVertices-2);

				// Triangle 2
				pIndexBuffer->SetData(nIndex++, nVertices-4);
				pIndexBuffer->SetData(nIndex++, nVertices-2);
				pIndexBuffer->SetData(nIndex++, nVertices-1);
			}

			// Unlock the index buffer
			pIndexBuffer->Unlock();
		}
	}
}
//[-------------------------------------------------------]
//[ Private virtual MeshCreator functions                 ]
//[-------------------------------------------------------]
Mesh *MeshCreatorCube::Create(Mesh &cMesh, uint32 nLODLevel, bool bStatic) const
{
	// Call base implementation
	MeshCreator::Create(cMesh, nLODLevel, bStatic);

	// Get dimension and offset
	const Vector3 &vDimension = Dimension.Get();
	const Vector3 &vOffset    = Offset.Get();

	// Get morph target
	MeshMorphTarget *pMorphTarget = cMesh.GetMorphTarget(0);
	if (pMorphTarget && pMorphTarget->GetVertexBuffer()) {
		VertexBuffer *pVertexBuffer = pMorphTarget->GetVertexBuffer();
		if (TexCoords || Normals) {
			// Allocate data
			pVertexBuffer->AddVertexAttribute(VertexBuffer::Position, 0, VertexBuffer::Float3);
			if (TexCoords)
				pVertexBuffer->AddVertexAttribute(VertexBuffer::TexCoord, 0, VertexBuffer::Float2);
			if (Normals)
				pVertexBuffer->AddVertexAttribute(VertexBuffer::Normal, 0, VertexBuffer::Float3);
			pVertexBuffer->Allocate(24, bStatic ? Usage::Static : Usage::Dynamic);
			if (pVertexBuffer->Lock(Lock::WriteOnly)) { // Setup vertices
			// x-positive (0)
				// 0
				float *pfVertices = static_cast<float*>(pVertexBuffer->GetData(0, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 1
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(1, VertexBuffer::Position));
				pfVertices[Vector3::X] = vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = vDimension.z + vOffset.z;

				// 2
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(2, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 3
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(3, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

			// x-negative (1)
				// 4
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(4, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 5
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(5, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 6
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(6, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 7
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(7, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

			// y-positive (2)
				// 8
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(8, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 9
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(9, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 10
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(10, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 11
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(11, VertexBuffer::Position));
				pfVertices[Vector3::X] = vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = vDimension.z + vOffset.z;

			// y-negative (3)
				// 12
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(12, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 13
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(13, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 14
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(14, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 15
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(15, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

			// z-positive (4)
				// 16
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(16, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 17
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(17, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 18
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(18, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 19
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(19, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

			// z-negative (5)
				// 20
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(20, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 21
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(21, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 22
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(22, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 23
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(23, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// Setup texture coordinates
				if (TexCoords) {
					for (int nSide=0; nSide<6; nSide++) {
						// 0
						pfVertices = static_cast<float*>(pVertexBuffer->GetData(0+nSide*4, VertexBuffer::TexCoord));
						pfVertices[Vector2::X] = 1.0f;
						pfVertices[Vector2::Y] = 0.0f;

						// 1
						pfVertices = static_cast<float*>(pVertexBuffer->GetData(1+nSide*4, VertexBuffer::TexCoord));
						pfVertices[Vector2::X] = 0.0f;
						pfVertices[Vector2::Y] = 0.0f;

						// 2
						pfVertices = static_cast<float*>(pVertexBuffer->GetData(2+nSide*4, VertexBuffer::TexCoord));
						pfVertices[Vector2::X] = 0.0f;
						pfVertices[Vector2::Y] = 1.0f;

						// 3
						pfVertices = static_cast<float*>(pVertexBuffer->GetData(3+nSide*4, VertexBuffer::TexCoord));
						pfVertices[Vector2::X] = 1.0f;
						pfVertices[Vector2::Y] = 1.0f;
					}
				}

				// Setup normal vectors
				if (Normals) {
					// x-positive (0)
					SetNormals(*pVertexBuffer, 0, 1.0f, 0.0f, 0.0f);

					// x-negative (1)
					SetNormals(*pVertexBuffer, 1, -1.0f, 0.0f, 0.0f);

					// y-positive (2)
					SetNormals(*pVertexBuffer, 2, 0.0f, 1.0f, 0.0f);

					// y-negative (3)
					SetNormals(*pVertexBuffer, 3, 0.0f, -1.0f, 0.0f);

					// z-positive (4)
					SetNormals(*pVertexBuffer, 4, 0.0f, 0.0f, 1.0f);

					// z-negative (5)
					SetNormals(*pVertexBuffer, 5, 0.0f, 0.0f, -1.0f);
				}

				// Unlock the vertex buffer
				pVertexBuffer->Unlock();
			}

			// Get LOD level
			MeshLODLevel *pLODLevel = cMesh.GetLODLevel(nLODLevel);
			if (pLODLevel && pLODLevel->GetIndexBuffer()) {
				// Allocate and setup index buffer
				IndexBuffer *pIndexBuffer = pLODLevel->GetIndexBuffer();
				pIndexBuffer->SetElementTypeByMaximumIndex(pVertexBuffer->GetNumOfElements()-1);
				pIndexBuffer->Allocate(24, bStatic ? Usage::Static : Usage::Dynamic);
				if (pIndexBuffer->Lock(Lock::WriteOnly)) {
					for (int nSide=0; nSide<6; nSide++) {
						if (Order) {
							pIndexBuffer->SetData(nSide*4+0, nSide*4+3-2);
							pIndexBuffer->SetData(nSide*4+1, nSide*4+3-3);
							pIndexBuffer->SetData(nSide*4+2, nSide*4+3-1);
							pIndexBuffer->SetData(nSide*4+3, nSide*4+3-0);
						} else {
							pIndexBuffer->SetData(nSide*4+0, nSide*4+3-1);
							pIndexBuffer->SetData(nSide*4+1, nSide*4+3-0);
							pIndexBuffer->SetData(nSide*4+2, nSide*4+3-2);
							pIndexBuffer->SetData(nSide*4+3, nSide*4+3-3);
						}
					}

					// Unlock the index buffer
					pIndexBuffer->Unlock();
				}

				// Create the geometries
				Array<Geometry> &lstGeometries = *pLODLevel->GetGeometries();
				for (int i=0; i<6; i++) {
					Geometry &cGeometry = lstGeometries.Add();
					cGeometry.SetPrimitiveType(Primitive::TriangleStrip);
					cGeometry.SetStartIndex(i*4);
					cGeometry.SetIndexSize(4);
					if (MultiMaterials && i) {
						cMesh.AddMaterial(cMesh.GetRenderer()->GetRendererContext().GetMaterialManager().Create());
						cGeometry.SetMaterial(i);
					}
				}
			}
		} else { // No texture coordinates
			// Allocate and setup data
			pVertexBuffer->AddVertexAttribute(VertexBuffer::Position, 0, VertexBuffer::Float3);
			pVertexBuffer->Allocate(8, bStatic ? Usage::Static : Usage::Dynamic);
			if (pVertexBuffer->Lock(Lock::WriteOnly)) { // Setup vertices
				// 0
				float *pfVertices = static_cast<float*>(pVertexBuffer->GetData(0, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 1
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(1, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 2
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(2, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 3
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(3, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] =  vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 4
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(4, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 5
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(5, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] = -vDimension.z + vOffset.z;

				// 6
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(6, VertexBuffer::Position));
				pfVertices[Vector3::X] =  vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// 7
				pfVertices = static_cast<float*>(pVertexBuffer->GetData(7, VertexBuffer::Position));
				pfVertices[Vector3::X] = -vDimension.x + vOffset.x;
				pfVertices[Vector3::Y] = -vDimension.y + vOffset.y;
				pfVertices[Vector3::Z] =  vDimension.z + vOffset.z;

				// Unlock the vertex buffer
				pVertexBuffer->Unlock();
			}

			// Get LOD level
			MeshLODLevel *pLODLevel = cMesh.GetLODLevel(nLODLevel);
			if (pLODLevel) {
				// Allocate and setup index buffer
				IndexBuffer *pIndexBuffer = pLODLevel->GetIndexBuffer();
				pIndexBuffer->SetElementTypeByMaximumIndex(pVertexBuffer->GetNumOfElements()-1);
				pIndexBuffer->Allocate(24, bStatic ? Usage::Static : Usage::Dynamic);
				if (pIndexBuffer->Lock(Lock::WriteOnly)) {
					if (Order) {
						// Left
						pIndexBuffer->SetData(0,  7);
						pIndexBuffer->SetData(1,  4);
						pIndexBuffer->SetData(2,  3);
						pIndexBuffer->SetData(3,  0);
						// Front
						pIndexBuffer->SetData(4,  1);
						pIndexBuffer->SetData(5,  0);
						pIndexBuffer->SetData(6,  5);
						pIndexBuffer->SetData(7,  4);
						// Right
						pIndexBuffer->SetData(8,  5);
						pIndexBuffer->SetData(9,  6);
						pIndexBuffer->SetData(10, 1);
						pIndexBuffer->SetData(11, 2);
						// Back
						pIndexBuffer->SetData(12, 6);
						pIndexBuffer->SetData(13, 7);
						pIndexBuffer->SetData(14, 2);
						pIndexBuffer->SetData(15, 3);
						// Top
						pIndexBuffer->SetData(16, 2);
						pIndexBuffer->SetData(17, 3);
						pIndexBuffer->SetData(18, 1);
						pIndexBuffer->SetData(19, 0);
						// Bottom
						pIndexBuffer->SetData(20, 5);
						pIndexBuffer->SetData(21, 4);
						pIndexBuffer->SetData(22, 6);
						pIndexBuffer->SetData(23, 7);
					} else {
						// Left
						pIndexBuffer->SetData(0,  3);
						pIndexBuffer->SetData(1,  0);
						pIndexBuffer->SetData(2,  7);
						pIndexBuffer->SetData(3,  4);
						// Front
						pIndexBuffer->SetData(4,  5);
						pIndexBuffer->SetData(5,  4);
						pIndexBuffer->SetData(6,  1);
						pIndexBuffer->SetData(7,  0);
						// Right
						pIndexBuffer->SetData(8,  1);
						pIndexBuffer->SetData(9,  2);
						pIndexBuffer->SetData(10, 5);
						pIndexBuffer->SetData(11, 6);
						// Back 
						pIndexBuffer->SetData(12, 2);
						pIndexBuffer->SetData(13, 3);
						pIndexBuffer->SetData(14, 6);
						pIndexBuffer->SetData(15, 7);
						// Top
						pIndexBuffer->SetData(16, 1);
						pIndexBuffer->SetData(17, 0);
						pIndexBuffer->SetData(18, 2);
						pIndexBuffer->SetData(19, 3);
						// Bottom
						pIndexBuffer->SetData(20, 6);
						pIndexBuffer->SetData(21, 7);
						pIndexBuffer->SetData(22, 5);
						pIndexBuffer->SetData(23, 4);
					}

					// Unlock the index buffer
					pIndexBuffer->Unlock();
				}

				// Create the geometries
				Array<Geometry> &lstGeometries = *pLODLevel->GetGeometries();
				for (int i=0; i<6; i++) {
					Geometry &cGeometry = lstGeometries.Add();
					cGeometry.SetPrimitiveType(Primitive::TriangleStrip);
					cGeometry.SetStartIndex(i*4);
					cGeometry.SetIndexSize(4);
				}
			}
		}
	}

	// Return the created mesh
	return &cMesh;
}