/** * @brief Prints text on the screen. * * @usage gfx.print( nil, "Hello World!", 50, 50, colour.new("Red") ) -- Displays text in red at 50,50. * @usage gfx.print( true, "Hello World!", 50, 50, col, 100 ) -- Displays text to a maximum of 100 pixels wide. * @usage gfx.print( true, str, 50, 50, col, 100, true ) -- Displays centered text to a maximum of 100 pixels. * * @luaparam small Whether or not to use a small font. * @luaparam str String to print. * @luaparam x X position to print at. * @luaparam y Y position to print at. * @luaparam col Colour to print text. * @luaparam max Optional parameter to indicate maximum width to render up to. * @luaparam center Optional boolean parameter indicating whether or not to center it. * @luafunc print( small, str, x, y, col, max, center ) */ static int gfxL_print( lua_State *L ) { glFont *font; const char *str; double x, y; LuaColour *lc; int max, mid; /* Parse parameters. */ font = lua_toboolean(L,1) ? &gl_smallFont : &gl_defFont; str = luaL_checkstring(L,2); x = luaL_checknumber(L,3); y = luaL_checknumber(L,4); lc = luaL_checkcolour(L,5); if (lua_gettop(L) >= 6) max = luaL_checkinteger(L,6); else max = 0; mid = lua_toboolean(L,7); /* Render. */ if (mid) gl_printMidRaw( font, max, x, y, &lc->col, str ); else if (max > 0) gl_printMaxRaw( font, max, x, y, &lc->col, str ); else gl_printRaw( font, x, y, &lc->col, str ); return 0; }
/** * @brief Renders a button widget. * * @param tab WIDGET_BUTTON widget to render. * @param bx Base X position. * @param by Base Y position. */ static void tab_render( Widget* tab, double bx, double by ) { int i, x; Window *wdw; glColour *c, *lc; /** Get window. */ wdw = window_wget( tab->dat.tab.windows[ tab->dat.tab.active ] ); if (wdw == NULL) { WARN("Active window in widget '%s' not found in stack.", tab->name); return; } /* Render the active window. */ window_render( wdw ); /* Render tabs ontop. */ x = 20; for (i=0; i<tab->dat.tab.ntabs; i++) { if (i!=tab->dat.tab.active) { lc = toolkit_col; c = toolkit_colDark; /* Draw border. */ toolkit_drawRect( bx+x, by+0, tab->dat.tab.namelen[i] + 10, TAB_HEIGHT, lc, c ); toolkit_drawOutline( bx+x+1, by+1, tab->dat.tab.namelen[i] + 8, TAB_HEIGHT-1, 1., c, &cBlack ); } else { if (i==0) toolkit_drawRect( bx+x-1, by+0, 1, TAB_HEIGHT+1, toolkit_colDark, &cGrey20 ); else if (i==tab->dat.tab.ntabs-1) toolkit_drawRect( bx+x+tab->dat.tab.namelen[i]+9, by+0, 1, TAB_HEIGHT+1, toolkit_colDark, &cGrey20 ); } /* Draw text. */ gl_printRaw( &gl_defFont, bx+x + 5 + SCREEN_W/2, by + (TAB_HEIGHT-gl_defFont.h)/2 + SCREEN_H/2, &cBlack, tab->dat.tab.tabnames[i] ); /* Go to next line. */ x += 10 + tab->dat.tab.namelen[i]; } }
/** * @brief Prints text on screen like printf. * * Defaults ft_font to gl_defFont if NULL. * * @param ft_font Font to use (NULL means gl_defFont) * @param x X position to put text at. * @param y Y position to put text at. * @param c Colour to use (uses white if NULL) * @param fmt String formatted like printf to print. */ void gl_print( const glFont *ft_font, const double x, const double y, const glColour* c, const char *fmt, ... ) { /*float h = ft_font->h / .63;*/ /* slightly increase fontsize */ char text[256]; /* holds the string */ va_list ap; if (fmt == NULL) return; else { /* convert the symbols to text */ va_start(ap, fmt); vsnprintf(text, 256, fmt, ap); va_end(ap); } gl_printRaw( ft_font, x, y, c, text ); }
/** * @brief Renders the overlay map. * * @param dt Current delta tick. */ void ovr_render( double dt ) { (void) dt; int i, j; Pilot **pstk; int n; double w, h, res; double x,y; glColour c = { .r=0., .g=0., .b=0., .a=0.5 }; /* Must be open. */ if (!ovr_open) return; /* Player must be alive. */ if (player_isFlag( PLAYER_DESTROYED ) || (player.p == NULL)) return; /* Default values. */ w = SCREEN_W; h = SCREEN_H; res = ovr_res; /* First render the background overlay. */ gl_renderRect( 0., 0., w, h, &c ); /* Render planets. */ for (i=0; i<cur_system->nplanets; i++) if ((cur_system->planets[ i ]->real == ASSET_REAL) && (i != player.p->nav_planet)) gui_renderPlanet( i, RADAR_RECT, w, h, res, 1 ); if (player.p->nav_planet > -1) gui_renderPlanet( player.p->nav_planet, RADAR_RECT, w, h, res, 1 ); /* Render jump points. */ for (i=0; i<cur_system->njumps; i++) if ((i != player.p->nav_hyperspace) && !jp_isFlag(&cur_system->jumps[i], JP_EXITONLY)) gui_renderJumpPoint( i, RADAR_RECT, w, h, res, 1 ); if (player.p->nav_hyperspace > -1) gui_renderJumpPoint( player.p->nav_hyperspace, RADAR_RECT, w, h, res, 1 ); /* Render pilots. */ pstk = pilot_getAll( &n ); j = 0; for (i=0; i<n; i++) { if (pstk[i]->id == PLAYER_ID) /* Skip player. */ continue; if (pstk[i]->id == player.p->target) j = i; else gui_renderPilot( pstk[i], RADAR_RECT, w, h, res, 1 ); } /* Render the targeted pilot */ if (j!=0) gui_renderPilot( pstk[j], RADAR_RECT, w, h, res, 1 ); /* Check if player has goto target. */ if (player_isFlag(PLAYER_AUTONAV) && (player.autonav == AUTONAV_POS_APPROACH)) { x = player.autonav_pos.x / res + w / 2.; y = player.autonav_pos.y / res + h / 2.; gl_renderCross( x, y, 5., &cRadar_hilight ); gl_printRaw( &gl_smallFont, x+10., y-gl_smallFont.h/2., &cRadar_hilight, "GOTO" ); } /* Render the player. */ gui_renderPlayer( res, 1 ); /* Render markers. */ ovr_mrkRenderAll( res ); } /** * @brief Renders all the markers. * * @param res Resolution to render at. */ static void ovr_mrkRenderAll( double res ) { int i; ovr_marker_t *mrk; double x, y; if (ovr_markers == NULL) return; for (i=0; i<array_size(ovr_markers); i++) { mrk = &ovr_markers[i]; x = mrk->u.pt.x / res + SCREEN_W / 2.; y = mrk->u.pt.y / res + SCREEN_H / 2.; gl_renderCross( x, y, 5., &cRadar_hilight ); if (mrk->text != NULL) gl_printRaw( &gl_smallFont, x+10., y-gl_smallFont.h/2., &cRadar_hilight, mrk->text ); } }
/** * @brief Renders the load screen with message. * * @param done Amount done (1. == completed). * @param msg Loading screen message. */ void loadscreen_render( double done, const char *msg ) { glColour col; double bx,by, bw,bh; double x,y, w,h, rh; /* Clear background. */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Draw stars. */ space_renderStars( 0. ); /* * Dimensions. */ /* Image. */ bw = 512.; bh = 512.; bx = (SCREEN_W-bw)/2.; by = (SCREEN_H-bh)/2.; /* Loading bar. */ w = gl_screen.w * 0.4; h = gl_screen.h * 0.02; rh = h + gl_defFont.h + 4.; x = -w/2.; if (SCREEN_H < 768) y = -h/2.; else y = -bw/2 - rh - 5.; /* Draw loading screen image. */ if (loading != NULL) gl_blitScale( loading, bx, by, bw, bh, NULL ); /* Draw progress bar. */ /* BG. */ col.r = cBlack.r; col.g = cBlack.g; col.b = cBlack.b; col.a = 0.7; gl_renderRect( x-2., y-2., w+4., rh+4., &col ); /* FG. */ col.r = cDConsole.r; col.g = cDConsole.g; col.b = cDConsole.b; col.a = 0.2; gl_renderRect( x+done*w, y, (1.-done)*w, h, &col ); col.r = cConsole.r; col.g = cConsole.g; col.b = cConsole.b; col.a = 0.7; gl_renderRect( x, y, done*w, h, &col ); /* Draw text. */ gl_printRaw( &gl_defFont, x + gl_screen.w/2., y + gl_screen.h/2 + 2. + h, &cConsole, msg ); /* Flip buffers. */ SDL_GL_SwapBuffers(); }