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