diff --git a/src/colour.c b/src/colour.c new file mode 100644 index 0000000..3afd8cd --- /dev/null +++ b/src/colour.c @@ -0,0 +1,18 @@ +#include "colour.h" + +// Default colors. +glColour cWhite = { .r = 1.00, .g = 1.00, .b = 1.00, .a = 1 }; +glColour cGrey90 = { .r = 0.90, .g = 0.90, .b = 0.90, .a = 1 }; +glColour cGrey80 = { .r = 0.80, .g = 0.80, .b = 0.80, .a = 1 }; +glColour cGrey70 = { .r = 0.70, .g = 0.70, .b = 0.70, .a = 1 }; +glColour cGrey60 = { .r = 0.60, .g = 0.60, .b = 0.60, .a = 1 }; +glColour cGrey50 = { .r = 0.50, .g = 0.50, .b = 0.50, .a = 1 }; +glColour cGrey40 = { .r = 0.40, .g = 0.40, .b = 0.40, .a = 1 }; +glColour cGrey30 = { .r = 0.30, .g = 0.30, .b = 0.30, .a = 1 }; +glColour cGrey20 = { .r = 0.20, .g = 0.20, .b = 0.20, .a = 1 }; +glColour cGrey10 = { .r = 0.10, .g = 0.10, .b = 0.10, .a = 1 }; +glColour cBlack = { .r = 0.00, .g = 0.00, .b = 0.00, .a = 1 }; + +glColour cGreen = { .r = 0.20, .g = 0.80, .b = 0.20, .a = 1 }; +glColour cRed = { .r = 0.80, .g = 0.20, .b = 0.20, .a = 1 }; + diff --git a/src/colour.h b/src/colour.h new file mode 100644 index 0000000..295086e --- /dev/null +++ b/src/colour.h @@ -0,0 +1,26 @@ +#pragma once + +// Colours. +typedef struct { + double r, g, b, a; +} glColour; + +// Default colors. +// -- Greyscale. +extern glColour cWhite; +#define cGrey cGrey70 +extern glColour cBlack; + +extern glColour cGrey90; +extern glColour cGrey80; +extern glColour cGrey70; +extern glColour cGrey60; +extern glColour cGrey50; +extern glColour cGrey40; +extern glColour cGrey30; +extern glColour cGrey20; +extern glColour cGrey10; + +extern glColour cGreen; +extern glColour cRed; + diff --git a/src/land.c b/src/land.c index 1c9e6b3..3a6d76b 100644 --- a/src/land.c +++ b/src/land.c @@ -2,6 +2,11 @@ #include "pause.h" #include "land.h" +#define LAND_WIDTH 500 +#define LAND_HEIGHT 400 +#define BUTTON_WIDTH 80 +#define BUTTON_HEIGHT 40 + int landed = 0; static int land_wid = 0; @@ -10,10 +15,14 @@ static Planet* planet = NULL; // Land the player. void land(Planet* p) { if(landed) return; - planet = p; - land_wid = window_create(-1, -1, 400, 300); - window_addButton(land_wid, 400-80-20, 20, 80, 40, "takeoff", "Takeoff", (void(*)(char*))takeoff); + land_wid = window_create(-1, -1, LAND_WIDTH, LAND_HEIGHT); + + // Pretty display. + window_addText(land_wid, 0., -20., LAND_WIDTH, 1, p->name, NULL, &cBlack); + // Buttons. + window_addButton(land_wid, -20, 20, BUTTON_WIDTH, BUTTON_HEIGHT, + "takeoff", "Takeoff", (void(*)(char*))takeoff); landed = 1; } diff --git a/src/opengl.c b/src/opengl.c index 0beeab7..45803db 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -18,23 +18,6 @@ #define FONT_DEF "../gfx/fonts/font.ttf" -// Default colors. -glColour cWhite = { .r = 1.00, .g = 1.00, .b = 1.00, .a = 1 }; -glColour cGrey90 = { .r = 0.90, .g = 0.90, .b = 0.90, .a = 1 }; -glColour cGrey80 = { .r = 0.80, .g = 0.80, .b = 0.80, .a = 1 }; -glColour cGrey70 = { .r = 0.70, .g = 0.70, .b = 0.70, .a = 1 }; -glColour cGrey60 = { .r = 0.60, .g = 0.60, .b = 0.60, .a = 1 }; -glColour cGrey50 = { .r = 0.50, .g = 0.50, .b = 0.50, .a = 1 }; -glColour cGrey40 = { .r = 0.40, .g = 0.40, .b = 0.40, .a = 1 }; -glColour cGrey30 = { .r = 0.30, .g = 0.30, .b = 0.30, .a = 1 }; -glColour cGrey20 = { .r = 0.20, .g = 0.20, .b = 0.20, .a = 1 }; -glColour cGrey10 = { .r = 0.10, .g = 0.10, .b = 0.10, .a = 1 }; -glColour cBlack = { .r = 0.00, .g = 0.00, .b = 0.00, .a = 1 }; - -glColour cGreen = { .r = 0.20, .g = 0.80, .b = 0.20, .a = 1 }; -glColour cRed = { .r = 0.80, .g = 0.20, .b = 0.20, .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; @@ -656,15 +639,15 @@ static void glFontMakeDList(FT_Face face, char ch, GLuint list_base, GLuint* tex // Draw the texture mapped quad. glBindTexture(GL_TEXTURE_2D, tex_base[(int)ch]); - glBegin(GL_TRIANGLE_STRIP); + glBegin(GL_QUADS); glTexCoord2d(0, 0); glVertex2d(0, bitmap.rows); glTexCoord2d(x, 0); glVertex2d(bitmap.width, bitmap.rows); - glTexCoord2d(0, y); - glVertex2d(0, 0); glTexCoord2d(x, y); glVertex2d(bitmap.width, 0); + glTexCoord2d(0, y); + glVertex2d(0, 0); glEnd(); glPopMatrix(); diff --git a/src/opengl.h b/src/opengl.h index 4216b56..56b0807 100644 --- a/src/opengl.h +++ b/src/opengl.h @@ -1,6 +1,7 @@ #pragma once #include <SDL.h> #include <SDL_opengl.h> +#include "colour.h" #include "physics.h" // Recommended for compatibility bullshit. @@ -32,31 +33,8 @@ typedef struct { } glInfo; extern glInfo gl_screen; // Local structure set with gl_init etc. -// Colours. -typedef struct { - double r, g, b, a; -} glColour; #define COLOUR(x) glColor4d((x).r, (x).g, (x).b, (x).a) -// Default colors. -// -- Greyscale. -extern glColour cWhite; -#define cGrey cGrey70 -extern glColour cBlack; - -extern glColour cGrey90; -extern glColour cGrey80; -extern glColour cGrey70; -extern glColour cGrey60; -extern glColour cGrey50; -extern glColour cGrey40; -extern glColour cGrey30; -extern glColour cGrey20; -extern glColour cGrey10; - -extern glColour cGreen; -extern glColour cRed; - // Spritesheet info. typedef struct { double w, h; // Real size of the image (excluding POT buffer. diff --git a/src/player.c b/src/player.c index 174ea8a..82905f3 100644 --- a/src/player.c +++ b/src/player.c @@ -881,6 +881,6 @@ void player_screenshot(void) { // TODO not overwirte old screenshots. strncpy(filename, "screenshot.png", 20); DEBUG("SCREENSHOT!"); - gl_screenshot(filename); + gl_screenshot(filename); } diff --git a/src/toolkit.c b/src/toolkit.c index 9407665..82bca35 100644 --- a/src/toolkit.c +++ b/src/toolkit.c @@ -6,7 +6,8 @@ typedef enum { WIDGET_NULL, WIDGET_BUTTON, - WIDGET_TEXT + WIDGET_TEXT, + WIDGET_IMAGE } WidgetType; typedef enum { @@ -34,6 +35,11 @@ typedef struct { struct { glFont* font; glColour* colour; + int centered; + }; + struct { + // Widget image. + glTexture* texture; }; }; } Widget; @@ -57,8 +63,9 @@ static Window* windows = NULL; static int nwindows = 0; static int mwindows = 0; -static Widget* window_newWidget(const unsigned int wid); +static Widget* window_newWidget(Window* w); static void widget_cleanup(Widget* widget); +static Window* window_get(const unsigned int wid); // Render. static void window_render(Window* w); static void toolkit_renderButton(Widget* btn, double bx, double by); @@ -69,56 +76,66 @@ static void toolkit_renderText(Widget* txt, double bx, double by); void window_addButton(const unsigned int wid, const int x, const int y, const int w, const int h, char* name, char* display, void (*call)(char*)) { - Widget* wgt = window_newWidget(wid); + Window* wdw = window_get(wid); + Widget* wgt = window_newWidget(wdw); wgt->type = WIDGET_BUTTON; wgt->name = strdup(name); wgt->string = strdup(display); // Set the properties. - wgt->x = (double) x; - wgt->y = (double) y; wgt->w = (double) w; wgt->h = (double) h; + if(x < 0) wgt->x = wdw->w - wgt->w + x; + else wgt->x = (double)x; + if(y < 0) wgt->y = wdw->h - wgt->h + y; + else wgt->y = (double)y; wgt->fptr = call; } void window_addText(const unsigned int wid, const int x, const int y, const int w, - const int h, char* name, glFont* font, glColour* colour) { - Widget* wgt = window_newWidget(wid); + const int centered, char* name, glFont* font, glColour* colour) { + + Window* wdw = window_get(wid); + Widget* wgt = window_newWidget(wdw); wgt->type = WIDGET_TEXT; wgt->name = strdup(name); // Display the widgets name. // Set the properties. - wgt->x = (double) x; - wgt->y = (double) y; wgt->w = (double) w; - wgt->h = (double) h; - wgt->font = font; + if(font == NULL) wgt->font = &gl_defFont; + else wgt->font = font; + if(x < 0) wgt->x = wdw->w - wgt->w + x; + else wgt->x = (double)x; + if(y < 0) wgt->y = wdw->h - wgt->font->h + y; + else wgt->y = (double) y; wgt->colour = colour; + wgt->centered = centered; } // Return pointer to newly allocated widget. -static Widget* window_newWidget(const unsigned int wid) { +static Widget* window_newWidget(Window* w) { + Widget* wgt = NULL; + + w->widgets = realloc(w->widgets, sizeof(Widget)*(++w->nwidgets)); + if(w->widgets == NULL) WARN("Out of memory"); + + wgt = &w->widgets[w->nwidgets - 1]; + + wgt->type = WIDGET_NULL; + wgt->status = WIDGET_STATUS_NORMAL; + return wgt; +} + +// Return the window of id wid. +static Window* window_get(const unsigned int wid) { int i; for(i = 0; i < nwindows; i++) if(windows[i].id == wid) - break; - - if(i == nwindows) return NULL; - - Widget* w = NULL; - - windows[i].widgets = realloc(windows[i].widgets, sizeof(Widget)*(++windows[i].nwidgets)); - if(windows[i].widgets == NULL) WARN("Out of memory"); - - w = &windows[i].widgets[windows[i].nwidgets - 1]; - - w->type = WIDGET_NULL; - w->status = WIDGET_STATUS_NORMAL; - return w; + return &windows[i]; + return NULL; } // Create a window. @@ -162,7 +179,7 @@ unsigned int window_create(const int x, const int y, const int w, const int h) { static void widget_cleanup(Widget* widget) { if(widget->name) free(widget->name); - if((widget->type == WIDGET_TEXT) && widget->string) + if((widget->type == WIDGET_BUTTON) && widget->string) free(widget->string); } @@ -365,6 +382,8 @@ static void window_render(Window* w) { case WIDGET_TEXT: toolkit_renderText(&w->widgets[i], x, y); break; + case WIDGET_IMAGE: + break; } } } @@ -372,7 +391,6 @@ static void window_render(Window* w) { static void toolkit_renderButton(Widget* btn, double bx, double by) { glColour* c, *dc, *oc, *lc; double x, y; - int j; x = bx + btn->x; y = by + btn->y; @@ -474,8 +492,16 @@ static void toolkit_renderButton(Widget* btn, double bx, double by) { } static void toolkit_renderText(Widget* txt, double bx, double by) { - gl_printMax(txt->font, txt->w, bx+(double)gl_screen.w/2. + txt->x, - by + (double)gl_screen.h/2. + txt->y, txt->colour, txt->name); + if(txt->centered) + gl_printMid(txt->font, txt->w, + bx + (double)gl_screen.w/2. + txt->x, + by + (double)gl_screen.h/2. + txt->y, + txt->colour, txt->name); + else + gl_printMax(txt->font, txt->w, + bx + (double)gl_screen.w/2. + txt->x, + by + (double)gl_screen.h/2. + txt->y, + txt->colour, txt->name); } // Render the window. diff --git a/src/toolkit.h b/src/toolkit.h index b601057..aa097a3 100644 --- a/src/toolkit.h +++ b/src/toolkit.h @@ -12,7 +12,8 @@ void window_addButton(const unsigned int wid, const int x, const int y, void(*call)(char*)); void window_addText(const unsigned int wid, const int x, const int y, - const int w, const int h, char* name, glFont* font, glColour* colour); + const int w, const int cenetered, + char* name, glFont* font, glColour* colour); // Destroy window. void window_destroy(const unsigned int wid);