Added some early support for a cheezy external view of TuX.
'v' toggles internal vs. external view modes. Add the distance of the bouding radius into the tile's range selector.
This commit is contained in:
parent
39b3602dce
commit
9f9f487e2a
5 changed files with 78 additions and 15 deletions
|
@ -277,7 +277,10 @@ void GLUTkey(unsigned char k, int x, int y) {
|
||||||
t->adjust_warp_delta (+30);
|
t->adjust_warp_delta (+30);
|
||||||
local_update_sky_and_lighting_params();
|
local_update_sky_and_lighting_params();
|
||||||
return;
|
return;
|
||||||
case 120: // X key
|
case 118: // v key
|
||||||
|
v->cycle_view_mode();
|
||||||
|
return;
|
||||||
|
case 120: // x key
|
||||||
fov = current_options.get_fov();
|
fov = current_options.get_fov();
|
||||||
fov /= 1.05;
|
fov /= 1.05;
|
||||||
if ( fov < FG_FOV_MIN ) {
|
if ( fov < FG_FOV_MIN ) {
|
||||||
|
|
|
@ -402,17 +402,15 @@ static void fgRenderFrame( void ) {
|
||||||
|
|
||||||
sgMat4 sgTRANS;
|
sgMat4 sgTRANS;
|
||||||
sgMakeTransMat4( sgTRANS,
|
sgMakeTransMat4( sgTRANS,
|
||||||
current_view.view_pos.x()
|
current_view.view_pos.x(),
|
||||||
+ current_view.view_forward[0] * 20,
|
current_view.view_pos.y(),
|
||||||
current_view.view_pos.y()
|
current_view.view_pos.z() );
|
||||||
+ current_view.view_forward[1] * 20,
|
|
||||||
current_view.view_pos.z()
|
|
||||||
+ current_view.view_forward[2] * 20 );
|
|
||||||
|
|
||||||
sgMat4 sgTMP;
|
// sgMat4 sgTMP;
|
||||||
sgMat4 sgTUX;
|
sgMat4 sgTUX;
|
||||||
sgMultMat4( sgTMP, current_view.sgUP, sgTRANS );
|
// sgMultMat4( sgTMP, current_view.sgUP, sgTRANS );
|
||||||
sgMultMat4( sgTUX, current_view.sgLARC_TO_SSG, sgTMP );
|
// sgMultMat4( sgTUX, current_view.sgLARC_TO_SSG, sgTMP );
|
||||||
|
sgMultMat4( sgTUX, current_view.sgVIEW_ROT, sgTRANS );
|
||||||
|
|
||||||
sgCoord tuxpos;
|
sgCoord tuxpos;
|
||||||
sgSetCoord( &tuxpos, sgTUX );
|
sgSetCoord( &tuxpos, sgTUX );
|
||||||
|
@ -423,7 +421,17 @@ static void fgRenderFrame( void ) {
|
||||||
current_view.view_pos.y(),
|
current_view.view_pos.y(),
|
||||||
current_view.view_pos.z() );
|
current_view.view_pos.z() );
|
||||||
sgMat4 sgVIEW;
|
sgMat4 sgVIEW;
|
||||||
sgMultMat4( sgVIEW, current_view.sgVIEW, sgTRANS );
|
|
||||||
|
if ( current_view.view_mode == FGView::FG_VIEW_FIRST_PERSON ) {
|
||||||
|
sgCopyMat4( sgVIEW, current_view.sgVIEW );
|
||||||
|
} else if ( current_view.view_mode == FGView::FG_VIEW_FOLLOW ) {
|
||||||
|
FGMat4Wrapper tmp = current_view.follow.front();
|
||||||
|
sgCopyMat4( sgVIEW, tmp.m );
|
||||||
|
}
|
||||||
|
if ( current_view.follow.size() > 15 ) {
|
||||||
|
current_view.follow.pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
ssgSetCamera( sgVIEW );
|
ssgSetCamera( sgVIEW );
|
||||||
|
|
||||||
global_tile_mgr.prep_ssg_nodes();
|
global_tile_mgr.prep_ssg_nodes();
|
||||||
|
|
|
@ -76,6 +76,7 @@ FGView::FGView( void ) {
|
||||||
void FGView::Init( void ) {
|
void FGView::Init( void ) {
|
||||||
FG_LOG( FG_VIEW, FG_INFO, "Initializing View parameters" );
|
FG_LOG( FG_VIEW, FG_INFO, "Initializing View parameters" );
|
||||||
|
|
||||||
|
view_mode = FG_VIEW_FIRST_PERSON;
|
||||||
view_offset = 0.0;
|
view_offset = 0.0;
|
||||||
goal_view_offset = 0.0;
|
goal_view_offset = 0.0;
|
||||||
|
|
||||||
|
@ -131,6 +132,16 @@ void FGView::UpdateFOV( const fgOPTIONS& o ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Cycle view mode
|
||||||
|
void FGView::cycle_view_mode() {
|
||||||
|
if ( view_mode == FG_VIEW_FIRST_PERSON ) {
|
||||||
|
view_mode = FG_VIEW_FOLLOW;
|
||||||
|
} else if ( view_mode == FG_VIEW_FOLLOW ) {
|
||||||
|
view_mode = FG_VIEW_FIRST_PERSON;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Basically, this is a modified version of the Mesa gluLookAt()
|
// Basically, this is a modified version of the Mesa gluLookAt()
|
||||||
// function that's been modified slightly so we can capture the
|
// function that's been modified slightly so we can capture the
|
||||||
// result before sending it off to OpenGL land.
|
// result before sending it off to OpenGL land.
|
||||||
|
@ -742,7 +753,15 @@ void FGView::UpdateViewMath( FGInterface *f ) {
|
||||||
|
|
||||||
sgMat4 sgTMP;
|
sgMat4 sgTMP;
|
||||||
sgMultMat4( sgTMP, sgLOCAL, sgUP );
|
sgMultMat4( sgTMP, sgLOCAL, sgUP );
|
||||||
sgMultMat4( sgVIEW, sgLARC_TO_SSG, sgTMP );
|
sgMultMat4( sgVIEW_ROT, sgLARC_TO_SSG, sgTMP );
|
||||||
|
|
||||||
|
sgMakeTransMat4( sgTRANS, view_pos.x(), view_pos.y(), view_pos.z() );
|
||||||
|
|
||||||
|
sgMultMat4( sgVIEW, sgVIEW_ROT, sgTRANS );
|
||||||
|
|
||||||
|
FGMat4Wrapper tmp;
|
||||||
|
sgCopyMat4( tmp.m, sgVIEW );
|
||||||
|
follow.push_back( tmp );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
cout << "FG derived VIEW matrix using sg routines" << endl;
|
cout << "FG derived VIEW matrix using sg routines" << endl;
|
||||||
|
|
|
@ -29,6 +29,10 @@
|
||||||
# error This library requires C++
|
# error This library requires C++
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <Include/compiler.h>
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
#include <sg.h> // plib include
|
#include <sg.h> // plib include
|
||||||
|
|
||||||
#include <FDM/flight.hxx>
|
#include <FDM/flight.hxx>
|
||||||
|
@ -39,6 +43,18 @@
|
||||||
|
|
||||||
#include "options.hxx"
|
#include "options.hxx"
|
||||||
|
|
||||||
|
FG_USING_STD(list);
|
||||||
|
|
||||||
|
|
||||||
|
class FGMat4Wrapper {
|
||||||
|
public:
|
||||||
|
sgMat4 m;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef list < FGMat4Wrapper > sgMat4_list;
|
||||||
|
typedef sgMat4_list::iterator sgMat4_list_iterator;
|
||||||
|
typedef sgMat4_list::const_iterator const_sgMat4_list_iterator;
|
||||||
|
|
||||||
|
|
||||||
// used in views.cxx and tilemgr.cxx
|
// used in views.cxx and tilemgr.cxx
|
||||||
#define USE_FAST_FOV_CLIP
|
#define USE_FAST_FOV_CLIP
|
||||||
|
@ -49,6 +65,12 @@ class FGView {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
enum fgViewMode
|
||||||
|
{
|
||||||
|
FG_VIEW_FIRST_PERSON = 0,
|
||||||
|
FG_VIEW_FOLLOW = 1
|
||||||
|
};
|
||||||
|
|
||||||
// the current offset from forward for viewing
|
// the current offset from forward for viewing
|
||||||
double view_offset;
|
double view_offset;
|
||||||
|
|
||||||
|
@ -153,7 +175,14 @@ public:
|
||||||
// Current model view matrix;
|
// Current model view matrix;
|
||||||
GLfloat MODEL_VIEW[16];
|
GLfloat MODEL_VIEW[16];
|
||||||
|
|
||||||
sgMat4 sgLOCAL, sgUP, sgVIEW, sgLARC_TO_SSG;
|
// view mode
|
||||||
|
fgViewMode view_mode;
|
||||||
|
|
||||||
|
// sg versions of our friendly matrices
|
||||||
|
sgMat4 sgLOCAL, sgUP, sgVIEW_ROT, sgTRANS, sgVIEW, sgLARC_TO_SSG;
|
||||||
|
|
||||||
|
// queue of view matrices so we can have a follow view
|
||||||
|
sgMat4_list follow;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -190,6 +219,9 @@ public:
|
||||||
// Update the field of view coefficients
|
// Update the field of view coefficients
|
||||||
void UpdateFOV( const fgOPTIONS& o );
|
void UpdateFOV( const fgOPTIONS& o );
|
||||||
|
|
||||||
|
// Cycle view mode
|
||||||
|
void cycle_view_mode();
|
||||||
|
|
||||||
// accessor functions
|
// accessor functions
|
||||||
inline double get_view_offset() const { return view_offset; }
|
inline double get_view_offset() const { return view_offset; }
|
||||||
inline void set_view_offset( double a ) { view_offset = a; }
|
inline void set_view_offset( double a ) { view_offset = a; }
|
||||||
|
|
|
@ -744,7 +744,6 @@ void FGTileMgr::prep_ssg_nodes( void ) {
|
||||||
|
|
||||||
float ranges[2];
|
float ranges[2];
|
||||||
ranges[0] = 0.0f;
|
ranges[0] = 0.0f;
|
||||||
ranges[1] = current_weather.get_visibility();
|
|
||||||
|
|
||||||
// traverse the potentially viewable tile list and update range
|
// traverse the potentially viewable tile list and update range
|
||||||
// selector and transform
|
// selector and transform
|
||||||
|
@ -753,7 +752,9 @@ void FGTileMgr::prep_ssg_nodes( void ) {
|
||||||
t = global_tile_cache.get_tile(index);
|
t = global_tile_cache.get_tile(index);
|
||||||
|
|
||||||
if ( t->is_loaded() ) {
|
if ( t->is_loaded() ) {
|
||||||
// set range selector (LOD trick)
|
// set range selector (LOD trick) to be distance to center
|
||||||
|
// of tile + bounding radius
|
||||||
|
ranges[1] = current_weather.get_visibility() + t->bounding_radius;
|
||||||
t->range_ptr->setRanges( ranges, 2 );
|
t->range_ptr->setRanges( ranges, 2 );
|
||||||
|
|
||||||
// calculate tile offset
|
// calculate tile offset
|
||||||
|
|
Loading…
Reference in a new issue