1999-06-12 21:15:27 +00:00
|
|
|
// tileentry.hxx -- routines to handle an individual scenery tile
|
|
|
|
//
|
|
|
|
// Written by Curtis Olson, started May 1998.
|
|
|
|
//
|
2001-05-19 16:59:43 +00:00
|
|
|
// Copyright (C) 1998 - 2001 Curtis L. Olson - curt@flightgear.org
|
1999-06-12 21:15:27 +00:00
|
|
|
//
|
|
|
|
// 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>
|
2001-05-15 22:30:39 +00:00
|
|
|
#include <GL/gl.h>
|
1999-06-12 21:15:27 +00:00
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
#include <simgear/compiler.h>
|
1999-06-12 21:15:27 +00:00
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include STL_STRING
|
|
|
|
|
2000-02-04 22:50:04 +00:00
|
|
|
#include <plib/ssg.h> // plib includes
|
1999-06-12 21:15:27 +00:00
|
|
|
|
2000-02-16 23:01:03 +00:00
|
|
|
#include <simgear/bucket/newbucket.hxx>
|
|
|
|
#include <simgear/math/point3d.hxx>
|
2000-02-15 03:30:01 +00:00
|
|
|
|
2000-02-04 22:50:04 +00:00
|
|
|
#if defined( sgi )
|
1999-06-12 21:15:27 +00:00
|
|
|
#include <strings.h>
|
|
|
|
#endif
|
|
|
|
|
2001-03-23 22:59:18 +00:00
|
|
|
SG_USING_STD(string);
|
|
|
|
SG_USING_STD(vector);
|
1999-06-12 21:15:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
typedef vector < Point3D > point_list;
|
|
|
|
typedef point_list::iterator point_list_iterator;
|
|
|
|
typedef point_list::const_iterator const_point_list_iterator;
|
|
|
|
|
2001-05-19 16:59:43 +00:00
|
|
|
class FGTileEntry;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A class to hold deferred model loading info
|
|
|
|
*/
|
|
|
|
class FGDeferredModel {
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
string model_path;
|
|
|
|
string texture_path;
|
|
|
|
FGTileEntry *tile;
|
|
|
|
ssgTransform *obj_trans;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
inline FGDeferredModel() { }
|
|
|
|
inline FGDeferredModel( const string mp, const string tp,
|
|
|
|
FGTileEntry *t, ssgTransform *ot )
|
|
|
|
{
|
|
|
|
model_path = mp;
|
|
|
|
texture_path = tp;
|
|
|
|
tile = t;
|
|
|
|
obj_trans = ot;
|
|
|
|
}
|
|
|
|
inline ~FGDeferredModel() { }
|
|
|
|
inline string get_model_path() const { return model_path; }
|
|
|
|
inline string get_texture_path() const { return texture_path; }
|
|
|
|
inline FGTileEntry *get_tile() const { return tile; }
|
|
|
|
inline ssgTransform *get_obj_trans() const { return obj_trans; }
|
|
|
|
};
|
|
|
|
|
1999-06-12 21:15:27 +00:00
|
|
|
|
2001-03-29 01:42:31 +00:00
|
|
|
/**
|
|
|
|
* A class to encapsulate everything we need to know about a scenery tile.
|
|
|
|
*/
|
1999-06-12 21:15:27 +00:00
|
|
|
class FGTileEntry {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
1999-10-27 00:52:25 +00:00
|
|
|
typedef vector < sgVec3 * > free_vec3_list;
|
|
|
|
typedef vector < sgVec2 * > free_vec2_list;
|
|
|
|
typedef vector < unsigned short * > free_index_list;
|
1999-10-26 03:45:33 +00:00
|
|
|
|
2000-06-23 00:30:04 +00:00
|
|
|
// node list
|
1999-06-12 21:15:27 +00:00
|
|
|
point_list nodes;
|
|
|
|
int ncount;
|
|
|
|
|
|
|
|
// global tile culling data
|
|
|
|
Point3D center;
|
|
|
|
double bounding_radius;
|
|
|
|
Point3D offset;
|
|
|
|
|
|
|
|
// this tile's official location in the world
|
2000-12-13 20:36:04 +00:00
|
|
|
SGBucket tile_bucket;
|
1999-06-12 21:15:27 +00:00
|
|
|
|
1999-10-27 00:52:25 +00:00
|
|
|
// list of pointers to memory chunks that need to be freed when
|
|
|
|
// tile entry goes away
|
|
|
|
free_vec3_list vec3_ptrs;
|
|
|
|
free_vec2_list vec2_ptrs;
|
|
|
|
free_index_list index_ptrs;
|
1999-06-28 00:02:52 +00:00
|
|
|
|
2001-03-29 01:42:31 +00:00
|
|
|
private:
|
|
|
|
|
1999-06-30 00:28:20 +00:00
|
|
|
// ssg tree structure for this tile is as follows:
|
|
|
|
// ssgRoot(scene)
|
|
|
|
// - ssgBranch(terrain)
|
|
|
|
// - ssgTransform(tile)
|
|
|
|
// - ssgRangeSelector(tile)
|
|
|
|
// - ssgEntity(tile)
|
|
|
|
// - kid1(fan)
|
|
|
|
// - kid2(fan)
|
|
|
|
// ...
|
|
|
|
// - kidn(fan)
|
|
|
|
|
|
|
|
// pointer to ssg transform for this tile
|
2000-12-04 05:24:38 +00:00
|
|
|
ssgTransform *terra_transform;
|
|
|
|
ssgTransform *lights_transform;
|
1999-07-04 07:37:30 +00:00
|
|
|
|
|
|
|
// pointer to ssg range selector for this tile
|
2000-12-04 05:24:38 +00:00
|
|
|
ssgRangeSelector *terra_range;
|
|
|
|
ssgRangeSelector *lights_range;
|
1999-06-28 00:02:52 +00:00
|
|
|
|
2000-12-04 23:25:05 +00:00
|
|
|
// we create several preset brightness and can choose which one we
|
|
|
|
// want based on lighting conditions.
|
|
|
|
ssgSelector *lights_brightness;
|
|
|
|
|
2001-04-06 18:30:07 +00:00
|
|
|
/**
|
2001-04-16 20:03:52 +00:00
|
|
|
* Indicates this tile has been loaded from a file and connected
|
|
|
|
* into the scene graph. Note that this may be set asynchronously
|
|
|
|
* by another thread.
|
2001-04-06 18:30:07 +00:00
|
|
|
*/
|
|
|
|
volatile bool loaded;
|
|
|
|
|
2001-05-19 16:59:43 +00:00
|
|
|
/**
|
|
|
|
* Count of pending models to load for this tile. This tile
|
|
|
|
* cannot be removed until this number reaches zero (i.e. no
|
|
|
|
* pending models to load for this tile.)
|
|
|
|
*/
|
|
|
|
volatile int pending_models;
|
|
|
|
|
2001-03-29 01:42:31 +00:00
|
|
|
ssgBranch* obj_load( const std::string& path,
|
|
|
|
ssgVertexArray* lights, bool is_base );
|
|
|
|
|
|
|
|
ssgLeaf* gen_lights( ssgVertexArray *lights, int inc, float bright );
|
|
|
|
|
1999-06-12 21:15:27 +00:00
|
|
|
public:
|
|
|
|
|
|
|
|
// Constructor
|
2001-03-29 01:42:31 +00:00
|
|
|
FGTileEntry( const SGBucket& b );
|
1999-06-12 21:15:27 +00:00
|
|
|
|
|
|
|
// Destructor
|
2000-12-03 20:15:46 +00:00
|
|
|
~FGTileEntry();
|
1999-06-12 21:15:27 +00:00
|
|
|
|
2001-05-19 16:59:43 +00:00
|
|
|
// Schedule tile to be freed/removed
|
|
|
|
void sched_removal();
|
|
|
|
|
2000-06-23 00:30:04 +00:00
|
|
|
// Clean up the memory used by this tile and delete the arrays
|
1999-06-29 14:57:00 +00:00
|
|
|
// used by ssg as well as the whole ssg branch
|
|
|
|
void free_tile();
|
1999-06-12 21:15:27 +00:00
|
|
|
|
|
|
|
// Calculate this tile's offset
|
1999-10-26 03:45:33 +00:00
|
|
|
void SetOffset( const Point3D& p)
|
1999-06-12 21:15:27 +00:00
|
|
|
{
|
1999-10-26 03:45:33 +00:00
|
|
|
offset = center - p;
|
1999-06-12 21:15:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Return this tile's offset
|
2000-12-03 20:15:46 +00:00
|
|
|
inline Point3D get_offset() const { return offset; }
|
|
|
|
|
|
|
|
// Update the ssg transform node for this tile so it can be
|
|
|
|
// properly drawn relative to our (0,0,0) point
|
2000-12-04 05:24:38 +00:00
|
|
|
void prep_ssg_node( const Point3D& p, float vis);
|
2001-03-29 01:42:31 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Load tile data from a file.
|
|
|
|
* @param base name of directory containing tile data file.
|
|
|
|
* @param is_base is this a base terrain object for which we should generate
|
2001-05-19 16:59:43 +00:00
|
|
|
* random ground light points */
|
2001-04-06 18:30:07 +00:00
|
|
|
void load( const SGPath& base, bool is_base );
|
2001-04-11 02:47:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Return true if the tile entry is loaded, otherwise return false
|
|
|
|
* indicating that the loading thread is still working on this.
|
|
|
|
*/
|
2001-04-14 03:11:39 +00:00
|
|
|
inline bool is_loaded() const { return loaded; }
|
|
|
|
|
2001-05-19 16:59:43 +00:00
|
|
|
/**
|
|
|
|
* decrement the pending models count
|
|
|
|
*/
|
|
|
|
inline void dec_pending_models() { pending_models--; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* return the number of remaining pending models for this tile
|
|
|
|
*/
|
|
|
|
inline int get_pending_models() const { return pending_models; }
|
|
|
|
|
2001-04-14 03:11:39 +00:00
|
|
|
/**
|
|
|
|
* Return the "bucket" for this tile
|
|
|
|
*/
|
|
|
|
inline SGBucket get_tile_bucket() const { return tile_bucket; }
|
|
|
|
|
2001-04-16 20:03:52 +00:00
|
|
|
/**
|
|
|
|
* Add terrain mesh and ground lighting to scene graph.
|
|
|
|
*/
|
|
|
|
void add_ssg_nodes( ssgBranch* terrain, ssgBranch* ground );
|
2001-05-19 16:59:43 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* disconnect terrain mesh and ground lighting nodes from scene
|
|
|
|
* graph for this tile.
|
|
|
|
*/
|
|
|
|
void disconnect_ssg_nodes();
|
1999-06-12 21:15:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // _TILEENTRY_HXX
|