void Replicator::update(float value) { //logFile << getFrequentcyRange() << " :\t " << value << "\n"; Ogre::Vector3 currentScale = getScale(); this->setThreshold(0.7*this->getThreshold() + 0.4*value); float result = value / this->getThreshold(); int numOfChildrenToGenerate = result > 1.0 ? (result - value) * 2 : 0; //logFile << value / this->getThreashold() << "\t" << (result - value) * 10 << "\t" << numOfChildrenToGenerate << "\n"; for ( int i = 0; i < numOfChildrenToGenerate; i++ ) { createChildren(numOfChildrenToGenerate); } for(std::vector<Ogre::Entity*>::size_type i = 0; i < children.size(); ) { Ogre::SceneNode* childNode = children[i]->getParentSceneNode(); Ogre::Real res = childNode->getScale().length(); if ( res < 0.1 ) { children[i]->setVisible(false); childNode->setVisible(false); childNode->detachObject(children[i]->getName()); _sceneManager->destroyEntity(children[i]->getName()); // entity is now destroyed, don't try to use the pointer anymore! // optionally destroy node _sceneManager->destroySceneNode(childNode->getName()); children.erase( children.begin() + i ); } else { Ogre::Vector3 currScale = childNode->getScale(); childNode->setScale(Ogre::Vector3(currScale.x - currScale.x/3, currScale.y - currScale.y/3, currScale.z - currScale.z/3)); i++; } } }
void CFakeObjectEntityManager::_DestroyFakeNode(FakeObject& obj) { //销毁摄像机 CEngineInterface::GetMe()->GetFairySystem()->getSceneManager()->destroyCamera(obj.pCamera); //销毁ViewPort if(!obj.ptrRenderTexture.isNull() && obj.ptrRenderTexture->getBuffer()->getRenderTarget()) { obj.ptrRenderTexture->getBuffer()->getRenderTarget()->removeAllViewports(); } //销毁RenderTexture obj.ptrRenderTexture.setNull(); Ogre::TextureManager::getSingleton().remove( Ogre::String(obj.strName) + "_RenderTexture"); //销毁Rectangle2D if (obj.pRectange) { Ogre::SceneNode* parentNode = obj.pRectange->getParentSceneNode(); if (parentNode) { parentNode->detachObject(obj.pRectange); // 摧毁Rectangle2D所挂接的scene node if (parentNode->getParentSceneNode()) parentNode->getParentSceneNode()->removeAndDestroyChild(parentNode->getName()); } delete obj.pRectange; obj.pRectange = NULL; } }
void EC_OgreLight::DetachLight() { if ((placeable_) && (attached_)) { EC_OgrePlaceable* placeable = checked_static_cast<EC_OgrePlaceable*>(placeable_.get()); Ogre::SceneNode* node = placeable->GetSceneNode(); node->detachObject(light_); attached_ = false; } }
void EC_OgreCustomObject::DetachEntity() { if ((placeable_) && (attached_) && (entity_)) { EC_Placeable* placeable = checked_static_cast<EC_Placeable*>(placeable_.get()); Ogre::SceneNode* node = placeable->GetSceneNode(); node->detachObject(entity_); attached_ = false; } }
void EC_OgreCamera::DetachCamera() { if ((!attached_) || (!camera_) || (!placeable_)) return; EC_OgrePlaceable* placeable = checked_static_cast<EC_OgrePlaceable*>(placeable_.get()); Ogre::SceneNode* node = placeable->GetSceneNode(); node->detachObject(camera_); attached_ = false; }
//--------------------------------------------------------------------- void BillboardSetElement::_destroyBillboardSet(void) { if (mBillboardSet) { Ogre::SceneNode* parent = mBillboardSet->getParentSceneNode(); assert(parent); Ogre::SceneManager* creator = parent->getCreator(); assert(creator); parent->detachObject(mBillboardSet->getName()); creator->destroyBillboardSet(mBillboardSet); } }
void ProjectileManager::destroyProjectile(Projectile* projectile){ Ogre::SceneNode* snParticle = projectile->particleSn; Ogre::ParticleSystem* particleSys = static_cast<Ogre::ParticleSystem*>(snParticle->getAttachedObject(0)); // Detach the entity from the scene node snParticle->detachObject(particleSys); // Delete the entity and the scene node mSceneMgr->destroyParticleSystem(particleSys); mSceneMgr->destroySceneNode(snParticle); delete projectile; }
void ProjectileManager::destroyExplosion(Explosion* explosion){ Ogre::SceneNode* snParticle = explosion->snExplosion; Ogre::ParticleSystem* particleSys = static_cast<Ogre::ParticleSystem*>(snParticle->getAttachedObject(0)); // Detach the entity from the scene node snParticle->detachObject(particleSys); // Delete the entity and the scene node mSceneMgr->destroyParticleSystem(particleSys); mSceneMgr->destroySceneNode(snParticle); delete explosion; }
void VLogicModel::_destroySkeletonEntity() { if (mSkeletonEntity) { Ogre::SceneNode *node = mSkeletonEntity->getParentSceneNode(); if (node && node == mSkeletonEntity->getParentNode()) { node->detachObject(mSkeletonEntity); } VLogicModelManager::instance()._destroySkeletalEntity(mSkeletonEntity); mSkeletonEntity = VNULL; } }
void EC_Mesh::RemoveAttachmentMesh(uint index) { if (renderer_.expired()) return; RendererPtr renderer = renderer_.lock(); if (!entity_) return; if (index >= attachment_entities_.size()) return; Ogre::SceneManager* scene_mgr = renderer->GetSceneManager(); if (attachment_entities_[index] && attachment_nodes_[index]) { // See if attached to a tagpoint or an ordinary node Ogre::TagPoint* tag = dynamic_cast<Ogre::TagPoint*>(attachment_nodes_[index]); if (tag) { entity_->detachObjectFromBone(attachment_entities_[index]); } else { Ogre::SceneNode* scenenode = dynamic_cast<Ogre::SceneNode*>(attachment_nodes_[index]); if (scenenode) { scenenode->detachObject(attachment_entities_[index]); scene_mgr->destroySceneNode(scenenode); } } attachment_nodes_[index] = 0; } if (attachment_entities_[index]) { if (attachment_entities_[index]->sharesSkeletonInstance()) attachment_entities_[index]->stopSharingSkeletonInstance(); scene_mgr->destroyEntity(attachment_entities_[index]); attachment_entities_[index] = 0; } }
void RenderComponentBillboardSet::setVisible(bool visible) { Ogre::SceneNode * pSceneNode; pSceneNode=getParent()->getPositionalComponent()->getSceneNode(); if(visible) { if(!mBillboardSet->isAttached()) { pSceneNode->attachObject(mBillboardSet); } } else { if(mBillboardSet->isAttached() && mBillboardSet->getParentSceneNode()->getName().compare(pSceneNode->getName())==0) { pSceneNode->detachObject(mBillboardSet->getName()); } } }
//----------------------------------------------------------------------- void MeshParticleVisualData::modifyMesh(const String &meshName) { // destroy old entity assert(mEntity); Ogre::SceneNode* parent = mEntity->getParentSceneNode(); assert(parent); Ogre::SceneManager* creator = parent->getCreator(); assert(creator); parent->detachObject(mEntity->getName()); creator->destroyMovableObject(mEntity); mEntity = NULL; // create new entity mEntity = creator->createEntity( mSceneNode->getName(), meshName ); assert (mEntity); mSceneNode->attachObject(mEntity); }
void OgreCameraSystem::update(int) { for (EntityId entityId : m_impl->m_entities.removedEntities()) { Ogre::Camera* camera = m_impl->m_cameras[entityId]; if (camera) { Ogre::SceneNode* sceneNode = camera->getParentSceneNode(); sceneNode->detachObject(camera); m_impl->m_sceneManager->destroyCamera(camera); } m_impl->m_cameras.erase(entityId); } for (auto& value : m_impl->m_entities.addedEntities()) { EntityId entityId = value.first; OgreSceneNodeComponent* sceneNodeComponent = std::get<0>(value.second); OgreCameraComponent* cameraComponent = std::get<1>(value.second); Ogre::Camera* camera = m_impl->m_sceneManager->createCamera( cameraComponent->name() ); camera->setAutoAspectRatio(true); cameraComponent->m_camera = camera; m_impl->m_cameras[entityId] = camera; sceneNodeComponent->m_sceneNode->attachObject(camera); } m_impl->m_entities.clearChanges(); for (auto& value : m_impl->m_entities) { OgreCameraComponent* cameraComponent = std::get<1>(value.second); auto& properties = cameraComponent->m_properties; if (properties.hasChanges()) { Ogre::Camera* camera = cameraComponent->m_camera; // Update camera camera->setPolygonMode(properties.polygonMode); camera->setFOVy(properties.fovY); camera->setNearClipDistance(properties.nearClipDistance); camera->setFarClipDistance(properties.farClipDistance); // Untouch properties.untouch(); } } }
//! //! Removes the OGRE entity containing the mesh geometry from the scene and //! destroys it along with the OGRE scene node. //! void Model2SceneNode::destroyEntity () { if (m_entity) { // delete entity container if (m_entityContainer) { delete m_entityContainer; m_entityContainer = 0; } // remove the entity from the scene node it is attached to Ogre::SceneNode *parentSceneNode = m_entity->getParentSceneNode(); if (parentSceneNode) parentSceneNode->detachObject(m_entity); // destroy the entity through its scene manager Ogre::SceneManager *sceneManager = OgreManager::getSceneManager(); if (sceneManager) { sceneManager->destroyEntity(m_entity); m_entity = 0; } } }
// ------------------------------------------------------------------------- void CollisionsWorld::setShowDebugContactPoints(bool show) { if (show && !mShowDebugContactPoints) { assert (mDebugContactPoints == 0); mDebugContactPoints = new DebugLines(); getSceneManager()->getRootSceneNode ()->createChildSceneNode ("DebugContactPoints")->attachObject (mDebugContactPoints); mShowDebugContactPoints = true; return; } if (!show && mShowDebugContactPoints) { assert (mDebugContactPoints != 0); Ogre::SceneNode * n = (Ogre::SceneNode *)getSceneManager()->getRootSceneNode ()->getChild ("DebugContactPoints"); n->detachObject (mDebugContactPoints); n->getParentSceneNode()->removeAndDestroyChild("DebugContactPoints"); delete mDebugContactPoints; mDebugContactPoints = 0; mShowDebugContactPoints = false; return; } }
//----------------------------------------------------------------------- void BeamRenderer::_destroyAll(void) { if (!mParentTechnique) return; // Remove the listener mParentTechnique->removeTechniqueListener(this); // Detach the billboardchain Ogre::SceneNode* parentNode = mParentTechnique->getParentSystem()->getParentSceneNode(); if (parentNode && mBillboardChain && mBillboardChain->isAttached()) { parentNode->detachObject(mBillboardChain); } // Delete the BillboardChain Ogre::SceneManager* sceneManager = mParentTechnique->getParentSystem()->getSceneManager(); if (mBillboardChain && sceneManager && sceneManager->hasBillboardChain(mBillboardChainName)) { sceneManager->destroyBillboardChain(mBillboardChainName); mBillboardChain = 0; } // Delete the visual data vector<BeamRendererVisualData*>::const_iterator it; vector<BeamRendererVisualData*>::const_iterator itEnd = mAllVisualData.end(); for (it = mAllVisualData.begin(); it != itEnd; ++it) { PU_DELETE_T(*it, BeamRendererVisualData, MEMCATEGORY_SCENE_OBJECTS); } mAllVisualData.clear(); mVisualData.clear(); // Reset the visual data in the pool mParentTechnique->initVisualDataInPool(); }
void DisableDecalGrids::_destroyProjector(void) { if (mProjector) { Ogre::SceneNode* parent = mProjector->getParentSceneNode(); assert(parent); Ogre::SceneManager* creator = parent->getCreator(); assert(creator); assert (parent == mProjectorNode); parent->detachObject(mProjector->getName()); getSceneManipulator()->getSceneManager()->destroyMovableObject(mProjector); mProjector = NULL; if (mProjectorNode) { getSceneManager()->destroySceneNode(mProjectorNode); mProjectorNode = NULL; } } }
void SceneNodeProvider::detachObject(Ogre::MovableObject* movable) { Ogre::SceneNode* node = mOffsetNode ? mOffsetNode : mNode; node->detachObject(movable); }
void ImpostorTexture::renderTextures(bool force) { #ifdef IMPOSTOR_FILE_SAVE TexturePtr renderTexture; #else TexturePtr renderTexture(texture); //if we're not using a file image we need to set up a resource loader, so that the texture is regenerated if it's ever unloaded (such as switching between fullscreen and the desktop in win32) loader = std::auto_ptr<ImpostorTextureResourceLoader>(new ImpostorTextureResourceLoader(*this)); #endif RenderTexture *renderTarget; Camera *renderCamera; Viewport *renderViewport; SceneNode *camNode; //Set up RTT texture uint32 textureSize = ImpostorPage::impostorResolution; if (renderTexture.isNull()) { renderTexture = TextureManager::getSingleton().createManual(getUniqueID("ImpostorTexture"), "Impostors", TEX_TYPE_2D, textureSize * IMPOSTOR_YAW_ANGLES, textureSize * IMPOSTOR_PITCH_ANGLES, 0, PF_A8R8G8B8, TU_RENDERTARGET, loader.get()); } renderTexture->setNumMipmaps(MIP_UNLIMITED); //Set up render target renderTarget = renderTexture->getBuffer()->getRenderTarget(); renderTarget->setAutoUpdated(false); //Set up camera camNode = sceneMgr->getSceneNode("ImpostorPage::cameraNode"); renderCamera = sceneMgr->createCamera(getUniqueID("ImpostorCam")); camNode->attachObject(renderCamera); renderCamera->setLodBias(1000.0f); renderViewport = renderTarget->addViewport(renderCamera); renderViewport->setOverlaysEnabled(false); renderViewport->setClearEveryFrame(true); renderViewport->setShadowsEnabled(false); renderViewport->setBackgroundColour(ImpostorPage::impostorBackgroundColor); //Set up scene node SceneNode* node = sceneMgr->getSceneNode("ImpostorPage::renderNode"); Ogre::SceneNode* oldSceneNode = entity->getParentSceneNode(); if (oldSceneNode) { oldSceneNode->detachObject(entity); } node->attachObject(entity); node->setPosition(-entityCenter); //Set up camera FOV const Real objDist = entityRadius * 100; const Real nearDist = objDist - (entityRadius + 1); const Real farDist = objDist + (entityRadius + 1); renderCamera->setAspectRatio(1.0f); renderCamera->setFOVy(Math::ATan(entityDiameter / objDist)); renderCamera->setNearClipDistance(nearDist); renderCamera->setFarClipDistance(farDist); //Disable mipmapping (without this, masked textures look bad) MaterialManager *mm = MaterialManager::getSingletonPtr(); FilterOptions oldMinFilter = mm->getDefaultTextureFiltering(FT_MIN); FilterOptions oldMagFilter = mm->getDefaultTextureFiltering(FT_MAG); FilterOptions oldMipFilter = mm->getDefaultTextureFiltering(FT_MIP); mm->setDefaultTextureFiltering(FO_POINT, FO_LINEAR, FO_NONE); //Disable fog FogMode oldFogMode = sceneMgr->getFogMode(); ColourValue oldFogColor = sceneMgr->getFogColour(); Real oldFogDensity = sceneMgr->getFogDensity(); Real oldFogStart = sceneMgr->getFogStart(); Real oldFogEnd = sceneMgr->getFogEnd(); sceneMgr->setFog(Ogre::FOG_EXP2, Ogre::ColourValue(0,0,0,0), 0.0f, 0.0f, 0.0f); //Ember change //We need to disable all lightning and render it full bright Ogre::ColourValue oldAmbientColour = sceneMgr->getAmbientLight(); sceneMgr->setAmbientLight(ColourValue::White); std::vector<Ogre::MovableObject*> lightStore; Ogre::SceneManager::MovableObjectIterator lightIterator = sceneMgr->getMovableObjectIterator(Ogre::LightFactory::FACTORY_TYPE_NAME); while (lightIterator.hasMoreElements()) { Ogre::MovableObject* light = lightIterator.getNext(); if (light) { if (light->getVisible()) { lightStore.push_back(light); light->setVisible(false); } } } // Get current status of the queue mode Ogre::SceneManager::SpecialCaseRenderQueueMode OldSpecialCaseRenderQueueMode = sceneMgr->getSpecialCaseRenderQueueMode(); //Only render the entity sceneMgr->setSpecialCaseRenderQueueMode(Ogre::SceneManager::SCRQM_INCLUDE); sceneMgr->addSpecialCaseRenderQueue(group->geom->getRenderQueue() + 1); uint8 oldRenderQueueGroup = entity->getRenderQueueGroup(); entity->setRenderQueueGroup(group->geom->getRenderQueue() + 1); bool oldVisible = entity->getVisible(); entity->setVisible(true); float oldMaxDistance = entity->getRenderingDistance(); entity->setRenderingDistance(0); bool needsRegen = true; #ifdef IMPOSTOR_FILE_SAVE //Calculate the filename hash used to uniquely identity this render String strKey = entityKey; char key[32] = {0}; uint32 i = 0; for (String::const_iterator it = entityKey.begin(); it != entityKey.end(); ++it) { key[i] ^= *it; i = (i+1) % sizeof(key); } for (i = 0; i < sizeof(key); ++i) key[i] = (key[i] % 26) + 'A'; String tempdir = this->group->geom->getTempdir(); ResourceGroupManager::getSingleton().addResourceLocation(tempdir, "FileSystem", "BinFolder"); String fileNamePNG = "Impostor." + String(key, sizeof(key)) + '.' + StringConverter::toString(textureSize) + ".png"; String fileNameDDS = "Impostor." + String(key, sizeof(key)) + '.' + StringConverter::toString(textureSize) + ".dds"; //Attempt to load the pre-render file if allowed needsRegen = force; if (!needsRegen){ try{ texture = TextureManager::getSingleton().load(fileNameDDS, "BinFolder", TEX_TYPE_2D, MIP_UNLIMITED); } catch (...){ try{ texture = TextureManager::getSingleton().load(fileNamePNG, "BinFolder", TEX_TYPE_2D, MIP_UNLIMITED); } catch (...){ needsRegen = true; } } } #endif if (needsRegen){ //If this has not been pre-rendered, do so now const float xDivFactor = 1.0f / IMPOSTOR_YAW_ANGLES; const float yDivFactor = 1.0f / IMPOSTOR_PITCH_ANGLES; for (int o = 0; o < IMPOSTOR_PITCH_ANGLES; ++o){ //4 pitch angle renders #ifdef IMPOSTOR_RENDER_ABOVE_ONLY Radian pitch = Degree((90.0f * o) * yDivFactor); //0, 22.5, 45, 67.5 #else Radian pitch = Degree((180.0f * o) * yDivFactor - 90.0f); #endif for (int i = 0; i < IMPOSTOR_YAW_ANGLES; ++i){ //8 yaw angle renders Radian yaw = Degree((360.0f * i) * xDivFactor); //0, 45, 90, 135, 180, 225, 270, 315 //Position camera camNode->setPosition(0, 0, 0); camNode->setOrientation(Quaternion(yaw, Vector3::UNIT_Y) * Quaternion(-pitch, Vector3::UNIT_X)); camNode->translate(Vector3(0, 0, objDist), Node::TS_LOCAL); //Render the impostor renderViewport->setDimensions((float)(i) * xDivFactor, (float)(o) * yDivFactor, xDivFactor, yDivFactor); renderTarget->update(); } } #ifdef IMPOSTOR_FILE_SAVE //Save RTT to file with respecting the temp dir renderTarget->writeContentsToFile(tempdir + fileNamePNG); //Load the render into the appropriate texture view texture = TextureManager::getSingleton().load(fileNamePNG, "BinFolder", TEX_TYPE_2D, MIP_UNLIMITED); #else texture = renderTexture; #endif } entity->setVisible(oldVisible); entity->setRenderQueueGroup(oldRenderQueueGroup); entity->setRenderingDistance(oldMaxDistance); sceneMgr->removeSpecialCaseRenderQueue(group->geom->getRenderQueue() + 1); // Restore original state sceneMgr->setSpecialCaseRenderQueueMode(OldSpecialCaseRenderQueueMode); //Re-enable mipmapping mm->setDefaultTextureFiltering(oldMinFilter, oldMagFilter, oldMipFilter); //Re-enable fog sceneMgr->setFog(oldFogMode, oldFogColor, oldFogDensity, oldFogStart, oldFogEnd); //Re-enable both scene lightning and disabled individual lights sceneMgr->setAmbientLight(oldAmbientColour); for (std::vector<Ogre::MovableObject*>::const_iterator I = lightStore.begin(); I != lightStore.end(); ++I) { (*I)->setVisible(true); } //Delete camera renderTarget->removeViewport(0); renderCamera->getSceneManager()->destroyCamera(renderCamera); //Delete scene node node->detachAllObjects(); if (oldSceneNode) { oldSceneNode->attachObject(entity); } #ifdef IMPOSTOR_FILE_SAVE //Delete RTT texture assert(!renderTexture.isNull()); String texName2(renderTexture->getName()); renderTexture.setNull(); if (TextureManager::getSingletonPtr()) TextureManager::getSingleton().remove(texName2); #endif }
void EC_ChatBubble::Update() { if (renderer_.expired()) return; Ogre::SceneManager *scene = renderer_.lock()->GetSceneManager(); assert(scene); if (!scene) return; Scene::Entity *entity = GetParentEntity(); // assert(entity); if (!entity) return; EC_Placeable *node = entity->GetComponent<EC_Placeable>().get(); if (!node) return; Ogre::SceneNode *sceneNode = node->GetSceneNode(); assert(sceneNode); if (!sceneNode) return; // Create billboard if it doesn't exist. if (!billboardSet_ && !billboard_) { // Create billboardset and billboard billboardSet_ = scene->createBillboardSet(renderer_.lock()->GetUniqueObjectName("EC_ChatBubble"), 1); assert(billboardSet_); billboard_ = billboardSet_->createBillboard(Ogre::Vector3(0, 0, default_z_pos_)); assert(billboard_); billboardSet_->setDefaultDimensions(2, 1); sceneNode->attachObject(billboardSet_); // Create material materialName_ = renderer_.lock()->GetUniqueObjectName("EC_ChatBubble_Material"); Ogre::MaterialPtr material = OgreRenderer::CloneMaterial("UnlitTexturedSoftAlpha", materialName_); billboardSet_->setMaterialName(materialName_); // Create texture texture_name_ = renderer_.lock()->GetUniqueObjectName("EC_ChatBubble_Texture"); Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().createManual( texture_name_, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, 1, 1, 0, Ogre::PF_A8R8G8B8, Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE); // Set texture to material if (texture.isNull()) texture_name_ = ""; else OgreRenderer::SetTextureUnitOnMaterial(material, texture_name_); } else { // Billboard already exists, remove it from the old and attach it to a new scene node. LogInfo("Trying to detach chat bubble billboard from its old node and attach to a new node. This feature is not tested."); Ogre::SceneNode *oldNode = billboardSet_->getParentSceneNode(); oldNode->detachObject(billboardSet_); sceneNode->attachObject(billboardSet_); } }
void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh) { Ogre::SceneNode* insert = ptr.getRefData().getBaseNode(); assert(insert); Ogre::AxisAlignedBox bounds = Ogre::AxisAlignedBox::BOX_NULL; NifOgre::EntityList entities = NifOgre::NIFLoader::createEntities(insert, NULL, mesh); for(size_t i = 0;i < entities.mEntities.size();i++) { const Ogre::AxisAlignedBox &tmp = entities.mEntities[i]->getBoundingBox(); bounds.merge(Ogre::AxisAlignedBox(insert->_getDerivedPosition() + tmp.getMinimum(), insert->_getDerivedPosition() + tmp.getMaximum()) ); } Ogre::Vector3 extents = bounds.getSize(); extents *= insert->getScale(); float size = std::max(std::max(extents.x, extents.y), extents.z); bool small = (size < Settings::Manager::getInt("small object size", "Viewing distance")) && Settings::Manager::getBool("limit small object distance", "Viewing distance"); // do not fade out doors. that will cause holes and look stupid if (ptr.getTypeName().find("Door") != std::string::npos) small = false; if (mBounds.find(ptr.getCell()) == mBounds.end()) mBounds[ptr.getCell()] = Ogre::AxisAlignedBox::BOX_NULL; mBounds[ptr.getCell()].merge(bounds); bool transparent = false; for(size_t i = 0;i < entities.mEntities.size();i++) { Ogre::Entity *ent = entities.mEntities[i]; for (unsigned int i=0; i<ent->getNumSubEntities(); ++i) { Ogre::MaterialPtr mat = ent->getSubEntity(i)->getMaterial(); Ogre::Material::TechniqueIterator techIt = mat->getTechniqueIterator(); while (techIt.hasMoreElements()) { Ogre::Technique* tech = techIt.getNext(); Ogre::Technique::PassIterator passIt = tech->getPassIterator(); while (passIt.hasMoreElements()) { Ogre::Pass* pass = passIt.getNext(); if (pass->getDepthWriteEnabled() == false) transparent = true; } } } } if(!mIsStatic || !Settings::Manager::getBool("use static geometry", "Objects") || transparent) { for(size_t i = 0;i < entities.mEntities.size();i++) { Ogre::Entity *ent = entities.mEntities[i]; ent->setRenderingDistance(small ? Settings::Manager::getInt("small object distance", "Viewing distance") : 0); ent->setVisibilityFlags(mIsStatic ? (small ? RV_StaticsSmall : RV_Statics) : RV_Misc); ent->setRenderQueueGroup(transparent ? RQG_Alpha : RQG_Main); } } else { Ogre::StaticGeometry* sg = 0; if (small) { if( mStaticGeometrySmall.find(ptr.getCell()) == mStaticGeometrySmall.end()) { uniqueID = uniqueID +1; sg = mRenderer.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); mStaticGeometrySmall[ptr.getCell()] = sg; sg->setRenderingDistance(Settings::Manager::getInt("small object distance", "Viewing distance")); } else sg = mStaticGeometrySmall[ptr.getCell()]; } else { if( mStaticGeometry.find(ptr.getCell()) == mStaticGeometry.end()) { uniqueID = uniqueID +1; sg = mRenderer.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); mStaticGeometry[ptr.getCell()] = sg; } else sg = mStaticGeometry[ptr.getCell()]; } // This specifies the size of a single batch region. // If it is set too high: // - there will be problems choosing the correct lights // - the culling will be more inefficient // If it is set too low: // - there will be too many batches. sg->setRegionDimensions(Ogre::Vector3(2500,2500,2500)); sg->setVisibilityFlags(small ? RV_StaticsSmall : RV_Statics); sg->setCastShadows(true); sg->setRenderQueueGroup(transparent ? RQG_Alpha : RQG_Main); for(size_t i = 0;i < entities.mEntities.size();i++) { Ogre::Entity *ent = entities.mEntities[i]; insert->detachObject(ent); sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); mRenderer.getScene()->destroyEntity(ent); } } }
void RenderedTexture::renderTextures() { //Set up RTT texture Ogre::TexturePtr renderTexture; if (renderTexture.isNull()) { renderTexture = Ogre::TextureManager::getSingleton().createManual( getUniqueID("RenderedEntityMaterial"), "EntityRenderer", Ogre::TEX_TYPE_2D, textureSize, textureSize, 0, Ogre::PF_A8R8G8B8, Ogre::TU_RENDERTARGET, 0); } renderTexture->setNumMipmaps(0); //Set up render target Ogre::RenderTexture* renderTarget = renderTexture->getBuffer()->getRenderTarget(); renderTarget->setAutoUpdated(false); //Set up camera Ogre::SceneNode* camNode = sceneMgr->getSceneNode("EntityRenderer::cameraNode"); Ogre::Camera* renderCamera = sceneMgr->createCamera(getUniqueID("EntityRendererCam")); camNode->attachObject(renderCamera); renderCamera->setLodBias(1000.0f); Ogre::Viewport* renderViewport = renderTarget->addViewport(renderCamera); renderViewport->setOverlaysEnabled(false); renderViewport->setClearEveryFrame(true); renderViewport->setShadowsEnabled(false); renderViewport->setBackgroundColour(Ogre::ColourValue(0.0f, 0.0f, 0.0f, 0.0f)); //Set up scene node Ogre::SceneNode* node = sceneMgr->getSceneNode("EntityRenderer::renderNode"); Ogre::SceneNode* oldSceneNode = entity->getParentSceneNode(); if (oldSceneNode) oldSceneNode->detachObject(entity); node->attachObject(entity); node->setPosition(-entityCenter); //Set up camera FOV const Ogre::Real objDist = entityRadius * 100; const Ogre::Real nearDist = objDist - (entityRadius + 1); const Ogre::Real farDist = objDist + (entityRadius + 1); renderCamera->setAspectRatio(1.0f); renderCamera->setFOVy(Ogre::Math::ATan(2.0 * entityRadius / objDist)); renderCamera->setNearClipDistance(nearDist); renderCamera->setFarClipDistance(farDist); //Disable mipmapping (without this, masked textures look bad) Ogre::MaterialManager* mm = Ogre::MaterialManager::getSingletonPtr(); Ogre::FilterOptions oldMinFilter = mm->getDefaultTextureFiltering(Ogre::FT_MIN); Ogre::FilterOptions oldMagFilter = mm->getDefaultTextureFiltering(Ogre::FT_MAG); Ogre::FilterOptions oldMipFilter = mm->getDefaultTextureFiltering(Ogre::FT_MIP); mm->setDefaultTextureFiltering(Ogre::FO_POINT, Ogre::FO_LINEAR,Ogre:: FO_NONE); //Disable fog Ogre::FogMode oldFogMode = sceneMgr->getFogMode(); Ogre::ColourValue oldFogColor = sceneMgr->getFogColour(); Ogre::Real oldFogDensity = sceneMgr->getFogDensity(); Ogre::Real oldFogStart = sceneMgr->getFogStart(); Ogre::Real oldFogEnd = sceneMgr->getFogEnd(); sceneMgr->setFog(Ogre::FOG_NONE); // Get current status of the queue mode Ogre::SceneManager::SpecialCaseRenderQueueMode OldSpecialCaseRenderQueueMode = sceneMgr->getSpecialCaseRenderQueueMode(); //Only render the entity sceneMgr->setSpecialCaseRenderQueueMode(Ogre::SceneManager::SCRQM_INCLUDE); sceneMgr->addSpecialCaseRenderQueue(renderQueueGroup); Ogre::uint8 oldRenderQueueGroup = entity->getRenderQueueGroup(); entity->setRenderQueueGroup(renderQueueGroup); bool oldVisible = entity->getVisible(); entity->setVisible(true); float oldMaxDistance = entity->getRenderingDistance(); entity->setRenderingDistance(0); //Calculate the filename hash used to uniquely identity this render std::string strKey = entityKey; char key[32] = {0}; Ogre::uint32 i = 0; for (std::string::const_iterator it = entityKey.begin(); it != entityKey.end(); ++it) { key[i] ^= *it; i = (i+1) % sizeof(key); } for (i = 0; i < sizeof(key); ++i) key[i] = (key[i] % 26) + 'A'; Ogre::ResourceGroupManager::getSingleton().addResourceLocation( GetUserDir().string(), "FileSystem", "BinFolder"); std::string fileNamePNG = "Rendered." + std::string(key, sizeof(key)) + '.' + Ogre::StringConverter::toString(textureSize) + ".png"; //Attempt to load the pre-render file if allowed bool needsRegen = false; if (!needsRegen) { try{ texture = Ogre::TextureManager::getSingleton().load( fileNamePNG, "BinFolder", Ogre::TEX_TYPE_2D, 0); } catch (...) { needsRegen = true; } } if (needsRegen) { //If this has not been pre-rendered, do so now //Position camera camNode->setPosition(0, 0, 0); // TODO camNode->setOrientation(Quaternion(yaw, Vector3::UNIT_Y) * Quaternion(-pitch, Vector3::UNIT_X)); camNode->translate(Ogre::Vector3(0, 0, objDist), Ogre::Node::TS_LOCAL); renderTarget->update(); //Save RTT to file renderTarget->writeContentsToFile((GetUserDir() / fileNamePNG).string()); //Load the render into the appropriate texture view texture = Ogre::TextureManager::getSingleton().load(fileNamePNG, "BinFolder", Ogre::TEX_TYPE_2D, 0); ggTexture = ClientUI::GetTexture(GetUserDir() / fileNamePNG); } entity->setVisible(oldVisible); entity->setRenderQueueGroup(oldRenderQueueGroup); entity->setRenderingDistance(oldMaxDistance); sceneMgr->removeSpecialCaseRenderQueue(renderQueueGroup); // Restore original state sceneMgr->setSpecialCaseRenderQueueMode(OldSpecialCaseRenderQueueMode); //Re-enable mipmapping mm->setDefaultTextureFiltering(oldMinFilter, oldMagFilter, oldMipFilter); //Re-enable fog sceneMgr->setFog(oldFogMode, oldFogColor, oldFogDensity, oldFogStart, oldFogEnd); //Delete camera renderTarget->removeViewport(0); renderCamera->getSceneManager()->destroyCamera(renderCamera); //Delete scene node node->detachAllObjects(); if (oldSceneNode) oldSceneNode->attachObject(entity); //Delete RTT texture assert(!renderTexture.isNull()); std::string texName2(renderTexture->getName()); renderTexture.setNull(); if (Ogre::TextureManager::getSingletonPtr()) Ogre::TextureManager::getSingleton().remove(texName2); }