Revision: 2769
http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2769&view=rev
Author: rorthomas
Date: 2012-06-02 17:56:31 +0000 (Sat, 02 Jun 2012)
Log Message:
-----------
terrain object loading basics working
Modified Paths:
--------------
trunk/source/main/gameplay/RoRFrameListener.cpp
trunk/source/main/gameplay/RoRFrameListener.h
trunk/source/main/terrain/TerrainGeometryManager.h
trunk/source/main/terrain/TerrainManager.cpp
trunk/source/main/terrain/TerrainManager.h
trunk/source/main/terrain/TerrainObjectManager.cpp
trunk/source/main/terrain/TerrainObjectManager.h
Modified: trunk/source/main/gameplay/RoRFrameListener.cpp
===================================================================
--- trunk/source/main/gameplay/RoRFrameListener.cpp 2012-06-01 11:25:53 UTC
(rev 2768)
+++ trunk/source/main/gameplay/RoRFrameListener.cpp 2012-06-02 17:56:31 UTC
(rev 2769)
@@ -45,7 +45,6 @@
#include "DustManager.h"
#include "EnvironmentMap.h"
#include "ErrorUtils.h"
-#include "ExtinguishableFireAffector.h"
#include "FlexAirfoil.h"
#include "ForceFeedback.h"
#include "GlowMaterialListener.h"
@@ -124,31 +123,10 @@
//#include <CFUserNotification.h>
#endif
-#ifdef USE_PAGED
-#include "BatchPage.h"
-#include "GrassLoader.h"
-#include "ImpostorPage.h"
-#include "PagedGeometry.h"
-#include "TreeLoader2D.h"
-#include "TreeLoader3D.h"
-#endif //USE_PAGED
-
-#ifdef USE_PAGED
-using namespace Forests;
-#endif //USE_PAGED
-
using namespace Ogre;
bool shutdownall=false;
-//workaround for pagedgeometry
-inline float getTerrainHeight(Real x, Real z, void *unused=0)
-{
- if (!gEnv->terrainManager->getHeightFinder())
- return 1;
- return gEnv->terrainManager->getHeightFinder()->getHeightAt(x, z);
-}
-
void RoRFrameListener::startTimer()
{
raceStartTime = (int)rtime;
@@ -695,7 +673,6 @@
flaresMode(3), // on by default
forcefeedback(0),
freeTruckPosition(false),
- free_localizer(0),
heathaze(0),
hidegui(false),
initialized(false),
@@ -710,7 +687,6 @@
netChat(0),
netPointToUID(-1),
netcheckGUITimer(0),
- objcounter(0),
objectCounter(0),
ow(0),
parentState(parentState),
@@ -723,8 +699,7 @@
shaderSchemeMode(1),
surveyMap(0),
surveyMapMode(SURVEY_MAP_NONE),
- terrainUID(""),
- truck_preload_num(0)
+ terrainUID("")
{
// we don't use overlays in embedded mode
if (!gEnv->embeddedMode)
@@ -1093,7 +1068,7 @@
if (preselected_truck.empty())
{
- if (truck_preload_num == 0 && (!netmode ||
false/*!terrainHasTruckShop*/))
+ if (!gEnv->terrainManager->getTrucksLoaded() &&
(!netmode || false/*!terrainHasTruckShop*/))
{
#ifdef USE_MYGUI
// show truck selector
@@ -1139,21 +1114,7 @@
#endif //MYGUI
// if (joy) delete (joy);
-#ifdef USE_PAGED
- for (std::vector<paged_geometry_t>::iterator it=pagedGeometry.begin();
it!=pagedGeometry.end(); it++)
- {
- if (it->geom)
- {
- delete(it->geom);
- it->geom=0;
- }
- if (it->loader)
- {
- delete((TreeLoader2D *)it->loader);
- it->loader=0;
- }
- }
-#endif
+
#ifdef USE_SOCKETW
if (net) delete (net);
#endif //SOCKETW
@@ -2586,7 +2547,7 @@
loadTerrain(sel->fname);
// no trucks loaded?
- if (truck_preload_num == 0)
+ if
(!gEnv->terrainManager->getTrucksLoaded())
{
// show truck selector
if
(gEnv->terrainManager->getWater())
@@ -2882,29 +2843,6 @@
}
}
- // load the rest in SP
- // in netmode, don't load other trucks!
- if (!netmode)
- {
- for (int i=0; i<truck_preload_num; i++)
- {
- Beam *b =
BeamFactory::getSingleton().createLocal(Vector3(truck_preload[i].px,
truck_preload[i].py, truck_preload[i].pz), truck_preload[i].rotation,
truck_preload[i].name, 0, truck_preload[i].ismachine, flaresMode, truckconfig,
0, truck_preload[i].freePosition);
-#ifdef USE_MYGUI
- if (b && surveyMap)
- {
- MapEntity *e =
surveyMap->createNamedMapEntity("Truck"+TOSTRING(b->trucknum),
MapControl::getTypeByDriveable(b->driveable));
- if (e)
- {
- e->setState(DESACTIVATED);
- e->setVisibility(true);
- e->setPosition(truck_preload[i].px,
truck_preload[i].pz);
-
e->setRotation(-Radian(b->getHeadingDirectionAngle()));
- }
- }
-#endif //USE_MYGUI
- }
-
- }
LOG("EFL: beam instanciated");
if (!enterTruck)
@@ -3297,13 +3235,7 @@
// one of the input modes is immediate, so update the movement vector
if (loading_state==ALL_LOADED || loading_state == TERRAIN_EDITOR)
{
-#ifdef USE_PAGED
- // paged geometry
- for (std::vector<paged_geometry_t>::iterator
it=pagedGeometry.begin();it!=pagedGeometry.end();it++)
- {
- if (it->geom) it->geom->update();
- }
-#endif //USE_PAGED
+
BeamFactory::getSingleton().checkSleepingState();
Modified: trunk/source/main/gameplay/RoRFrameListener.h
===================================================================
--- trunk/source/main/gameplay/RoRFrameListener.h 2012-06-01 11:25:53 UTC
(rev 2768)
+++ trunk/source/main/gameplay/RoRFrameListener.h 2012-06-02 17:56:31 UTC
(rev 2769)
@@ -42,13 +42,6 @@
class TerrainGroup;
}
-#ifdef USE_PAGED
-namespace Forests
-{
- class PagedGeometry;
- class TreeLoader2D;
-}
-#endif //USE_PAGED
class RoRFrameListener: public Ogre::FrameListener, public
Ogre::WindowEventListener, public ZeroedMemoryAllocator
{
@@ -72,36 +65,6 @@
protected:
- typedef struct
- {
- float px;
- float py;
- float pz;
- //float ry;
- Ogre::Quaternion rotation;
- char name[256];
- bool ismachine;
- bool freePosition;
- } truck_prepare_t;
-
- typedef struct
- {
- Ogre::Vector3 pos;
- Ogre::Quaternion rot;
- } spawn_location_t;
-
-
-#ifdef USE_PAGED
- typedef struct
- {
- Forests::PagedGeometry *geom;
- void *loader;
- } paged_geometry_t;
-
- std::vector<paged_geometry_t> pagedGeometry;
- Forests::TreeLoader2D *treeLoader;
-#endif //USE_PAGED
-
#ifdef USE_MPLATFORM
MPlatform_Base *mplatform;
#endif //USE_MPLATFORM
@@ -124,7 +87,6 @@
Ogre::Real mTimeUntilNextToggle; // just to stop toggles flipping too
fast
Ogre::SceneNode *dirArrowNode;
Ogre::SceneNode *pointerDestination;
- Ogre::String grassdensityTextureFilename;
Ogre::String inputhwnd;
Ogre::String terrainUID;
Ogre::Vector3 dirArrowPointed;
@@ -151,14 +113,12 @@
double rtime;
float clutch;
- float farclip;
float mouseGrabForce;
float terrainxsize;
float terrainzsize;
//float truckx, trucky, truckz;
int flaresMode;
- int free_localizer;
int gameStartTime;
int inputGrabMode;
int joyshiftlock;
@@ -167,17 +127,14 @@
int mouseGrabState;
int netPointToUID;
int nodegrabbed;
- int objcounter;
int objectCounter;
int raceStartTime;
int screenHeight;
int screenWidth;
int shaderSchemeMode;
- int truck_preload_num;
int truckgrabbed;
- truck_prepare_t truck_preload[100];
unsigned int mNumScreenShots;
Modified: trunk/source/main/terrain/TerrainGeometryManager.h
===================================================================
--- trunk/source/main/terrain/TerrainGeometryManager.h 2012-06-01 11:25:53 UTC
(rev 2768)
+++ trunk/source/main/terrain/TerrainGeometryManager.h 2012-06-02 17:56:31 UTC
(rev 2769)
@@ -35,6 +35,7 @@
// this class handles all interactions with the Ogre Terrain system
class TerrainGeometryManager : public IHeightFinder, public
ZeroedMemoryAllocator
{
+ friend class TerrainObjectManager;
public:
TerrainGeometryManager(TerrainManager *terrainManager);
~TerrainGeometryManager();
Modified: trunk/source/main/terrain/TerrainManager.cpp
===================================================================
--- trunk/source/main/terrain/TerrainManager.cpp 2012-06-01 11:25:53 UTC
(rev 2768)
+++ trunk/source/main/terrain/TerrainManager.cpp 2012-06-02 17:56:31 UTC
(rev 2769)
@@ -54,6 +54,15 @@
}
+
+// some shortcut to remove ugly code
+#ifdef USE_MYGUI
+#include "LoadingWindow.h"
+#define PROGRESS_WINDOW(x, y) LoadingWindow::getSingleton().setProgress(x, y);
+#else
+#define PROGRESS_WINDOW(x, y)
+#endif //USE_MYGUI
+
void TerrainManager::loadTerrainConfigBasics(Ogre::DataStreamPtr &ds)
{
// now generate the hash of it
@@ -101,6 +110,8 @@
exit(125);
}
+ PROGRESS_WINDOW(10, _L("Loading Terrain Configuration"));
+
loadTerrainConfigBasics(ds);
@@ -110,8 +121,10 @@
fixCompositorClearColor();
// load the terrain geometry
+ PROGRESS_WINDOW(80, _L("Loading Terrain Geometry"));
geometry_manager->loadOgreTerrainConfig(ogre_terrain_config_filename);
+ PROGRESS_WINDOW(90, _L("Loading Terrain Objects"));
loadTerrainObjects();
collisions->printStats();
@@ -133,56 +146,74 @@
void TerrainManager::initSubSystems()
{
// geometry - ogre terrain things
+ PROGRESS_WINDOW(15, _L("Initializing Geometry Subsystem"));
initGeometry();
// objects - .odef support
+ PROGRESS_WINDOW(17, _L("Initializing Object Subsystem"));
initObjects();
// collisions
+ PROGRESS_WINDOW(19, _L("Initializing Collision Subsystem"));
initCollisions();
// shadows
+ PROGRESS_WINDOW(21, _L("Initializing Shadow Subsystem"));
initShadows();
// sky
+ PROGRESS_WINDOW(23, _L("Initializing Sky Subsystem"));
initSkySubSystem();
+ PROGRESS_WINDOW(25, _L("Initializing Camera Subsystem"));
initCamera();
+ PROGRESS_WINDOW(27, _L("Initializing Light Subsystem"));
initLight();
+ PROGRESS_WINDOW(29, _L("Initializing Fog Subsystem"));
initFog();
+ PROGRESS_WINDOW(31, _L("Initializing Vegetation Subsystem"));
initVegetation();
+ PROGRESS_WINDOW(33, _L("Initializing Water Subsystem"));
initWater();
if (BSETTING("HDR", false))
{
+ PROGRESS_WINDOW(35, _L("Initializing HDR Subsystem"));
initHDR();
}
if (BSETTING("Glow", false))
{
+ PROGRESS_WINDOW(37, _L("Initializing Glow Subsystem"));
initGlow();
}
if (BSETTING("Motion blur", false))
{
+ PROGRESS_WINDOW(39, _L("Initializing Motion Blur Subsystem"));
initMotionBlur();
}
if (BSETTING("Sunburn", false))
{
+ PROGRESS_WINDOW(41, _L("Initializing Sunburn Subsystem"));
initSunburn();
}
// environment map
if (!BSETTING("Envmapdisable", false))
{
+ PROGRESS_WINDOW(43, _L("Initializing Environment Map
Subsystem"));
initEnvironmentMap();
}
// init the map
if (!BSETTING("disableOverViewMap", false))
{
+ PROGRESS_WINDOW(45, _L("Initializing Overview Map Subsystem"));
initSurveyMap();
}
+
+ PROGRESS_WINDOW(47, _L("Initializing Dashboards Subsystem"));
initDashboards();
}
@@ -264,8 +295,8 @@
void TerrainManager::initVegetation()
{
// get vegetation mode
- int pagedMode = 0; //None
- float pagedDetailFactor = 0;
+ pagedMode = 0; //None
+ pagedDetailFactor = 0;
String vegetationMode = SSETTING("Vegetation", "None (fastest)");
if (vegetationMode == "None (fastest)")
{
@@ -466,12 +497,21 @@
object_manager->loadObjectConfigFile(sname);
}
+
+ // bakes the geometry and things
+ object_manager->postLoad();
}
void TerrainManager::initCollisions()
{
collisions = new Collisions();
gEnv->collisions = collisions;
+
+ String tractionMapConfig = mTerrainConfig.getSetting("TractionMap",
"General");
+ if (!tractionMapConfig.empty())
+ {
+ gEnv->collisions->setupLandUse(tractionMapConfig.c_str());
+ }
}
void TerrainManager::initScripting()
Modified: trunk/source/main/terrain/TerrainManager.h
===================================================================
--- trunk/source/main/terrain/TerrainManager.h 2012-06-01 11:25:53 UTC (rev
2768)
+++ trunk/source/main/terrain/TerrainManager.h 2012-06-02 17:56:31 UTC (rev
2769)
@@ -29,6 +29,7 @@
class TerrainManager : public ZeroedMemoryAllocator
{
friend class CacheSystem;
+ friend class TerrainObjectManager;
public:
TerrainManager();
@@ -52,6 +53,7 @@
Water *getWater() { return water; };
Ogre::Light *getMainLight() { return main_light; };
Ogre::Vector3 getSpawnPos() { return start_position; };
+ bool getTrucksLoaded() { return trucksLoaded; };
protected:
// members
@@ -86,7 +88,9 @@
float water_line;
int farclip;
int loading_state;
-
+ int pagedMode;
+ float pagedDetailFactor;
+ bool trucksLoaded;
// internal methods
void initCamera();
void initCollisions();
Modified: trunk/source/main/terrain/TerrainObjectManager.cpp
===================================================================
--- trunk/source/main/terrain/TerrainObjectManager.cpp 2012-06-01 11:25:53 UTC
(rev 2768)
+++ trunk/source/main/terrain/TerrainObjectManager.cpp 2012-06-02 17:56:31 UTC
(rev 2769)
@@ -28,65 +28,121 @@
#include "RoRFrameListener.h"
#include "SkyManager.h"
+#include "Collisions.h"
+
+#include "MeshObject.h"
+
+#include "SoundScriptManager.h"
+#include "TerrainManager.h"
+#include "TerrainGeometryManager.h"
+#include "Settings.h"
+
+#include "ExtinguishableFireAffector.h"
+
+#include "ScopeLog.h"
+
+#include "AutoPilot.h"
+
+#include "Road2.h"
+
+#include <OgreRTShaderSystem.h>
+#include <OgreFontManager.h>
+
+#include "WriteTextToTexture.h"
+
+#include "ResourceBuffer.h"
+
+#include "MapControl.h"
+#include "MapEntity.h"
+
+
+using namespace Ogre;
+
#ifdef USE_PAGED
-#include "BatchPage.h"
-#include "GrassLoader.h"
-#include "ImpostorPage.h"
-#include "PagedGeometry.h"
-#include "TreeLoader2D.h"
-#include "TreeLoader3D.h"
+using namespace Forests;
#endif //USE_PAGED
-#ifdef USE_PAGED
-namespace Forests
+
+//workaround for pagedgeometry
+inline float getTerrainHeight(Real x, Real z, void *unused=0)
{
- class PagedGeometry;
- class TreeLoader2D;
+ if (!gEnv->terrainManager->getHeightFinder())
+ return 1;
+ return gEnv->terrainManager->getHeightFinder()->getHeightAt(x, z);
}
-#endif //USE_PAGED
-using namespace Ogre;
TerrainObjectManager::TerrainObjectManager(TerrainManager *terrainManager) :
terrainManager(terrainManager)
{
+ //prepare for baking
+ bakeNode =
gEnv->sceneManager->getRootSceneNode()->createChildSceneNode();
}
TerrainObjectManager::~TerrainObjectManager()
{
-
+#ifdef USE_PAGED
+ for (std::vector<paged_geometry_t>::iterator it=pagedGeometry.begin();
it!=pagedGeometry.end(); it++)
+ {
+ if (it->geom)
+ {
+ delete(it->geom);
+ it->geom=0;
+ }
+ if (it->loader)
+ {
+ delete((TreeLoader2D *)it->loader);
+ it->loader=0;
+ }
+ }
+#endif //USE_PAGED
}
void TerrainObjectManager::loadObjectConfigFile(Ogre::String odefname)
{
-#if 0
- //prepare for baking
- SceneNode
*bakeNode=globalEnvironment->ogreSceneManager->getRootSceneNode()->createChildSceneNode();
+ objcounter = 0;
+ free_localizer = 0;
+
#ifdef USE_PAGED
- Forests::TreeLoader2D *treeLoader = 0;
+ Forests::TreeLoader2D *treeLoader = 0;
Entity *curTree = 0;
String treename = "";
-#endif
+#endif // USE_PAGED
ProceduralObject po;
po.loadingState = -1;
int r2oldmode = 0;
int lastprogress = -1;
bool proroad = false;
-
- String odefgroup =
ResourceGroupManager::getSingleton().findGroupContainingResource(odefname);
- DataStreamPtr
ds=ResourceGroupManager::getSingleton().openResource(odefname, odefgroup);
- long line = 0;
+ DataStreamPtr ds;
+ try
+ {
+ ds =
ResourceGroupManager::getSingleton().openResource(odefname,
Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);
+ }
+ catch(...)
+ {
+ LOG("Error openeing object configuration: " + odefname);
+ }
+ int &mapsizex = terrainManager->geometry_manager->mapsizex;
+ int &mapsizez = terrainManager->geometry_manager->mapsizex;
+
+ Vector3 r2lastpos=Vector3::ZERO;
+ Quaternion r2lastrot=Quaternion::IDENTITY;
+ int r2counter=0;
+
+ //long line = 0;
+ char line[4096] = "";
+
while (!ds->eof())
{
int progress = ((float)(ds->tell()) / (float)(ds->size())) *
100.0f;
if (progress-lastprogress > 20)
{
#ifdef USE_MYGUI
- LoadingWindow::getSingleton().setProgress(progress,
_L("Loading Terrain"));
+ LoadingWindow::getSingleton().setProgress(progress,
_L("Loading Terrain Objects"));
#endif //MYGUI
lastprogress = progress;
}
@@ -167,57 +223,11 @@
n->attachObject(mReferenceObject);
n->setVisible(true);
}
-
- if (!strncmp("mpspawn", line, 7))
- {
- spawn_location_t spl;
- memset(&spl, 0, sizeof(spawn_location_t));
-
- char tmp[256]="";
- float x=0,y=0,z=0, rx=0, ry=0, rz=0;
- int res = sscanf(line, "mpspawn %s %f %f %f %f %f %f",
tmp, &x, &y, &z, &rx, &ry, &rz);
- if (res < 7)
- {
- LOG("error reading mpspawn command!");
- continue;
- }
- spl.pos = Vector3(x, y, z);
- spl.rot = Quaternion(Degree(rx),
Vector3::UNIT_X)*Quaternion(Degree(ry), Vector3::UNIT_Y)*Quaternion(Degree(rz),
Vector3::UNIT_Z);
- netSpawnPos[String(tmp)] = spl;
- continue;
- }
-
- //sandstorm cube texture
- if (!strncmp(line,"sandstormcubemap", 16))
- {
- sscanf(line, "sandstormcubemap %s", sandstormcubemap);
- }
- if (!strncmp("landuse-config", line, 14))
- {
- gEnv->collisions->setupLandUse(line+15);
- continue;
- }
- if (!strncmp("gravity", line, 7))
- {
- int res = sscanf(line, "gravity %f", &gravity);
- if (res < 1)
- {
- LOG("error reading gravity command!");
- }
- continue;
- }
- //ugly stuff to parse map size
- if (!strncmp("mapsize", line, 7))
- {
- // this is deprecated!!! (replaced by direct .cfg reads)
- //sscanf(line, "mapsize %f, %f", &mapsizex, &mapsizez);
- continue;
- }
#ifdef USE_PAGED
//ugly stuff to parse trees :)
if (!strncmp("trees", line, 5))
{
- if (pagedMode == 0) continue;
+ if (terrainManager->pagedMode == 0) continue;
char ColorMap[256] = {};
char DensityMap[256] = {};
char treemesh[256] = {};
@@ -238,7 +248,7 @@
LOG("tree DensityMap zero!");
continue;
}
- Forests::DensityMap *densityMap =
Forests::DensityMap::load(DensityMap, CHANNEL_COLOR);
+ Forests::DensityMap *densityMap =
Forests::DensityMap::load(DensityMap, Forests::CHANNEL_COLOR);
if (!densityMap)
{
LOG("could not load densityMap:
"+String(DensityMap));
@@ -250,7 +260,7 @@
paged_geometry_t paged;
paged.geom = new PagedGeometry();
paged.geom->setTempDir(SSETTING("User Path", "") +
"cache" + SSETTING("dirsep", "\\"));
- paged.geom->setCamera(mCamera);
+ paged.geom->setCamera(gEnv->mainCamera);
paged.geom->setPageSize(50);
paged.geom->setInfinite();
Ogre::TRect<Ogre::Real> bounds = TBounds(0, 0,
mapsizex, mapsizez);
@@ -258,10 +268,10 @@
//Set up LODs
//trees->addDetailLevel<EntityPage>(50);
- float min = minDist * pagedDetailFactor;
+ float min = minDist * terrainManager->pagedDetailFactor;
if (min<10) min = 10;
paged.geom->addDetailLevel<BatchPage>(min, min/2);
- float max = maxDist * pagedDetailFactor;
+ float max = maxDist * terrainManager->pagedDetailFactor;
if (max<10) max = 10;
paged.geom->addDetailLevel<ImpostorPage>(max, max/10);
TreeLoader2D *treeLoader = new TreeLoader2D(paged.geom,
TBounds(0, 0, mapsizex, mapsizez));
@@ -313,7 +323,7 @@
{
if (highdens < 0) hd =
Math::RangeRandom(0, -highdens);
float density =
densityMap->_getDensityAt_Unfiltered(x, z, bounds);
- int numTreesToPlace =
(int)((float)(hd) * density * pagedDetailFactor);
+ int numTreesToPlace =
(int)((float)(hd) * density * terrainManager->pagedDetailFactor);
float nx=0, nz=0;
while(numTreesToPlace-->0)
{
@@ -340,27 +350,27 @@
if (!strncmp("grass", line, 5) || !strncmp("grass2", line, 6))
{
// is paged geometry disabled by configuration?
- if (pagedMode == 0) continue;
+ if (terrainManager->pagedMode == 0) continue;
int range = 80;
float SwaySpeed=0.5, SwayLength=0.05,
SwayDistribution=10.0, minx=0.2, miny=0.2, maxx=1, maxy=0.6, Density=0.6,
minH=-9999, maxH=9999;
char grassmat[256]="";
- char ColorMap[256]="";
- char DensityMap[256]="";
+ char colorMapFilename[256]="";
+ char densityMapFilename[256]="";
int growtechnique = 0;
int techn = GRASSTECH_CROSSQUADS;
if (!strncmp("grass2", line, 6))
- sscanf(line, "grass2 %d, %f, %f, %f, %f, %f,
%f, %f, %f, %d, %f, %f, %d, %s %s %s", &range, &SwaySpeed, &SwayLength,
&SwayDistribution, &Density, &minx, &miny, &maxx, &maxy, &growtechnique, &minH,
&maxH, &techn, grassmat, ColorMap, DensityMap);
+ sscanf(line, "grass2 %d, %f, %f, %f, %f, %f,
%f, %f, %f, %d, %f, %f, %d, %s %s %s", &range, &SwaySpeed, &SwayLength,
&SwayDistribution, &Density, &minx, &miny, &maxx, &maxy, &growtechnique, &minH,
&maxH, &techn, grassmat, colorMapFilename, densityMapFilename);
else if (!strncmp("grass", line, 5))
- sscanf(line, "grass %d, %f, %f, %f, %f, %f, %f,
%f, %f, %d, %f, %f, %s %s %s", &range, &SwaySpeed, &SwayLength,
&SwayDistribution, &Density, &minx, &miny, &maxx, &maxy, &growtechnique, &minH,
&maxH, grassmat, ColorMap, DensityMap);
+ sscanf(line, "grass %d, %f, %f, %f, %f, %f, %f,
%f, %f, %d, %f, %f, %s %s %s", &range, &SwaySpeed, &SwayLength,
&SwayDistribution, &Density, &minx, &miny, &maxx, &maxy, &growtechnique, &minH,
&maxH, grassmat, colorMapFilename, densityMapFilename);
//Initialize the PagedGeometry engine
try
{
paged_geometry_t paged;
- PagedGeometry *grass = new
PagedGeometry(mCamera, 30);
+ PagedGeometry *grass = new
PagedGeometry(gEnv->mainCamera, 30);
//Set up LODs
- grass->addDetailLevel<GrassPage>(range *
pagedDetailFactor); // original value: 80
+ grass->addDetailLevel<GrassPage>(range *
terrainManager->pagedDetailFactor); // original value: 80
//Set up a GrassLoader for easy use
GrassLoader *grassLoader = new
GrassLoader(grass);
@@ -379,9 +389,9 @@
grassLayer->setSwayLength(SwayLength);
grassLayer->setSwayDistribution(SwayDistribution);
- grassdensityTextureFilename =
String(DensityMap);
+ //String grassdensityTextureFilename =
String(DensityMap);
- grassLayer->setDensity(Density *
pagedDetailFactor);
+ grassLayer->setDensity(Density *
terrainManager->pagedDetailFactor);
if (techn>10)
grassLayer->setRenderTechnique(static_cast<GrassTechnique>(techn-10), true);
else
@@ -389,15 +399,15 @@
grassLayer->setMapBounds(TBounds(0, 0,
mapsizex, mapsizez));
- if (strcmp(ColorMap,"none") != 0)
+ if (strcmp(colorMapFilename,"none") != 0)
{
- grassLayer->setColorMap(ColorMap);
+
grassLayer->setColorMap(colorMapFilename);
grassLayer->setColorMapFilter(MAPFILTER_BILINEAR);
}
- if (strcmp(DensityMap,"none") != 0)
+ if (strcmp(densityMapFilename,"none") != 0)
{
- grassLayer->setDensityMap(DensityMap);
+
grassLayer->setDensityMap(densityMapFilename);
grassLayer->setDensityMapFilter(MAPFILTER_BILINEAR);
}
@@ -493,7 +503,7 @@
{
bool newFormat = (!strcmp(oname, "truck2"));
- if (!strcmp(oname, "boat") && !w)
+ if (!strcmp(oname, "boat") && !terrainManager->water)
// no water so do not load boats!
continue;
String group="";
@@ -513,6 +523,8 @@
//truck_preload[truck_preload_num].ry=ry;
strcpy(truck_preload[truck_preload_num].name,
truckname.c_str());
truck_preload_num++;
+
+ terrainManager->trucksLoaded = true;
continue;
}
if ( !strcmp(oname, "road")
@@ -609,14 +621,16 @@
if (proceduralManager)
proceduralManager->addObject(po);
}
+}
-
+void TerrainObjectManager::postLoad()
+{
// okay, now bake everything
bakesg = gEnv->sceneManager->createStaticGeometry("bakeSG");
bakesg->setCastShadows(true);
bakesg->addSceneNode(bakeNode);
- bakesg->setRegionDimensions(Vector3(farclip/2.0, 10000.0, farclip/2.0));
- bakesg->setRenderingDistance(farclip);
+ bakesg->setRegionDimensions(Vector3(terrainManager->farclip/2.0,
10000.0, terrainManager->farclip/2.0));
+ bakesg->setRenderingDistance(terrainManager->farclip);
try
{
bakesg->build();
@@ -628,19 +642,17 @@
LOG("error while baking roads. ignoring.");
}
-#endif
}
void TerrainObjectManager::unloadObject(const char* instancename)
{
-#if 0
if (loadedObjects.find(std::string(instancename)) ==
loadedObjects.end())
{
LOG("unable to unload object: " + std::string(instancename));
return;
}
- loaded_object_t obj = loadedObjects[std::string(instancename)];
+ loadedObject_t obj = loadedObjects[std::string(instancename)];
// check if it was already deleted
if (!obj.enabled)
@@ -651,7 +663,7 @@
{
for (std::vector<int>::iterator it = obj.collTris.begin(); it
!= obj.collTris.end(); it++)
{
- globalEnvironment->collisions->removeCollisionTri(*it);
+ gEnv->collisions->removeCollisionTri(*it);
}
}
@@ -660,19 +672,17 @@
{
for (std::vector<int>::iterator it = obj.collBoxes.begin(); it
!= obj.collBoxes.end(); it++)
{
- globalEnvironment->collisions->removeCollisionBox(*it);
+ gEnv->collisions->removeCollisionBox(*it);
}
}
obj.sceneNode->detachAllObjects();
obj.sceneNode->setVisible(false);
obj.enabled = false;
-#endif
}
void TerrainObjectManager::loadObject(const char* name, float px, float py,
float pz, float rx, float ry, float rz, SceneNode * bakeNode, const char*
instancename, bool enable_collisions, int scripthandler, const char *type, bool
uniquifyMaterial)
{
-#if 0
ScopeLog log("object_"+String(name));
if (type && !strcmp(type, "grid"))
{
@@ -711,20 +721,9 @@
// try to load with UID first!
String odefgroup = "";
String odefname = "";
+
bool odefFound = false;
- if (terrainUID != "" && !CACHE.stringHasUID(name))
- {
- sprintf(fname,"%s-%s.odef", terrainUID.c_str(), name);
- odefname = String(fname);
- bool exists =
ResourceGroupManager::getSingleton().resourceExistsInAnyGroup(odefname);
- if (exists)
- {
- odefgroup =
ResourceGroupManager::getSingleton().findGroupContainingResource(odefname);
- odefFound = true;
- }
- }
- if (!odefFound)
{
sprintf(fname,"%s.odef", name);
odefname = String(fname);
@@ -760,12 +759,12 @@
objcounter++;
- SceneNode *tenode =
globalEnvironment->ogreSceneManager->getRootSceneNode()->createChildSceneNode();
+ SceneNode *tenode =
gEnv->sceneManager->getRootSceneNode()->createChildSceneNode();
bool background_loading = BSETTING("Background Loading", false);
MeshObject *mo = NULL;
if (String(mesh) != "none")
- mo = new
MeshObject(globalEnvironment->ogreSceneManager, mesh, oname, tenode, NULL,
background_loading);
+ mo = new MeshObject(mesh, oname, tenode, NULL,
background_loading);
//mo->setQueryFlags(OBJECTS_MASK);
//tenode->attachObject(te);
@@ -776,7 +775,7 @@
tenode->setVisible(true);
// register in map
- loaded_object_t *obj =
&loadedObjects[std::string(instancename)];
+ loadedObject_t *obj = &loadedObjects[std::string(instancename)];
obj->instanceName = std::string(instancename);
obj->loadType = 0;
obj->enabled = true;
@@ -805,7 +804,7 @@
bool rotating=false;
bool classic_ref=true;
// everything is of concrete by default
- ground_model_t *gm =
globalEnvironment->collisions->getGroundModelByString("concrete");
+ ground_model_t *gm =
gEnv->collisions->getGroundModelByString("concrete");
char eventname[256];
eventname[0]=0;
while (!ds->eof())
@@ -934,8 +933,8 @@
else if (!strncmp(ts, "delete", 8))
event_filter=EVENT_DELETE;
- if (!strncmp(ts, "shoptruck", 9))
- terrainHasTruckShop=true;
+ //if (!strncmp(ts, "shoptruck", 9))
+ //
terrainManager->terrainHasTruckShop=true;
// fallback
if (strlen(ts) == 0)
@@ -1142,7 +1141,7 @@
//add icons if type is set
#ifdef USE_MYGUI
String typestr = "";
- if (type && surveyMap)
+ if (type && gEnv->surveyMap)
{
typestr = String(type);
// hack for raceways
@@ -1155,7 +1154,7 @@
if (typestr != String("") && typestr != String("road")
&& typestr != String("sign"))
{
- MapEntity *e =
surveyMap->createMapEntity(typestr);
+ MapEntity *e =
gEnv->surveyMap->createMapEntity(typestr);
if (e)
{
e->setVisibility(true);
@@ -1168,12 +1167,10 @@
}
}
#endif //USE_MYGUI
-#endif
}
bool TerrainObjectManager::updateAnimatedObjects(float dt)
{
-#if 0
if (animatedObjects.size() == 0) return true;
std::vector<animated_object_t>::iterator it;
@@ -1186,6 +1183,62 @@
it->anim->addTime(time);
}
}
-#endif
return true;
}
+
+void TerrainObjectManager::loadPreloadedTrucks()
+{
+ // get lights mode
+ int flaresMode = 0;
+ String lightsMode = SSETTING("Lights", "Only current vehicle, main
lights");
+ if (lightsMode == "None (fastest)")
+ flaresMode = 0;
+ else if (lightsMode == "No light sources")
+ flaresMode = 1;
+ else if (lightsMode == "Only current vehicle, main lights")
+ flaresMode = 2;
+ else if (lightsMode == "All vehicles, main lights")
+ flaresMode = 3;
+ else if (lightsMode == "All vehicles, all lights")
+ flaresMode = 4;
+
+ // load the rest in SP
+ // in netmode, don't load other trucks!
+ if (!gEnv->network)
+ {
+ for (int i=0; i<truck_preload_num; i++)
+ {
+ Vector3 pos = Vector3(truck_preload[i].px,
truck_preload[i].py, truck_preload[i].pz);
+ Beam *b = BeamFactory::getSingleton().createLocal(pos,
truck_preload[i].rotation, truck_preload[i].name, 0,
truck_preload[i].ismachine, flaresMode, 0, 0, truck_preload[i].freePosition);
+#ifdef USE_MYGUI
+ if (b && gEnv->surveyMap)
+ {
+ MapEntity *e =
gEnv->surveyMap->createNamedMapEntity("Truck"+TOSTRING(b->trucknum),
MapControl::getTypeByDriveable(b->driveable));
+ if (e)
+ {
+ e->setState(DESACTIVATED);
+ e->setVisibility(true);
+ e->setPosition(truck_preload[i].px,
truck_preload[i].pz);
+
e->setRotation(-Radian(b->getHeadingDirectionAngle()));
+ }
+ }
+#endif //USE_MYGUI
+ }
+ }
+
+}
+
+bool TerrainObjectManager::update( float dt )
+{
+#ifdef USE_PAGED
+ // paged geometry
+ for (std::vector<paged_geometry_t>::iterator
it=pagedGeometry.begin();it!=pagedGeometry.end();it++)
+ {
+ if (it->geom) it->geom->update();
+ }
+#endif //USE_PAGED
+
+ updateAnimatedObjects(dt);
+
+ return true;
+}
Modified: trunk/source/main/terrain/TerrainObjectManager.h
===================================================================
--- trunk/source/main/terrain/TerrainObjectManager.h 2012-06-01 11:25:53 UTC
(rev 2768)
+++ trunk/source/main/terrain/TerrainObjectManager.h 2012-06-02 17:56:31 UTC
(rev 2769)
@@ -22,8 +22,20 @@
#include "RoRPrerequisites.h"
+
+#ifdef USE_PAGED
+#include "BatchPage.h"
+#include "GrassLoader.h"
+#include "ImpostorPage.h"
+#include "PagedGeometry.h"
+#include "TreeLoader2D.h"
+#include "TreeLoader3D.h"
+#endif //USE_PAGED
+
+
class TerrainObjectManager : public ZeroedMemoryAllocator
{
+ friend class TerrainManager;
public:
TerrainObjectManager(TerrainManager *terrainManager);
@@ -31,7 +43,6 @@
void loadObjectConfigFile(Ogre::String filename);
- bool updateAnimatedObjects(float dt);
typedef struct localizer_t
{
@@ -40,19 +51,12 @@
Ogre::Quaternion rotation;
} localizer_t;
+ bool update(float dt);
+
protected:
TerrainManager *terrainManager;
- typedef struct {
- bool enabled;
- int loadType;
- Ogre::String instanceName;
- Ogre::SceneNode *sceneNode;
- std::vector <int> collTris;
- std::vector <int> collBoxes;
- } loaded_object_t;
-
typedef struct
{
Ogre::Entity *ent;
@@ -65,13 +69,60 @@
ProceduralManager *proceduralManager;
Road *road;
+ Ogre::SceneNode *bakeNode;
+ typedef struct
+ {
+ float px;
+ float py;
+ float pz;
+ //float ry;
+ Ogre::Quaternion rotation;
+ char name[256];
+ bool ismachine;
+ bool freePosition;
+ } truck_prepare_t;
+ int truck_preload_num;
+ truck_prepare_t truck_preload[100];
+
+
+#ifdef USE_PAGED
+ typedef struct
+ {
+ Forests::PagedGeometry *geom;
+ void *loader;
+ } paged_geometry_t;
+
+ std::vector<paged_geometry_t> pagedGeometry;
+ Forests::TreeLoader2D *treeLoader;
+#endif //USE_PAGED
+
localizer_t localizers[64];
+ int objcounter;
+ int free_localizer;
+
+ std::vector<animated_object_t> animatedObjects;
+
+ typedef struct loadedObject_t
+ {
+ bool enabled;
+ int loadType;
+ Ogre::String instanceName;
+ Ogre::SceneNode *sceneNode;
+ std::vector <int> collTris;
+ std::vector <int> collBoxes;
+ } loadedObject_t;
+ std::map< std::string, loadedObject_t> loadedObjects;
+
void loadObject(const char* name, float px, float py, float pz, float
rx, float ry, float rz, Ogre::SceneNode * bakeNode, const char* instancename,
bool enable_collisions=true, int scripthandler=-1, const char *type=0, bool
uniquifyMaterial=false);
void unloadObject(const char* name);
+
+ void loadPreloadedTrucks();
+ bool updateAnimatedObjects(float dt);
+ void postLoad();
};
#endif // __TerrainObjectManager_H_
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Rigsofrods-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel