/// Pre allocate imposters and calculate texture coordinates.
void ImposterSystem::AllocImposters(int numImpostersU, int numImpostersV)
{
	// Pre-allocate all imposters in an array.

	m_NumImpostersU = numImpostersU;
	m_NumImpostersV = numImpostersV;
	m_MaxNumImposters = numImpostersU * numImpostersV;
	m_pImposters = new Imposter[m_MaxNumImposters];
	m_pSortBuffer = new Imposter*[m_MaxNumImposters];

	float uWidth = 1.0f / (float) numImpostersU;
	float vWidth = 1.0f / (float) numImpostersV;

	// Initialise imposters and divide up the imposter render texture
	// among all of them.

	int i = 0;
	for (int u = 0; u < numImpostersU; ++u)
	{
		for (int v = 0; v < numImpostersV; ++v)
		{
			Imposter* pImposter = &m_pImposters[i];

			// Initialise imposter members.

			pImposter->requiresRegeneration = true;
			pImposter->startTime = 0;
			pImposter->endTime = FLT_MAX;
			pImposter->lastGeneratedTime = 0;
			pImposter->active = false;
			pImposter->generated = false;
			pImposter->cameraDistSq = 0.0f;

			// Calculate texture coordinates.

			float u1 = (float) u * uWidth;
			float v1 = (float) v * vWidth;
			float u2 = u1 + uWidth;
			float v2 = v1 + vWidth;
			pImposter->uvOffset.x = u1;
			pImposter->uvOffset.y = v1;
			pImposter->verts[0].uv = D3DXVECTOR2(u1, v1);
			pImposter->verts[1].uv = D3DXVECTOR2(u2, v1);
			pImposter->verts[2].uv = D3DXVECTOR2(u1, v2);
			pImposter->verts[3].uv = D3DXVECTOR2(u2, v1);
			pImposter->verts[4].uv = D3DXVECTOR2(u2, v2);
			pImposter->verts[5].uv = D3DXVECTOR2(u1, v2);
			++i;
		}
	}
}