1999-06-12 21:15:27 +00:00
|
|
|
// tileentry.hxx -- routines to handle an individual scenery tile
|
|
|
|
//
|
|
|
|
// Written by Curtis Olson, started May 1998.
|
|
|
|
//
|
2004-11-19 22:10:41 +00:00
|
|
|
// Copyright (C) 1998 - 2001 Curtis L. Olson - http://www.flightgear.org/~curt
|
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
|
|
|
|
|
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-16 23:01:03 +00:00
|
|
|
#include <simgear/bucket/newbucket.hxx>
|
|
|
|
#include <simgear/math/point3d.hxx>
|
2001-05-23 22:28:38 +00:00
|
|
|
#include <simgear/misc/sg_path.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;
|
|
|
|
|
2004-09-20 13:21:51 +00:00
|
|
|
|
2004-09-19 18:34:47 +00:00
|
|
|
class ssgLeaf;
|
|
|
|
class ssgBranch;
|
|
|
|
class ssgTransform;
|
Mathias:
I have done a patch to eliminate the jitter of 3D-objects near the viewpoint
(for example 3D cockpit objects).
The problem is the roundoff accuracy of the float values used in the
scenegraph together with the transforms of the eyepoint relative to the
scenery center.
The solution will be to move the scenery center near the view point.
This way floats relative accuracy is enough to show a stable picture.
To get that right I have introduced a transform node for the scenegraph which
is responsible for that shift and uses double values as long as possible.
The scenery subsystem now has a list of all those transforms required to place
objects in the world and will tell all those transforms that the scenery
center has changed when the set_scenery_center() of the scenery subsystem is
called.
The problem was not solvable by SGModelPlacement and SGLocation, since not all
objects, especially the scenery, are placed using these classes.
The first approach was to have the scenery center exactly at the eyepoint.
This works well for the cockpit.
But then the ground jitters a bit below the aircraft. With our default views
you can't see that, but that F-18 has a camera view below the left engine
intake with the nose gear and the ground in its field of view, here I could
see that.
Having the scenery center constant will still have this roundoff problems, but
like it is now too, the roundoff error here is exactly the same in each
frame, so you will not notice any jitter.
The real solution is now to keep the scenery center constant as long as it is
in a ball of 30m radius around the view point. If the scenery center is
outside this ball, just put it at the view point.
As a sideeffect of now beeing able to switch the scenery center in the whole
scenegraph with one function call, I was able to remove a one half of a
problem when switching views, where the scenery center was far off for one or
two frames past switching from one view to the next. Also included is a fix
to the other half of this problem, where the view position was not yet copied
into a view when it is switched (at least under glut). This was responsible
for the 'Error: ...' messages of the cloud subsystem when views were
switched.
2005-04-29 14:38:24 +00:00
|
|
|
class ssgPlacementTransform;
|
2004-09-19 18:34:47 +00:00
|
|
|
class ssgSelector;
|
|
|
|
class ssgRangeSelector;
|
|
|
|
class ssgVertexArray;
|
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;
|
2004-09-15 15:52:05 +00:00
|
|
|
SGBucket bucket;
|
|
|
|
|
2001-05-19 16:59:43 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
inline FGDeferredModel() { }
|
2005-10-25 13:49:55 +00:00
|
|
|
inline FGDeferredModel( const string& mp, const string& tp, SGBucket b,
|
2001-05-19 16:59:43 +00:00
|
|
|
FGTileEntry *t, ssgTransform *ot )
|
|
|
|
{
|
|
|
|
model_path = mp;
|
|
|
|
texture_path = tp;
|
2004-09-15 15:52:05 +00:00
|
|
|
bucket = b;
|
2001-05-19 16:59:43 +00:00
|
|
|
tile = t;
|
|
|
|
obj_trans = ot;
|
|
|
|
}
|
|
|
|
inline ~FGDeferredModel() { }
|
2005-10-25 13:49:55 +00:00
|
|
|
inline const string& get_model_path() const { return model_path; }
|
|
|
|
inline const string& get_texture_path() const { return texture_path; }
|
|
|
|
inline const SGBucket& get_bucket() const { return bucket; }
|
2001-05-19 16:59:43 +00:00
|
|
|
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:
|
|
|
|
|
|
|
|
// global tile culling data
|
|
|
|
Point3D center;
|
|
|
|
double bounding_radius;
|
|
|
|
|
|
|
|
// 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
|
|
|
|
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
|
Mathias:
I have done a patch to eliminate the jitter of 3D-objects near the viewpoint
(for example 3D cockpit objects).
The problem is the roundoff accuracy of the float values used in the
scenegraph together with the transforms of the eyepoint relative to the
scenery center.
The solution will be to move the scenery center near the view point.
This way floats relative accuracy is enough to show a stable picture.
To get that right I have introduced a transform node for the scenegraph which
is responsible for that shift and uses double values as long as possible.
The scenery subsystem now has a list of all those transforms required to place
objects in the world and will tell all those transforms that the scenery
center has changed when the set_scenery_center() of the scenery subsystem is
called.
The problem was not solvable by SGModelPlacement and SGLocation, since not all
objects, especially the scenery, are placed using these classes.
The first approach was to have the scenery center exactly at the eyepoint.
This works well for the cockpit.
But then the ground jitters a bit below the aircraft. With our default views
you can't see that, but that F-18 has a camera view below the left engine
intake with the nose gear and the ground in its field of view, here I could
see that.
Having the scenery center constant will still have this roundoff problems, but
like it is now too, the roundoff error here is exactly the same in each
frame, so you will not notice any jitter.
The real solution is now to keep the scenery center constant as long as it is
in a ball of 30m radius around the view point. If the scenery center is
outside this ball, just put it at the view point.
As a sideeffect of now beeing able to switch the scenery center in the whole
scenegraph with one function call, I was able to remove a one half of a
problem when switching views, where the scenery center was far off for one or
two frames past switching from one view to the next. Also included is a fix
to the other half of this problem, where the view position was not yet copied
into a view when it is switched (at least under glut). This was responsible
for the 'Error: ...' messages of the cloud subsystem when views were
switched.
2005-04-29 14:38:24 +00:00
|
|
|
ssgPlacementTransform *terra_transform;
|
|
|
|
ssgPlacementTransform *vasi_lights_transform;
|
|
|
|
ssgPlacementTransform *rwy_lights_transform;
|
|
|
|
ssgPlacementTransform *taxi_lights_transform;
|
|
|
|
ssgPlacementTransform *gnd_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;
|
2002-03-01 18:08:30 +00:00
|
|
|
ssgRangeSelector *gnd_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.
|
2002-03-01 18:08:30 +00:00
|
|
|
ssgSelector *gnd_lights_brightness;
|
2000-12-04 23:25:05 +00:00
|
|
|
|
2003-05-14 20:48:31 +00:00
|
|
|
// we need to be able to turn runway lights on or off (doing this
|
|
|
|
// via a call back would be nifty, but then the call back needs to
|
|
|
|
// know about the higher level application's global state which is
|
|
|
|
// a problem if we move the code into simgear.)
|
2003-09-24 19:59:25 +00:00
|
|
|
ssgSelector *vasi_lights_selector;
|
2003-05-14 20:48:31 +00:00
|
|
|
ssgSelector *rwy_lights_selector;
|
|
|
|
ssgSelector *taxi_lights_selector;
|
|
|
|
|
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;
|
|
|
|
|
2003-05-14 18:33:56 +00:00
|
|
|
bool obj_load( const string& path,
|
|
|
|
ssgBranch* geometry,
|
2003-09-24 19:59:25 +00:00
|
|
|
ssgBranch* vasi_lights,
|
2003-05-14 18:33:56 +00:00
|
|
|
ssgBranch* rwy_lights,
|
|
|
|
ssgBranch* taxi_lights,
|
|
|
|
ssgVertexArray* gound_lights,
|
|
|
|
bool is_base );
|
|
|
|
|
|
|
|
ssgLeaf* gen_lights( SGMaterialLib *matlib, ssgVertexArray *lights,
|
|
|
|
int inc, float bright );
|
2001-03-29 01:42:31 +00:00
|
|
|
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
double timestamp;
|
|
|
|
|
2003-12-30 15:12:04 +00:00
|
|
|
/**
|
|
|
|
* this value is used by the tile scheduler/loader to mark which
|
|
|
|
* tiles are in the primary ring (i.e. the current tile or the
|
|
|
|
* surrounding eight.) Other routines then can use this as an
|
|
|
|
* optimization and not do some operation to tiles outside of this
|
|
|
|
* inner ring. (For instance vasi color updating)
|
|
|
|
*/
|
|
|
|
bool is_inner_ring;
|
2002-07-25 23:59:04 +00:00
|
|
|
|
2003-12-30 15:12:04 +00:00
|
|
|
/**
|
|
|
|
* this variable tracks the status of the incremental memory
|
|
|
|
* freeing.
|
|
|
|
*/
|
2002-07-25 23:59:04 +00:00
|
|
|
enum {
|
|
|
|
NODES = 0x01,
|
|
|
|
VEC_PTRS = 0x02,
|
|
|
|
TERRA_NODE = 0x04,
|
|
|
|
GROUND_LIGHTS = 0x08,
|
2003-09-24 19:59:25 +00:00
|
|
|
VASI_LIGHTS = 0x10,
|
|
|
|
RWY_LIGHTS = 0x20,
|
|
|
|
TAXI_LIGHTS = 0x40,
|
|
|
|
LIGHTMAPS = 0x80
|
2002-07-25 23:59:04 +00:00
|
|
|
};
|
|
|
|
int free_tracker;
|
|
|
|
|
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
|
|
|
|
2000-06-23 00:30:04 +00:00
|
|
|
// Clean up the memory used by this tile and delete the arrays
|
2002-07-25 23:59:04 +00:00
|
|
|
// used by ssg as well as the whole ssg branch. This does a
|
|
|
|
// partial clean up and exits so we can spread the load across
|
|
|
|
// multiple frames. Returns false if work remaining to be done,
|
|
|
|
// true if dynamically allocated memory used by this tile is
|
|
|
|
// completely freed.
|
|
|
|
bool free_tile();
|
1999-06-12 21:15:27 +00:00
|
|
|
|
2000-12-03 20:15:46 +00:00
|
|
|
// Update the ssg transform node for this tile so it can be
|
|
|
|
// properly drawn relative to our (0,0,0) point
|
2002-04-07 15:24:32 +00:00
|
|
|
void prep_ssg_node( const Point3D& p, sgVec3 up, 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 */
|
Melchior FRANZ:
Wouldn't it be better to prepare the whole list of paths (or two
separate ones for Terrain/Objects if necessary) in FGGlobals::set_fg_scenery,
and to pass the vector<string>s to FGTileEntry::load? It doesn't seem to make
a lot of sense to split the path up, modify it, mount it together to one string
again, and then let FGTileEntry::load split it up again.
Here we go:
Main/globals.cxx
================
As fg_scenery is now a string_list, we don't need initialization. Furthermore,
this list is cleared with every set_fg_scenery() call.
ctor: create default dir from fg_root if necessary. Otherwise check all paths
of --fg-scenery/FG_SCENERY: If the path doesn't exist, ignore it. If it contains
a dir Terrain and/or Objects, then only add that to the list. If it contains
neither, then use the path as is.
Scenery/tileentry.cxx
=====================
Trivial: don't split a "base path", but use the given path_list as is.
(I considered a variable name "path_list" better suited than "search".)
Scenery/FGTileLoader.cxx
========================
No more fiddling with sub-paths. This has to be delivered by get_fg_scenery
already.
2004-06-08 15:32:09 +00:00
|
|
|
void load( const string_list &base_path, 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
|
|
|
|
*/
|
2005-10-25 13:49:55 +00:00
|
|
|
inline const SGBucket& get_tile_bucket() const { return tile_bucket; }
|
2001-04-14 03:11:39 +00:00
|
|
|
|
2004-10-10 17:41:11 +00:00
|
|
|
/**
|
|
|
|
* Apply ssgLeaf::makeDList to all leaf of a branch
|
|
|
|
*/
|
|
|
|
void makeDList( ssgBranch *b );
|
|
|
|
|
2001-04-16 20:03:52 +00:00
|
|
|
/**
|
|
|
|
* Add terrain mesh and ground lighting to scene graph.
|
|
|
|
*/
|
2003-09-24 19:59:25 +00:00
|
|
|
void add_ssg_nodes( ssgBranch *terrain_branch,
|
|
|
|
ssgBranch *gnd_lights_branch,
|
|
|
|
ssgBranch *vasi_lights_branch,
|
|
|
|
ssgBranch *rwy_lights_branch,
|
|
|
|
ssgBranch *taxi_lights_branch );
|
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();
|
2002-03-17 00:38:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* return the SSG Transform node for the terrain
|
|
|
|
*/
|
Mathias:
I have done a patch to eliminate the jitter of 3D-objects near the viewpoint
(for example 3D cockpit objects).
The problem is the roundoff accuracy of the float values used in the
scenegraph together with the transforms of the eyepoint relative to the
scenery center.
The solution will be to move the scenery center near the view point.
This way floats relative accuracy is enough to show a stable picture.
To get that right I have introduced a transform node for the scenegraph which
is responsible for that shift and uses double values as long as possible.
The scenery subsystem now has a list of all those transforms required to place
objects in the world and will tell all those transforms that the scenery
center has changed when the set_scenery_center() of the scenery subsystem is
called.
The problem was not solvable by SGModelPlacement and SGLocation, since not all
objects, especially the scenery, are placed using these classes.
The first approach was to have the scenery center exactly at the eyepoint.
This works well for the cockpit.
But then the ground jitters a bit below the aircraft. With our default views
you can't see that, but that F-18 has a camera view below the left engine
intake with the nose gear and the ground in its field of view, here I could
see that.
Having the scenery center constant will still have this roundoff problems, but
like it is now too, the roundoff error here is exactly the same in each
frame, so you will not notice any jitter.
The real solution is now to keep the scenery center constant as long as it is
in a ball of 30m radius around the view point. If the scenery center is
outside this ball, just put it at the view point.
As a sideeffect of now beeing able to switch the scenery center in the whole
scenegraph with one function call, I was able to remove a one half of a
problem when switching views, where the scenery center was far off for one or
two frames past switching from one view to the next. Also included is a fix
to the other half of this problem, where the view position was not yet copied
into a view when it is switched (at least under glut). This was responsible
for the 'Error: ...' messages of the cloud subsystem when views were
switched.
2005-04-29 14:38:24 +00:00
|
|
|
inline ssgPlacementTransform *get_terra_transform() { return terra_transform; }
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
|
|
|
|
inline double get_timestamp() const { return timestamp; }
|
2003-12-30 15:12:04 +00:00
|
|
|
inline void set_timestamp( double time_ms ) { timestamp = time_ms; }
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
|
2003-12-30 15:12:04 +00:00
|
|
|
inline bool get_inner_ring() const { return is_inner_ring; }
|
|
|
|
inline void set_inner_ring( bool val ) { is_inner_ring = val; }
|
1999-06-12 21:15:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // _TILEENTRY_HXX
|