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
Rigsofrods-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to