Revision: 1437
http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1437&view=rev
Author: rorthomas
Date: 2010-07-13 20:02:18 +0000 (Tue, 13 Jul 2010)
Log Message:
-----------
added basics of new terrain mode to RoR. Completely separate from old mode. Can
be switched via "new Terrain Mode=Yes" in RoR.cfg
added shadowmanager
Modified Paths:
--------------
trunk/source/main/RigsOfRods.cpp
trunk/source/main/RoR.list
trunk/source/main/RoRFrameListener.cpp
trunk/source/main/RoRFrameListener.h
Added Paths:
-----------
trunk/source/main/ShadowManager.cpp
trunk/source/main/ShadowManager.h
Modified: trunk/source/main/RigsOfRods.cpp
===================================================================
--- trunk/source/main/RigsOfRods.cpp 2010-07-13 19:36:58 UTC (rev 1436)
+++ trunk/source/main/RigsOfRods.cpp 2010-07-13 20:02:18 UTC (rev 1437)
@@ -234,7 +234,13 @@
//CREATE SCENE MANAGER
LogManager::getSingleton().logMessage("Creating Scene Manager");
- mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
+ if(SETTINGS.getSetting("new Terrain Mode") == "Yes")
+ {
+ mSceneMgr = mRoot->createSceneManager(ST_GENERIC);
+ } else
+ {
+ mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
+ }
//CREATE CAMERA
LogManager::getSingleton().logMessage("Creating camera");
Modified: trunk/source/main/RoR.list
===================================================================
--- trunk/source/main/RoR.list 2010-07-13 19:36:58 UTC (rev 1436)
+++ trunk/source/main/RoR.list 2010-07-13 20:02:18 UTC (rev 1437)
@@ -115,6 +115,7 @@
StreamableFactory.h
resource.h
SkyManager.h
+ ShadowManager.h
)
set (SOURCE_FILES
gui_friction.cpp
@@ -219,6 +220,7 @@
NetworkStreamManager.cpp
Streamable.cpp
SkyManager.cpp
+ ShadowManager.cpp
COPYING
icon.rc
ror.ico
@@ -286,6 +288,8 @@
DynamicRenderable.h
SkyManager.h
SkyManager.cpp
+ ShadowManager.h
+ ShadowManager.cpp
envmap.cpp
envmap.h
hdrlistener.cpp
Modified: trunk/source/main/RoRFrameListener.cpp
===================================================================
--- trunk/source/main/RoRFrameListener.cpp 2010-07-13 19:36:58 UTC (rev
1436)
+++ trunk/source/main/RoRFrameListener.cpp 2010-07-13 20:02:18 UTC (rev
1437)
@@ -19,6 +19,13 @@
*/
#include "RoRFrameListener.h"
+#include "OgrePrerequisites.h"
+#include "OgreTerrain.h"
+#include "OgreTerrainQuadTreeNode.h"
+#include "OgreTerrainMaterialGeneratorA.h"
+#include "OgreTerrainPaging.h"
+
+
//#include "joystick.h"
#include "ProceduralManager.h"
#include "hdrlistener.h"
@@ -37,6 +44,7 @@
#include "rormemory.h"
#include "PlayerColours.h"
#include "OverlayWrapper.h"
+#include "ShadowManager.h"
#include "TruckHUD.h"
#ifdef USE_MPLATFORM
@@ -150,6 +158,17 @@
Camera *gCamera;
+/// This class just pretends to provide prcedural page content to avoid page
loading
+class DummyPageProvider : public PageProvider
+{
+public:
+ bool prepareProceduralPage(Page* page, PagedWorldSection* section) {
return true; }
+ bool loadProceduralPage(Page* page, PagedWorldSection* section) {
return true; }
+ bool unloadProceduralPage(Page* page, PagedWorldSection* section) {
return true; }
+ bool unprepareProceduralPage(Page* page, PagedWorldSection* section) {
return true; }
+};
+DummyPageProvider mDummyPageProvider;
+
class disableRenderingListener : public RenderTargetListener
{
private:
@@ -4716,119 +4735,9 @@
#endif
//shadows
- if (SETTINGS.getSetting("Shadow technique")=="Stencil shadows (best
looking)")
- {
- float scoef=0.2;
- mSceneMgr->setShadowColour(ColourValue(0.563+scoef,
0.578+scoef, 0.625+scoef));
+ new ShadowManager(mSceneMgr, mWindow, mCamera);
+ ShadowManager::getSingleton().loadConfiguration();
- mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE);
//projects on ground
- //
mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE); //does not project
on ground
- // mSceneMgr->setShadowIndexBufferSize(2000000);
- mSceneMgr->setShadowDirectionalLightExtrusionDistance(100);
- mSceneMgr->setShadowFarDistance(550);
-
- //important optimization
-
mSceneMgr->getRenderQueue()->getQueueGroup(RENDER_QUEUE_WORLD_GEOMETRY_1)->setShadowsEnabled(false);
-
- // mSceneMgr->setUseCullCamera(false);
- // mSceneMgr->setShowBoxes(true);
- // mSceneMgr->showBoundingBoxes(true);
- // mSceneMgr->setShowDebugShadows(true);
- } else if (SETTINGS.getSetting("Shadow technique")=="Texture shadows")
- {
- float scoef=0.2;
- mSceneMgr->setShadowColour(ColourValue(0.563+scoef,
0.578+scoef, 0.625+scoef));
-
- mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);
- // LiSPSMShadowCameraSetup* m_LiSPSMSetup = new
Ogre::LiSPSMShadowCameraSetup();
- // m_LiSPSMSetup->setOptimalAdjustFactor( 1 );
- // ShadowCameraSetupPtr m_currentShadowCameraSetup =
Ogre::ShadowCameraSetupPtr(m_LiSPSMSetup);
- //
mSceneMgr->setShadowCameraSetup(m_currentShadowCameraSetup);
-
- // FocusedShadowCameraSetup* m_FocusedSetup = new
Ogre::FocusedShadowCameraSetup();
- // ShadowCameraSetupPtr m_currentShadowCameraSetup =
Ogre::ShadowCameraSetupPtr(m_FocusedSetup);
- //
mSceneMgr->setShadowCameraSetup(m_currentShadowCameraSetup);
-
- mSceneMgr->setShadowFarDistance(50);
- mSceneMgr->setShadowTextureSettings(1024,1);
- } else if (SETTINGS.getSetting("Shadow technique")=="Soft shadows")
- {
- initSoftShadows();
- } else if (SETTINGS.getSetting("Shadow technique")=="Parallel-split
Shadow Maps")
- {
-#if OGRE_VERSION>0x010602
-
mSceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_ADDITIVE_INTEGRATED);
-
- // 3 textures per directional light
-
mSceneMgr->setShadowTextureCountPerLightType(Ogre::Light::LT_DIRECTIONAL, 3);
- mSceneMgr->setShadowTextureSettings(2048, 3, PF_FLOAT32_R);
- mSceneMgr->setShadowTextureSelfShadow(true);
- // Set up caster material - this is just a standard
depth/shadow map caster
- mSceneMgr->setShadowTextureCasterMaterial("PSSM/shadow_caster");
-
- // shadow camera setup
- PSSMShadowCameraSetup* pssmSetup = new PSSMShadowCameraSetup();
- pssmSetup->calculateSplitPoints(3,
mCamera->getNearClipDistance(), mCamera->getFarClipDistance());
- pssmSetup->setUseSimpleOptimalAdjust(true);
- //pssmSetup->setSplitPadding(10);
- //pssmSetup->setOptimalAdjustFactor(0, 2);
- //pssmSetup->setOptimalAdjustFactor(1, 1);
- //pssmSetup->setOptimalAdjustFactor(2, 0.5);
-
-
mSceneMgr->setShadowCameraSetup(ShadowCameraSetupPtr(pssmSetup));
-
-
- /*
- // we have Caelum, no need for another light
- mSceneMgr->setAmbientLight(ColourValue(0.3, 0.3, 0.3));
- Light* l = mSceneMgr->createLight("Dir");
- l->setType(Light::LT_DIRECTIONAL);
- Vector3 dir(0.3, -1, 0.2);
- dir.normalise();
- l->setDirection(dir);
- */
-
- // Create a basic plane to have something in the scene to look
at
- /*
- Plane plane;
- plane.normal = Vector3::UNIT_Y;
- plane.d = 100;
- MeshPtr msh = MeshManager::getSingleton().createPlane("Myplane",
- ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
plane,
- 4500,4500,100,100,true,1,40,40,Vector3::UNIT_Z);
- msh->buildTangentVectors(VES_TANGENT);
- Entity* pPlaneEnt;
- pPlaneEnt = mSceneMgr->createEntity( "plane", "Myplane" );
- pPlaneEnt->setMaterialName("PSSM/Plane");
-
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(pPlaneEnt);
-
- mCamera->setPosition(-50, 500, 1000);
- mCamera->lookAt(Vector3(-50,-100,0));
-
- */
- //Entity* ent = mSceneMgr->createEntity("knot", "knot.mesh");
- //ent->setMaterialName("PSSM/Knot");
-
//mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(0,0,0))->attachObject(ent);
- //createRandomEntityClones(ent, 20, Vector3(-1000,0,-1000),
Vector3(1000,0,1000));
-
- const PSSMShadowCameraSetup::SplitPointList& splitPointList =
pssmSetup->getSplitPoints();
- for (int i = 0; i < 3; ++i)
- {
- splitPoints[i] = splitPointList[i];
- }
- //MaterialPtr mat =
MaterialManager::getSingleton().getByName("PSSM/Plane");
-
//mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("pssmSplitPoints",
splitPoints);
-
- //mat =
MaterialManager::getSingleton().getByName("PSSM/Plane2");
-
//mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("pssmSplitPoints",
splitPoints);
-
- //mat = MaterialManager::getSingleton().getByName("PSSM/Knot");
-
//mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("pssmSplitPoints",
splitPoints);
-#else
- showError("Parallel-split Shadow Maps as shadow technique is
only available when you build with Ogre 1.6 support.", "PSSM error");
- exit(1);
-#endif //OGRE_VERSION
- }
ColourValue fadeColour(r,g,b);
bool fogEnable = true;
@@ -4894,7 +4803,8 @@
#ifdef USE_CAELUM
//Caelum skies
- if (SETTINGS.getSetting("Sky effects")=="Caelum (best looking, slower)")
+ bool useCaelum = SETTINGS.getSetting("Sky effects")=="Caelum (best
looking, slower)";
+ if (useCaelum)
{
//mCamera->setNearClipDistance (0.01);
mCamera->setFarClipDistance( farclip*1.733 );
@@ -4967,8 +4877,199 @@
if(!disableMap && bigMap)
bigMap->setWorldSize(mapsizex, mapsizez);
#endif //MYGUI
- if(!disableTetrrain)
- mSceneMgr->setWorldGeometry(geom);
+
+ bool newTerrainMode = (SETTINGS.getSetting("new Terrain Mode") ==
"Yes");
+ if(!newTerrainMode && !disableTetrrain)
+ {
+ // classic mode
+ mSceneMgr->setWorldGeometry(geom);
+ } else if (newTerrainMode && !disableTetrrain)
+ {
+ // new terrain mode
+ mRoot->destroySceneManager(mScene);
+ mScene = mRoot->createSceneManager(ST_GENERIC);
+ // XXX OLD TERRAIN
+ //if(!disableTetrrain)
+ // mSceneMgr->setWorldGeometry(geom);
+
+ // new terrain
+ int pageSize =
StringConverter::parseInt(cfg.getSetting("PageSize"));
+ int worldSize =
StringConverter::parseInt(cfg.getSetting("PageWorldX"));
+ int pageMaxHeight =
StringConverter::parseInt(cfg.getSetting("MaxHeight"));
+
+ String TERRAIN_FILE_PREFIX = String(geom); //"testTerrain";
+ String TERRAIN_FILE_SUFFIX = "mapbin";
+ float TERRAIN_WORLD_SIZE = worldSize; //1000.0f; //
PageWorldX?
+ int TERRAIN_SIZE = pageSize;
+ int TERRAIN_PAGE_MIN_X=0, TERRAIN_PAGE_MAX_X=0;
+ int TERRAIN_PAGE_MIN_Y=0, TERRAIN_PAGE_MAX_Y=0;
+ bool mTerrainsImported=false;
+ TerrainPaging* mTerrainPaging=0;
+ PageManager* mPageManager=0;
+ Light* l = 0;
+
+#ifdef USE_CAELUM
+ if(!useCaelum)
+ l = mSceneMgr->getLight("MainLight");
+ else
+ l = SkyManager::getSingleton().getMainLight();
+#else // USE_CAELUM
+ l = mSceneMgr->getLight("MainLight");
+#endif // USE_CAELUM
+
+ Vector3 mTerrainPos(0,0,0);
+ mTerrainGroup = OGRE_NEW TerrainGroup(mSceneMgr,
Terrain::ALIGN_X_Z, TERRAIN_SIZE, TERRAIN_WORLD_SIZE);
+ mTerrainGroup->setFilenameConvention(TERRAIN_FILE_PREFIX,
TERRAIN_FILE_SUFFIX);
+ mTerrainGroup->setOrigin(mTerrainPos);
+
+ new TerrainGlobalOptions();
+ // Configure global
+ TerrainGlobalOptions::getSingleton().setMaxPixelError(8);
+ // testing composite map
+
TerrainGlobalOptions::getSingleton().setCompositeMapDistance(3000);
+ //mTerrainGlobals->setUseRayBoxDistanceCalculation(true);
+
//mTerrainGlobals->getDefaultMaterialGenerator()->setDebugLevel(1);
+ //mTerrainGlobals->setLightMapSize(256);
+
+ //matProfile->setLightmapEnabled(false);
+ // Important to set these so that the terrain knows what to use
for derived (non-realtime) data
+ if(l)
TerrainGlobalOptions::getSingleton().setLightMapDirection(l->getDerivedDirection());
+
TerrainGlobalOptions::getSingleton().setCompositeMapAmbient(mSceneMgr->getAmbientLight());
+ //mTerrainGlobals->setCompositeMapAmbient(ColourValue::Red);
+ if(l)
TerrainGlobalOptions::getSingleton().setCompositeMapDiffuse(l->getDiffuseColour());
+
+ // Configure default import settings for if we use imported
image
+ Terrain::ImportData& defaultimp =
mTerrainGroup->getDefaultImportSettings();
+ defaultimp.terrainSize = TERRAIN_SIZE;
+ defaultimp.worldSize = TERRAIN_WORLD_SIZE;
+
+ defaultimp.inputScale = pageMaxHeight;
+ defaultimp.minBatchSize = 32;
+ defaultimp.maxBatchSize = 64;
+ // textures
+ defaultimp.layerList.resize(3);
+ defaultimp.layerList[0].worldSize = 10;
+
defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_diffusespecular.dds");
+
defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_normalheight.dds");
+ defaultimp.layerList[1].worldSize = 10;
+
defaultimp.layerList[1].textureNames.push_back("grass_green-01_diffusespecular.dds");
+
defaultimp.layerList[1].textureNames.push_back("grass_green-01_normalheight.dds");
+ defaultimp.layerList[2].worldSize = 20;
+
defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_diffusespecular.dds");
+
defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_normalheight.dds");
+
+ bool paging = false;
+ if(!paging)
+ {
+ for (long x = TERRAIN_PAGE_MIN_X; x <=
TERRAIN_PAGE_MAX_X; ++x)
+ {
+ for (long y = TERRAIN_PAGE_MIN_Y; y <=
TERRAIN_PAGE_MAX_Y; ++y)
+ {
+ String filename =
mTerrainGroup->generateFilename(x, y);
+ if
(ResourceGroupManager::getSingleton().resourceExists(mTerrainGroup->getResourceGroup(),
filename))
+ {
+ mTerrainGroup->defineTerrain(x,
y);
+ }
+ else
+ {
+ String heightmapFilename =
cfg.getSetting("Heightmap.image");
+ Image img;
+
if(heightmapFilename.find(".raw") != String::npos)
+ {
+ int rawSize =
StringConverter::parseInt(cfg.getSetting("Heightmap.raw.size"));
+ int bpp =
StringConverter::parseInt(cfg.getSetting("Heightmap.raw.bpp"));
+
+ // load raw data
+ DataStreamPtr stream =
ResourceGroupManager::getSingleton().openResource(heightmapFilename);
+
LogManager::getSingleton().logMessage(" loading RAW image: " +
StringConverter::toString(stream->size()) + " / " +
StringConverter::toString(rawSize*rawSize*bpp));
+ PixelFormat pformat =
PF_L8;
+ if(bpp == 2)
+ pformat =
PF_L16;
+ img.loadRawData(stream,
rawSize, rawSize, 1, pformat);
+ } else
+ {
+
img.load(heightmapFilename, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+ }
+ if (x % 2 != 0)
+ img.flipAroundY();
+ if (y % 2 != 0)
+ img.flipAroundX();
+
+ mTerrainGroup->defineTerrain(x,
y, &img);
+ mTerrainsImported = true;
+ }
+ }
+ }
+ // sync load since we want everything in place when we
start
+ mTerrainGroup->loadAllTerrains(true);
+ } else
+ {
+ // paging, yeah!
+ // Paging setup
+ mPageManager = OGRE_NEW PageManager();
+ // Since we're not loading any pages from .page files,
we need a way just
+ // to say we've loaded them without them actually being
loaded
+ mPageManager->setPageProvider(&mDummyPageProvider);
+ mPageManager->addCamera(mCamera);
+ mTerrainPaging = OGRE_NEW TerrainPaging(mPageManager);
+ PagedWorld* world = mPageManager->createWorld();
+ mTerrainPaging->createWorldSection(world,
mTerrainGroup, TERRAIN_WORLD_SIZE, TERRAIN_WORLD_SIZE*1.2f,
+ TERRAIN_PAGE_MIN_X, TERRAIN_PAGE_MIN_Y,
+ TERRAIN_PAGE_MAX_X, TERRAIN_PAGE_MAX_Y);
+ }
+
+ if (mTerrainsImported)
+ {
+ TerrainGroup::TerrainIterator ti =
mTerrainGroup->getTerrainIterator();
+ while(ti.hasMoreElements())
+ {
+ Terrain* terrain = ti.getNext()->instance;
+ TerrainLayerBlendMap* blendMap0 =
terrain->getLayerBlendMap(1);
+ TerrainLayerBlendMap* blendMap1 =
terrain->getLayerBlendMap(2);
+ Real minHeight0 = 5;
+ Real fadeDist0 = 40;
+ Real minHeight1 = 10;
+ Real fadeDist1 = 15;
+ float* pBlend1 = blendMap1->getBlendPointer();
+ for (Ogre::uint16 y = 0; y <
terrain->getLayerBlendMapSize(); ++y)
+ {
+ for (Ogre::uint16 x = 0; x <
terrain->getLayerBlendMapSize(); ++x)
+ {
+ Real tx, ty;
+
+
blendMap0->convertImageToTerrainSpace(x, y, &tx, &ty);
+ Real height =
terrain->getHeightAtTerrainPosition(tx, ty);
+ Real val = (height -
minHeight0) / fadeDist0;
+ val = Math::Clamp(val, (Real)0,
(Real)1);
+ //*pBlend0++ = val;
+
+ val = (height - minHeight1) /
fadeDist1;
+ val = Math::Clamp(val, (Real)0,
(Real)1);
+ *pBlend1++ = val;
+
+
+ }
+ }
+ blendMap0->dirty();
+ blendMap1->dirty();
+ //blendMap0->loadImage("blendmap1.png",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+ blendMap0->update();
+ blendMap1->update();
+
+ // set up a colour map
+ /*
+ if (!terrain->getGlobalColourMapEnabled())
+ {
+
terrain->setGlobalColourMapEnabled(true);
+ Image colourMap;
+ colourMap.load("testcolourmap.jpg",
ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
+
terrain->getGlobalColourMap()->loadImage(colourMap);
+ }
+ */
+ }
+ }
+
+ mTerrainGroup->freeTemporaryResources();
}
@@ -5301,8 +5402,13 @@
float wheight=0.0;
if (w) wheight=w->getHeight()-30.0;
-
- hfinder = new TSMHeightFinder(geom, terrainmap, wheight);
+ // we choose the heightfinder depending on whether we use the classical
+ // terrain or the new one
+ if(newTerrainMode)
+ hfinder = new NTHeightFinder(mTerrainGroup, Vector3::ZERO);
+ else
+ hfinder = new TSMHeightFinder(geom, terrainmap, wheight);
+
collisions->setHfinder(hfinder);
if(person) person->setHFinder(hfinder);
@@ -5860,6 +5966,8 @@
//if (envmap) envmap->update(Vector3(terrainxsize/2.0,
hfinder->getHeightAt(terrainxsize/2.0, terrainzsize/2.0)+50.0,
terrainzsize/2.0));
#if OGRE_VERSION>0x010602
+#if 0
+ // disabled for now, to be cleaned up and moved into the shadowmanager
if (SETTINGS.getSetting("Shadow technique")=="Parallel-split Shadow
Maps")
{
Ogre::ResourceManager::ResourceMapIterator RI =
Ogre::MaterialManager::getSingleton().getResourceIterator();
@@ -5872,6 +5980,7 @@
mat->getTechnique(0)->getPass("SkyLight")->getFragmentProgramParameters()->setNamedConstant("pssmSplitPoints",
splitPoints);
}
}
+#endif //0
#endif //OGRE_VERSION
}
Modified: trunk/source/main/RoRFrameListener.h
===================================================================
--- trunk/source/main/RoRFrameListener.h 2010-07-13 19:36:58 UTC (rev
1436)
+++ trunk/source/main/RoRFrameListener.h 2010-07-13 20:02:18 UTC (rev
1437)
@@ -59,6 +59,7 @@
# include "TreeLoader2D.h"
#endif
+#include "OgreTerrainGroup.h"
#ifdef USE_LUA
class LuaSystem;
@@ -232,6 +233,7 @@
bool enablePosStor;
//GUI_Progress *gui_progress;
+ TerrainGroup* mTerrainGroup;
std::map<String, spawn_location_t> netSpawnPos;
float truckx, trucky, truckz;
Added: trunk/source/main/ShadowManager.cpp
===================================================================
--- trunk/source/main/ShadowManager.cpp (rev 0)
+++ trunk/source/main/ShadowManager.cpp 2010-07-13 20:02:18 UTC (rev 1437)
@@ -0,0 +1,152 @@
+/*
+This source file is part of Rigs of Rods
+Copyright 2005,2006,2007,2008,2009,2010 Pierre-Michel Ricordel
+Copyright 2007,2008,2009,2010 Thomas Fischer
+
+For more information, see http://www.rigsofrods.com/
+
+Rigs of Rods is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License version 3, as
+published by the Free Software Foundation.
+
+Rigs of Rods is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "ShadowManager.h"
+
+#include "Ogre.h"
+#include "OgreShadowCameraSetup.h"
+
+#include "OgreTerrain.h"
+#include "OgreTerrainMaterialGeneratorA.h"
+
+#include "Settings.h"
+
+using namespace std;
+using namespace Ogre;
+
+//---------------------------------------------------------------------
+template<> ShadowManager * Singleton< ShadowManager >::ms_Singleton = 0;
+ShadowManager* ShadowManager::getSingletonPtr(void)
+{
+ return ms_Singleton;
+}
+ShadowManager& ShadowManager::getSingleton(void)
+{
+ assert( ms_Singleton ); return ( *ms_Singleton );
+}
+
+ShadowManager::ShadowManager(Ogre::SceneManager *scene, Ogre::RenderWindow
*window, Ogre::Camera *camera) :
+ mSceneMgr(scene), mWindow(window), mCamera(camera), mPSSMSetup()
+{
+}
+
+ShadowManager::~ShadowManager()
+{
+}
+
+void ShadowManager::loadConfiguration()
+{
+ String s = SETTINGS.getSetting("Shadow technique");
+ if (s == "Stencil shadows")
changeShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE);
+ if (s == "Texture shadows")
changeShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);
+ if (s == "Parallel-split Shadow Maps")
changeShadowTechnique(SHADOWTYPE_TEXTURE_ADDITIVE_INTEGRATED);
+}
+int ShadowManager::changeShadowTechnique(Ogre::ShadowTechnique tech)
+{
+ float shadowFarDistance = 500;
+ float scoef=0.2;
+ mSceneMgr->setShadowColour(ColourValue(0.563+scoef, 0.578+scoef,
0.625+scoef));
+
+ mSceneMgr->setShadowTechnique(tech);
+ mSceneMgr->setShadowFarDistance(shadowFarDistance);
+ mSceneMgr->setShowDebugShadows(true);
+
+ if(tech == SHADOWTYPE_STENCIL_MODULATIVE)
+ {
+ // mSceneMgr->setShadowIndexBufferSize(2000000);
+ mSceneMgr->setShadowDirectionalLightExtrusionDistance(100);
+
+ //important optimization
+
mSceneMgr->getRenderQueue()->getQueueGroup(RENDER_QUEUE_WORLD_GEOMETRY_1)->setShadowsEnabled(false);
+
+ // mSceneMgr->setUseCullCamera(false);
+ // mSceneMgr->setShowBoxes(true);
+ // mSceneMgr->showBoundingBoxes(true);
+ } else if(tech == SHADOWTYPE_TEXTURE_MODULATIVE)
+ {
+ mSceneMgr->setShadowTextureSettings(1024,1);
+ } else if(tech == SHADOWTYPE_TEXTURE_ADDITIVE_INTEGRATED)
+ {
+#if OGRE_VERSION>0x010602
+
+ TerrainMaterialGeneratorA::SM2Profile* matProfile =
static_cast<TerrainMaterialGeneratorA::SM2Profile*>(TerrainGlobalOptions::getSingleton().getDefaultMaterialGenerator()->getActiveProfile());
+ matProfile->setReceiveDynamicShadowsEnabled(true);
+ matProfile->setReceiveDynamicShadowsLowLod(false);
+
+
+ // General scene setup
+
+ // 3 textures per directional light (PSSM)
+
mSceneMgr->setShadowTextureCountPerLightType(Ogre::Light::LT_DIRECTIONAL, 3);
+
+ if (mPSSMSetup.isNull())
+ {
+ // shadow camera setup
+ PSSMShadowCameraSetup* pssmSetup = new
PSSMShadowCameraSetup();
+
pssmSetup->setSplitPadding(mCamera->getNearClipDistance());
+ pssmSetup->calculateSplitPoints(3,
mCamera->getNearClipDistance(), mSceneMgr->getShadowFarDistance());
+ pssmSetup->setOptimalAdjustFactor(0, 2);
+ pssmSetup->setOptimalAdjustFactor(1, 1);
+ pssmSetup->setOptimalAdjustFactor(2, 0.5);
+
+ mPSSMSetup.bind(pssmSetup);
+
+ }
+ mSceneMgr->setShadowCameraSetup(mPSSMSetup);
+
+ bool depthShadows = false;
+ if (depthShadows)
+ {
+ /*
+ mSceneMgr->setShadowTextureCount(3);
+ mSceneMgr->setShadowTextureConfig(0, 2048, 2048,
PF_FLOAT32_R);
+ mSceneMgr->setShadowTextureConfig(1, 1024, 1024,
PF_FLOAT32_R);
+ mSceneMgr->setShadowTextureConfig(2, 1024, 1024,
PF_FLOAT32_R);
+ mSceneMgr->setShadowTextureSelfShadow(true);
+ mSceneMgr->setShadowCasterRenderBackFaces(true);
+
mSceneMgr->setShadowTextureCasterMaterial("PSSM/shadow_caster");
+
+ MaterialPtr houseMat =
buildDepthShadowMaterial("fw12b.jpg");
+ for (EntityList::iterator i = mHouseList.begin(); i !=
mHouseList.end(); ++i)
+ {
+ (*i)->setMaterial(houseMat);
+ }
+ */
+
+ }
+ else
+ {
+ mSceneMgr->setShadowTextureCount(3);
+ mSceneMgr->setShadowTextureConfig(0, 2048, 2048,
PF_X8B8G8R8);
+ mSceneMgr->setShadowTextureConfig(1, 1024, 1024,
PF_X8B8G8R8);
+ mSceneMgr->setShadowTextureConfig(2, 1024, 1024,
PF_X8B8G8R8);
+ mSceneMgr->setShadowTextureSelfShadow(false);
+ mSceneMgr->setShadowCasterRenderBackFaces(false);
+
mSceneMgr->setShadowTextureCasterMaterial(StringUtil::BLANK);
+ }
+
+ matProfile->setReceiveDynamicShadowsDepth(depthShadows);
+
matProfile->setReceiveDynamicShadowsPSSM(static_cast<PSSMShadowCameraSetup*>(mPSSMSetup.get()));
+#else
+ showError("Parallel-split Shadow Maps as shadow technique is
only available when you build with Ogre 1.6 support.", "PSSM error");
+ exit(1);
+#endif //OGRE_VERSION
+ }
+ return 0;
+}
Added: trunk/source/main/ShadowManager.h
===================================================================
--- trunk/source/main/ShadowManager.h (rev 0)
+++ trunk/source/main/ShadowManager.h 2010-07-13 20:02:18 UTC (rev 1437)
@@ -0,0 +1,51 @@
+/*
+This source file is part of Rigs of Rods
+Copyright 2005,2006,2007,2008,2009,2010 Pierre-Michel Ricordel
+Copyright 2007,2008,2009,2010 Thomas Fischer
+
+For more information, see http://www.rigsofrods.com/
+
+Rigs of Rods is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License version 3, as
+published by the Free Software Foundation.
+
+Rigs of Rods is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
+*/
+// created by thomas{AT}thomasfischer{DOT}biz, 5th of July 2010
+#ifndef SHADOWMANAGER_H__
+#define SHADOWMANAGER_H__
+
+#include "OgrePrerequisites.h"
+#ifdef USE_CAELUM
+#include "CaelumPrerequisites.h"
+#endif // USE_CAELUM
+#include "OgreCommon.h"
+#include "OgreSingleton.h"
+#include "OgreShadowCameraSetup.h"
+
+class ShadowManager : public Ogre::Singleton< ShadowManager >
+{
+public:
+ ShadowManager(Ogre::SceneManager *mScene, Ogre::RenderWindow *mWindow,
Ogre::Camera *mCamera);
+ ~ShadowManager();
+
+ static ShadowManager& getSingleton(void);
+ static ShadowManager* getSingletonPtr(void);
+
+ int changeShadowTechnique(Ogre::ShadowTechnique tech);
+ void loadConfiguration();
+
+protected:
+ Ogre::SceneManager *mSceneMgr;
+ Ogre::RenderWindow *mWindow;
+ Ogre::Camera *mCamera;
+ Ogre::ShadowCameraSetupPtr mPSSMSetup;
+};
+
+#endif //SHADOWMANAGER_H__
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Rigsofrods-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel