]> git.mxchange.org Git - flightgear.git/commitdiff
Add a command to dump just the terrain portion of the scene graph to a .osg
authorcurt <curt>
Wed, 21 Nov 2007 20:51:49 +0000 (20:51 +0000)
committercurt <curt>
Wed, 21 Nov 2007 20:51:49 +0000 (20:51 +0000)
file.  Possible uses of this functionality could include converting the
model to some other format or coordinate system for use in some other
visualization or simulation.

src/GUI/gui.h
src/GUI/gui_funcs.cxx
src/Main/fg_commands.cxx
src/Main/renderer.cxx
src/Main/renderer.hxx

index 31e65bb10f3c2197d41282a198ab71da1463827c..bc27d9a305b517ea6f5b49ab0f27286a5ddc2bd1 100644 (file)
@@ -48,6 +48,7 @@ extern void guiErrorMessage(const char *txt, const sg_throwable &throwable);
 
 extern void fgDumpSnapShot();
 extern void fgDumpSceneGraph();
+extern void fgDumpTerrainBranch();
 
 extern puFont guiFnt;
 extern fntTexFont *guiFntHandle;
index 413c65bd5b1b6aa54d2681df85dda452c0817eab..6a57dc1d68611eb80b2bba7dc8edba723973ed4e 100644 (file)
@@ -591,7 +591,7 @@ void fgDumpSnapShot () {
     }
 }
 
-// do a screen snap shot
+// do an entire scenegraph dump
 void fgDumpSceneGraph()
 {
     char *filename = new char [24];
@@ -617,7 +617,52 @@ void fgDumpSceneGraph()
     }
 
     if ( fgDumpSceneGraphToFile(filename)) {
-       message = "Scene graphe saved to \"";
+       message = "Entire scene graph saved to \"";
+       message += filename;
+       message += "\".";
+    } else {
+        message = "Failed to save to \"";
+       message += filename;
+       message += "\".";
+    }
+
+    mkDialog (message.c_str());
+
+    delete [] filename;
+
+    if ( !freeze ) {
+        fgSetBool("/sim/freeze/master", false);
+    }
+}
+
+    
+// do an terrain branch dump
+void fgDumpTerrainBranch()
+{
+    char *filename = new char [24];
+    string message;
+    static int count = 1;
+
+    FGRenderer *renderer = globals->get_renderer();
+
+    static const SGPropertyNode *master_freeze
+       = fgGetNode("/sim/freeze/master");
+
+    bool freeze = master_freeze->getBoolValue();
+    if ( !freeze ) {
+        fgSetBool("/sim/freeze/master", true);
+    }
+
+    while (count < 1000) {
+        FILE *fp;
+        snprintf(filename, 24, "fgfs-graph-%03d.osg", count++);
+        if ( (fp = fopen(filename, "r")) == NULL )
+            break;
+        fclose(fp);
+    }
+
+    if ( fgDumpTerrainBranchToFile(filename)) {
+       message = "Terrain graph saved to \"";
        message += filename;
        message += "\".";
     } else {
index cd637d77bca8a3101bdb82d9261f8ea1d493a334..455baea8bc9ee3f212c85b88f4224ae369627e8f 100644 (file)
@@ -494,6 +494,23 @@ do_dump_scene_graph (const SGPropertyNode*)
     return true;
 }
 
+static bool
+do_dump_terrain_branch (const SGPropertyNode*)
+{
+    fgDumpTerrainBranch();
+
+    double lon_deg = fgGetDouble("/position/longitude-deg");
+    double lat_deg = fgGetDouble("/position/latitude-deg");
+    SGGeod geodPos = SGGeod::fromDegFt(lon_deg, lat_deg, 0.0);
+    SGVec3d zero = SGVec3d::fromGeod(geodPos);
+
+    SG_LOG(SG_INPUT, SG_INFO, "Model parameters:");
+    SG_LOG(SG_INPUT, SG_INFO, "Center: " << zero.x() << ", " << zero.y() << ", " << zero.z() );
+    SG_LOG(SG_INPUT, SG_INFO, "Rotation: " << lat_deg << ", " << lon_deg );
+
+    return true;
+}
+
 /**
  * Built-in command: hires capture screen.
  */
@@ -1471,6 +1488,7 @@ static struct {
     { "press-cockpit-button", do_press_cockpit_button },
     { "release-cockpit-button", do_release_cockpit_button },
     { "dump-scenegraph", do_dump_scene_graph },
+    { "dump-terrainbranch", do_dump_terrain_branch },
     { 0, 0 }                   // zero-terminated
 };
 
index 59b87974352e7091581dd4f14c133b8ebb19f56a..7b26b30b85bf04f61e38d9d8443053e54ecd3284 100644 (file)
@@ -1071,5 +1071,12 @@ fgDumpSceneGraphToFile(const char* filename)
     return osgDB::writeNodeFile(*mRealRoot.get(), filename);
 }
 
+bool
+fgDumpTerrainBranchToFile(const char* filename)
+{
+    return osgDB::writeNodeFile( *globals->get_scenery()->get_terrain_branch(),
+                                 filename );
+}
+
 // end of renderer.cxx
     
index 3fb7e0f83da8a35fe00c8ab7521ea52d0e0b02d5..de21b932e3c501657b48b23539a8fef1c41cc0f2 100644 (file)
@@ -81,5 +81,6 @@ protected:
 };
 
 bool fgDumpSceneGraphToFile(const char* filename);
+bool fgDumpTerrainBranchToFile(const char* filename);
 
 #endif