//----------------------------------------------------------------------------------------- void CTerrainGroupEditor::onShadowsTechniqueChange(const OgitorsPropertyBase* property, Ogre::Any value) { CSceneManagerEditor *mSceneMgr = static_cast<CSceneManagerEditor*>(mOgitorsRoot->GetSceneManagerEditor()); bool newstate = mSceneMgr->getShadowsEnabled(); if(mSceneMgr->getShadowsTechnique() >= Ogre::SHADOWTYPE_TEXTURE_ADDITIVE && mSceneMgr->getShadowsTechnique() <= Ogre::SHADOWTYPE_TEXTURE_MODULATIVE_INTEGRATED) { if(mMaterialGeneratorType->get() == 1) { Ogre::TerrainMaterialGeneratorC::SM2Profile* matProfile = static_cast<Ogre::TerrainMaterialGeneratorC::SM2Profile*>(mTerrainGlobalOptions->getDefaultMaterialGenerator()->getActiveProfile()); matProfile->setReceiveDynamicShadowsEnabled(newstate); matProfile->setReceiveDynamicShadowsLowLod(false); matProfile->setReceiveDynamicShadowsDepth(newstate); matProfile->setReceiveDynamicShadowsPSSM(static_cast<Ogre::PSSMShadowCameraSetup*>(mSceneMgr->getPSSMSetup().get())); } else { Ogre::TerrainMaterialGeneratorB::SM2Profile* matProfile = static_cast<Ogre::TerrainMaterialGeneratorB::SM2Profile*>(mTerrainGlobalOptions->getDefaultMaterialGenerator()->getActiveProfile()); matProfile->setReceiveDynamicShadowsEnabled(newstate); matProfile->setReceiveDynamicShadowsLowLod(false); matProfile->setReceiveDynamicShadowsDepth(newstate); matProfile->setReceiveDynamicShadowsPSSM(static_cast<Ogre::PSSMShadowCameraSetup*>(mSceneMgr->getPSSMSetup().get())); } } }
//------------------------------------------------------------------------------- Ogre::Entity *CPlaneEditor::_createPlane() { Ogre::MeshPtr mesh; if(mPlaneHandle) { mPlaneHandle->detachFromParent(); mPlaneHandle->_getManager()->destroyEntity(mPlaneHandle); Ogre::MeshManager::getSingletonPtr()->remove(mName->get()); } Ogre::Plane plane(mNormal->get(), mDistance->get()); mesh = Ogre::MeshManager::getSingletonPtr()->createPlane(mName->get(),"ProjectResources",plane,mWidth->get(),mHeight->get(),mxSegments->get(),mySegments->get(),mHasNormals->get(),mNumCoordSets->get(),muTile->get(),mvTile->get(),Ogre::Vector3::UNIT_Z); mPlaneHandle = mOgitorsRoot->GetSceneManager()->createEntity(mName->get(), mName->get()); mPlaneHandle->setQueryFlags(QUERYFLAG_MOVABLE); CSceneManagerEditor *mSceneMgr = mOgitorsRoot->GetSceneManagerEditor(); if(mSceneMgr->getShadowsEnabled()) { Ogre::MaterialPtr matEnt = Ogre::MaterialManager::getSingletonPtr()->getByName(mMaterial->get()); mPlaneHandle->setMaterial(mSceneMgr->buildDepthShadowMaterial(matEnt)); } else mPlaneHandle->setMaterialName(mMaterial->get()); mPlaneHandle->setCastShadows(mCastShadows->get()); mPlaneHandle->setVisibilityFlags(1 << mLayer->get()); mHandle->attachObject(mPlaneHandle); if(mBBoxNode) adjustBoundingBox(); return mPlaneHandle; }
//----------------------------------------------------------------------------------------- CBaseEditor *CSceneManagerEditorFactory::CreateObject(CBaseEditor **parent, OgitorsPropertyValueMap ¶ms) { CSceneManagerEditor *object = OGRE_NEW CSceneManagerEditor(this); object->createProperties(params); object->mParentEditor->init(*parent); object->load(); mInstanceCount++; return object; }
//----------------------------------------------------------------------------------------- bool CEntityEditor::load(bool async) { if(mLoaded->get()) return true; if(CNodeEditor::load()) { CSceneManagerEditor *mSceneMgr = mOgitorsRoot->GetSceneManagerEditor(); try { mEntityHandle = mOgitorsRoot->GetSceneManager()->createEntity(mName->get(), mMeshFile->get() + ".mesh"); mUsingPlaceHolderMesh = false; } catch(...) { mUsingPlaceHolderMesh = true; mEntityHandle = mOgitorsRoot->GetSceneManager()->createEntity(mName->get(), "missing_mesh.mesh"); mEntityHandle->setMaterialName("MAT_GIZMO_X_L"); } mHandle->attachObject(mEntityHandle); mEntityHandle->setQueryFlags(QUERYFLAG_MOVABLE); mEntityHandle->setCastShadows(mCastShadows->get()); mEntityHandle->setVisibilityFlags(1 << mLayer->get()); mEntityHandle->setRenderingDistance(mRenderingDistance->get()); OgitorsPropertyDef *definition; if(mSubEntityCount->get() == -1) { int count = mEntityHandle->getNumSubEntities(); mSubEntityCount->set(count); for(int ix = 0; ix < count; ix++) { Ogre::String sCount1 = "SubEntities::SubEntity" + Ogre::StringConverter::toString(ix); Ogre::String sCount2 = "subentity" + Ogre::StringConverter::toString(ix); definition = mFactory->AddPropertyDefinition(sCount2 + "::material", sCount1 + "::Material", "Sub Entity's Material Name", PROP_STRING, true, true); definition->setOptions(OgitorsRoot::GetMaterialNames()); mFactory->AddPropertyDefinition(sCount2 + "::visible", sCount1 + "::Visible", "Sub Entity's Visibility", PROP_BOOL, true, true); PROPERTY(sCount2 + "::material", Ogre::String, mEntityHandle->getSubEntity(ix)->getMaterialName(), ix, SETTER(Ogre::String, CEntityEditor, _setSubMaterial)); PROPERTY(sCount2 + "::visible", bool, mEntityHandle->getSubEntity(ix)->isVisible(), ix, SETTER(bool, CEntityEditor, _setSubVisible)); if(mSceneMgr->getShadowsEnabled()) { Ogre::MaterialPtr matEnt = Ogre::MaterialManager::getSingletonPtr()->getByName(mEntityHandle->getSubEntity(ix)->getMaterialName()); mEntityHandle->getSubEntity(ix)->setMaterial(mSceneMgr->buildDepthShadowMaterial(matEnt)); } } } else if(!mUsingPlaceHolderMesh)
//----------------------------------------------------------------------------------------- bool CPlaneEditor::_setMaterial(OgitorsPropertyBase* property, const Ogre::String& value) { if(mPlaneHandle) { CSceneManagerEditor *mSceneMgr = mOgitorsRoot->GetSceneManagerEditor(); if(mSceneMgr->getShadowsEnabled()) { Ogre::MaterialPtr matEnt = Ogre::MaterialManager::getSingletonPtr()->getByName(value); mPlaneHandle->setMaterial(mSceneMgr->buildDepthShadowMaterial(matEnt)); } else mPlaneHandle->setMaterialName(value); } return true; }
//----------------------------------------------------------------------------------------- bool CEntityEditor::_setSubMaterial(OgitorsPropertyBase* property, const Ogre::String& value) { if(mEntityHandle && !mUsingPlaceHolderMesh) { CSceneManagerEditor *mSceneMgr = mOgitorsRoot->GetSceneManagerEditor(); if(mSceneMgr->getShadowsEnabled()) { Ogre::MaterialPtr matEnt = Ogre::MaterialManager::getSingletonPtr()->getByName(value); mEntityHandle->getSubEntity(property->getTag())->setMaterial(mSceneMgr->buildDepthShadowMaterial(matEnt)); } else mEntityHandle->getSubEntity(property->getTag())->setMaterialName(value); } return true; }
//----------------------------------------------------------------------------------------- bool CTerrainGroupEditor::_setMaterialGeneratorType(OgitorsPropertyBase* property, const int& value) { if(value == 1) { Ogre::TerrainMaterialGeneratorPtr matGenPtr(OGRE_NEW Ogre::TerrainMaterialGeneratorC(this, mDecalFrustum)); mTerrainGlobalOptions->setDefaultMaterialGenerator(matGenPtr); mMaxLayersAllowed = 10; } else { Ogre::TerrainMaterialGeneratorPtr matGenPtr(OGRE_NEW Ogre::TerrainMaterialGeneratorB(this, mDecalFrustum)); mTerrainGlobalOptions->setDefaultMaterialGenerator(matGenPtr); mMaxLayersAllowed = 6; } CSceneManagerEditor *mSceneMgr = static_cast<CSceneManagerEditor*>(mOgitorsRoot->GetSceneManagerEditor()); if(mSceneMgr->getShadowsEnabled()) { if(value == 1) { Ogre::TerrainMaterialGeneratorC::SM2Profile* matProfile = static_cast<Ogre::TerrainMaterialGeneratorC::SM2Profile*>(mTerrainGlobalOptions->getDefaultMaterialGenerator()->getActiveProfile()); matProfile->setReceiveDynamicShadowsEnabled(true); matProfile->setReceiveDynamicShadowsLowLod(false); matProfile->setReceiveDynamicShadowsDepth(true); matProfile->setReceiveDynamicShadowsPSSM(static_cast<Ogre::PSSMShadowCameraSetup*>(mSceneMgr->getPSSMSetup().get())); } else { Ogre::TerrainMaterialGeneratorB::SM2Profile* matProfile = static_cast<Ogre::TerrainMaterialGeneratorB::SM2Profile*>(mTerrainGlobalOptions->getDefaultMaterialGenerator()->getActiveProfile()); matProfile->setReceiveDynamicShadowsEnabled(true); matProfile->setReceiveDynamicShadowsLowLod(false); matProfile->setReceiveDynamicShadowsDepth(true); matProfile->setReceiveDynamicShadowsPSSM(static_cast<Ogre::PSSMShadowCameraSetup*>(mSceneMgr->getPSSMSetup().get())); } } return true; }
//----------------------------------------------------------------------------------------- void CEntityEditor::onDropMaterial(Ogre::Ray ray, Ogre::Vector3 position, const Ogre::String& materialname) { if(mEntityHandle && !mUsingPlaceHolderMesh) { int submeshid = OgitorsUtils::PickSubMesh(ray, mEntityHandle); if(submeshid > -1) { CSceneManagerEditor *mSceneMgr = mOgitorsRoot->GetSceneManagerEditor(); if(mSceneMgr->getShadowsEnabled()) { Ogre::MaterialPtr matEnt = Ogre::MaterialManager::getSingletonPtr()->getByName(materialname); mEntityHandle->getSubEntity(submeshid)->setMaterial(mSceneMgr->buildDepthShadowMaterial(matEnt)); } else mEntityHandle->getSubEntity(submeshid)->setMaterialName(materialname); Ogre::String propName = "subentity" + Ogre::StringConverter::toString(submeshid) + "::material"; mProperties.setValue(propName, materialname); } } }
//----------------------------------------------------------------------------------------- bool CTerrainGroupEditor::load(bool async) { if(mLoaded->get()) return true; if(!getParent()->load()) return false; Ogre::ResourceGroupManager *mngr = Ogre::ResourceGroupManager::getSingletonPtr(); Ogre::String terrainDir = OgitorsRoot::getSingletonPtr()->GetProjectOptions()->TerrainDirectory; terrainDir = mOgitorsRoot->GetProjectFile()->getFileSystemName() + "::/" + terrainDir + "/"; mngr->addResourceLocation(terrainDir + "textures/normalheight", "Ofs", "TerrainGroupNormalHeight"); mngr->initialiseResourceGroup("TerrainGroupNormalHeight"); mngr->addResourceLocation(terrainDir + "textures/diffusespecular", "Ofs", "TerrainGroupDiffuseSpecular"); mngr->initialiseResourceGroup("TerrainGroupDiffuseSpecular"); mngr->addResourceLocation(terrainDir + "plants", "Ofs", "TerrainGroupPlants"); mngr->initialiseResourceGroup("TerrainGroupPlants"); OgitorsRoot::getSingletonPtr()->PrepareTerrainResources(); OgitorsRoot::getSingletonPtr()->ReloadUserResources(); mDecalFrustum = OGRE_NEW Ogre::Frustum(); mDecalNode = getSceneManager()->getRootSceneNode()->createChildSceneNode("OgitorTerrainDecalNode"); mDecalNode->setPosition(99999, -99999, 99999); mDecalNode->attachObject(mDecalFrustum); mDecalFrustum->setProjectionType(Ogre::PT_ORTHOGRAPHIC); mDecalNode->setOrientation(Ogre::Quaternion(Ogre::Degree(-90), Ogre::Vector3::UNIT_X)); mDecalFrustum->setFOVy(Ogre::Degree(45)); mDecalFrustum->setNearClipDistance(10); mDecalFrustum->setOrthoWindow(10, 10); mDecalFrustum->setVisible(false); mDecalTexture = Ogre::TextureManager::getSingletonPtr()->createManual("OgitorDecalTexture", "TerrainResources", Ogre::TEX_TYPE_2D, 256, 256, 1, 1, Ogre::PF_A8R8G8B8, Ogre::TU_DYNAMIC_WRITE_ONLY, this); mBrushData = OGRE_ALLOC_T(float, BRUSH_DATA_SIZE * BRUSH_DATA_SIZE, Ogre::MEMCATEGORY_GEOMETRY); mTerrainGlobalOptions->setMaxPixelError(mMaxPixelError->get()); mTerrainGlobalOptions->setCompositeMapSize(mCompositeMapTextureSize->get()); mTerrainGlobalOptions->setCompositeMapDistance(mCompositeMapDistance->get()); mTerrainGlobalOptions->setLightMapSize(mLightMapTextureSize->get()); mTerrainGlobalOptions->setLayerBlendMapSize(mBlendMapTextureSize->get()); mTerrainGlobalOptions->setUseVertexCompressionWhenAvailable(false); mTerrainGlobalOptions->setSkirtSize(mSkirtSize->get()); mTerrainGlobalOptions->setUseRayBoxDistanceCalculation(mUseRayBoxDistanceCalculation->get()); if(mMaterialGeneratorType->get() == 1) { Ogre::TerrainMaterialGeneratorPtr matGenPtr(OGRE_NEW Ogre::TerrainMaterialGeneratorC(this, mDecalFrustum)); mTerrainGlobalOptions->setDefaultMaterialGenerator(matGenPtr); mMaxLayersAllowed = 10; } else { Ogre::TerrainMaterialGeneratorPtr matGenPtr(OGRE_NEW Ogre::TerrainMaterialGeneratorB(this, mDecalFrustum)); mTerrainGlobalOptions->setDefaultMaterialGenerator(matGenPtr); mMaxLayersAllowed = 6; } CSceneManagerEditor *mSceneMgr = static_cast<CSceneManagerEditor*>(mOgitorsRoot->GetSceneManagerEditor()); if(mSceneMgr->getShadowsEnabled()) { if(mMaterialGeneratorType->get() == 1) { Ogre::TerrainMaterialGeneratorC::SM2Profile* matProfile = static_cast<Ogre::TerrainMaterialGeneratorC::SM2Profile*>(mTerrainGlobalOptions->getDefaultMaterialGenerator()->getActiveProfile()); matProfile->setReceiveDynamicShadowsEnabled(true); matProfile->setReceiveDynamicShadowsLowLod(false); matProfile->setReceiveDynamicShadowsDepth(true); matProfile->setReceiveDynamicShadowsPSSM(static_cast<Ogre::PSSMShadowCameraSetup*>(mSceneMgr->getPSSMSetup().get())); } else { Ogre::TerrainMaterialGeneratorB::SM2Profile* matProfile = static_cast<Ogre::TerrainMaterialGeneratorB::SM2Profile*>(mTerrainGlobalOptions->getDefaultMaterialGenerator()->getActiveProfile()); matProfile->setReceiveDynamicShadowsEnabled(true); matProfile->setReceiveDynamicShadowsLowLod(false); matProfile->setReceiveDynamicShadowsDepth(true); matProfile->setReceiveDynamicShadowsPSSM(static_cast<Ogre::PSSMShadowCameraSetup*>(mSceneMgr->getPSSMSetup().get())); } } CONNECT_PROPERTY_MEMFN(mSceneMgr, "shadows::enabled", CTerrainGroupEditor, onShadowsChange, mShadowsConnection[0]); CONNECT_PROPERTY_MEMFN(mSceneMgr, "shadows::technique", CTerrainGroupEditor, onShadowsTechniqueChange, mShadowsConnection[1]); mHandle = OGRE_NEW Ogre::TerrainGroup(mOgitorsRoot->GetSceneManager(), Ogre::Terrain::ALIGN_X_Z, mMapSize->get(), mWorldSize->get()); mHandle->setOrigin(Ogre::Vector3::ZERO); mHandle->setResourceGroup("TerrainResources"); mHandle->setFilenameConvention(mPageNamePrefix->get(), "ogt"); StaticGroupPtr = mHandle; mPGHandle = new PagedGeometry(mOgitorsRoot->GetViewport()->getCameraEditor()->getCamera(), mPGPageSize->get()); mPGHandle->addDetailLevel<GrassPage>(mPGDetailDistance->get()); //Create a GrassLoader object mGrassLoaderHandle = new GrassLoader(mPGHandle); mGrassLoaderHandle->setVisibilityFlags(1 << mLayer->get()); //Assign the "grassLoader" to be used to load geometry for the PagedGrass instance mPGHandle->setPageLoader(mGrassLoaderHandle); //Supply a height function to GrassLoader so it can calculate grass Y values mGrassLoaderHandle->setHeightFunction(OgitorTerrainGroupHeightFunction); Ogre::Vector3 vDir; Ogre::ColourValue cDiffuse; Ogre::SceneManager::MovableObjectIterator mit = mOgitorsRoot->GetSceneManager()->getMovableObjectIterator("Light"); while(mit.hasMoreElements()) { Ogre::Light *l = static_cast<Ogre::Light*>(mit.getNext()); if(l->getType() == Ogre::Light::LT_DIRECTIONAL && l->getCastShadows()) { vDir = l->getDerivedDirection(); cDiffuse = l->getDiffuseColour(); break; } } mTerrainGlobalOptions->setLightMapDirection(vDir); mTerrainGlobalOptions->setCompositeMapAmbient(mOgitorsRoot->GetSceneManager()->getAmbientLight()); mTerrainGlobalOptions->setCompositeMapDiffuse(cDiffuse); terrainDir = OgitorsRoot::getSingletonPtr()->GetProjectOptions()->TerrainDirectory + "/terrain/"; OFS::FileList TGAList = mOgitorsRoot->GetProjectFile()->listFiles(terrainDir.c_str(), OFS::OFS_FILE); for(unsigned int t = 0; t < TGAList.size(); t++) { int pos = TGAList[t].name.find("_density.tga"); if(pos > 0) { Ogre::Image _img; Ogre::String sLoc = terrainDir + TGAList[t].name; // Block to ensure streams are freed when exiting the block { OFS::OFSHANDLE *iHandle = new OFS::OFSHANDLE(); mOgitorsRoot->GetProjectFile()->openFile( *iHandle, sLoc.c_str() ); Ogre::DataStreamPtr img_stream = Ogre::DataStreamPtr(OGRE_NEW OfsDataStream(mOgitorsRoot->GetProjectFile(), iHandle)); _img.load(img_stream); } Ogre::String nLoc = terrainDir + TGAList[t].name.substr(0, pos); nLoc += "_density.png"; OgitorsUtils::SaveImageOfs( _img, nLoc ); mOgitorsRoot->GetProjectFile()->deleteFile( sLoc.c_str() ); } } registerForUpdates(); mLoaded->set(true); return true; }