//-----------------------------------------------------------------------
	void BillboardChain::setupVertexDeclaration(void)
	{
		if (mVertexDeclDirty)
		{
			VertexDeclaration* decl = mVertexData->vertexDeclaration;
			decl->removeAllElements();

			size_t offset = 0;
			// Add a description for the buffer of the positions of the vertices
			decl->addElement(0, offset, VET_FLOAT3, VES_POSITION);
			offset += VertexElement::getTypeSize(VET_FLOAT3);

			if (mUseVertexColour)
			{
				decl->addElement(0, offset, VET_COLOUR, VES_DIFFUSE);
				offset += VertexElement::getTypeSize(VET_COLOUR);
			}

			if (mUseTexCoords)
			{
				decl->addElement(0, offset, VET_FLOAT2, VES_TEXTURE_COORDINATES);
			}

			if (!mUseTexCoords && !mUseVertexColour)
			{
				LogManager::getSingleton().logMessage(
					"Error - BillboardChain '" + mName + "' is using neither "
					"texture coordinates or vertex colours; it will not be "
					"visible on some rendering APIs so you should change this "
					"so you use one or the other.");
			}
			mVertexDeclDirty = false;
		}
	}
SurfacePatchRenderable::SurfacePatchRenderable() : SimpleRenderable()
{
	// Set up what we can of the vertex data
	mRenderOp.vertexData = new VertexData();
	mRenderOp.vertexData->vertexStart = 0;
	mRenderOp.vertexData->vertexCount = 0;
	mRenderOp.operationType = RenderOperation::OT_TRIANGLE_LIST;

	// Set up what we can of the index data
	mRenderOp.indexData = new IndexData();
	mRenderOp.useIndexes = true;
	mRenderOp.indexData->indexStart = 0;
	mRenderOp.indexData->indexCount = 0;

	// Set up the vertex declaration
	VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration;
	decl->removeAllElements();
	decl->addElement(0, 0, VET_FLOAT3, VES_POSITION);
	decl->addElement(0, 3 * sizeof(float), VET_FLOAT3, VES_NORMAL);
	decl->addElement(0, 6 * sizeof(float), VET_FLOAT3, VES_TEXTURE_COORDINATES);
	decl->addElement(0, 9 * sizeof(float), VET_FLOAT3, VES_TEXTURE_COORDINATES, 1);
}