/// Create a new World instance. /// /// @param[in] pSceneDefinition The SceneDefinition from which to create the new World. /// /// @return Newly created world instance. Helium::World* WorldManager::CreateWorld( SceneDefinition* pSceneDefinition ) { // Any scene that creates a world must define a world definition so that the world knows what components to init on itself HELIUM_ASSERT(pSceneDefinition); const WorldDefinition *pWorldDefinition = pSceneDefinition->GetWorldDefinition(); WorldPtr spWorld; if (pWorldDefinition) { // Let the world definition provide the world spWorld = pWorldDefinition->CreateWorld(); } else { // Make a blank, default world. // TODO: Consider having the concept of a "default" world definition. Generally, not loading a world from a definition // is bad because pretty much any useful world should be initialized with world components HELIUM_ASSERT( 0 ); spWorld = new World(); spWorld->Initialize(); } HELIUM_ASSERT(spWorld.Get()); m_worlds.Push( spWorld ); if ( pSceneDefinition && spWorld ) { Slice *pRootSlice = spWorld->GetRootSlice(); size_t entityDefinitionCount = pSceneDefinition->GetEntityDefinitionCount(); for ( size_t i = 0; i < entityDefinitionCount; ++i ) { EntityDefinition *pEntityDefinition = pSceneDefinition->GetEntityDefinition( i ); HELIUM_ASSERT( pEntityDefinition ); Entity *pEntity = pRootSlice->CreateEntity(pEntityDefinition); } } return spWorld; }