]> git.mxchange.org Git - simgear.git/commitdiff
Frederic Bouvier:
authorehofman <ehofman>
Fri, 2 Apr 2004 14:38:57 +0000 (14:38 +0000)
committerehofman <ehofman>
Fri, 2 Apr 2004 14:38:57 +0000 (14:38 +0000)
 add an optional parameter that would be called to
 build the aircraft panel, so that flightgear's
 model_panel no longer duplicate code.

 add a pretrav callback to models so that we can
 filter out models when calling ssgCullAndDraw on
 the global scene.
 sgSetModelFilter( true ) means that we want to draw
 the models. Use false to cull them out.

simgear/scene/model/model.cxx
simgear/scene/model/model.hxx

index 39eb41c5c4fac25301b89d38928ec0f87eeca0b7..66de79b59a123a2a190d465dc4c216e26a02d252 100644 (file)
 SG_USING_STD(vector);
 
 
+\f
+////////////////////////////////////////////////////////////////////////
+// Global state
+////////////////////////////////////////////////////////////////////////
+static bool
+model_filter = true;
+
 \f
 ////////////////////////////////////////////////////////////////////////
 // Static utility functions.
 ////////////////////////////////////////////////////////////////////////
 
+static int
+model_filter_callback (ssgEntity * entity, int mask)
+{
+  return model_filter;
+}
+
 /**
  * Callback to update an animation.
  */
@@ -187,7 +200,7 @@ sgMakeAnimation( ssgBranch * model,
 ssgBranch *
 sgLoad3DModel( const string &fg_root, const string &path,
                SGPropertyNode *prop_root,
-               double sim_time_sec )
+               double sim_time_sec, ssgEntity *(*load_panel)(SGPropertyNode *) )
 {
   ssgBranch * model = 0;
   SGPropertyNode props;
@@ -223,6 +236,8 @@ sgLoad3DModel( const string &fg_root, const string &path,
 
                                 // Set up the alignment node
   ssgTransform * alignmainmodel = new ssgTransform;
+  if ( load_panel == 0 )
+    alignmainmodel->setTravCallback( SSG_CALLBACK_PRETRAV, model_filter_callback );
   alignmainmodel->addKid(model);
   sgMat4 res_matrix;
   sgMakeOffsetsMatrix(&res_matrix,
@@ -236,6 +251,18 @@ sgLoad3DModel( const string &fg_root, const string &path,
 
   unsigned int i;
 
+  if ( load_panel ) {
+                                // Load panels
+    vector<SGPropertyNode_ptr> panel_nodes = props.getChildren("panel");
+    for (i = 0; i < panel_nodes.size(); i++) {
+        SG_LOG(SG_INPUT, SG_DEBUG, "Loading a panel");
+        ssgEntity * panel = load_panel(panel_nodes[i]);
+        if (panel_nodes[i]->hasValue("name"))
+            panel->setName((char *)panel_nodes[i]->getStringValue("name"));
+        model->addKid(panel);
+    }
+  }
+
                                 // Load sub-models
   vector<SGPropertyNode_ptr> model_nodes = props.getChildren("model");
   for (i = 0; i < model_nodes.size(); i++) {
@@ -252,7 +279,7 @@ sgLoad3DModel( const string &fg_root, const string &path,
     align->setTransform(res_matrix);
 
     ssgBranch * kid = sgLoad3DModel( fg_root, node->getStringValue("path"),
-                                     prop_root, sim_time_sec );
+                                     prop_root, sim_time_sec, load_panel );
     align->addKid(kid);
     align->setName(node->getStringValue("name", ""));
     model->addKid(align);
@@ -271,5 +298,13 @@ sgLoad3DModel( const string &fg_root, const string &path,
   return alignmainmodel;
 }
 
+bool
+sgSetModelFilter( bool filter )
+{
+  bool old = model_filter;
+  model_filter = filter;
+  return old;
+}
+
 
 // end of model.cxx
index 8cf417b5ddd0796d3c8740dc609690f18348f934..564c4d416cb938c923fab324a6ae85b94110a2d4 100644 (file)
@@ -43,7 +43,8 @@ SG_USING_STD(vector);
  */
 ssgBranch *
 sgLoad3DModel( const string& fg_root, const string &path,
-                          SGPropertyNode *prop_root, double sim_time_sec );
+                          SGPropertyNode *prop_root, double sim_time_sec,
+                          ssgEntity *(*load_panel)(SGPropertyNode *) = 0 );
 
 
 /**
@@ -64,5 +65,10 @@ sgMakeAnimation( ssgBranch * model,
                  SGPropertyNode_ptr node,
                  double sim_time_sec );
 
+/**
+ * Set the filter state on models
+ */
+bool
+sgSetModelFilter( bool filter );
 
 #endif // __MODEL_HXX