void ChunkLoadTask::Run()
{
	// Wait until we have some memory for this chunk (we may need to wait for another
	// chunk to be unloaded).
	void* mem = NULL;
	while (true)
	{
		mem = m_manager->Get_Chunk_Memory_Pool().Allocate();
		if (mem != NULL)
		{
			break;
		}

		Thread::Get_Current()->Sleep(0.01f);
	}
				
	Chunk* chunk = new(mem) Chunk  (m_manager, m_position.X, m_position.Y, m_position.Z, 
									m_config.chunk_size.X, m_config.chunk_size.Y, m_config.chunk_size.Z,
									m_config.voxel_size.X, m_config.voxel_size.Y, m_config.voxel_size.Z);

	chunk->Set_Status(ChunkStatus::Loading);
		
	// Load actual chunk.
	RegionFile* region = m_manager->Get_Region_File(chunk->Get_Region());
	if (region->Contains_Chunk(chunk))
	{
		region->Load_Chunk(chunk);
	}
	else
	{
		// Generate a procedural chunk.
		ChunkGenerator generator(m_manager, m_config);
		generator.Generate(chunk);

		// Save generated result.
		region->Save_Chunk(chunk);
	}
				
	// Loaded!
	chunk->Set_Status(ChunkStatus::Loaded);
	chunk->Recalculate_State();

	// Done, store result!
	m_chunk = chunk;
}