void PlaneNodeProcessor::createRenderToTextures(Ogre::Entity* entity, Plane* plane, MaterialPtr material, XERCES_CPP_NAMESPACE::DOMElement* rttElem) { if(rttElem == NULL) return; Camera* cam = CoreSubsystem::getSingleton().getWorld()->getSceneManager()->createCamera("Cam" + entity->getName()); cam->setNearClipDistance(CoreSubsystem::getSingleton().getWorld()->getActiveCamera()->getNearClipDistance()); cam->setFarClipDistance(CoreSubsystem::getSingleton().getWorld()->getActiveCamera()->getFarClipDistance()); //cam->setFarClipDistance(1000000); cam->setAspectRatio(CoreSubsystem::getSingleton().getWorld()->getActiveCamera()->getAspectRatio()); cam->setFOVy(CoreSubsystem::getSingleton().getWorld()->getActiveCamera()->getFOVy()); AliasTextureNamePairList aliases; if(getAttributeValueAsBool(rttElem, "reflection")) { TexturePtr texture = Ogre::TextureManager::getSingleton().createManual( "Reflection" + entity->getName(), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, 512, 512, 0, PF_R8G8B8, TU_RENDERTARGET ); RenderTexture* rttTex = texture->getBuffer()->getRenderTarget(); Viewport *v = rttTex->addViewport( cam ); v->setOverlaysEnabled(false); rttTex->addListener(new PlaneReflectionTextureListener(entity, cam, plane)); aliases["reflection"] = "Reflection" + entity->getName(); cam->enableCustomNearClipPlane((MovablePlane*)plane); } if(getAttributeValueAsBool(rttElem, "refraction")) { TexturePtr texture = Ogre::TextureManager::getSingleton().createManual( "Refraction" + entity->getName(), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, 512, 512, 0, PF_R8G8B8, TU_RENDERTARGET ); RenderTexture* rttTex = texture->getBuffer()->getRenderTarget(); Viewport *v = rttTex->addViewport( cam); v->setOverlaysEnabled(false); rttTex->addListener(new PlaneRefractionTextureListener(entity, cam)); aliases["refraction"] = "Refraction" + entity->getName(); plane->normal = Vector3::NEGATIVE_UNIT_Y; cam->enableCustomNearClipPlane((MovablePlane*)plane); } if(!material->applyTextureAliases(aliases)) LOG_ERROR("PLANE", "Texture Aliase konnten nicht angewandt werden"); }
/** * @brief Initializes the water. You must call this in order for the water to show up. * @return True if the water technique could be setup, else false. */ bool Water::initialize() { try { Ogre::Plane waterPlane(Ogre::Vector3::UNIT_Y, 0); // create a water plane/scene node /* waterPlane.normal = ; waterPlane.d = 0; */ Ogre::MeshManager::getSingleton().createPlane( "WaterPlane", "environment", waterPlane, 10000, 10000, 5, 5, true, 1, 1000, 1000, Ogre::Vector3::UNIT_Z ); mWaterNode = mSceneMgr.getRootSceneNode()->createChildSceneNode("water"); mRefractionListener = new RefractionTextureListener(); mReflectionListener = new ReflectionTextureListener(); Ogre::TexturePtr texture = TextureManager::getSingleton().createManual("Refraction", "General", TEX_TYPE_2D, 512, 512, 0, PF_A8R8G8B8, TU_RENDERTARGET); RenderTexture* rttTex = texture->getBuffer()->getRenderTarget(); /* RenderTexture* rttTex = EmberOgre::getSingleton().getOgreRoot()->getRenderSystem()->createRenderTexture( "Refraction", 512, 512 );*/ { Viewport *v = rttTex->addViewport( &mCamera ); Ogre::MaterialPtr mat = MaterialManager::getSingleton().getByName("Examples/FresnelReflectionRefraction"); if (!mat.isNull()) { mat->getTechnique(0)->getPass(0)->getTextureUnitState(2)->setTextureName("Refraction"); v->setOverlaysEnabled(false); rttTex->addListener(mRefractionListener); } } texture = TextureManager::getSingleton().createManual("Reflection", "General", TEX_TYPE_2D, 512, 512, 0, PF_A8R8G8B8, TU_RENDERTARGET); rttTex = texture->getBuffer()->getRenderTarget(); { Viewport *v = rttTex->addViewport( &mCamera ); Ogre::MaterialPtr mat = MaterialManager::getSingleton().getByName("Examples/FresnelReflectionRefraction"); if (!mat.isNull()) { mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName("Reflection"); v->setOverlaysEnabled(false); rttTex->addListener(mReflectionListener); } } // Define a floor plane mesh /* reflectionPlane.normal = Vector3::UNIT_Y; reflectionPlane.d = 0;*/ /* MeshManager::getSingleton().createPlane("ReflectPlane",reflectionPlane, 1500,1500,10,10,true,1,5,5,Vector3::UNIT_Z);*/ mWaterEntity = mSceneMgr.createEntity( "plane", "WaterPlane" ); mWaterEntity->setMaterialName("Examples/FresnelReflectionRefraction"); mRefractionListener->setPlaneEntity(mWaterEntity); mReflectionListener->setPlaneEntity(mWaterEntity); mReflectionListener->setReflectionPlane(mReflectionPlane); mReflectionListener->setCamera(&mCamera); mWaterNode->attachObject(mWaterEntity); return true; } catch (const std::exception& ex) { S_LOG_FAILURE("Error when creating water." << ex); return false; } }