- update Sky code

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@4744 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: 01c532e990fd57843056c97222e5bff626225217
Former-commit-id: 6ae139010f3dfcc148805d04756ca5ddcbfbea81
This commit is contained in:
torcs-ng 2012-06-12 18:51:55 +00:00
parent 03550e9138
commit 886b897fe2
5 changed files with 58 additions and 148 deletions

View file

@ -41,9 +41,10 @@ static int grMoonOrbPostDraw( ssgEntity *e )
}
// Constructor
cGrMoon::cGrMoon( void ) :
prev_moon_angle(-1)
cGrMoon::cGrMoon( void )
{
moon_transform = 0;
prev_moon_angle= - 9999;
}
// Destructor
@ -114,7 +115,7 @@ bool cGrMoon::repaint( double moon_angle )
return true;
}
bool cGrMoon::reposition( sgVec3 p, double angle, double rightAscension, double declination, double moon_dist )
bool cGrMoon::reposition( sgVec3 p, double moonangle, double moonrightAscension, double moondeclination, double moon_dist )
{
sgMat4 T1, T2, GST, RA, DEC;
sgVec3 axis;
@ -123,11 +124,11 @@ bool cGrMoon::reposition( sgVec3 p, double angle, double rightAscension, double
sgMakeTransMat4( T1, p );
sgSetVec3( axis, 0.0, 0.0, -1.0 );
sgMakeRotMat4( GST, (float)angle, axis );
sgMakeRotMat4( GST, (float)moonangle, axis );
sgSetVec3( axis, 0.0, 0.0, 1.0 );
sgMakeRotMat4( RA, ((float)rightAscension * SGD_RADIANS_TO_DEGREES) - 90.0, axis );
sgMakeRotMat4( RA, ((float)moonrightAscension * SGD_RADIANS_TO_DEGREES) - 90.0, axis );
sgSetVec3( axis, 1.0, 0.0, 0.0 );
sgMakeRotMat4( DEC, (float)declination * SGD_RADIANS_TO_DEGREES, axis );
sgMakeRotMat4( DEC, (float)moondeclination * SGD_RADIANS_TO_DEGREES, axis );
sgSetVec3( v, 0.0, moon_dist, 0.0 );
sgMakeTransMat4( T2, v );

View file

@ -63,10 +63,8 @@ cGrSky::~cGrSky( void )
void cGrSky::build( double h_radius, double v_radius,
const char *sun_path, const char *ihalo_path, const char *ohalo_path,
float sun_size, const char *moon_path, float moon_size,
int nplanets, sgdVec3 *planet_data,
int nstars, sgdVec3 *star_data, float humidity, float visibility )
int nstars, sgdVec3 *star_data )
{
delete dome;
delete sun;
@ -94,12 +92,6 @@ void cGrSky::build( double h_radius, double v_radius,
dome = new cGrSkyDome;
pre_transform -> addKid( dome->build( h_radius, v_radius ) );
sun = new cGrSun;
sun_transform -> addKid( sun->build( sun_path, ihalo_path, ohalo_path, sun_size, humidity, visibility));
moon = new cGrMoon;
moon_transform -> addKid( moon->build( moon_path, moon_size ));
planets = new cGrStars;
stars_transform -> addKid( planets->build( nplanets, planet_data, h_radius ) );
@ -120,37 +112,25 @@ void cGrSky::build( double h_radius, double v_radius,
post_root->addKid( post_selector );
}
/*cGrCelestialBody*
cGrSky::addBody( const char *body_tex_path, const char *ihalo_tex_path, const char *ohalo_tex_path, double size, double dist, bool sol )
cGrSun*
cGrSky::addSun( const char *sun_path, const char *ihalo_path, const char* ohalo_path, double sun_size, double sun_dist, double humidity, double visibility )
{
cGrCelestialBody* body = new cGrCelestialBody;
bodies_transform->addKid( body->build( body_tex_path, ihalo_tex_path, ohalo_tex_path, size ) );
bodies.add( body );
cGrSun* sun = new cGrSun;
sun_transform->addKid( sun->build( sun_path, ihalo_path, ohalo_path, sun_size, humidity, visibility ) );
sun->setDistance(sun_dist);
body -> setDist( dist );
if ( sol )
sol_ref = body;
return body;
return sun;
}
cGrCelestialBody*
cGrSky::addBody( ssgSimpleState *orb_state, ssgSimpleState *ihalo_state, ssgSimpleState *ohalo_state, double size, double dist, bool sol )
cGrMoon*
cGrSky::addMoon( const char *moon_path, double moon_size, double moon_dist )
{
cGrCelestialBody* body = new cGrCelestialBody;
bodies_transform->addKid( body->build( orb_state, ihalo_state, ohalo_state, size ) );
bodies.add( body );
cGrMoon* moon = new cGrMoon;
moon_transform->addKid( moon->build( moon_path, moon_size ));
moon->setmoonDist(moon_dist);
body -> setDist( dist );
if ( sol )
sol_ref = body;
return body;
}*/
return moon;
}
cGrCloudLayer*
@ -184,11 +164,15 @@ bool cGrSky::repositionFlat( sgVec3 view_pos, double spin, double dt )
moon->reposition( view_pos, 0 );
// Calc angles for rise/set effects
sun->getPosition ( & pos );
sun->getPosition ( &pos );
calc_celestial_angles( pos.xyz, view_pos, angle, rotation );
sun->setAngle( angle );
sun->setRotation( rotation );
moon->getPosition(&pos);
calc_celestial_angles( pos.xyz, view_pos, angle, rotation );
moon->setAngle( angle );
moon->setRotation( rotation );
for ( i = 0; i < clouds.getNum (); i++ )
{

View file

@ -22,8 +22,6 @@
#include "plib/ssg.h"
//class cGrCelestialBody;
//class cGrCelestialBodyList;
class cGrSun;
class cGrMoon;
class cGrCloudLayer;
@ -45,6 +43,7 @@ class cGrMoon
double prev_moon_angle;
double moon_angle;
double moon_rotation;
double moon_size;
double moon_dist;
double moonAscension;
@ -82,11 +81,23 @@ public:
bool reposition(sgVec3 p, double moon_angle, double moonAscension, double moondeclination, double moon_dist);
bool repaint(double moon_angle);
void getPosition (sgCoord* p)
{
sgMat4 Xform;
moon_transform->getTransform(Xform);
sgSetCoord(p, Xform);
}
void setAngle (double angle) { moon_angle = angle; }
double getAngle () { return moon_angle; }
void setRotation (double rotation) { moon_rotation = rotation; }
double getRotation () { return moon_rotation; }
void setmoonRightAscension ( double ra ) { moonAscension = ra; }
double getRightAscension () { return moonAscension; }
void setmoonDeclination ( double decl ) { moondeclination = decl; }
double getmoonDeclination () { return moondeclination; }
void setmoonDist ( double dist ) { moon_dist = dist; }
double getmoonDist() { return moon_dist; }
};
class cGrSun
@ -154,7 +165,7 @@ public:
return reposition ( p, sun_angle, sun_right_ascension, sun_declination, sun_dist );
}
bool reposition( sgVec3 p, double sun_angle, double rightAscension, double declination, double dist );
bool reposition( sgVec3 p, double sun_angle, double sun_right_ascension, double sun_declination, double sun_dist );
void getPosition (sgCoord* p)
{
@ -200,11 +211,11 @@ public:
return sun_declination;
}
void setDist ( double dist )
void setDistance ( double dist )
{
sun_dist = dist;
}
double getDist ()
double getDistance ()
{
return sun_dist;
}
@ -214,95 +225,6 @@ public:
double effective_visibility;
};
/*class cGrCelestialBody
{
private:
ssgTransform *transform;
ssgColourArray *cl;
ssgColourArray *ihalo_cl;
ssgColourArray *ohalo_cl;
// used by repaint for rise/set effects
double body_angle;
double body_rotation;
// used by reposition
double body_right_ascension;
double body_declination;
double body_dist;
public:
cGrCelestialBody( void );
~cGrCelestialBody( void );
ssgBranch *build( const char* body_tex_path, const char* ihalo_tex_path, const char* ohalo_tex, double body_size );
ssgBranch *build( ssgSimpleState *orb_state, ssgSimpleState *ihalo_state, ssgSimpleState *ohalo_state, double body_size );
bool reposition( sgVec3 p, double angle )
{
return reposition ( p, angle, body_right_ascension, body_declination, body_dist );
}
bool reposition( sgVec3 p, double angle, double rightAscension, double declination, double dist );
bool repaint() { return repaint ( body_angle ); }
bool repaint( double angle );
void getPosition ( sgCoord* p )
{
sgMat4 Xform;
transform->getTransform(Xform);
sgSetCoord(p, Xform);
}
void setAngle ( double angle ) { body_angle = angle; }
double getAngle () { return body_angle; }
void setRotation ( double rotation ) { body_rotation = rotation; }
double getRotation () { return body_rotation; }
void setRightAscension ( double ra ) { body_right_ascension = ra; }
double getRightAscension () { return body_right_ascension; }
void setDeclination ( double decl ) { body_declination = decl; }
double getDeclination () { return body_declination; }
void setDist ( double dist ) { body_dist = dist; }
double getDist () { return body_dist; }
double effective_visibility;
inline float *getColor() { return cl->get( 0 ); }
} ;
class cGrCelestialBodyList : private ssgSimpleList
{
public:
cGrCelestialBodyList ( int init = 3 )
: ssgSimpleList ( sizeof(cGrCelestialBody*), init ) { }
~cGrCelestialBodyList () { removeAll(); }
int getNum (void) { return total ; }
cGrCelestialBody* get ( unsigned int n )
{
assert(n<total);
return *( (cGrCelestialBody**) raw_get ( n ) ) ;
}
void add ( cGrCelestialBody* item ) { raw_add ( (char *) &item ) ;}
void removeAll ()
{
for ( int i = 0; i < getNum (); i++ )
delete get (i) ;
ssgSimpleList::removeAll () ;
}
} ;*/
class cGrCloudLayer
{
@ -486,11 +408,11 @@ public:
~cGrSky( void );
void build( double h_radius, double v_radius,
const char *sun_path, const char *ihalo_path,
const char *ohalo_path, float sun_size,
const char *moon_path, float moon_size,
int nplanets, sgdVec3 *planet_data,
int nstars, sgdVec3 *star_data, float humidity, float visibility);
int nstars, sgdVec3 *star_data );
cGrSun* addSun( const char *sun_path, const char *ihalo_path, const char* ohalo_path, double sun_size, double sun_dist, double humidity, double visibility );
cGrMoon* addMoon( const char *moon_path, double moon_size, double moon_dist );
cGrCloudLayer* addCloud( const char *cloud_tex_path, float span, float elevation, float thickness, float transition );
cGrCloudLayer* addCloud( ssgSimpleState *cloud_state, float span, float elevation, float thickness, float transition );
@ -531,7 +453,7 @@ public:
{
effective_visibility = visibility = v;
}
} ;
};
// return a random number between [0.0, 1.0)

View file

@ -22,6 +22,7 @@
#include "grSphere.h"
static float sun_exp2_punch_through;
static double visibility;
// Set up sun rendering call backs
static int grSunPreDraw( ssgEntity *e )
@ -64,6 +65,7 @@ static int grSunHaloPostDraw( ssgEntity *e )
// Constructor
cGrSun::cGrSun( void )
{
sun_transform = 0;
prev_sun_angle = -9999.0;
visibility = -9999.0;
}

View file

@ -219,12 +219,12 @@ grInitBackground()
//Build the sky
TheSky = new cGrSky;
const double domeSizeRatio = grSkyDomeDistance / 80000.0;
TheSky->build(grSkyDomeDistance, grSkyDomeDistance, "data/textures/halo.rgba", "data/textures/halo.rgba", "data/textures/outer_halo.rgba",
2500 * domeSizeRatio, "data/textures/moon.rgba", 2000 * domeSizeRatio, NPlanets, APlanetsData, NStars, AStarsData, 0.5f, visibility);
TheSky->build(grSkyDomeDistance, grSkyDomeDistance, NPlanets, APlanetsData, NStars, AStarsData );
//Add the Sun itself
const double domeSizeRatio = grSkyDomeDistance / 80000.0;
Sun = TheSky->addSun( "data/textures/halo.rgba", "data/textures/halo.rgba", "data/textures/outer_halo.rgba",
2500 * domeSizeRatio, grSkyDomeDistance, 0.5f, 10000.0 );
GLfloat sunAscension = grTrack->local.sunascension;
grSunDeclination = (float)(15 * (double)timeOfDay / 3600 - 90.0);
@ -237,6 +237,7 @@ grInitBackground()
grSunDeclination, RAD2DEG(sunAscension));
// Add the Moon (TODO: Find a better solution than this random positioning !)
Moon = TheSky->addMoon( "data/textures/moon.rgba", 2000 * domeSizeRatio, grSkyDomeDistance );
if ( grSunDeclination > 180 )
grMoonDeclination = 3.0 + (rand() % 40);
else