From: curt Date: Thu, 2 Mar 2000 23:07:25 +0000 (+0000) Subject: Working on drawing sun and sun halo. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=99a59763f1c9dd7190025e4b54895528f3649579;p=simgear.git Working on drawing sun and sun halo. --- diff --git a/simgear/sky/skydome.cxx b/simgear/sky/skydome.cxx index 1a1abc42..5a7bfd01 100644 --- a/simgear/sky/skydome.cxx +++ b/simgear/sky/skydome.cxx @@ -104,11 +104,11 @@ bool FGSkyDome::initialize( ) { dome_state = new ssgSimpleState(); dome_state->setShadeModel( GL_SMOOTH ); dome_state->disable( GL_LIGHTING ); - dome_state->disable( GL_DEPTH_TEST ); dome_state->disable( GL_CULL_FACE ); dome_state->disable( GL_TEXTURE_2D ); dome_state->enable( GL_COLOR_MATERIAL ); dome_state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE ); + dome_state->disable( GL_BLEND ); // initialize arrays center_disk_vl = new ssgVertexArray( 14 ); diff --git a/simgear/sky/skysun.cxx b/simgear/sky/skysun.cxx index a0a0f8cf..fce1026e 100644 --- a/simgear/sky/skysun.cxx +++ b/simgear/sky/skysun.cxx @@ -44,25 +44,97 @@ FGSkySun::~FGSkySun( void ) { } +static GLuint makeHalo( GLubyte *sun_texbuf ) { + int texWidth = 64; // 64x64 is plenty + int texSize; + GLuint texid; + GLubyte *p; + int i,j; + double radius; + + // create a texture id +#ifdef GL_VERSION_1_1 + glGenTextures(1, &texid); + glBindTexture(GL_TEXTURE_2D, texid); +#elif GL_EXT_texture_object + glGenTexturesEXT(1, &texid); + glBindTextureEXT(GL_TEXTURE_2D, texid); +#else +# error port me +#endif + + glPixelStorei( GL_UNPACK_ALIGNMENT, 4 ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ; + + // create the actual texture contents + texSize = texWidth * texWidth; + + sun_texbuf = new GLubyte[texSize*4]; + if ( !sun_texbuf ) { + return 0; // Ugly! + } + + p = sun_texbuf; + + radius = (double)(texWidth / 2); + + for (i=0; i < texWidth; i++) { + for (j=0; j < texWidth; j++) { + double x, y, d; + + *p = 0xff; + *(p+1) = 0xff; + *(p+2) = 0xff; + + x = fabs((double)(i - (texWidth / 2))); + y = fabs((double)(j - (texWidth / 2))); + + d = sqrt((x * x) + (y * y)); + if (d < radius) { + // t is 1.0 at center, 0.0 at edge + double t = 1.0 - (d / radius); + + // inverse square looks nice + *(p+3) = (int)((double) 0xff * (t*t)); + } else { + *(p+3) = 0x00; + } + p += 4; + } + } + + glTexImage2D( GL_TEXTURE_2D, + 0, + GL_RGBA, + texWidth, texWidth, + 0, + GL_RGBA, GL_UNSIGNED_BYTE, + sun_texbuf ); + + return texid; +} + + // initialize the sun object and connect it into our scene graph root bool FGSkySun::initialize() { - // create the scene graph for the dome + // create the scene graph for the sun/halo skysun = new ssgRoot; skysun->setName( "Sky Sun" ); - // set up the state + // set up the orb state orb_state = new ssgSimpleState(); orb_state->setShadeModel( GL_SMOOTH ); orb_state->disable( GL_LIGHTING ); - orb_state->disable( GL_DEPTH_TEST ); orb_state->disable( GL_CULL_FACE ); orb_state->disable( GL_TEXTURE_2D ); orb_state->enable( GL_COLOR_MATERIAL ); orb_state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE ); + orb_state->disable( GL_BLEND ); cl = new ssgColourArray( 1 ); - ssgBranch *orb = ssgMakeSphere( orb_state, cl, 550.0, 10, 10 ); // force a repaint of the sun colors with arbitrary defaults @@ -82,6 +154,51 @@ bool FGSkySun::initialize() { skysun->addKid( sun_selector ); + // set up the halo state + halo_state = new ssgSimpleState(); + halo_state->setShadeModel( GL_SMOOTH ); + halo_state->disable( GL_LIGHTING ); + halo_state->disable( GL_CULL_FACE ); + halo_state->enable( GL_TEXTURE_2D ); + halo_state->enable( GL_COLOR_MATERIAL ); + halo_state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE ); + halo_state->enable( GL_BLEND ); + halo_state->setTranslucent(); + + // build the halo + sun_texid = makeHalo( sun_texbuf ); + halo_state->setTexture( sun_texid ); + cout << "set texture" << endl;; + + // Build ssg structure + sgVec3 v3; + halo_vl = new ssgVertexArray; + sgSetVec3( v3, -5000.0, 0.0, -5000.0 ); + halo_vl->add( v3 ); + sgSetVec3( v3, 5000.0, 0.0, -5000.0 ); + halo_vl->add( v3 ); + sgSetVec3( v3, 5000.0, 0.0, 5000.0 ); + halo_vl->add( v3 ); + sgSetVec3( v3, -5000.0, 0.0, 5000.0 ); + halo_vl->add( v3 ); + + sgVec2 v2; + halo_tl = new ssgTexCoordArray; + sgSetVec2( v2, 0.0f, 0.0f ); + halo_tl->add( v2 ); + sgSetVec2( v2, 1.0, 0.0 ); + halo_tl->add( v2 ); + sgSetVec2( v2, 1.0, 1.0 ); + halo_tl->add( v2 ); + sgSetVec2( v2, 0.0, 1.0 ); + halo_tl->add( v2 ); + + ssgLeaf *halo = + new ssgVtxTable ( GL_QUADS, halo_vl, NULL, halo_tl, cl ); + halo->setState( halo_state); + + sun_transform->addKid( halo ); + return true; } @@ -114,7 +231,8 @@ bool FGSkySun::repaint( double sun_angle ) { if (color[1] > 1.0) color[1] = 1.0; if (color[2] > 1.0) color[2] = 1.0; - cout << "color = " << color[0] << " " << color[1] << " " << color[2] << endl; + // cout << "color = " << color[0] << " " << color[1] << " " + // << color[2] << endl; float *ptr; ptr = cl->get( 0 ); @@ -198,11 +316,11 @@ Star::Star(FGTime *t) : FG_LOG( FG_GENERAL, FG_INFO, "Initializing Sun Texture"); #ifdef GL_VERSION_1_1 - xglGenTextures(1, &sun_texid); - xglBindTexture(GL_TEXTURE_2D, sun_texid); + glGenTextures(1, &sun_texid); + glBindTexture(GL_TEXTURE_2D, sun_texid); #elif GL_EXT_texture_object - xglGenTexturesEXT(1, &sun_texid); - xglBindTextureEXT(GL_TEXTURE_2D, sun_texid); + glGenTexturesEXT(1, &sun_texid); + glBindTextureEXT(GL_TEXTURE_2D, sun_texid); #else # error port me #endif @@ -368,12 +486,12 @@ void Star::newImage(void) if (amb[0] > 1.0) amb[0] = 1.0; if (amb[1] > 1.0) amb[1] = 1.0; if (amb[2] > 1.0) amb[2] = 1.0; - xglColor3fv(amb); + glColor3fv(amb); glPushMatrix(); { - xglRotatef(((RAD_TO_DEG * rightAscension)- 90.0), 0.0, 0.0, 1.0); - xglRotatef((RAD_TO_DEG * declination), 1.0, 0.0, 0.0); - xglTranslatef(0,60000,0); + glRotatef(((RAD_TO_DEG * rightAscension)- 90.0), 0.0, 0.0, 1.0); + glRotatef((RAD_TO_DEG * declination), 1.0, 0.0, 0.0); + glTranslatef(0,60000,0); if (current_options.get_textures()) { glEnable(GL_TEXTURE_2D); // TEXTURE ENABLED @@ -391,8 +509,8 @@ void Star::newImage(void) glTexCoord2f(0.0f, 1.0f); glVertex3f(-5000, 0.0, 5000); glEnd(); } - xglDisable(GL_TEXTURE_2D); // TEXTURE DISABLED - xglDisable(GL_BLEND); // BLEND DISABLED + glDisable(GL_TEXTURE_2D); // TEXTURE DISABLED + glDisable(GL_BLEND); // BLEND DISABLED } glPopMatrix(); @@ -400,10 +518,10 @@ void Star::newImage(void) glDisable(GL_BLEND); // BLEND DISABLED glPushMatrix(); { - xglRotatef(((RAD_TO_DEG * rightAscension)- 90.0), 0.0, 0.0, 1.0); - xglRotatef((RAD_TO_DEG * declination), 1.0, 0.0, 0.0); - xglColor4fv(amb); - xglTranslatef(0,60000,0); + glRotatef(((RAD_TO_DEG * rightAscension)- 90.0), 0.0, 0.0, 1.0); + glRotatef((RAD_TO_DEG * declination), 1.0, 0.0, 0.0); + glColor4fv(amb); + glTranslatef(0,60000,0); gluSphere( SunObject, sun_size, 10, 10 ); } glPopMatrix(); diff --git a/simgear/sky/skysun.hxx b/simgear/sky/skysun.hxx index 77e5d2a9..c2af23b7 100644 --- a/simgear/sky/skysun.hxx +++ b/simgear/sky/skysun.hxx @@ -43,6 +43,12 @@ class FGSkySun { ssgColourArray *cl; + ssgVertexArray *halo_vl; + ssgTexCoordArray *halo_tl; + + GLuint sun_texid; + GLubyte *sun_texbuf; + public: // Constructor