From 2cb51a228b97e7f993696b854316de4436febbd2 Mon Sep 17 00:00:00 2001
From: curt <curt>
Date: Thu, 12 Jul 2001 15:03:09 +0000
Subject: [PATCH] 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

---
 src/Objects/Makefile.am   |   1 +
 src/Objects/apt_signs.cxx | 155 ++++++++++++++++++++++++++++++++++++++
 src/Objects/apt_signs.hxx |  54 +++++++++++++
 src/Objects/obj.cxx       | 142 ++--------------------------------
 src/Objects/obj.hxx       |  16 ++--
 5 files changed, 227 insertions(+), 141 deletions(-)
 create mode 100644 src/Objects/apt_signs.cxx
 create mode 100644 src/Objects/apt_signs.hxx

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 <simgear/math/sg_types.hxx>
+
+#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 <config.h>
+#endif
+
+#include <simgear/compiler.h>
+
+#include STL_STRING
+
+#include <plib/ssg.h>		// 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/ssg.h>		// plib include
 
+#include <simgear/math/sg_types.hxx>
+
 #include <Scenery/tileentry.hxx>
 
 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