From: <sv...@ww...> - 2004-12-18 10:36:49
|
Author: mkrose Date: 2004-12-18 02:36:40 -0800 (Sat, 18 Dec 2004) New Revision: 1401 Modified: trunk/CSP/CSPSim/CHANGES.current trunk/CSP/CSPSim/Source/DemeterTerrain.cpp Log: Check for CSPSim/Data/Terrain, and print clearer diagnostic information if it isn't found. Previously Demeter just segfaulted, and the last CSPSim.log entry mentioned the terrain. This is a fairly common case for new installs, since the terrain files must be downloaded separately. Browse at: https://www.zerobar.net/viewcvs/viewcvs.cgi?view=rev&rev=1401 Modified: trunk/CSP/CSPSim/CHANGES.current =================================================================== --- trunk/CSP/CSPSim/CHANGES.current 2004-12-18 10:33:41 UTC (rev 1400) +++ trunk/CSP/CSPSim/CHANGES.current 2004-12-18 10:36:40 UTC (rev 1401) @@ -11,6 +11,11 @@ CSPSim.py calls cspinput to try to regenerate them from the examples in ../Tools/HID/Examples. + * Check for CSPSim/Data/Terrain, and print clearer diagnostic information + if it isn't found. Previously Demeter just segfaulted, and the last + CSPSim.log entry mentioned the terrain. This is a fairly common case + for new installs, since the terrain files must be downloaded separately. + 2004-12-17: delta * Updated FlightModel and m2k xml related files. Modified: trunk/CSP/CSPSim/Source/DemeterTerrain.cpp =================================================================== --- trunk/CSP/CSPSim/Source/DemeterTerrain.cpp 2004-12-18 10:33:41 UTC (rev 1400) +++ trunk/CSP/CSPSim/Source/DemeterTerrain.cpp 2004-12-18 10:36:40 UTC (rev 1401) @@ -25,6 +25,7 @@ #include "DemeterTerrain.h" #include "Config.h" +#include "Exception.h" #include <Demeter/Terrain.h> #include <Demeter/DemeterDrawable.h> @@ -32,6 +33,7 @@ #include <SimCore/Util/Log.h> #include <SimData/InterfaceRegistry.h> +#include <SimData/FileUtility.h> #include <osg/Geode> #include <osg/StateSet> @@ -56,7 +58,7 @@ */ DemeterTerrain::DemeterTerrain() { - CSP_LOG(TERRAIN, DEBUG, "DemeterTerrain::DemeterTerrain" ); + CSP_LOG(TERRAIN, DEBUG, "DemeterTerrain::DemeterTerrain"); m_TerrainLattice = NULL; m_Terrain = NULL; m_TerrainTextureFactory = NULL; @@ -66,11 +68,11 @@ m_PreloadTextures = true; m_TextureFactory = false; m_MaxTriangles = 50000; - + m_DetailTextureFile.setSource(""); m_TextureFile.setSource(""); m_ElevationFile.setSource(""); - + m_VertexSpacing = 1.0; m_VertexHeight = 1.0; m_Lattice = false; @@ -108,16 +110,18 @@ void DemeterTerrain::load() { if (m_Loaded) return; std::string terrain_path = getDataPath("TerrainPath"); - if (m_Lattice) - { + CSP_LOG(APP, INFO, "Using terrain path " << terrain_path); + if (!simdata::ospath::exists(terrain_path)) { + CSP_LOG(APP, ERROR, "Terrain path " << terrain_path << " not found"); + throw csp::DataError("Terrain path " + terrain_path + " not found"); + } + if (m_Lattice) { // create lattice Demeter::Settings::GetInstance()->SetMediaPath(terrain_path.c_str()); createTerrainLattice(); m_TerrainNode = createTerrainLatticeNode(m_TerrainLattice.get()); m_TerrainNode->setName("TerrainLatticeNode"); - } - else - { + } else { // create single terrain node Demeter::Settings::GetInstance()->SetMediaPath(terrain_path.c_str()); createTerrain(); @@ -126,13 +130,12 @@ } m_Loaded = true; } - + /** * Activate the terrain engine. */ -void DemeterTerrain::activate() -{ +void DemeterTerrain::activate() { if (!m_Active) { m_Active = true; load(); @@ -142,8 +145,7 @@ /** * Deactivate the terrain engine. */ -void DemeterTerrain::deactivate() -{ +void DemeterTerrain::deactivate() { if (m_Active) { m_Active = false; } @@ -210,14 +212,13 @@ } -int DemeterTerrain::createTerrain() -{ - CSP_LOG(TERRAIN, DEBUG, "DemeterTerrain::createTerrain() " ); +int DemeterTerrain::createTerrain() { + CSP_LOG(TERRAIN, DEBUG, "DemeterTerrain::createTerrain() "); updateDemeterSettings(); if (!m_TextureFactory) { if (m_DetailTextureFile.getSource() == "") { m_Terrain = new Demeter::Terrain(m_ElevationFile.getSource().c_str(),m_TextureFile.getSource().c_str(),NULL, - m_VertexSpacing,m_VertexHeight,m_MaxTriangles); + m_VertexSpacing,m_VertexHeight,m_MaxTriangles); } else { m_Terrain = new Demeter::Terrain(m_ElevationFile.getSource().c_str(),m_TextureFile.getSource().c_str(), m_DetailTextureFile.getSource().c_str(),m_VertexSpacing,m_VertexHeight,m_MaxTriangles); @@ -254,41 +255,39 @@ } -int DemeterTerrain::createTerrainLattice() -{ +int DemeterTerrain::createTerrainLattice() { + CSP_LOG(TERRAIN, DEBUG, "DemeterTerrain::createTerrainLattice()..."); - CSP_LOG(TERRAIN, DEBUG, "DemeterTerrain::createTerrainLattice()..." ); - //float detailThreshold = Config.GetFloat("TerraindetailThreshold"); - + updateDemeterSettings(); - + //char terrainTextureDetail[256]; // Config.GetString(terrainTextureDetail, "TerrainTextureDetail"); // if (m_DetailTextureFile == "") // { // m_TerrainLattice = new Demeter::TerrainLattice(m_LatticeBaseName.c_str(), -// m_LatticeElevExt.c_str(), m_LatticeTexExt.c_str(), +// m_LatticeElevExt.c_str(), m_LatticeTexExt.c_str(), // NULL, m_VertexSpacing, m_VertexHeight, m_MaxTriangles, // false, m_LatticeWidth, m_LatticeHeight); // } // else // { // m_TerrainLattice = new Demeter::TerrainLattice(m_LatticeBaseName.c_str(), -// m_LatticeElevExt.c_str(), m_LatticeTexExt.c_str(), +// m_LatticeElevExt.c_str(), m_LatticeTexExt.c_str(), // m_DetailTextureFile.c_str(), m_VertexSpacing, m_VertexHeight, m_MaxTriangles, // false, m_LatticeWidth, m_LatticeHeight); // // } - m_TerrainLattice = new Demeter::TerrainLattice(m_LatticeBaseName.c_str(), - m_LatticeElevExt.c_str(), /*m_LatticeTexExt.c_str() */ NULL, - m_DetailTextureFile.getSource().c_str(), m_VertexSpacing, m_VertexHeight, m_MaxTriangles, - //NULL, m_VertexSpacing, m_VertexHeight, m_MaxTriangles, - true, m_LatticeWidth, m_LatticeHeight); - + m_LatticeElevExt.c_str(), /*m_LatticeTexExt.c_str() */ NULL, + m_DetailTextureFile.getSource().c_str(), + m_VertexSpacing, m_VertexHeight, m_MaxTriangles, + //NULL, m_VertexSpacing, m_VertexHeight, m_MaxTriangles, + true, m_LatticeWidth, m_LatticeHeight); + // just to catch your attention ;-) it may be ok to just delete any // pre-existing terraintexturefactory. assert(!m_TerrainTextureFactory); @@ -297,12 +296,11 @@ m_TerrainLattice->SetTextureFactory(m_TerrainTextureFactory, 2, 2); m_TerrainLattice->SetDetailThreshold(m_DetailThreshold); - CSP_LOG(TERRAIN, DEBUG, "Terrain size: " << m_TerrainLattice->GetWidth() << "(" << m_Width << "), " << - m_TerrainLattice->GetHeight() << "(" << m_Height << ")"); + CSP_LOG(TERRAIN, DEBUG, "Terrain size: " << m_TerrainLattice->GetWidth() << "(" << m_Width << "), " << m_TerrainLattice->GetHeight() << "(" << m_Height << ")"); assert(m_TerrainLattice->GetWidth() == m_Width); assert(m_TerrainLattice->GetHeight() == m_Height); - - // XXX it appears to be critical that the camera position be setup correctly + + // XXX it appears to be critical that the camera position be setup correctly // here at the start. doing so afterward can result in very strange texture // anomalies in demeter. don't know why, but it is a problem in general // since we don't know exactly where the sim will start at this point! @@ -314,8 +312,7 @@ return 1; } -void DemeterTerrain::setCameraPosition(double x, double y, double z) -{ +void DemeterTerrain::setCameraPosition(double x, double y, double z) { if (m_TerrainLattice.valid()) { CSP_LOG(TERRAIN, DEBUG, "Terrain camera @ " << (m_Offset + simdata::Vector3(x,y,z))); m_TerrainLattice->SetCameraPosition(x+m_Offset.x(), y+m_Offset.y(), z+m_Offset.z()); @@ -323,10 +320,9 @@ } -osg::Node* DemeterTerrain::createTerrainLatticeNode(Demeter::TerrainLattice* pTerrainLattice) -{ - CSP_LOG(TERRAIN, INFO, "DemeterTerrain::createTerrainLatticeNode" ); - +osg::Node* DemeterTerrain::createTerrainLatticeNode(Demeter::TerrainLattice* pTerrainLattice) { + CSP_LOG(TERRAIN, INFO, "DemeterTerrain::createTerrainLatticeNode"); + Demeter::DemeterLatticeDrawable* pLatticeDrawable = NULL; osg::Geode* pGeode = NULL; @@ -347,14 +343,13 @@ catch(...) { CSP_LOG(TERRAIN, ERROR, "Caught Exception in DemeterTerrain::createTerrainLatticeNode"); } - - return pGeode; + + return pGeode; } -osg::Node* DemeterTerrain::createTerrainNode(Demeter::Terrain* pTerrain) -{ - CSP_LOG(TERRAIN, INFO, "DemeterTerrain::createTerrainNode" ); +osg::Node* DemeterTerrain::createTerrainNode(Demeter::Terrain* pTerrain) { + CSP_LOG(TERRAIN, INFO, "DemeterTerrain::createTerrainNode"); osg::Geode* pGeode = NULL; @@ -371,8 +366,7 @@ return pGeode; } -int DemeterTerrain::getTerrainPolygonsRendered() const -{ +int DemeterTerrain::getTerrainPolygonsRendered() const { if (m_TerrainLattice.valid()) { return m_TerrainLattice->GetLatticePolygonsRendered(); } else if (m_Terrain.valid()) { @@ -383,8 +377,7 @@ } -void DemeterTerrain::updateDemeterSettings() -{ +void DemeterTerrain::updateDemeterSettings() { std::string terrain_path = getDataPath("TerrainPath"); bool verbose = g_Config.getBool("Debug", "Demeter", false, true); Demeter::Settings::GetInstance()->SetMediaPath(terrain_path.c_str()); |