Rewrites of material.[ch]xx and materialmgr.[ch]xx
This commit is contained in:
parent
39ae3864de
commit
33bfe7587d
4 changed files with 630 additions and 0 deletions
190
src/Objects/matlib.cxx
Normal file
190
src/Objects/matlib.cxx
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
// materialmgr.cxx -- class to handle material properties
|
||||||
|
//
|
||||||
|
// Written by Curtis Olson, started May 1998.
|
||||||
|
//
|
||||||
|
// Copyright (C) 1998 Curtis L. Olson - curt@me.umn.edu
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 2 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful, but
|
||||||
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FG_MATH_EXCEPTION_CLASH
|
||||||
|
# include <math.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
# include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <GL/glut.h>
|
||||||
|
#include <simgear/xgl/xgl.h>
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include STL_STRING
|
||||||
|
|
||||||
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
#include <simgear/misc/fgpath.hxx>
|
||||||
|
#include <simgear/misc/fgstream.hxx>
|
||||||
|
|
||||||
|
#include <Main/options.hxx>
|
||||||
|
#include <Main/views.hxx>
|
||||||
|
#include <Scenery/tileentry.hxx>
|
||||||
|
|
||||||
|
#include "matlib.hxx"
|
||||||
|
|
||||||
|
FG_USING_STD(string);
|
||||||
|
|
||||||
|
|
||||||
|
// global material management class
|
||||||
|
FGMaterialLib material_lib;
|
||||||
|
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
FGMaterialLib::FGMaterialLib ( void ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Load a library of material properties
|
||||||
|
bool FGMaterialLib::load( const string& mpath ) {
|
||||||
|
string material_name;
|
||||||
|
|
||||||
|
fg_gzifstream in( mpath );
|
||||||
|
if ( ! in.is_open() ) {
|
||||||
|
FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << mpath );
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef __MWERKS__
|
||||||
|
while ( ! in.eof() ) {
|
||||||
|
#else
|
||||||
|
char c = '\0';
|
||||||
|
while ( in.get(c) && c != '\0' ) {
|
||||||
|
in.putback(c);
|
||||||
|
#endif
|
||||||
|
// printf("%s", line);
|
||||||
|
|
||||||
|
// strip leading white space and comments
|
||||||
|
in >> skipcomment;
|
||||||
|
|
||||||
|
// set to zero to prevent its value accidently being '{'
|
||||||
|
// after a failed >> operation.
|
||||||
|
char token = 0;
|
||||||
|
|
||||||
|
in >> material_name >> token;
|
||||||
|
|
||||||
|
if ( token == '{' ) {
|
||||||
|
FGNewMat m;
|
||||||
|
in >> m;
|
||||||
|
|
||||||
|
// build the ssgSimpleState
|
||||||
|
FGPath tex_path( current_options.get_fg_root() );
|
||||||
|
tex_path.append( "Textures" );
|
||||||
|
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " Loading material "
|
||||||
|
<< material_name << " (" << tex_path.c_str() << ")");
|
||||||
|
|
||||||
|
GLenum shade_model = GL_SMOOTH;
|
||||||
|
if ( current_options.get_shading() == 1 ) {
|
||||||
|
shade_model = GL_SMOOTH;
|
||||||
|
} else {
|
||||||
|
shade_model = GL_FLAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
m.build_ssg_state( tex_path.str(), shade_model,
|
||||||
|
current_options.get_textures() );
|
||||||
|
|
||||||
|
#if EXTRA_DEBUG
|
||||||
|
m.dump_info();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
matlib[material_name] = m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Load a library of material properties
|
||||||
|
bool FGMaterialLib::add_item ( const string &path )
|
||||||
|
{
|
||||||
|
string material_name = path;
|
||||||
|
int pos = path.rfind( "/" );
|
||||||
|
material_name = material_name.substr( pos + 1 );
|
||||||
|
|
||||||
|
FGNewMat m( material_name );
|
||||||
|
|
||||||
|
// build the ssgSimpleState
|
||||||
|
FGPath tex_file( path );
|
||||||
|
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " Loading material "
|
||||||
|
<< material_name << " (" << tex_file.c_str() << ")");
|
||||||
|
|
||||||
|
#if EXTRA_DEBUG
|
||||||
|
m.dump_info();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GLenum shade_model = GL_SMOOTH;
|
||||||
|
if ( current_options.get_shading() == 1 ) {
|
||||||
|
shade_model = GL_SMOOTH;
|
||||||
|
} else {
|
||||||
|
shade_model = GL_FLAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
m.build_ssg_state( path, shade_model, current_options.get_textures() );
|
||||||
|
|
||||||
|
material_lib.matlib[material_name] = m;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// find a material record by material name
|
||||||
|
FGNewMat *FGMaterialLib::find( const string& material ) {
|
||||||
|
FGNewMat *result = NULL;
|
||||||
|
material_map_iterator it = matlib.find( material );
|
||||||
|
if ( it != end() ) {
|
||||||
|
result = &((*it).second);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
FGMaterialLib::~FGMaterialLib ( void ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Set the step for all of the state selectors in the material slots
|
||||||
|
void FGMaterialLib::set_step ( int step )
|
||||||
|
{
|
||||||
|
// container::iterator it = begin();
|
||||||
|
for ( material_map_iterator it = begin(); it != end(); it++ ) {
|
||||||
|
const string &key = it->first;
|
||||||
|
FG_LOG( FG_GENERAL, FG_INFO,
|
||||||
|
"Updating material " << key << " to step " << step );
|
||||||
|
FGNewMat &slot = it->second;
|
||||||
|
slot.get_state()->selectStep(step);
|
||||||
|
}
|
||||||
|
}
|
137
src/Objects/matlib.hxx
Normal file
137
src/Objects/matlib.hxx
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
// matlib.hxx -- class to handle material properties
|
||||||
|
//
|
||||||
|
// Written by Curtis Olson, started May 1998.
|
||||||
|
//
|
||||||
|
// Copyright (C) 1998 - 2000 Curtis L. Olson - curt@flightgear.org
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 2 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful, but
|
||||||
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _MATLIB_HXX
|
||||||
|
#define _MATLIB_HXX
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
# error This library requires C++
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
# include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include <GL/glut.h>
|
||||||
|
#include <simgear/xgl/xgl.h>
|
||||||
|
|
||||||
|
#include STL_STRING // Standard C++ string library
|
||||||
|
#include <map> // STL associative "array"
|
||||||
|
#include <vector> // STL "array"
|
||||||
|
|
||||||
|
#include <plib/ssg.h> // plib include
|
||||||
|
|
||||||
|
#include "newmat.hxx"
|
||||||
|
|
||||||
|
|
||||||
|
FG_USING_STD(string);
|
||||||
|
FG_USING_STD(map);
|
||||||
|
FG_USING_STD(vector);
|
||||||
|
FG_USING_STD(less);
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// Material property class
|
||||||
|
class FGMaterialSlotold {
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
FGMaterial m;
|
||||||
|
|
||||||
|
// ssg stage structure
|
||||||
|
ssgStateSelector *state;
|
||||||
|
bool state_valid;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
FGMaterialSlotold ( void );
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
~FGMaterialSlotold ( void );
|
||||||
|
|
||||||
|
// friend istream& operator >> ( istream& in, FGMaterialSlot& m );
|
||||||
|
|
||||||
|
inline FGMaterial get_m() const { return m; }
|
||||||
|
inline void set_m( FGMaterial new_m ) { m = new_m; }
|
||||||
|
|
||||||
|
// ssg state
|
||||||
|
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; }
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// Material management class
|
||||||
|
class FGMaterialLib {
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// associative array of materials
|
||||||
|
typedef map < string, FGNewMat, less<string> > material_map;
|
||||||
|
typedef material_map::iterator material_map_iterator;
|
||||||
|
typedef material_map::const_iterator const_material_map_iterator;
|
||||||
|
|
||||||
|
material_map matlib;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
FGMaterialLib ( void );
|
||||||
|
|
||||||
|
// Load a library of material properties
|
||||||
|
bool load( const string& mpath );
|
||||||
|
|
||||||
|
// Add the named texture with default properties
|
||||||
|
bool add_item( const string &name );
|
||||||
|
|
||||||
|
// find a material record by material name
|
||||||
|
FGNewMat *find( const string& material );
|
||||||
|
|
||||||
|
void set_step (int step);
|
||||||
|
|
||||||
|
material_map_iterator begin() { return matlib.begin(); }
|
||||||
|
const_material_map_iterator begin() const { return matlib.begin(); }
|
||||||
|
|
||||||
|
material_map_iterator end() { return matlib.end(); }
|
||||||
|
const_material_map_iterator end() const { return matlib.end(); }
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
~FGMaterialLib ( void );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// global material management class
|
||||||
|
extern FGMaterialLib material_lib;
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _MATLIB_HXX
|
181
src/Objects/newmat.cxx
Normal file
181
src/Objects/newmat.cxx
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
// newmat.cxx -- class to handle material properties
|
||||||
|
//
|
||||||
|
// Written by Curtis Olson, started May 1998.
|
||||||
|
//
|
||||||
|
// Copyright (C) 1998 - 2000 Curtis L. Olson - curt@flightgear.org
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 2 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful, but
|
||||||
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#ifdef FG_MATH_EXCEPTION_CLASH
|
||||||
|
# include <math.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
#include <simgear/misc/fgpath.hxx>
|
||||||
|
#include <simgear/misc/fgstream.hxx>
|
||||||
|
|
||||||
|
#include "newmat.hxx"
|
||||||
|
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
FGNewMat::FGNewMat ( void ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
FGNewMat::FGNewMat ( const string &name )
|
||||||
|
{
|
||||||
|
material_name = name;
|
||||||
|
texture_name = name;
|
||||||
|
xsize = ysize = 0;
|
||||||
|
alpha = 0;
|
||||||
|
ambient[0] = ambient[1] = ambient[2] = ambient[3] = 1.0;
|
||||||
|
diffuse[0] = diffuse[1] = diffuse[2] = diffuse[3] = 1.0;
|
||||||
|
specular[0] = specular[1] = specular[2] = specular[3] = 1.0;
|
||||||
|
emission[0] = emission[1] = emission[2] = emission[3] = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FGNewMat::build_ssg_state( const string& path,
|
||||||
|
GLenum shade_model, bool texture_default )
|
||||||
|
{
|
||||||
|
FGPath tex_file( path );
|
||||||
|
tex_file.append( texture_name );
|
||||||
|
|
||||||
|
state = new ssgStateSelector(2);
|
||||||
|
textured = new ssgSimpleState();
|
||||||
|
nontextured = new ssgSimpleState();
|
||||||
|
|
||||||
|
// Set up the textured state
|
||||||
|
textured->setShadeModel( shade_model );
|
||||||
|
textured->enable ( GL_CULL_FACE ) ;
|
||||||
|
textured->enable( GL_TEXTURE_2D );
|
||||||
|
textured->disable( GL_BLEND );
|
||||||
|
textured->disable( GL_ALPHA_TEST );
|
||||||
|
textured->setTexture( (char *)tex_file.c_str() );
|
||||||
|
textured->enable( GL_COLOR_MATERIAL );
|
||||||
|
textured->setColourMaterial( GL_AMBIENT_AND_DIFFUSE );
|
||||||
|
textured->setMaterial( GL_EMISSION, 0, 0, 0, 1 );
|
||||||
|
textured->setMaterial( GL_SPECULAR, 0, 0, 0, 1 );
|
||||||
|
|
||||||
|
// Set up the coloured state
|
||||||
|
nontextured->enable( GL_LIGHTING );
|
||||||
|
nontextured->setShadeModel( shade_model );
|
||||||
|
nontextured->enable ( GL_CULL_FACE ) ;
|
||||||
|
nontextured->disable( GL_TEXTURE_2D );
|
||||||
|
nontextured->disable( GL_BLEND );
|
||||||
|
nontextured->disable( GL_ALPHA_TEST );
|
||||||
|
nontextured->disable( GL_COLOR_MATERIAL );
|
||||||
|
|
||||||
|
/* cout << "ambient = " << ambient[0] << "," << ambient[1]
|
||||||
|
<< "," << ambient[2] << endl; */
|
||||||
|
nontextured->setMaterial ( GL_AMBIENT,
|
||||||
|
ambient[0], ambient[1],
|
||||||
|
ambient[2], ambient[3] ) ;
|
||||||
|
nontextured->setMaterial ( GL_DIFFUSE,
|
||||||
|
diffuse[0], diffuse[1],
|
||||||
|
diffuse[2], diffuse[3] ) ;
|
||||||
|
nontextured->setMaterial ( GL_SPECULAR,
|
||||||
|
specular[0], specular[1],
|
||||||
|
specular[2], specular[3] ) ;
|
||||||
|
nontextured->setMaterial ( GL_EMISSION,
|
||||||
|
emission[0], emission[1],
|
||||||
|
emission[2], emission[3] ) ;
|
||||||
|
|
||||||
|
state->setStep( 0, textured ); // textured
|
||||||
|
state->setStep( 1, nontextured ); // untextured
|
||||||
|
|
||||||
|
// Choose the appropriate starting state.
|
||||||
|
if ( texture_default ) {
|
||||||
|
state->selectStep(0);
|
||||||
|
} else {
|
||||||
|
state->selectStep(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FGNewMat::dump_info () {
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, "{" << endl << " texture = "
|
||||||
|
<< texture_name );
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " xsize = " << xsize );
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " ysize = " << ysize );
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " ambient = " << ambient[0] << " "
|
||||||
|
<< ambient[1] <<" "<< ambient[2] <<" "<< ambient[3] );
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " diffuse = " << diffuse[0] << " "
|
||||||
|
<< diffuse[1] << " " << diffuse[2] << " " << diffuse[3] );
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " specular = " << specular[0] << " "
|
||||||
|
<< specular[1] << " " << specular[2] << " " << specular[3]);
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " emission = " << emission[0] << " "
|
||||||
|
<< emission[1] << " " << emission[2] << " " << emission[3]);
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, " alpha = " << alpha << endl <<"}" );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
FGNewMat::~FGNewMat ( void ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
istream&
|
||||||
|
operator >> ( istream& in, FGNewMat& m )
|
||||||
|
{
|
||||||
|
string token;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
in >> token;
|
||||||
|
if ( token == "texture" ) {
|
||||||
|
in >> token >> m.texture_name;
|
||||||
|
} else if ( token == "xsize" ) {
|
||||||
|
in >> token >> m.xsize;
|
||||||
|
} else if ( token == "ysize" ) {
|
||||||
|
in >> token >> m.ysize;
|
||||||
|
} else if ( token == "ambient" ) {
|
||||||
|
in >> token >> m.ambient[0] >> m.ambient[1]
|
||||||
|
>> m.ambient[2] >> m.ambient[3];
|
||||||
|
} else if ( token == "diffuse" ) {
|
||||||
|
in >> token >> m.diffuse[0] >> m.diffuse[1]
|
||||||
|
>> m.diffuse[2] >> m.diffuse[3];
|
||||||
|
} else if ( token == "specular" ) {
|
||||||
|
in >> token >> m.specular[0] >> m.specular[1]
|
||||||
|
>> m.specular[2] >> m.specular[3];
|
||||||
|
} else if ( token == "emission" ) {
|
||||||
|
in >> token >> m.emission[0] >> m.emission[1]
|
||||||
|
>> m.emission[2] >> m.emission[3];
|
||||||
|
} else if ( token == "alpha" ) {
|
||||||
|
in >> token >> token;
|
||||||
|
if ( token == "yes" ) {
|
||||||
|
m.alpha = 1;
|
||||||
|
} else if ( token == "no" ) {
|
||||||
|
m.alpha = 0;
|
||||||
|
} else {
|
||||||
|
FG_LOG( FG_TERRAIN, FG_INFO, "Bad alpha value " << token );
|
||||||
|
}
|
||||||
|
} else if ( token[0] == '}' ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return in;
|
||||||
|
}
|
122
src/Objects/newmat.hxx
Normal file
122
src/Objects/newmat.hxx
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
// newmat.hxx -- class to handle material properties
|
||||||
|
//
|
||||||
|
// Written by Curtis Olson, started May 1998.
|
||||||
|
//
|
||||||
|
// Copyright (C) 1998 - 2000 Curtis L. Olson - curt@flightgear.org
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 2 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful, but
|
||||||
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _NEWMAT_HXX
|
||||||
|
#define _NEWMAT_HXX
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
# error This library requires C++
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
# include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <plib/sg.h>
|
||||||
|
#include <plib/ssg.h>
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include <GL/glut.h>
|
||||||
|
|
||||||
|
#include STL_STRING // Standard C++ string library
|
||||||
|
|
||||||
|
FG_USING_STD(string);
|
||||||
|
|
||||||
|
|
||||||
|
// MSVC++ 6.0 kuldge - Need forward declaration of friends.
|
||||||
|
class FGNewMat;
|
||||||
|
istream& operator >> ( istream& in, FGNewMat& m );
|
||||||
|
|
||||||
|
// Material property class
|
||||||
|
class FGNewMat {
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// names
|
||||||
|
string material_name;
|
||||||
|
string texture_name;
|
||||||
|
|
||||||
|
// pointers to ssg states
|
||||||
|
ssgStateSelector *state;
|
||||||
|
ssgSimpleState *textured;
|
||||||
|
ssgSimpleState *nontextured;
|
||||||
|
|
||||||
|
// alpha texture?
|
||||||
|
int alpha;
|
||||||
|
|
||||||
|
// texture size
|
||||||
|
double xsize, ysize;
|
||||||
|
|
||||||
|
// material properties
|
||||||
|
sgVec4 ambient, diffuse, specular, emission;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
FGNewMat ( void );
|
||||||
|
FGNewMat ( const string& name );
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
~FGNewMat ( void );
|
||||||
|
|
||||||
|
friend istream& operator >> ( istream& in, FGNewMat& m );
|
||||||
|
|
||||||
|
// void load_texture( const string& root );
|
||||||
|
void build_ssg_state( const string& path,
|
||||||
|
GLenum shade_model, bool texture_default );
|
||||||
|
|
||||||
|
inline string get_material_name() const { return material_name; }
|
||||||
|
inline void set_material_name( const string& n ) { material_name = n; }
|
||||||
|
|
||||||
|
inline string get_texture_name() const { return texture_name; }
|
||||||
|
inline void set_texture_name( const string& n ) { texture_name = n; }
|
||||||
|
|
||||||
|
inline double get_xsize() const { return xsize; }
|
||||||
|
inline double get_ysize() const { return ysize; }
|
||||||
|
inline void set_xsize( double x ) { xsize = x; }
|
||||||
|
inline void set_ysize( double y ) { ysize = y; }
|
||||||
|
|
||||||
|
inline float *get_ambient() { return ambient; }
|
||||||
|
inline float *get_diffuse() { return diffuse; }
|
||||||
|
inline float *get_specular() { return specular; }
|
||||||
|
inline float *get_emission() { return emission; }
|
||||||
|
inline void set_ambient( sgVec4 a ) { sgCopyVec4( ambient, a ); }
|
||||||
|
inline void set_diffuse( sgVec4 d ) { sgCopyVec4( diffuse, d ); }
|
||||||
|
inline void set_specular( sgVec4 s ) { sgCopyVec4( specular, s ); }
|
||||||
|
inline void set_emission( sgVec4 e ) { sgCopyVec4( emission, e ); }
|
||||||
|
|
||||||
|
inline ssgStateSelector *get_state() const { return state; }
|
||||||
|
|
||||||
|
void dump_info();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _NEWMAT_HXX
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue