void ShrubberyFoliage::initialize() { mPagedGeometry = new ::Forests::PagedGeometry(&mTerrainManager.getScene().getMainCamera(), mTerrainManager.getFoliageBatchSize()); const WFMath::AxisBox<2>& worldSize = mTerrainManager.getTerrainInfo().getWorldSizeInIndices(); ::Forests::TBounds ogreBounds(Convert::toOgre(worldSize)); if (ogreBounds.width() != ogreBounds.height()) { if (ogreBounds.width() > ogreBounds.height()) { float difference = ogreBounds.width() - ogreBounds.height(); ogreBounds.bottom += difference; } else { float difference = ogreBounds.height() - ogreBounds.width(); ogreBounds.right += difference; } } mPagedGeometry->setBounds(ogreBounds); mPagedGeometry->addDetailLevel<Forests::BatchPage>(64, 32); mLoader = new FoliageLoader(mTerrainManager.getAdapter()->getSceneManager(), mTerrainManager, mTerrainLayerDefinition, mFoliageDefinition, *mPagedGeometry); mPagedGeometry->setPageLoader(mLoader); std::list<Forests::GeometryPageManager*> detailLevels = mPagedGeometry->getDetailLevels(); for (std::list<Forests::GeometryPageManager*>::iterator I = detailLevels.begin(); I != detailLevels.end(); ++I) { DistanceStore tempDistance = { (*I)->getFarRange(), (*I)->getNearRange(), (*I)->getTransition() }; mDistanceStore.push_back(tempDistance); } }
void ShrubberyFoliage::initialize() { mPagedGeometry = new ::Forests::PagedGeometry(&mTerrainManager.getScene().getMainCamera(), mTerrainManager.getFoliageBatchSize()); const WFMath::AxisBox<2>& worldSize = mTerrainManager.getTerrainInfo().getWorldSizeInIndices(); ::Forests::TBounds ogreBounds(Convert::toOgre(worldSize)); if (ogreBounds.width() != ogreBounds.height()) { if (ogreBounds.width() > ogreBounds.height()) { float difference = ogreBounds.width() - ogreBounds.height(); ogreBounds.bottom += difference; } else { float difference = ogreBounds.height() - ogreBounds.width(); ogreBounds.right += difference; } } mPagedGeometry->setBounds(ogreBounds); mPagedGeometry->addDetailLevel<Forests::BatchPage>(64, 32); mLoader = new FoliageLoader(mTerrainManager.getAdapter()->getSceneManager(), mTerrainManager, mTerrainLayerDefinition, mFoliageDefinition, *mPagedGeometry); mPagedGeometry->setPageLoader(mLoader); }
void GrassFoliage::initialize() { mPagedGeometry = new ::Forests::PagedGeometry(&mTerrainManager.getScene().getMainCamera(), mTerrainManager.getFoliageBatchSize()); const WFMath::AxisBox<2>& worldSize = mTerrainManager.getTerrainInfo().getWorldSizeInIndices(); ::Forests::TBounds ogreBounds(Convert::toOgre(worldSize)); if (!WFMath::Equal(ogreBounds.width(), ogreBounds.height())) { if (ogreBounds.width() > ogreBounds.height()) { float difference = ogreBounds.width() - ogreBounds.height(); ogreBounds.bottom += difference; } else { float difference = ogreBounds.height() - ogreBounds.width(); ogreBounds.right += difference; } } mPagedGeometry->setBounds(ogreBounds); mPagedGeometry->addDetailLevel<Forests::GrassPage>(96); //We'll provide our own shaders for the grass materials. mPagedGeometry->setShadersEnabled(false); //Create a GrassLoader object mGrassLoader = new ::Forests::GrassLoader<FoliageLayer>(mPagedGeometry); mPagedGeometry->setPageLoader(mGrassLoader); //Assign the "treeLoader" to be used to load mGrassLoader->setHeightFunction(&getTerrainHeight, static_cast<IHeightProvider*>(&mTerrainManager)); //Add some grass to the scene with GrassLoader::addLayer() FoliageLayer *l = mGrassLoader->addLayer(mFoliageDefinition.getParameter("material")); l->configure(&mTerrainManager, &mTerrainLayerDefinition, &mFoliageDefinition); //Configure the grass layer properties (size, density, animation properties, fade settings, etc.) l->setMinimumSize(mMinWidth, mMinHeight); l->setMaximumSize(mMaxWidth, mMaxHeight); l->setAnimationEnabled(true); //Enable animations if (mFoliageDefinition.hasParameter("swayDistribution")) { l->setSwayDistribution(atof(mFoliageDefinition.getParameter("swayDistribution").c_str())); } else { l->setSwayDistribution(10.0f); //Sway fairly unsynchronized } if (mFoliageDefinition.hasParameter("swayLength")) { l->setSwayLength(atof(mFoliageDefinition.getParameter("swayLength").c_str())); } else { l->setSwayLength(0.5f); //Sway back and forth 0.5 units in length } if (mFoliageDefinition.hasParameter("swaySpeed")) { l->setSwaySpeed(atof(mFoliageDefinition.getParameter("swaySpeed").c_str())); } else { l->setSwaySpeed(0.5f); //Sway 1/2 a cycle every second } if (mFoliageDefinition.hasParameter("fadeTech")) { const std::string& fadeTech(mFoliageDefinition.getParameter("fadeTech")); if (fadeTech == "alphagrow") { l->setFadeTechnique(::Forests::FADETECH_ALPHAGROW); //Distant grass should slowly fade in } else if (fadeTech == "grow") { l->setFadeTechnique(::Forests::FADETECH_GROW); //Distant grass should slowly fade in } else { l->setFadeTechnique(::Forests::FADETECH_ALPHA); //Distant grass should slowly fade in } } else { l->setFadeTechnique(::Forests::FADETECH_ALPHA); //Distant grass should slowly fade in } // l->setDensity(1.5f); //Relatively dense grass if (mFoliageDefinition.hasParameter("renderTech")) { const std::string& renderTech(mFoliageDefinition.getParameter("renderTech")); if (renderTech == "quad") { l->setRenderTechnique(::Forests::GRASSTECH_QUAD); } else if (renderTech == "sprite") { l->setRenderTechnique(::Forests::GRASSTECH_SPRITE); } else { l->setRenderTechnique(::Forests::GRASSTECH_CROSSQUADS); //Draw grass as scattered quads } } else { l->setRenderTechnique(::Forests::GRASSTECH_CROSSQUADS); //Draw grass as scattered quads } l->setMapBounds(Convert::toOgre(worldSize)); l->setMaxSlope(Ogre::Degree(40.0f)); std::list<Forests::GeometryPageManager*> detailLevels = mPagedGeometry->getDetailLevels(); for (std::list<Forests::GeometryPageManager*>::iterator I = detailLevels.begin(); I != detailLevels.end(); ++I) { DistanceStore tempDistance = { (*I)->getFarRange(), (*I)->getNearRange(), (*I)->getTransition() }; mDistanceStore.push_back(tempDistance); } }