Axiom.Core.PrefabFactory._createCube C# (CSharp) Method

_createCube() private static method

Creates a 100x100x100 cube as a submesh of the given mesh
private static _createCube ( Axiom.Core.Mesh mesh ) : void
mesh Axiom.Core.Mesh
return void
		private static void _createCube( Mesh mesh )
		{
			SubMesh sub = mesh.CreateSubMesh();

			const int NUM_VERTICES = 4 * 6; // 4 vertices per side * 6 sides
			const int NUM_ENTRIES_PER_VERTEX = 8;
			const int NUM_VERTEX_ENTRIES = NUM_VERTICES * NUM_ENTRIES_PER_VERTEX;
			const int NUM_INDICES = 3 * 2 * 6; // 3 indices per face * 2 faces per side * 6 sides

			const float CUBE_SIZE = 100.0f;
			const float CUBE_HALF_SIZE = CUBE_SIZE / 2.0f;

			// Create 4 vertices per side instead of 6 that are shared for the whole cube.
			// The reason for this is with only 6 vertices the normals will look bad
			// since each vertex can "point" in a different direction depending on the face it is included in.
			float[] vertices = new float[ NUM_VERTEX_ENTRIES ] {
				// front side
				-CUBE_HALF_SIZE, -CUBE_HALF_SIZE, CUBE_HALF_SIZE,	// pos
				0,0,1,	// normal
				0,1,	// texcoord
				CUBE_HALF_SIZE, -CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				0,0,1,
				1,1,
				CUBE_HALF_SIZE,  CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				0,0,1,
				1,0,
				-CUBE_HALF_SIZE,  CUBE_HALF_SIZE, CUBE_HALF_SIZE ,
				0,0,1,
				0,0,

				// back side
				CUBE_HALF_SIZE, -CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				0,0,-1,
				0,1,
				-CUBE_HALF_SIZE, -CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				0,0,-1,
				1,1,
				-CUBE_HALF_SIZE, CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				0,0,-1,
				1,0,
				CUBE_HALF_SIZE, CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				0,0,-1,
				0,0,

				// left side
				-CUBE_HALF_SIZE, -CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				-1,0,0,
				0,1,
				-CUBE_HALF_SIZE, -CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				-1,0,0,
				1,1,
				-CUBE_HALF_SIZE, CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				-1,0,0,
				1,0,
				-CUBE_HALF_SIZE, CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				-1,0,0,
				0,0,

				// right side
				CUBE_HALF_SIZE, -CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				1,0,0,
				0,1,
				CUBE_HALF_SIZE, -CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				1,0,0,
				1,1,
				CUBE_HALF_SIZE, CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				1,0,0,
				1,0,
				CUBE_HALF_SIZE, CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				1,0,0,
				0,0,

				// up side
				-CUBE_HALF_SIZE, CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				0,1,0,
				0,1,
				CUBE_HALF_SIZE, CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				0,1,0,
				1,1,
				CUBE_HALF_SIZE, CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				0,1,0,
				1,0,
				-CUBE_HALF_SIZE, CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				0,1,0,
				0,0,

				// down side
				-CUBE_HALF_SIZE, -CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				0,-1,0,
				0,1,
				CUBE_HALF_SIZE, -CUBE_HALF_SIZE, -CUBE_HALF_SIZE,
				0,-1,0,
				1,1,
				CUBE_HALF_SIZE, -CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				0,-1,0,
				1,0,
				-CUBE_HALF_SIZE, -CUBE_HALF_SIZE, CUBE_HALF_SIZE,
				0,-1,0,
				0,0
			};

			mesh.SharedVertexData = new VertexData();
			mesh.SharedVertexData.vertexCount = NUM_VERTICES;
			VertexDeclaration decl = mesh.SharedVertexData.vertexDeclaration;
			VertexBufferBinding bind = mesh.SharedVertexData.vertexBufferBinding;

			int offset = 0;
			decl.AddElement( 0, offset, VertexElementType.Float3, VertexElementSemantic.Position );
			offset += VertexElement.GetTypeSize( VertexElementType.Float3 );
			decl.AddElement( 0, offset, VertexElementType.Float3, VertexElementSemantic.Normal );
			offset += VertexElement.GetTypeSize( VertexElementType.Float3 );
			decl.AddElement( 0, offset, VertexElementType.Float2, VertexElementSemantic.TexCoords, 0 );
			offset += VertexElement.GetTypeSize( VertexElementType.Float2 );

			HardwareVertexBuffer vbuf =	HardwareBufferManager.Instance.CreateVertexBuffer( decl, NUM_VERTICES, BufferUsage.StaticWriteOnly );
			bind.SetBinding( 0, vbuf );

			vbuf.WriteData( 0, vbuf.Size, vertices, true );

			sub.useSharedVertices = true;
			HardwareIndexBuffer ibuf = HardwareBufferManager.Instance.CreateIndexBuffer( IndexType.Size16, NUM_INDICES,	BufferUsage.StaticWriteOnly );

			short[] faces = new short[ NUM_INDICES ] {
				// front
				0,1,2,
				0,2,3,

				// back
				4,5,6,
				4,6,7,

				// left
				8,9,10,
				8,10,11,

				// right
				12,13,14,
				12,14,15,

				// up
				16,17,18,
				16,18,19,

				// down
				20,21,22,
				20,22,23
			};

			sub.IndexData.indexBuffer = ibuf;
			sub.IndexData.indexCount = NUM_INDICES;
			sub.IndexData.indexStart = 0;
			ibuf.WriteData( 0, ibuf.Size, faces, true );

			mesh.BoundingBox = new AxisAlignedBox( new Vector3( -CUBE_HALF_SIZE, -CUBE_HALF_SIZE, -CUBE_HALF_SIZE ),
												   new Vector3( CUBE_HALF_SIZE, CUBE_HALF_SIZE, CUBE_HALF_SIZE ) );

			mesh.BoundingSphereRadius = CUBE_HALF_SIZE;

		}