bool FoliageClass::Initialize(ID3D11Device* device, WCHAR* textureFilename, int fCount) { bool result; // Set the foliage count. m_foliageCount = fCount; // Generate the positions of the foliage. result = GeneratePositions(); if(!result) { return false; } // Initialize the vertex and instance buffer that hold the geometry for the foliage model. result = InitializeBuffers(device); if(!result) { return false; } // Load the texture for this model. result = LoadTexture(device, textureFilename); if(!result) { return false; } // Set the initial wind rotation and direction. m_windRotation = 0.0f; m_windDirection = 1; return true; }
void csMeshGenerator::AllocateBlock (int cidx, csMGCell& cell) { if (cell.block) { // Our block is already there. We just push it back to the // front of 'inuse_blocks' if it is not already there. csMGPositionBlock* block = cell.block; if (block->prev) { // Unlink first. block->prev->next = block->next; if (block->next) block->next->prev = block->prev; else inuse_blocks_last = block->prev; // Link to front. block->next = inuse_blocks; block->prev = 0; inuse_blocks->prev = block; inuse_blocks = block; } // It is possible that our positions got cleared so we may have to // recalculate them here. if (cell.needPositions) { GeneratePositions (cidx, cell, block); } } else if (cache_blocks.GetSize () > 0) { // We need a new block and one is available in the cache. csMGPositionBlock* block = cache_blocks.Pop (); CS_ASSERT (block->parent_cell == csArrayItemNotFound); CS_ASSERT (block->next == 0 && block->prev == 0); block->parent_cell = cidx; cell.block = block; // Link block to the front. block->next = inuse_blocks; block->prev = 0; if (inuse_blocks) inuse_blocks->prev = block; else inuse_blocks_last = block; inuse_blocks = block; GeneratePositions (cidx, cell, block); } else { // We need a new block and the cache is empty. // Now we take the last used block from 'inuse_blocks'. csMGPositionBlock* block = inuse_blocks_last; CS_ASSERT (block->parent_cell != csArrayItemNotFound); CS_ASSERT (block == cells[block->parent_cell].block); cells[block->parent_cell].block = 0; block->parent_cell = cidx; cell.block = block; // Unlink first. block->prev->next = 0; inuse_blocks_last = block->prev; // Link to front. block->next = inuse_blocks; block->prev = 0; inuse_blocks->prev = block; inuse_blocks = block; GeneratePositions (cidx, cell, block); } }