]> git.mxchange.org Git - flightgear.git/commitdiff
Better no-texture support contributed by David Megginson.
authorcurt <curt>
Mon, 1 Nov 1999 19:17:43 +0000 (19:17 +0000)
committercurt <curt>
Mon, 1 Nov 1999 19:17:43 +0000 (19:17 +0000)
src/Main/keyboard.cxx
src/Objects/materialmgr.cxx
src/Objects/materialmgr.hxx

index 1be3fb9a3454f8920bd61abfb27f54c4905cba75..b7cdf9b5e2e8727ad6153cdf8c3f410cd6bb170a 100644 (file)
@@ -451,12 +451,10 @@ void GLUTspecialkey(int k, int x, int y) {
            if ( material_mgr.loaded() ) {
                if (current_options.get_textures()) {
                    current_options.set_textures(false);
-                   glDisable(GL_TEXTURE_2D);
-                   ssgOverrideTexture(true);
+                   material_mgr.set_step(1);
                } else {
                    current_options.set_textures(true);
-                   glEnable(GL_TEXTURE_2D);
-                   ssgOverrideTexture(false);
+                   material_mgr.set_step(0);
                }
                FG_LOG( FG_INPUT, FG_INFO, "Toggling texture" );
            } else {
index 315b756f64dae7dcf0873ab5ae73940e080a3fd4..2730fb3148a48e5dedff547e8ac0f4b923723188 100644 (file)
@@ -177,54 +177,73 @@ fgMATERIAL_MGR::load_lib ( void )
            tex_file.append( m.get_texture_name() );
            tex_file.concat( ".rgb" );
 
-           ssgSimpleState *state = new ssgSimpleState;
+           ssgStateSelector *state = new ssgStateSelector(2);
+           state->setStep(0, new ssgSimpleState); // textured
+           state->setStep(1, new ssgSimpleState); // untextured
+
+           // Set up the textured state
+           state->selectStep(0);
            state->enable( GL_LIGHTING );
            if ( current_options.get_shading() == 1 ) {
                state->setShadeModel( GL_SMOOTH );
            } else {
                state->setShadeModel( GL_FLAT );
            }
+
            state->enable ( GL_CULL_FACE      ) ;
+           state->enable( GL_TEXTURE_2D );
+           state->setTexture( (char *)tex_file.c_str() );
+           state->setMaterial ( GL_AMBIENT_AND_DIFFUSE, 1, 1, 1, 1 ) ;
+           state->setMaterial ( GL_SPECULAR, 0, 0, 0, 0 ) ;
+           state->setMaterial ( GL_EMISSION, 0, 0, 0, 0 ) ;
+
+                               // Set up the coloured state
+           state->selectStep(1);
+           state->enable( GL_LIGHTING );
+           if ( current_options.get_shading() == 1 ) {
+               state->setShadeModel( GL_SMOOTH );
+           } else {
+               state->setShadeModel( GL_FLAT );
+           }
+
+           state->enable ( GL_CULL_FACE      ) ;
+           state->disable( GL_TEXTURE_2D );
+           state->disable( GL_COLOR_MATERIAL );
+           GLfloat *ambient, *diffuse, *specular, *emission;
+           ambient = m.get_ambient();
+           diffuse = m.get_diffuse();
+           specular = m.get_specular();
+           emission = m.get_emission();
+
+           /* cout << "ambient = " << ambient[0] << "," << ambient[1] 
+              << "," << ambient[2] << endl; */
+           state->setMaterial ( GL_AMBIENT, 
+                                  ambient[0], ambient[1], 
+                                  ambient[2], ambient[3] ) ;
+           state->setMaterial ( GL_DIFFUSE, 
+                                  diffuse[0], diffuse[1], 
+                                  diffuse[2], diffuse[3] ) ;
+           state->setMaterial ( GL_SPECULAR, 
+                                  specular[0], specular[1], 
+                                  specular[2], specular[3] ) ;
+           state->setMaterial ( GL_EMISSION, 
+                                  emission[0], emission[1], 
+                                  emission[2], emission[3] ) ;
+
+                               // Choose the appropriate starting state.
            if ( current_options.get_textures() ) {
-               state->enable( GL_TEXTURE_2D );
-               state->setTexture( (char *)tex_file.c_str() );
-               state->setMaterial ( GL_AMBIENT_AND_DIFFUSE, 1, 1, 1, 1 ) ;
-               state->setMaterial ( GL_SPECULAR, 0, 0, 0, 0 ) ;
-               state->setMaterial ( GL_EMISSION, 0, 0, 0, 0 ) ;
+               state->selectStep(0);
            } else {
-               state->disable( GL_TEXTURE_2D );
-               state->disable( GL_COLOR_MATERIAL );
-               GLfloat *ambient, *diffuse, *specular, *emission;
-               ambient = m.get_ambient();
-               diffuse = m.get_diffuse();
-               specular = m.get_specular();
-               emission = m.get_emission();
-
-               /* cout << "ambient = " << ambient[0] << "," << ambient[1] 
-                    << "," << ambient[2] << endl; */
-               state->setMaterial ( GL_AMBIENT, 
-                                    ambient[0], ambient[1], 
-                                    ambient[2], ambient[3] ) ;
-               state->setMaterial ( GL_DIFFUSE, 
-                                    diffuse[0], diffuse[1], 
-                                    diffuse[2], diffuse[3] ) ;
-               state->setMaterial ( GL_SPECULAR, 
-                                    specular[0], specular[1], 
-                                    specular[2], specular[3] ) ;
-               state->setMaterial ( GL_EMISSION, 
-                                    emission[0], emission[1], 
-                                    emission[2], emission[3] ) ;
-    }
+               state->selectStep(1);
+           }
+
            m_slot.set_state( state );
 
            material_mgr.material_map[material_name] = m_slot;
        }
     }
 
-    if ( current_options.get_textures() ) {
-       materials_loaded = true;
-    }
-
+    materials_loaded = true;
     return(1);
 }
 
@@ -258,6 +277,21 @@ fgMATERIAL_MGR::~fgMATERIAL_MGR ( void ) {
 }
 
 
+// Set the step for all of the state selectors in the material slots
+void
+fgMATERIAL_MGR::set_step ( int step )
+{
+    // container::iterator it = begin();
+    for (container::iterator it = begin(); it != end(); it++) {
+      const string &key = it->first;
+      FG_LOG( FG_GENERAL, FG_INFO,
+             "Updating material " << key << " to step " << step );
+      FGMaterialSlot &slot = it->second;
+      slot.get_state()->selectStep(step);
+    }
+}
+
+
 void
 fgMATERIAL_MGR::render_fragments()
 {
index 34865eed2b17bf3e6642bd4b73ababb517b25c9c..56a4f078b2a59eef4bf5d026ac534ecac864b570 100644 (file)
@@ -83,7 +83,7 @@ private:
     // size_t list_size;
 
     // ssg stage structure
-    ssgSimpleState *state;
+    ssgStateSelector *state;
     bool state_valid;
 
 public:
@@ -115,8 +115,8 @@ public:
     inline void set_m( FGMaterial new_m ) { m = new_m; }
 
     // ssg state
-    inline ssgSimpleState *get_state() { return state; }
-    inline void set_state( ssgSimpleState *s ) { state = s; }
+    inline ssgStateSelector *get_state() { return state; }
+    inline void set_state( ssgStateSelector *s ) { state = s; }
     inline bool get_state_valid() const { return state_valid; }
     inline void set_state_valid( bool flag ) { state_valid = flag; }
 };
@@ -153,6 +153,8 @@ public:
 
     void render_fragments();
 
+    void set_step (int step);
+
     // Destructor
     ~fgMATERIAL_MGR ( void );