/// 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; } } }