[Change] Target color changes based on target.
This commit is contained in:
parent
c20a20e103
commit
053d7b75b6
19
src/opengl.c
19
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.
|
||||
|
15
src/opengl.h
15
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);
|
||||
|
@ -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.
|
||||
|
62
src/player.c
62
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);
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user