diff --git a/src/opengl.c b/src/opengl.c index 76dc36c..4ab05e9 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -329,7 +329,7 @@ void gl_getSpriteFromDir(int* x, int* y, const gl_texture* t, const double dir) // ================ // Blit the sprite at given position. -void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, const int sy) { +void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, const int sy, const glColor* c) { // Don't bother drawing if offscreen -- waste of cycles. if(fabs(VX(*pos) -VX(*gl_camera)) > gl_screen.w / 2 + sprite->sw / 2 || fabs(VY(*pos) -VY(*gl_camera)) > gl_screen.h / 2 + sprite->sh / 2) @@ -345,12 +345,13 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons glPushMatrix(); // Projection translation matrix. glTranslated(VX(*pos) - VX(*gl_camera) - sprite->sw/2. + gui_xoff, VY(*pos) -VY(*gl_camera) - sprite->sh/2. + gui_yoff, 0.); - glScalef((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.); + //glScalef((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.); // Actual blitting.... glBindTexture(GL_TEXTURE_2D, sprite->texture); glBegin(GL_TRIANGLE_STRIP); - glColor4d(1., 1., 1., 1.); + if(c == NULL) glColor4d(1., 1., 1., 1.); + else COLOR(*c); glTexCoord2d(0., 0.); glVertex2d(0., 0.); glTexCoord2d(sprite->sw/sprite->rw, 0.); @@ -370,17 +371,18 @@ void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, cons } // Just straight out blit the thing at position. -void gl_blitStatic(const gl_texture* texture, const Vec2* pos) { +void gl_blitStatic(const gl_texture* texture, const Vec2* pos, const glColor* c) { glEnable(GL_TEXTURE_2D); glMatrixMode(GL_PROJECTION); glPushMatrix(); // Set up translation matrix. glTranslated(VX(*pos) - (double)gl_screen.w/2., VY(*pos) - (double)gl_screen.h/2., 0); - glScaled((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.); + //glScaled((double)gl_screen.w/SCREEN_W, (double)gl_screen.h/SCREEN_H, 0.); // Actual blitting.. glBindTexture(GL_TEXTURE_2D, texture->texture); glBegin(GL_TRIANGLE_STRIP); - glColor4d(1., 1., 1., 1.); + if(c == NULL) glColor4d(1., 1., 1., 1.); + else COLOR(*c); glTexCoord2d(0., 0.); glVertex2d(0., 0.); glTexCoord2d(texture->sw/texture->rw, 0.); @@ -403,7 +405,7 @@ void gl_bindCamera(const Vec2* pos) { // Print text on screen! YES!!!! Just like printf! But different! // Defaults ft_font to gl_defFont if NULL. -void gl_print(const gl_font* ft_font, const Vec2* pos, const char* fmt, ...) { +void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const char* fmt, ...) { //float h = ft_font->h / .63; // Slightly increases font size. char text[256]; va_list ap; @@ -427,7 +429,8 @@ void gl_print(const gl_font* ft_font, const Vec2* pos, const char* fmt, ...) { glPushMatrix(); // Translation matrix. glTranslated(VX(*pos) - (double)gl_screen.w/2., VY(*pos) - (double)gl_screen.h/2., 0); - glColor4d(1., 1., 1., 1.); + if(c == NULL) glColor4d(1., 1., 1., 1.); + else COLOR(*c); glCallLists(strlen(text), GL_UNSIGNED_BYTE, &text); glPopMatrix(); // Translation matrix. diff --git a/src/opengl.h b/src/opengl.h index 7981103..1a03749 100644 --- a/src/opengl.h +++ b/src/opengl.h @@ -25,9 +25,14 @@ typedef struct { int r, g, b, a; // Framebuffer values in bits. int doublebuf; // Double buffer. } gl_info; - extern gl_info gl_screen; // Local structure set with gl_init etc. +// Colors. +typedef struct { + double r, g, b, a; +} glColor; +#define COLOR(x) glColor4d((x).r, (x).g, (x).b, (x).a) + // Spritesheet info. typedef struct { double w, h; // Real size of the image (excluding POT buffer. @@ -58,10 +63,12 @@ gl_texture* gl_newSprite(const char* path, const int sx, const int sy); void gl_freeTexture(gl_texture* texture); // Rendering. -void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, const int sx, const int sy); -void gl_blitStatic(const gl_texture* texture, const Vec2* pos); +void gl_blitSprite(const gl_texture* sprite, const Vec2* pos, + const int sx, const int sy, const glColor* c); + +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 char* fmt, ...); +void gl_print(const gl_font* ft_font, const Vec2* pos, const glColor* c, const char* fmt, ...); // Initialize/cleanup. int gl_init(void); diff --git a/src/pilot.c b/src/pilot.c index 7b2ecf4..a674544 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -154,7 +154,7 @@ void pilot_render(Pilot* p) { // Get the sprite corresponding to the direction facing. gl_getSpriteFromDir(&sx, &sy, p->ship->gfx_space, p->solid->dir); - gl_blitSprite(p->ship->gfx_space, &p->solid->pos, sx, sy); + gl_blitSprite(p->ship->gfx_space, &p->solid->pos, sx, sy, NULL); } // Update the pilot. diff --git a/src/player.c b/src/player.c index dfa3afc..6a98bf6 100644 --- a/src/player.c +++ b/src/player.c @@ -50,25 +50,21 @@ extern Pilot** pilot_stack; extern int pilots; // GUI crap. -// Need these offsets to render properly. -- Used in opengl.c -// -- Colors. -typedef struct { - double r, g, b, a; -} Color; -#define COLOR(x) glColor4d((x).r, (x).g, (x).b, (x).a) -// Standard colors. -Color cInert = { .r = 0.6, .g = 0.6, .b = 0.6, .a = 1. }; -Color cNeutral = { .r = 0.9, .g = 1.0, .b = 0.3, .a = 1. }; -Color cFriend = { .r = 0.0, .g = 1.0, .b = 0.0, .a = 1. }; -Color cHostile = { .r = 0.9, .g = 0.2, .b = 0.2, .a = 1. }; -Color cRadar_player = { .r = 0.4, .g = 0.8, .b = 0.4, .a = 1. }; -Color cRadar_targ = { .r = 0.0, .g = 0.7, .b = 1.0, .a = 1. }; -Color cRadar_weap = { .r = 0.8, .g = 0.2, .b = 0.2, .a = 1. }; +// -- Colors. +// Standard colors. +glColor cInert = { .r = 0.6, .g = 0.6, .b = 0.6, .a = 1. }; +glColor cNeutral = { .r = 0.9, .g = 1.0, .b = 0.3, .a = 1. }; +glColor cFriend = { .r = 0.0, .g = 1.0, .b = 0.0, .a = 1. }; +glColor cHostile = { .r = 0.9, .g = 0.2, .b = 0.2, .a = 1. }; + +glColor cRadar_player = { .r = 0.4, .g = 0.8, .b = 0.4, .a = 1. }; +glColor cRadar_targ = { .r = 0.0, .g = 0.7, .b = 1.0, .a = 1. }; +glColor cRadar_weap = { .r = 0.8, .g = 0.2, .b = 0.2, .a = 1. }; // Bars. -Color cShield = { .r = 0.2, .g = 0.2, .b = 0.8, .a = 1. }; -Color cArmor = { .r = 0.5, .g = 0.5, .b = 0.5, .a = 1. }; -Color cEnergy = { .r = 0.2, .g = 0.8, .b = 0.2, .a = 1. }; +glColor cShield = { .r = 0.2, .g = 0.2, .b = 0.8, .a = 1. }; +glColor cArmor = { .r = 0.5, .g = 0.5, .b = 0.5, .a = 1. }; +glColor cEnergy = { .r = 0.2, .g = 0.8, .b = 0.2, .a = 1. }; typedef struct { double w,h; // Dimensions. @@ -124,7 +120,7 @@ extern void planets_minimap(const double res, const double w, const double h, co static void rect_parse(const xmlNodePtr parent, double* x, double* y, double* w, double* h); static int gui_parse(const xmlNodePtr parent, const char* name); static void gui_renderPilot(const Pilot* p); -static void gui_renderBar(const Color* c, const Vec2* p, const Rect* r, const double w); +static void gui_renderBar(const glColor* c, const Vec2* p, const Rect* r, const double w); void player_message(const char* fmt, ...) { va_list ap; @@ -151,20 +147,24 @@ void player_render(void) { int i, j; Pilot* p; Vec2 v; + glColor* c; // Render the player target graphics. if(player_target != PLAYER_ID) { p = pilot_get(player_target); + if(pilot_isFlag(p, PILOT_HOSTILE)) c = &cHostile; + else c = &cNeutral; + vect_csetmin(&v, VX(p->solid->pos) - p->ship->gfx_space->sw * PILOT_SIZE_APROX/2., VY(p->solid->pos) + p->ship->gfx_space->sh * PILOT_SIZE_APROX/2.); - gl_blitSprite(gui.gfx_targetPilot, &v, 0, 0); // Top left. + gl_blitSprite(gui.gfx_targetPilot, &v, 0, 0, c); // Top left. VX(v) += p->ship->gfx_space->sw * PILOT_SIZE_APROX; - gl_blitSprite(gui.gfx_targetPilot, &v, 1, 0); // Top right. + gl_blitSprite(gui.gfx_targetPilot, &v, 1, 0, c); // Top right. VY(v) -= p->ship->gfx_space->sh * PILOT_SIZE_APROX; - gl_blitSprite(gui.gfx_targetPilot, &v, 1, 1); // Bottom right. + gl_blitSprite(gui.gfx_targetPilot, &v, 1, 1, c); // Bottom right. VX(v) -= p->ship->gfx_space->sw * PILOT_SIZE_APROX; - gl_blitSprite(gui.gfx_targetPilot, &v, 0, 1); // Bottom left. + gl_blitSprite(gui.gfx_targetPilot, &v, 0, 1, c); // Bottom left. } // Render the player. @@ -172,7 +172,7 @@ void player_render(void) { // GUI! // -- Frame. - gl_blitStatic(gui.gfx_frame, &gui.pos_frame); + gl_blitStatic(gui.gfx_frame, &gui.pos_frame, NULL); // -- Radar. glMatrixMode(GL_PROJECTION); glPushMatrix(); @@ -229,22 +229,22 @@ void player_render(void) { if(player_target != PLAYER_ID) { p = pilot_get(player_target); - gl_blitStatic(p->ship->gfx_target, &gui.pos_target); + gl_blitStatic(p->ship->gfx_target, &gui.pos_target, NULL); // Target name. - gl_print(NULL, &gui.pos_target_name, "%s", p->name); - gl_print(&gui.smallFont, &gui.pos_target_faction, "%s", p->faction->name); + gl_print(NULL, &gui.pos_target_name, NULL, "%s", p->name); + gl_print(&gui.smallFont, &gui.pos_target_faction, NULL, "%s", p->faction->name); // Target status. if(p->armor < p->armor_max * PILOT_DISABLED) // Disable the pilot. - gl_print(&gui.smallFont, &gui.pos_target_health, "Disabled"); + gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "Disabled"); else if(p->shield > p->shield_max / 100.) // On shields. - gl_print(&gui.smallFont, &gui.pos_target_health, "%s: %.0f%%", "Shield", p->shield/p->shield_max*100.); + gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "%s: %.0f%%", "Shield", p->shield/p->shield_max*100.); else // On armor. - gl_print(&gui.smallFont, &gui.pos_target_health, "%s: %.0f%%", "Armor", p->armor/p->armor_max*100.); + gl_print(&gui.smallFont, &gui.pos_target_health, NULL, "%s: %.0f%%", "Armor", p->armor/p->armor_max*100.); } // Messages. VX(v) = VX(gui.pos_msg); @@ -254,7 +254,7 @@ void player_render(void) { if(msg_stack[msg_max-i-1].str[0] != '\0') { if(msg_stack[msg_max-i-1].t < SDL_GetTicks()) msg_stack[msg_max-i-1].str[0] = '\0'; - else gl_print(NULL, &v, "%s", msg_stack[msg_max-i-1].str); + else gl_print(NULL, &v, NULL, "%s", msg_stack[msg_max-i-1].str); } } } @@ -300,7 +300,7 @@ static void gui_renderPilot(const Pilot* p) { } // Render a bar. -static void gui_renderBar(const Color* c, const Vec2* p, const Rect* r, const double w) { +static void gui_renderBar(const glColor* c, const Vec2* p, const Rect* r, const double w) { int x, y, sx, sy; glBegin(GL_QUADS); diff --git a/src/space.c b/src/space.c index b1f8dda..7df67d3 100644 --- a/src/space.c +++ b/src/space.c @@ -460,7 +460,7 @@ void space_render(double dt) { void planets_render(void) { int i; for(i = 0; i < cur_system->nplanets; i++) - gl_blitSprite(cur_system->planets[i].gfx_space, &cur_system->planets[i].pos, 0, 0); + gl_blitSprite(cur_system->planets[i].gfx_space, &cur_system->planets[i].pos, 0, 0, NULL); } // Clean up the system. diff --git a/src/weapon.c b/src/weapon.c index f73288e..021375a 100644 --- a/src/weapon.c +++ b/src/weapon.c @@ -115,7 +115,7 @@ static void weapon_render(const Weapon* w) { // Get the sprite corresponding to the direction facing. gl_getSpriteFromDir(&sx, &sy, w->outfit->gfx_space, w->solid->dir); - gl_blitSprite(w->outfit->gfx_space, &w->solid->pos, sx, sy); + gl_blitSprite(w->outfit->gfx_space, &w->solid->pos, sx, sy, NULL); } // Update the weapon.