void draw_gauge (double speed, double energy) { GLfloat xplane[4] = {1.0 / GAUGE_IMG_SIZE, 0.0, 0.0, 0.0 }; GLfloat yplane[4] = {0.0, 1.0 / GAUGE_IMG_SIZE, 0.0, 0.0 }; double y; double speedbar_frac; set_gl_options (GAUGE_BARS); if (Tex.TexID (GAUGE_ENERGY) < 1) return; if (Tex.TexID (GAUGE_SPEED) < 1) return; if (Tex.TexID (GAUGE_OUTLINE) < 1) return; Tex.BindTex (GAUGE_ENERGY); glTexGenfv (GL_S, GL_OBJECT_PLANE, xplane); glTexGenfv (GL_T, GL_OBJECT_PLANE, yplane); glPushMatrix(); glTranslatef (param.x_resolution - GAUGE_WIDTH, 0, 0); Tex.BindTex (GAUGE_ENERGY); y = ENERGY_GAUGE_BOTTOM + energy * ENERGY_GAUGE_HEIGHT; glColor4fv (energy_background_color); glBegin (GL_QUADS); glVertex2f (0.0, y); glVertex2f (GAUGE_IMG_SIZE, y); glVertex2f (GAUGE_IMG_SIZE, GAUGE_IMG_SIZE); glVertex2f (0.0, GAUGE_IMG_SIZE); glEnd (); glColor4fv (energy_foreground_color); glBegin (GL_QUADS); glVertex2f (0.0, 0.0); glVertex2f (GAUGE_IMG_SIZE, 0.0); glVertex2f (GAUGE_IMG_SIZE, y); glVertex2f (0.0, y); glEnd (); speedbar_frac = 0.0; if (speed > SPEEDBAR_GREEN_MAX_SPEED) { speedbar_frac = SPEEDBAR_GREEN_FRACTION; if (speed > SPEEDBAR_YELLOW_MAX_SPEED) { speedbar_frac += SPEEDBAR_YELLOW_FRACTION; if (speed > SPEEDBAR_RED_MAX_SPEED) { speedbar_frac += SPEEDBAR_RED_FRACTION; } else { speedbar_frac += (speed - SPEEDBAR_YELLOW_MAX_SPEED) / (SPEEDBAR_RED_MAX_SPEED - SPEEDBAR_YELLOW_MAX_SPEED) * SPEEDBAR_RED_FRACTION; } } else { speedbar_frac += (speed - SPEEDBAR_GREEN_MAX_SPEED) / (SPEEDBAR_YELLOW_MAX_SPEED - SPEEDBAR_GREEN_MAX_SPEED) * SPEEDBAR_YELLOW_FRACTION; } } else { speedbar_frac += speed/SPEEDBAR_GREEN_MAX_SPEED * SPEEDBAR_GREEN_FRACTION; } glColor4fv (speedbar_background_color); Tex.BindTex (GAUGE_SPEED); draw_partial_tri_fan (1.0); glColor4fv (hud_white); draw_partial_tri_fan (min (1.0, speedbar_frac)); glColor4fv (hud_white); Tex.BindTex (GAUGE_OUTLINE); glBegin (GL_QUADS); glVertex2f (0.0, 0.0); glVertex2f (GAUGE_IMG_SIZE, 0.0); glVertex2f (GAUGE_IMG_SIZE, GAUGE_IMG_SIZE); glVertex2f (0.0, GAUGE_IMG_SIZE); glEnd(); glPopMatrix(); }
void HUD::gauge(const int i, const double _speed, const double energy) { const GLfloat xplane[4] = { 1.0/m_element[i].size, 0.0, 0.0, 0.0 }; const GLfloat yplane[4] = { 0.0, 1.0/m_element[i].size, 0.0, 0.0 }; //the gauge bar needs it's own mode //we reset the mode at the end of the function set_gl_options( GAUGE_BARS ); gl::TexGen(GL_S, GL_OBJECT_PLANE, xplane); gl::TexGen(GL_T, GL_OBJECT_PLANE, yplane); gl::PushMatrix(); { gl::Translate(m_resolution.x() - m_element[i].width,0); gl::Color(energy_background_color); gl::BindTexture(GL_TEXTURE_2D, m_energymaskTex); const double y = ENERGY_GAUGE_BOTTOM + energy * m_element[i].height; gl::Begin( GL_QUADS ); { gl::Vertex(0.0, y); gl::Vertex(m_element[i].size, y); gl::Vertex(m_element[i].size, m_element[i].size); gl::Vertex(0.0, m_element[i].size); } gl::End(); gl::Color(energy_foreground_color); gl::Begin(GL_QUADS); { gl::Vertex(0.0, 0.0); gl::Vertex(m_element[i].size, 0.0); gl::Vertex(m_element[i].size, y); gl::Vertex(0.0, y); } gl::End(); // Calculate the fraction of the speed bar to fill double speedbar_frac = 0.0; if ( _speed > SPEEDBAR_GREEN_MAX_SPEED ) { speedbar_frac = SPEEDBAR_GREEN_FRACTION; if ( _speed > SPEEDBAR_YELLOW_MAX_SPEED ) { speedbar_frac += SPEEDBAR_YELLOW_FRACTION; if ( _speed > SPEEDBAR_RED_MAX_SPEED ) { speedbar_frac += SPEEDBAR_RED_FRACTION; } else { speedbar_frac += ( _speed - SPEEDBAR_YELLOW_MAX_SPEED ) / ( SPEEDBAR_RED_MAX_SPEED - SPEEDBAR_YELLOW_MAX_SPEED ) * SPEEDBAR_RED_FRACTION; } } else { speedbar_frac += ( _speed - SPEEDBAR_GREEN_MAX_SPEED ) / ( SPEEDBAR_YELLOW_MAX_SPEED - SPEEDBAR_GREEN_MAX_SPEED ) * SPEEDBAR_YELLOW_FRACTION; } } else { speedbar_frac += _speed/SPEEDBAR_GREEN_MAX_SPEED * SPEEDBAR_GREEN_FRACTION; } gl::Color(speedbar_background_color); gl::BindTexture(GL_TEXTURE_2D, m_speedmaskTex); draw_partial_tri_fan(1.0); gl::Color(ppogl::Color::white); draw_partial_tri_fan( MIN( 1.0, speedbar_frac ) ); gl::Color(ppogl::Color::white); gl::BindTexture(GL_TEXTURE_2D, m_outlineTex); gl::Begin(GL_QUADS); { gl::Vertex(0.0, 0.0); gl::Vertex(m_element[i].size, 0.0); gl::Vertex(m_element[i].size, m_element[i].size); gl::Vertex(0.0, m_element[i].size); } gl::End(); } gl::PopMatrix(); //we reset this because all other elements need TEXFONT set_gl_options( TEXFONT ); }
void draw_gauge (ETR_DOUBLE speed, ETR_DOUBLE energy) { #ifndef USE_GLES1 static const GLfloat xplane[4] = {1.0 / GAUGE_IMG_SIZE, 0.0, 0.0, 0.0 }; static const GLfloat yplane[4] = {0.0, 1.0 / GAUGE_IMG_SIZE, 0.0, 0.0 }; #endif ScopedRenderMode rm(GAUGE_BARS); if (Tex.GetTexture (GAUGE_ENERGY) == NULL) return; if (Tex.GetTexture (GAUGE_SPEED) == NULL) return; if (Tex.GetTexture (GAUGE_OUTLINE) == NULL) return; Tex.BindTex (GAUGE_ENERGY); #ifndef USE_GLES1 glTexGenfv (GL_S, GL_OBJECT_PLANE, xplane); glTexGenfv (GL_T, GL_OBJECT_PLANE, yplane); #endif glPushMatrix(); glTranslatef (Winsys.resolution.width - GAUGE_WIDTH, 0, 0); Tex.BindTex (GAUGE_ENERGY); ETR_DOUBLE y = ENERGY_GAUGE_BOTTOM + energy * ENERGY_GAUGE_HEIGHT; #ifdef USE_GLES1 const GLfloat tex1 [] = { 0.0, y/GAUGE_IMG_SIZE, 1.0, y/GAUGE_IMG_SIZE, 1.0, 1.0f, 0.0, 1.0f }; const GLfloat tex2 [] = { 0.0, 0.0f, 1.0, 0.0f, 1.0, y/GAUGE_IMG_SIZE, 0.0, y/GAUGE_IMG_SIZE }; #endif const GLfloat vtx1 [] = { 0.0, y, GAUGE_IMG_SIZE, y, GAUGE_IMG_SIZE, GAUGE_IMG_SIZE, 0.0, GAUGE_IMG_SIZE }; const GLfloat vtx2 [] = { 0.0, 0.0, GAUGE_IMG_SIZE, 0.0, GAUGE_IMG_SIZE, y, 0.0, y }; glEnableClientState(GL_VERTEX_ARRAY); #ifdef USE_GLES1 glEnableClientState(GL_TEXTURE_COORD_ARRAY); #endif glColor4fv(energy_background_color); glVertexPointer(2, GL_FLOAT, 0, vtx1); #ifdef USE_GLES1 glTexCoordPointer(2, GL_FLOAT, 0, tex1); #endif glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glColor4fv(energy_foreground_color); glVertexPointer(2, GL_FLOAT, 0, vtx2); #ifdef USE_GLES1 glTexCoordPointer(2, GL_FLOAT, 0, tex2); #endif glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); #ifdef USE_GLES1 glDisableClientState(GL_TEXTURE_COORD_ARRAY); #endif ETR_DOUBLE speedbar_frac = 0.0; if (speed > SPEEDBAR_GREEN_MAX_SPEED) { speedbar_frac = SPEEDBAR_GREEN_FRACTION; if (speed > SPEEDBAR_YELLOW_MAX_SPEED) { speedbar_frac += SPEEDBAR_YELLOW_FRACTION; if (speed > SPEEDBAR_RED_MAX_SPEED) { speedbar_frac += SPEEDBAR_RED_FRACTION; } else { speedbar_frac += (speed - SPEEDBAR_YELLOW_MAX_SPEED) / (SPEEDBAR_RED_MAX_SPEED - SPEEDBAR_YELLOW_MAX_SPEED) * SPEEDBAR_RED_FRACTION; } } else { speedbar_frac += (speed - SPEEDBAR_GREEN_MAX_SPEED) / (SPEEDBAR_YELLOW_MAX_SPEED - SPEEDBAR_GREEN_MAX_SPEED) * SPEEDBAR_YELLOW_FRACTION; } } else { speedbar_frac += speed/SPEEDBAR_GREEN_MAX_SPEED * SPEEDBAR_GREEN_FRACTION; } glColor4fv (speedbar_background_color); Tex.BindTex (GAUGE_SPEED); draw_partial_tri_fan (1.0); glColor4fv (hud_white); draw_partial_tri_fan (min (1.0, speedbar_frac)); glColor4fv (hud_white); Tex.BindTex (GAUGE_OUTLINE); #ifdef USE_GLES1 static const GLshort tex3 [] = { 0, 0, 1, 0, 1, 1, 0, 1 }; #endif static const GLshort vtx3 [] = { 0, 0, GAUGE_IMG_SIZE, 0, GAUGE_IMG_SIZE, GAUGE_IMG_SIZE, 0, GAUGE_IMG_SIZE }; glEnableClientState(GL_VERTEX_ARRAY); #ifdef USE_GLES1 glEnableClientState(GL_TEXTURE_COORD_ARRAY); #endif glVertexPointer(2, GL_SHORT, 0, vtx3); #ifdef USE_GLES1 glTexCoordPointer(2, GL_SHORT, 0, tex3); #endif glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); #ifdef USE_GLES1 glDisableClientState(GL_TEXTURE_COORD_ARRAY); #endif glPopMatrix(); }