From 184d527abf776ffd9d55c45d8175bfcc24999658 Mon Sep 17 00:00:00 2001 From: Allanis Date: Wed, 13 Feb 2013 18:57:44 +0000 Subject: [PATCH] [Add Gui's NAV and WEAPON monitors are now utilised. --- dat/fleet.xml | 2 +- dat/gui.xml | 26 ++++++++++++++------ dat/ship.xml | 4 ++-- gfx/gui/minimal.png | Bin 6938 -> 7116 bytes src/opengl.c | 45 +++++++++++++++++++++++++++++++---- src/opengl.h | 9 +++++-- src/player.c | 56 +++++++++++++++++++++++++++++++++++++++++--- src/ship.h | 8 +++---- 8 files changed, 126 insertions(+), 24 deletions(-) diff --git a/dat/fleet.xml b/dat/fleet.xml index 342588e..e5c1322 100644 --- a/dat/fleet.xml +++ b/dat/fleet.xml @@ -4,7 +4,7 @@ test Independent - Enemy Test + Lancer diff --git a/dat/gui.xml b/dat/gui.xml index b348443..fbe57fb 100644 --- a/dat/gui.xml +++ b/dat/gui.xml @@ -59,42 +59,54 @@ 72 72 + 98 8 52 - 186 + 201 98 8 52 - 197 + 212 98 8 52 - 207 + 223 + + 40 + 239 + 112 + 42 + 34 - 273 + 304 40 - 260 + 291 40 - 273 + 304 40 - 370 + 401 diff --git a/dat/ship.xml b/dat/ship.xml index bbda53d..0a5fad6 100644 --- a/dat/ship.xml +++ b/dat/ship.xml @@ -54,10 +54,10 @@ laser - + ship1 simple - 1 + 2 180 130 diff --git a/gfx/gui/minimal.png b/gfx/gui/minimal.png index c04f0839211164d33843bb233358f2467fe549e4..9f4a62061c82886030b1d2d80d0f07ae173e4a37 100644 GIT binary patch literal 7116 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 Ct*=J_ literal 6938 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 diff --git a/src/opengl.c b/src/opengl.c index 882cbcd..548d821 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -17,6 +17,9 @@ #define FONT_DEF "../gfx/fonts/FreeSans.ttf" +// Default colors. +glColor cGrey = { .r = .75, .g = 0.75, .b = 0.75, .a = 1 }; + // offsets to Adjust the pilot's place onscreen to be in the middle, even with the GUI. extern double gui_xoff; extern double gui_yoff; @@ -38,7 +41,7 @@ static int pot(int n); // gl_texture. static GLuint gl_loadSurface(SDL_Surface* surface, int* rw, int* rh); // Gl font. -static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex_base); +static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex_base, int* width_base); // ================ // MISC! @@ -437,10 +440,32 @@ void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const c glDisable(GL_TEXTURE_2D); } +// Get the width of the text about to be printed. +int gl_printWidth(const gl_font* ft_font, const char* fmt, ...) { + int i, n; + char txt[256]; // Holds the string. + va_list ap; + + if(ft_font == NULL) ft_font = &gl_defFont; + + if(fmt == NULL) return 0; + else { + // Convert the symbols to text. + va_start(ap, fmt); + vsprintf(txt, fmt, ap); + va_end(ap); + } + + for(n = 0, i = 0; i < (int)strlen(txt); i++) + n += ft_font->w[(int)txt[i]]; + + return n; +} + // ================ // FONT! // ================ -static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex_base) { +static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex_base, int* width_base) { FT_Glyph glyph; FT_Bitmap bitmap; GLubyte* expanded_data; @@ -492,6 +517,9 @@ static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* te double x = (double)bitmap.width/(double)w; double y = (double)bitmap.rows/(double)h; + // Give the width a value. + width_base[(int)ch] = bitmap.width; + // Draw the texture mapped quad. glBindTexture(GL_TEXTURE_2D, tex_base[(int)ch]); glBegin(GL_TRIANGLE_STRIP); @@ -514,14 +542,20 @@ static void gl_fontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* te FT_Done_Glyph(glyph); } -void gl_fontInit(gl_font* font, const char* fname, unsigned int h) { +void gl_fontInit(gl_font* font, const char* fname, const unsigned int h) { if(font == NULL) font = &gl_defFont; uint32_t bufsize; FT_Byte* buf = pack_readfile(DATA, (fname) ? fname : FONT_DEF, &bufsize); + // Allocatagery. font->textures = malloc(sizeof(GLuint)*128); - font->h = h; + font->w = malloc(sizeof(int)*128); + font->h = (int)h; + if(font->textures == NULL || font->w == NULL) { + WARN("Out of memory!"); + return; + } // Create a FreeType font library. FT_Library library; @@ -544,7 +578,7 @@ void gl_fontInit(gl_font* font, const char* fname, unsigned int h) { // Create each of the font display lists. unsigned char i; for(i = 0; i < 128; i++) - gl_fontMakeDList(face, i, font->list_base, font->textures); + gl_fontMakeDList(face, i, font->list_base, font->textures, font->w); // We can now free the face and library. FT_Done_Face(face); @@ -557,6 +591,7 @@ void gl_freeFont(gl_font* font) { glDeleteLists(font->list_base, 128); glDeleteTextures(128, font->textures); free(font->textures); + free(font->w); } // ================ diff --git a/src/opengl.h b/src/opengl.h index 1a03749..edf88af 100644 --- a/src/opengl.h +++ b/src/opengl.h @@ -33,6 +33,9 @@ typedef struct { } glColor; #define COLOR(x) glColor4d((x).r, (x).g, (x).b, (x).a) +// Default colors. +extern glColor cGrey; + // Spritesheet info. typedef struct { double w, h; // Real size of the image (excluding POT buffer. @@ -45,7 +48,8 @@ typedef struct { // Font info. typedef struct { - float h; // Height. + int h; // Height. + int* w; GLuint* textures; GLuint list_base; } gl_font; @@ -53,7 +57,7 @@ extern gl_font gl_defFont; // Default font. // gl_font loading/freeing. // If font is NULL it uses the internal default font, same with gl_print -void gl_fontInit(gl_font* font, const char* fname, unsigned int h); +void gl_fontInit(gl_font* font, const char* fname, const unsigned int h); void gl_freeFont(gl_font* font); // gl_texute loading/freeing. @@ -69,6 +73,7 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, void gl_blitStatic(const gl_texture* texture, const Vec2* pos, const glColor* c); void gl_bindCamera(const Vec2* pos); void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const char* fmt, ...); +int gl_printWidth(const gl_font* ft_font, const char* fmt, ...); // Initialize/cleanup. int gl_init(void); diff --git a/src/player.c b/src/player.c index e152881..823ef90 100644 --- a/src/player.c +++ b/src/player.c @@ -8,9 +8,6 @@ #include "xml.h" #include "player.h" -#define XML_NODE_START 1 -#define XML_NODE_TEXT 3 - #define XML_GUI_ID "GUIs" // XML section identifier. #define XML_GUI_TAG "gui" @@ -43,7 +40,10 @@ Pilot* player = NULL; // extern in pilot.h static double player_turn = 0.; // Turn velocity from input. static double player_acc = 0.; // Accel velocity from input. static int player_primary = 0; // Player is shooting primary weapon. +static int player_secondary = 0; // layer is shooting secondary weapon. static unsigned int player_target = PLAYER_ID; // Targetted pilot. +static int planet_target = -1; // Targetted planet. +static int weapon = -1; // Secondary weapon is in use. // Pilot stuff for GUI. extern Pilot** pilot_stack; @@ -88,11 +88,16 @@ typedef struct { gl_texture* gfx_frame; gl_texture* gfx_targetPilot, *gfx_targetPlanet; Radar radar; + Rect nav; Rect shield, armor, energy; + Rect weapon; + // Positions. Vec2 pos_frame; Vec2 pos_radar; + Vec2 pos_nav; Vec2 pos_shield, pos_armor, pos_energy; + Vec2 pos_weapon; Vec2 pos_target, pos_target_health, pos_target_name, pos_target_faction; Vec2 pos_msg; } GUI; @@ -225,6 +230,18 @@ void player_render(void) { gui_renderBar(&cArmor, &gui.pos_armor, &gui.armor, player->armor / player->armor_max); gui_renderBar(&cEnergy, &gui.pos_energy, &gui.energy, player->energy / player->energy_max); + // Nav. + if(planet_target != -1) { + + } else { + i = gl_printWidth(NULL, "Nav"); + vect_csetmin(&v, VX(gui.pos_nav) + (gui.nav.w - i)/2., VY(gui.pos_nav) - 5); + gl_print(NULL, &v, &cGrey, "NAV"); + i = gl_printWidth(&gui.smallFont, "No Target"); + vect_csetmin(&v, VX(gui.pos_nav) + (gui.nav.w - i)/2., VY(gui.pos_nav) - 10 - gui.smallFont.h); + gl_print(&gui.smallFont, &v, &cGrey, "No Target"); + } + // Target. if(player_target != PLAYER_ID) { p = pilot_get(player_target); @@ -245,6 +262,17 @@ void player_render(void) { else // On armor. gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "%s: %.0f%%", "Armor", p->armor/p->armor_max*100.); + } + // Weapon. + if(weapon == -1) { + i = gl_printWidth(NULL, "Secondary"); + vect_csetmin(&v, VX(gui.pos_weapon) + (gui.weapon.w - i)/2., VY(gui.pos_weapon) - 5); + gl_print(NULL, &v, &cGrey, "Secondary"); + i = gl_printWidth(&gui.smallFont, "None"); + vect_csetmin(&v, VX(gui.pos_weapon) + (gui.weapon.w - i)/2., VY(gui.pos_weapon) - 10 - gl_defFont.h); + gl_print(&gui.smallFont, &v, &cGrey, "None"); + } else { + } // Messages. VX(v) = VX(gui.pos_msg); @@ -318,6 +346,11 @@ static void gui_renderBar(const glColor* c, const Vec2* p, const Rect* r, const // Init GUI. int gui_init(void) { + // Set graphics to NULL. + gui.gfx_frame = NULL; + gui.gfx_targetPilot = NULL; + gui.gfx_targetPlanet = NULL; + // Font. gl_fontInit(&gui.smallFont, NULL, 10); // -- Radar. @@ -446,12 +479,15 @@ static int gui_parse(const xmlNodePtr parent, const char* name) { tmp = malloc((strlen(tmp2)+strlen(GUI_GFX)+12) * sizeof(char)); // Frame. snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+5, GUI_GFX"%s.png", tmp2); + if(gui.gfx_frame) gl_freeTexture(gui.gfx_frame); // Free if needed. gui.gfx_frame = gl_newImage(tmp); // Pilot. snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+11, GUI_GFX"%s_pilot.png", tmp2); + if(gui.gfx_targetPilot) gl_freeTexture(gui.gfx_targetPilot); // Free if needed. gui.gfx_targetPilot = gl_newSprite(tmp, 2, 2); // Planet. snprintf(tmp, strlen(tmp2)+strlen(GUI_GFX)+12, GUI_GFX"%s_planet.png", tmp2); + if(gui.gfx_targetPlanet) gl_freeTexture(gui.gfx_targetPlanet); // Free if needed. gui.gfx_targetPlanet = gl_newSprite(tmp, 2, 2); free(tmp); free(tmp2); @@ -490,6 +526,13 @@ static int gui_parse(const xmlNodePtr parent, const char* name) { VX(gui.pos_frame) + x, VY(gui.pos_frame) + gui.gfx_frame->h - y); } + // Nav computer. + else if(xml_isNode(node, "nav")) { + rect_parse(node, &x, &y, &gui.nav.w, &gui.nav.h); + vect_csetmin(&gui.pos_nav, + VX(gui.pos_frame) + x, + VY(gui.pos_frame) + gui.gfx_frame->h - y - gl_defFont.h); + } // Health bars. else if(xml_isNode(node, "health")) { cur = node->children; @@ -516,6 +559,13 @@ static int gui_parse(const xmlNodePtr parent, const char* name) { } } while((cur = cur->next)); } + // Secondary weapon. + else if(xml_isNode(node, "weapon")) { + rect_parse(node, &x, &y, &gui.weapon.w, &gui.weapon.h); + vect_csetmin(&gui.pos_weapon, + VX(gui.pos_frame) + x, + VY(gui.pos_frame) + gui.gfx_frame->h - y - gl_defFont.h); + } // Target. else if(xml_isNode(node, "target")) { cur = node->children; diff --git a/src/ship.h b/src/ship.h index 0c52b32..9454c3a 100644 --- a/src/ship.h +++ b/src/ship.h @@ -8,10 +8,10 @@ #define SHIP_TARGET_H 96 enum ship_class { - SHIP_CLASS_NULL, - SHIP_CLASS_CIV_LIGHT, - SHIP_CLASS_CIV_MEDIUM, - SHIP_CLASS_CIV_HEAVY + SHIP_CLASS_NULL = 0, + SHIP_CLASS_CIV_LIGHT = 1, + SHIP_CLASS_CIV_MEDIUM = 2, + SHIP_CLASS_CIV_HEAVY = 3 }; typedef enum ship_class ship_class;