From 392e8c09c89995d7372b0cb68f7aa229176a95b7 Mon Sep 17 00:00:00 2001 From: curt <curt> Date: Sat, 12 Jun 1999 21:15:27 +0000 Subject: [PATCH] Renamed tile.[ch]xx to tileentry.[ch]xx --- Simulator/Scenery/tileentry.cxx | 71 ++++++++++++++ Simulator/Scenery/tileentry.hxx | 167 ++++++++++++++++++++++++++++++++ 2 files changed, 238 insertions(+) create mode 100644 Simulator/Scenery/tileentry.cxx create mode 100644 Simulator/Scenery/tileentry.hxx diff --git a/Simulator/Scenery/tileentry.cxx b/Simulator/Scenery/tileentry.cxx new file mode 100644 index 000000000..0eee8cb48 --- /dev/null +++ b/Simulator/Scenery/tileentry.cxx @@ -0,0 +1,71 @@ +// tile.cxx -- routines to handle a scenery tile +// +// Written by Curtis Olson, started May 1998. +// +// Copyright (C) 1998, 1999 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/compiler.h> + +#ifdef FG_MATH_EXCEPTION_CLASH +# include <math.h> +#endif + +#include STL_FUNCTIONAL +#include STL_ALGORITHM + +#include <Debug/logstream.hxx> +#include <Bucket/newbucket.hxx> + +#include "tileentry.hxx" + +FG_USING_STD(for_each); +FG_USING_STD(mem_fun_ref); + + +// Constructor +FGTileEntry::FGTileEntry ( void ) + : ncount(0), + used(false) +{ + nodes.clear(); +} + + +// Destructor +FGTileEntry::~FGTileEntry ( void ) { + // cout << "nodes = " << nodes.size() << endl;; + // delete[] nodes; +} + + +// Step through the fragment list, deleting the display list, then +// the fragment, until the list is empty. +void +FGTileEntry::release_fragments() +{ + FG_LOG( FG_TERRAIN, FG_DEBUG, + "FREEING TILE = (" << tile_bucket << ")" ); + for_each( begin(), end(), + mem_fun_ref( &fgFRAGMENT::deleteDisplayList )); + fragment_list.erase( begin(), end() ); + used = false; +} + + diff --git a/Simulator/Scenery/tileentry.hxx b/Simulator/Scenery/tileentry.hxx new file mode 100644 index 000000000..955298941 --- /dev/null +++ b/Simulator/Scenery/tileentry.hxx @@ -0,0 +1,167 @@ +// tileentry.hxx -- routines to handle an individual scenery tile +// +// Written by Curtis Olson, started May 1998. +// +// Copyright (C) 1998, 1999 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 _TILEENTRY_HXX +#define _TILEENTRY_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 <GL/glut.h> +#include <XGL/xgl.h> + +#include <Include/compiler.h> + +#include <vector> +#include STL_STRING + +#include <plib/sg.h> + +#include <Bucket/newbucket.hxx> +#include <Math/mat3.h> +#include <Math/point3d.hxx> +#include <Objects/fragment.hxx> + +#ifdef FG_HAVE_NATIVE_SGI_COMPILERS +#include <strings.h> +#endif + +FG_USING_STD(string); +FG_USING_STD(vector); + + +typedef vector < Point3D > point_list; +typedef point_list::iterator point_list_iterator; +typedef point_list::const_iterator const_point_list_iterator; + + +// Scenery tile class +class FGTileEntry { + +public: + + typedef vector < fgFRAGMENT > container; + typedef container::iterator FragmentIterator; + typedef container::const_iterator FragmentConstIterator; + +public: + // node list (the per fragment face lists reference this node list) + point_list nodes; + int ncount; + + // global tile culling data + Point3D center; + double bounding_radius; + Point3D offset; + + // model view matrix for this tile + GLfloat model_view[16]; + + // this tile's official location in the world + FGBucket tile_bucket; + + // the tile cache will mark here if the tile is being used + bool used; + + container fragment_list; + +public: + + // Constructor + FGTileEntry ( void ); + + // Destructor + ~FGTileEntry ( void ); + + FragmentIterator begin() { return fragment_list.begin(); } + FragmentConstIterator begin() const { return fragment_list.begin(); } + + FragmentIterator end() { return fragment_list.end(); } + FragmentConstIterator end() const { return fragment_list.end(); } + + void add_fragment( fgFRAGMENT& frag ) { + frag.tile_ptr = this; + fragment_list.push_back( frag ); + } + + size_t num_fragments() const { + return fragment_list.size(); + } + + // Step through the fragment list, deleting the display list, then + // the fragment, until the list is empty. + void release_fragments(); + + // Calculate this tile's offset + void SetOffset( const Point3D& off) + { + offset = center - off; + } + + // Return this tile's offset + inline Point3D get_offset( void ) const { return offset; } + + // Calculate the model_view transformation matrix for this tile + inline void update_view_matrix(GLfloat *MODEL_VIEW) + { + +#if defined( USE_MEM ) || defined( WIN32 ) + memcpy( model_view, MODEL_VIEW, 16*sizeof(GLfloat) ); +#else + bcopy( MODEL_VIEW, model_view, 16*sizeof(GLfloat) ); +#endif + + // This is equivalent to doing a glTranslatef(x, y, z); + model_view[12] += (model_view[0]*offset.x() + + model_view[4]*offset.y() + + model_view[8]*offset.z()); + model_view[13] += (model_view[1]*offset.x() + + model_view[5]*offset.y() + + model_view[9]*offset.z()); + model_view[14] += (model_view[2]*offset.x() + + model_view[6]*offset.y() + + model_view[10]*offset.z() ); + // m[15] += (m[3]*x + m[7]*y + m[11]*z); + // m[3] m7[] m[11] are 0.0 see LookAt() in views.cxx + // so m[15] is unchanged + } + +}; + + +typedef vector < FGTileEntry > tile_list; +typedef tile_list::iterator tile_list_iterator; +typedef tile_list::const_iterator const_tile_list_iterator; + + +#endif // _TILEENTRY_HXX