From: curt Date: Thu, 12 Jul 2001 15:03:09 +0000 (+0000) Subject: Restructured code a bit to split out the bits that create objects on the X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=2cb51a228b97e7f993696b854316de4436febbd2;p=flightgear.git Restructured code a bit to split out the bits that create objects on the fly. More work needs to be done. Added apt_signs.[ch]xx --- diff --git a/src/Objects/Makefile.am b/src/Objects/Makefile.am index 57ccc7ae7..42ec6b400 100644 --- a/src/Objects/Makefile.am +++ b/src/Objects/Makefile.am @@ -1,6 +1,7 @@ noinst_LIBRARIES = libObjects.a libObjects_a_SOURCES = \ + apt_signs.cxx apt_signs.hxx \ newmat.cxx newmat.hxx \ matlib.cxx matlib.hxx \ obj.cxx obj.hxx \ diff --git a/src/Objects/apt_signs.cxx b/src/Objects/apt_signs.cxx new file mode 100644 index 000000000..51b2dfc72 --- /dev/null +++ b/src/Objects/apt_signs.cxx @@ -0,0 +1,155 @@ +// apt_signs.cxx -- build airport signs on the fly +// +// Written by Curtis Olson, started July 2001. +// +// Copyright (C) 2001 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$ + + +#include + +#include "apt_signs.hxx" +#include "obj.hxx" + + +ssgBranch *gen_taxi_sign( const string path, const string content ) { + // for demo purposes we assume each element (letter) is 1x1 meter. + // Sign is placed 0.25 meters above the ground + + ssgBranch *object = new ssgBranch(); + object->setName( (char *)content.c_str() ); + + double offset = content.length() / 2.0; + + for ( unsigned int i = 0; i < content.length(); ++i ) { + string material; + + char item = content[i]; + if ( item == '<' ) { + material = "ArrowL.rgb"; + } else if ( item == '>' ) { + material = "ArrowR.rgb"; + } else if ( item >= 'A' && item <= 'Z' ) { + material = "Letter"; + material += item; + material += ".rgb"; + } else if ( item >= 'a' && item <= 'z' ) { + int tmp = item - 'a'; + char c = 'A' + tmp; + material = "Black"; + material += c; + material += ".rgb"; + } else { + cout << "Unknown taxi sign code = '" << item << "' !!!!" << endl; + return NULL; + } + + point_list nodes; nodes.clear(); + point_list normals; normals.clear(); + point_list texcoords; texcoords.clear(); + int_list vertex_index; vertex_index.clear(); + int_list tex_index; tex_index.clear(); + + nodes.push_back( Point3D( -offset + i, 0, 0.25 ) ); + nodes.push_back( Point3D( -offset + i + 1, 0, 0.25 ) ); + nodes.push_back( Point3D( -offset + i, 0, 1.25 ) ); + nodes.push_back( Point3D( -offset + i + 1, 0, 1.25 ) ); + + normals.push_back( Point3D( 0, -1, 0 ) ); + normals.push_back( Point3D( 0, -1, 0 ) ); + normals.push_back( Point3D( 0, -1, 0 ) ); + normals.push_back( Point3D( 0, -1, 0 ) ); + + texcoords.push_back( Point3D( 0, 0, 0 ) ); + texcoords.push_back( Point3D( 1, 0, 0 ) ); + texcoords.push_back( Point3D( 0, 1, 0 ) ); + texcoords.push_back( Point3D( 1, 1, 0 ) ); + + vertex_index.push_back( 0 ); + vertex_index.push_back( 1 ); + vertex_index.push_back( 2 ); + vertex_index.push_back( 3 ); + + tex_index.push_back( 0 ); + tex_index.push_back( 1 ); + tex_index.push_back( 2 ); + tex_index.push_back( 3 ); + + ssgLeaf *leaf = gen_leaf( path, GL_TRIANGLE_STRIP, material, + nodes, normals, texcoords, + vertex_index, tex_index, + false, NULL ); + + object->addKid( leaf ); + } + + return object; +} + + +ssgBranch *gen_runway_sign( const string path, const string name ) { + // for demo purposes we assume each element (letter) is 1x1 meter. + // Sign is placed 0.25 meters above the ground + + ssgBranch *object = new ssgBranch(); + object->setName( (char *)name.c_str() ); + + double width = name.length() / 3.0; + + string material = name + ".rgb"; + + point_list nodes; nodes.clear(); + point_list normals; normals.clear(); + point_list texcoords; texcoords.clear(); + int_list vertex_index; vertex_index.clear(); + int_list tex_index; tex_index.clear(); + + nodes.push_back( Point3D( -width, 0, 0.25 ) ); + nodes.push_back( Point3D( width + 1, 0, 0.25 ) ); + nodes.push_back( Point3D( -width, 0, 1.25 ) ); + nodes.push_back( Point3D( width + 1, 0, 1.25 ) ); + + normals.push_back( Point3D( 0, -1, 0 ) ); + normals.push_back( Point3D( 0, -1, 0 ) ); + normals.push_back( Point3D( 0, -1, 0 ) ); + normals.push_back( Point3D( 0, -1, 0 ) ); + + texcoords.push_back( Point3D( 0, 0, 0 ) ); + texcoords.push_back( Point3D( 1, 0, 0 ) ); + texcoords.push_back( Point3D( 0, 1, 0 ) ); + texcoords.push_back( Point3D( 1, 1, 0 ) ); + + vertex_index.push_back( 0 ); + vertex_index.push_back( 1 ); + vertex_index.push_back( 2 ); + vertex_index.push_back( 3 ); + + tex_index.push_back( 0 ); + tex_index.push_back( 1 ); + tex_index.push_back( 2 ); + tex_index.push_back( 3 ); + + ssgLeaf *leaf = gen_leaf( path, GL_TRIANGLE_STRIP, material, + nodes, normals, texcoords, + vertex_index, tex_index, + false, NULL ); + + object->addKid( leaf ); + + return object; +} diff --git a/src/Objects/apt_signs.hxx b/src/Objects/apt_signs.hxx new file mode 100644 index 000000000..2d7705128 --- /dev/null +++ b/src/Objects/apt_signs.hxx @@ -0,0 +1,54 @@ +// apt_signs.hxx -- build airport signs on the fly +// +// Written by Curtis Olson, started July 2001. +// +// Copyright (C) 2001 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 _APT_SIGNS_HXX +#define _APT_SIGNS_HXX + + +#ifndef __cplusplus +# error This library requires C++ +#endif + + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include STL_STRING + +#include // plib include + +SG_USING_STD(string); + + +// Generate a taxi sign +ssgBranch *gen_taxi_sign( const string path, const string content ); + + +// Generate a runway sign +ssgBranch *gen_runway_sign( const string path, const string name ); + + +#endif // _APT_SIGNS_HXX diff --git a/src/Objects/obj.cxx b/src/Objects/obj.cxx index 45410798a..166111169 100644 --- a/src/Objects/obj.cxx +++ b/src/Objects/obj.cxx @@ -761,13 +761,13 @@ ssgBranch *fgAsciiObjLoad( const string& path, FGTileEntry *t, } -static ssgLeaf *gen_leaf( const string& path, - const GLenum ty, const string& material, - const point_list& nodes, const point_list& normals, - const point_list& texcoords, - const int_list node_index, - const int_list& tex_index, - const bool calc_lights, ssgVertexArray *lights ) +ssgLeaf *gen_leaf( const string& path, + const GLenum ty, const string& material, + const point_list& nodes, const point_list& normals, + const point_list& texcoords, + const int_list node_index, + const int_list& tex_index, + const bool calc_lights, ssgVertexArray *lights ) { double tex_width = 1000.0, tex_height = 1000.0; ssgSimpleState *state = NULL; @@ -965,131 +965,3 @@ ssgBranch *fgBinObjLoad( const string& path, FGTileEntry *t, return object; } - - -ssgBranch *gen_taxi_sign( const string path, const string content ) { - // for demo purposes we assume each element (letter) is 1x1 meter. - // Sign is placed 0.25 meters above the ground - - ssgBranch *object = new ssgBranch(); - object->setName( (char *)content.c_str() ); - - double offset = content.length() / 2.0; - - for ( unsigned int i = 0; i < content.length(); ++i ) { - string material; - - char item = content[i]; - if ( item == '<' ) { - material = "ArrowL.rgb"; - } else if ( item == '>' ) { - material = "ArrowR.rgb"; - } else if ( item >= 'A' && item <= 'Z' ) { - material = "Letter"; - material += item; - material += ".rgb"; - } else if ( item >= 'a' && item <= 'z' ) { - int tmp = item - 'a'; - char c = 'A' + tmp; - material = "Black"; - material += c; - material += ".rgb"; - } else { - cout << "Unknown taxi sign code = '" << item << "' !!!!" << endl; - return NULL; - } - - point_list nodes; nodes.clear(); - point_list normals; normals.clear(); - point_list texcoords; texcoords.clear(); - int_list vertex_index; vertex_index.clear(); - int_list tex_index; tex_index.clear(); - - nodes.push_back( Point3D( -offset + i, 0, 0.25 ) ); - nodes.push_back( Point3D( -offset + i + 1, 0, 0.25 ) ); - nodes.push_back( Point3D( -offset + i, 0, 1.25 ) ); - nodes.push_back( Point3D( -offset + i + 1, 0, 1.25 ) ); - - normals.push_back( Point3D( 0, -1, 0 ) ); - normals.push_back( Point3D( 0, -1, 0 ) ); - normals.push_back( Point3D( 0, -1, 0 ) ); - normals.push_back( Point3D( 0, -1, 0 ) ); - - texcoords.push_back( Point3D( 0, 0, 0 ) ); - texcoords.push_back( Point3D( 1, 0, 0 ) ); - texcoords.push_back( Point3D( 0, 1, 0 ) ); - texcoords.push_back( Point3D( 1, 1, 0 ) ); - - vertex_index.push_back( 0 ); - vertex_index.push_back( 1 ); - vertex_index.push_back( 2 ); - vertex_index.push_back( 3 ); - - tex_index.push_back( 0 ); - tex_index.push_back( 1 ); - tex_index.push_back( 2 ); - tex_index.push_back( 3 ); - - ssgLeaf *leaf = gen_leaf( path, GL_TRIANGLE_STRIP, material, - nodes, normals, texcoords, - vertex_index, tex_index, - false, NULL ); - - object->addKid( leaf ); - } - - return object; -} - - -ssgBranch *gen_runway_sign( const string path, const string name ) { - // for demo purposes we assume each element (letter) is 1x1 meter. - // Sign is placed 0.25 meters above the ground - - ssgBranch *object = new ssgBranch(); - object->setName( (char *)name.c_str() ); - - double width = name.length() / 3.0; - - string material = name + ".rgb"; - - point_list nodes; nodes.clear(); - point_list normals; normals.clear(); - point_list texcoords; texcoords.clear(); - int_list vertex_index; vertex_index.clear(); - int_list tex_index; tex_index.clear(); - - nodes.push_back( Point3D( -width, 0, 0.25 ) ); - nodes.push_back( Point3D( width + 1, 0, 0.25 ) ); - nodes.push_back( Point3D( -width, 0, 1.25 ) ); - nodes.push_back( Point3D( width + 1, 0, 1.25 ) ); - - normals.push_back( Point3D( 0, -1, 0 ) ); - normals.push_back( Point3D( 0, -1, 0 ) ); - normals.push_back( Point3D( 0, -1, 0 ) ); - normals.push_back( Point3D( 0, -1, 0 ) ); - - texcoords.push_back( Point3D( 0, 0, 0 ) ); - texcoords.push_back( Point3D( 1, 0, 0 ) ); - texcoords.push_back( Point3D( 0, 1, 0 ) ); - texcoords.push_back( Point3D( 1, 1, 0 ) ); - - vertex_index.push_back( 0 ); - vertex_index.push_back( 1 ); - vertex_index.push_back( 2 ); - vertex_index.push_back( 3 ); - - tex_index.push_back( 0 ); - tex_index.push_back( 1 ); - tex_index.push_back( 2 ); - tex_index.push_back( 3 ); - - ssgLeaf *leaf = gen_leaf( path, GL_TRIANGLE_STRIP, material, - nodes, normals, texcoords, - vertex_index, tex_index, - false, NULL ); - - object->addKid( leaf ); - - return object; -} diff --git a/src/Objects/obj.hxx b/src/Objects/obj.hxx index 5ad0804e0..05a7180d7 100644 --- a/src/Objects/obj.hxx +++ b/src/Objects/obj.hxx @@ -46,6 +46,8 @@ #include // plib include +#include + #include SG_USING_STD(string); @@ -67,12 +69,14 @@ ssgBranch *fgAsciiObjLoad(const string& path, FGTileEntry *tile, ssgBranch *fgGenTile( const string& path, FGTileEntry *t); -// Generate a taxi sign -ssgBranch *gen_taxi_sign( const string path, const string content ); - - -// Generate a runway sign -ssgBranch *gen_runway_sign( const string path, const string name ); +// Create an ssg leaf +ssgLeaf *gen_leaf( const string& path, + const GLenum ty, const string& material, + const point_list& nodes, const point_list& normals, + const point_list& texcoords, + const int_list node_index, + const int_list& tex_index, + const bool calc_lights, ssgVertexArray *lights ); #endif // _OBJ_HXX