Continuing work on ssg-ifying the sky dome.
This commit is contained in:
parent
f14de56712
commit
8b5514fa9f
@ -78,6 +78,10 @@ static GLubyte middle_color[12][4];
|
|||||||
static GLubyte lower_color[12][4];
|
static GLubyte lower_color[12][4];
|
||||||
|
|
||||||
|
|
||||||
|
// Defined the shared sky object here
|
||||||
|
FGSky current_sky;
|
||||||
|
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
FGSky::FGSky( void ) {
|
FGSky::FGSky( void ) {
|
||||||
}
|
}
|
||||||
@ -89,13 +93,25 @@ FGSky::~FGSky( void ) {
|
|||||||
|
|
||||||
|
|
||||||
// initialize the sky object and connect it into the scene graph
|
// initialize the sky object and connect it into the scene graph
|
||||||
bool FGSky::initialize() {
|
bool FGSky::initialize( ssgRoot *root ) {
|
||||||
sgVec3 vertex;
|
|
||||||
sgVec3 color;
|
sgVec3 color;
|
||||||
|
|
||||||
float theta;
|
float theta;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
// set up the state
|
||||||
|
sky_state = new ssgSimpleState();
|
||||||
|
if ( current_options.get_shading() == 1 ) {
|
||||||
|
sky_state->setShadeModel( GL_SMOOTH );
|
||||||
|
} else {
|
||||||
|
sky_state->setShadeModel( GL_FLAT );
|
||||||
|
}
|
||||||
|
sky_state->disable( GL_DEPTH_TEST );
|
||||||
|
sky_state->enable( GL_LIGHTING );
|
||||||
|
sky_state->disable( GL_FOG );
|
||||||
|
sky_state->disable( GL_CULL_FACE );
|
||||||
|
sky_state->disable( GL_TEXTURE_2D );
|
||||||
|
|
||||||
// initialize arrays
|
// initialize arrays
|
||||||
center_disk_vl = new ssgVertexArray( 14 );
|
center_disk_vl = new ssgVertexArray( 14 );
|
||||||
center_disk_cl = new ssgColourArray( 14 );
|
center_disk_cl = new ssgColourArray( 14 );
|
||||||
@ -197,8 +213,44 @@ bool FGSky::initialize() {
|
|||||||
lower_ring_vl->add( lower_vertex[0] );
|
lower_ring_vl->add( lower_vertex[0] );
|
||||||
lower_ring_cl->add( color );
|
lower_ring_cl->add( color );
|
||||||
|
|
||||||
// force a repaint of the colors
|
// force a repaint of the sky colors with ugly defaults
|
||||||
repaint();
|
sgVec3 fog_color;
|
||||||
|
sgSetVec3( fog_color, 1.0, 1.0, 1.0 );
|
||||||
|
repaint( color, fog_color, 0.0 );
|
||||||
|
|
||||||
|
// build the ssg scene graph sub tree for the sky and connected
|
||||||
|
// into the provide scene graph branch
|
||||||
|
sky_selector = new ssgSelector;
|
||||||
|
sky_transform = new ssgTransform;
|
||||||
|
|
||||||
|
ssgVtxTable *center_disk, *upper_ring, *middle_ring, *lower_ring;
|
||||||
|
|
||||||
|
center_disk = new ssgVtxTable( GL_TRIANGLE_FAN,
|
||||||
|
center_disk_vl, NULL, NULL, center_disk_cl );
|
||||||
|
|
||||||
|
upper_ring = new ssgVtxTable( GL_TRIANGLE_STRIP,
|
||||||
|
upper_ring_vl, NULL, NULL, upper_ring_cl );
|
||||||
|
|
||||||
|
middle_ring = new ssgVtxTable( GL_TRIANGLE_STRIP,
|
||||||
|
middle_ring_vl, NULL, NULL, middle_ring_cl );
|
||||||
|
|
||||||
|
lower_ring = new ssgVtxTable( GL_TRIANGLE_STRIP,
|
||||||
|
lower_ring_vl, NULL, NULL, lower_ring_cl );
|
||||||
|
|
||||||
|
center_disk->setState( sky_state );
|
||||||
|
upper_ring->setState( sky_state );
|
||||||
|
middle_ring->setState( sky_state );
|
||||||
|
lower_ring->setState( sky_state );
|
||||||
|
|
||||||
|
sky_transform->addKid( center_disk );
|
||||||
|
sky_transform->addKid( upper_ring );
|
||||||
|
sky_transform->addKid( middle_ring );
|
||||||
|
sky_transform->addKid( lower_ring );
|
||||||
|
|
||||||
|
sky_selector->addKid( sky_transform );
|
||||||
|
sky_selector->clrTraversalMaskBits( SSGTRAV_HOT );
|
||||||
|
|
||||||
|
root->addKid( sky_selector );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -206,7 +258,11 @@ bool FGSky::initialize() {
|
|||||||
|
|
||||||
// repaint the sky colors based on current value of sun_angle, sky,
|
// repaint the sky colors based on current value of sun_angle, sky,
|
||||||
// and fog colors. This updates the color arrays for ssgVtxTable.
|
// and fog colors. This updates the color arrays for ssgVtxTable.
|
||||||
bool FGSky::repaint() {
|
// sun angle in degrees relative to verticle
|
||||||
|
// 0 degrees = high noon
|
||||||
|
// 90 degrees = sun rise/set
|
||||||
|
// 180 degrees = darkest midnight
|
||||||
|
bool FGSky::repaint( sgVec3 sky_color, sgVec3 fog_color, double sun_angle ) {
|
||||||
double diff;
|
double diff;
|
||||||
sgVec3 outer_param, outer_amt, outer_diff;
|
sgVec3 outer_param, outer_amt, outer_diff;
|
||||||
sgVec3 middle_param, middle_amt, middle_diff;
|
sgVec3 middle_param, middle_amt, middle_diff;
|
||||||
@ -406,25 +462,51 @@ bool FGSky::repaint() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// build the ssg scene graph sub tree for the sky and connected into
|
// reposition the sky at the specified origin and orientation
|
||||||
// the provide scene graph root
|
// lon specifies a rotation about the Z axis
|
||||||
bool FGSky::build( ssgBranch *branch ) {
|
// lat specifies a rotation about the new Y axis
|
||||||
sky_selector = new ssgSelector;
|
// spin specifies a rotation about the new Z axis (and orients the
|
||||||
sky_transform = new ssgTransform;
|
// sunrise/set effects
|
||||||
|
bool FGSky::reposition( sgVec3 p, double lon, double lat, double spin ) {
|
||||||
|
sgMat4 T, LON, LAT, SPIN;
|
||||||
|
sgVec3 axis;
|
||||||
|
|
||||||
ssgVtxTable *center_disk, *upper_ring, *middle_ring, *lower_ring;
|
// Translate to view position
|
||||||
|
// Point3D zero_elev = current_view.get_cur_zero_elev();
|
||||||
|
// xglTranslatef( zero_elev.x(), zero_elev.y(), zero_elev.z() );
|
||||||
|
sgMakeTransMat4( T, p );
|
||||||
|
|
||||||
center_disk = new ssgVtxTable( GL_TRIANGLE_FAN,
|
// printf(" Translated to %.2f %.2f %.2f\n",
|
||||||
center_disk_vl, NULL, NULL, center_disk_cl );
|
// zero_elev.x, zero_elev.y, zero_elev.z );
|
||||||
|
|
||||||
upper_ring = new ssgVtxTable( GL_TRIANGLE_STRIP,
|
// Rotate to proper orientation
|
||||||
upper_ring_vl, NULL, NULL, upper_ring_cl );
|
// printf(" lon = %.2f lat = %.2f\n", FG_Longitude * RAD_TO_DEG,
|
||||||
|
// FG_Latitude * RAD_TO_DEG);
|
||||||
|
// xglRotatef( f->get_Longitude() * RAD_TO_DEG, 0.0, 0.0, 1.0 );
|
||||||
|
sgSetVec3( axis, 0.0, 0.0, 1.0 );
|
||||||
|
sgMakeRotMat4( LON, lon * RAD_TO_DEG, axis );
|
||||||
|
|
||||||
middle_ring = new ssgVtxTable( GL_TRIANGLE_STRIP,
|
// xglRotatef( 90.0 - f->get_Latitude() * RAD_TO_DEG, 0.0, 1.0, 0.0 );
|
||||||
middle_ring_vl, NULL, NULL, middle_ring_cl );
|
sgSetVec3( axis, 0.0, 1.0, 0.0 );
|
||||||
|
sgMakeRotMat4( LAT, 90.0 - lat * RAD_TO_DEG, axis );
|
||||||
|
|
||||||
lower_ring = new ssgVtxTable( GL_TRIANGLE_STRIP,
|
// xglRotatef( l->sun_rotation * RAD_TO_DEG, 0.0, 0.0, 1.0 );
|
||||||
lower_ring_vl, NULL, NULL, lower_ring_cl );
|
sgSetVec3( axis, 0.0, 0.0, 1.0 );
|
||||||
|
sgMakeRotMat4( SPIN, spin * RAD_TO_DEG, axis );
|
||||||
|
|
||||||
|
sgMat4 TRANSFORM;
|
||||||
|
|
||||||
|
sgCopyMat4( TRANSFORM, T );
|
||||||
|
sgPreMultMat4( TRANSFORM, LON );
|
||||||
|
sgPreMultMat4( TRANSFORM, LAT );
|
||||||
|
sgPreMultMat4( TRANSFORM, SPIN );
|
||||||
|
|
||||||
|
sgCoord skypos;
|
||||||
|
sgSetCoord( &skypos, TRANSFORM );
|
||||||
|
|
||||||
|
sky_transform->setTransform( &skypos );
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,24 +34,10 @@
|
|||||||
|
|
||||||
|
|
||||||
class FGSky {
|
class FGSky {
|
||||||
double sun_angle; // sun angle in degrees relative to verticle
|
|
||||||
// 0 degrees = high noon
|
|
||||||
// 90 degrees = sun rise/set
|
|
||||||
// 180 degrees = darkest midnight
|
|
||||||
|
|
||||||
sgVec3 sky_color; // base sky color
|
|
||||||
sgVec3 fog_color; // fog color
|
|
||||||
|
|
||||||
sgVec3 origin; // coordinates of sky placement origin
|
|
||||||
// I recommend (lon, lat, 0) relative to
|
|
||||||
// your world coordinate scheme
|
|
||||||
|
|
||||||
double lon, lat; // current lon and lat (for properly rotating
|
|
||||||
// sky)
|
|
||||||
|
|
||||||
|
|
||||||
ssgSelector *sky_selector;
|
ssgSelector *sky_selector;
|
||||||
ssgTransform *sky_transform;
|
ssgTransform *sky_transform;
|
||||||
|
ssgSimpleState *sky_state;
|
||||||
|
|
||||||
ssgVertexArray *center_disk_vl;
|
ssgVertexArray *center_disk_vl;
|
||||||
ssgColourArray *center_disk_cl;
|
ssgColourArray *center_disk_cl;
|
||||||
@ -74,40 +60,39 @@ public:
|
|||||||
~FGSky( void );
|
~FGSky( void );
|
||||||
|
|
||||||
// initialize the sky object and connect it into the scene graph
|
// initialize the sky object and connect it into the scene graph
|
||||||
bool initialize();
|
// as a kid to to the specified root
|
||||||
|
bool initialize( ssgRoot *branch );
|
||||||
|
|
||||||
// repaint the sky colors based on current value of sun_angle,
|
// repaint the sky colors based on current value of sun_angle,
|
||||||
// sky, and fog colors. This updates the color arrays for
|
// sky, and fog colors. This updates the color arrays for
|
||||||
// ssgVtxTable.
|
// ssgVtxTable.
|
||||||
bool repaint();
|
// sun angle in degrees relative to verticle
|
||||||
|
// 0 degrees = high noon
|
||||||
|
// 90 degrees = sun rise/set
|
||||||
|
// 180 degrees = darkest midnight
|
||||||
|
bool repaint( sgVec3 sky_color, sgVec3 fog_color, double sun_angle );
|
||||||
|
|
||||||
// build the ssg scene graph sub tree for the sky and connected
|
// reposition the sky at the specified origin and orientation
|
||||||
// into the provide scene graph branch
|
// lon specifies a rotation about the Z axis
|
||||||
bool build( ssgBranch *branch );
|
// lat specifies a rotation about the new Y axis
|
||||||
|
// spin specifies a rotation about the new Z axis (and orients the
|
||||||
|
// sunrise/set effects
|
||||||
|
bool reposition( sgVec3 p, double lon, double lat, double spin );
|
||||||
|
|
||||||
// enable the sky in the scene graph (default)
|
// enable the sky in the scene graph (default)
|
||||||
bool enable() { sky_selector->select( 1 ); }
|
void enable() { sky_selector->select( 1 ); }
|
||||||
|
|
||||||
// disable the sky in the scene graph. The leaf node is still
|
// disable the sky in the scene graph. The leaf node is still
|
||||||
// there, how ever it won't be traversed on the cullandrender
|
// there, how ever it won't be traversed on the cullandrender
|
||||||
// phase.
|
// phase.
|
||||||
bool disable() { sky_selector->select( 0 ); }
|
void disable() { sky_selector->select( 0 ); }
|
||||||
|
|
||||||
inline void set_sun_angle( double a ) { sun_angle = a; }
|
|
||||||
inline void set_sky_color( sgVec3 color ) {
|
|
||||||
sgCopyVec3(sky_color, color);
|
|
||||||
}
|
|
||||||
inline void set_fog_color( sgVec3 color ) {
|
|
||||||
sgCopyVec3(fog_color, color);
|
|
||||||
}
|
|
||||||
inline void set_origin( sgVec3 p ) {
|
|
||||||
sgCopyVec3(origin, p);
|
|
||||||
}
|
|
||||||
inline void set_lon( double l ) { lon = l; }
|
|
||||||
inline void set_lat( double l ) { lat = l; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern FGSky current_sky;
|
||||||
|
|
||||||
|
|
||||||
// (Re)generate the display list
|
// (Re)generate the display list
|
||||||
void fgSkyInit();
|
void fgSkyInit();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user