bool operator()() { Ogre::SceneManager* sm = GraphicsManager::get().sceneManager(); Ogre::Entity* entity = sm->createEntity( Ogre::StringConverter::toString(component->localId()), fileName); Ogre::StaticGeometry* sg = sm->createStaticGeometry( Ogre::StringConverter::toString(component->localId())); sg->addEntity( entity, positionComponent->sceneNode()->getPosition() + offset, positionComponent->sceneNode()->getOrientation() * offsetRotation); sg->build(); component->m_entity = entity; component->m_staticGeometry = sg; ThreadPool::get().schedule(boost::bind( &ComponentContainer::componentAttachedCallback, component->parent(), component)); return true; }
void gkGameObjectGroup::createStaticBatches(gkScene* scene) { Ogre::SceneManager* mgr = scene->getManager(); if (m_geometry) mgr->destroyStaticGeometry(m_geometry); m_geometry = 0; // Span all instances. gkResourceManager::ResourceIterator it = m_instanceManager->getResourceIterator(); while (it.hasMoreElements()) { gkGameObjectInstance* inst = static_cast<gkGameObjectInstance*>(it.getNext().second); if (!inst->isInstanced() || !(inst->getLayer() & scene->getLayer()) || inst->getRoot()->getOwner()!=scene) continue; gkGameObjectInstance::Objects::Iterator instIt = inst->getObjects().iterator(); while (instIt.hasMoreElements()) { gkGameObject* obj = instIt.getNext().second; obj->createInstance(); if (obj->getType() == GK_ENTITY) { const gkGameObjectProperties& props = obj->getProperties(); if (!props.isPhysicsObject()) { gkEntity* ent = obj->getEntity(); if (!m_geometry) m_geometry = mgr->createStaticGeometry(m_name.getName()); m_geometry->addEntity(ent->getEntity(), obj->getWorldPosition(), obj->getWorldOrientation(), obj->getWorldScale()); // no longer needed ent->_destroyAsStaticGeometry(); } } } } if (m_geometry) { m_geometry->build(); m_geometry->setCastShadows(false); } }