X-Git-Url: https://deadsoftware.ru/gitweb?p=flatwaifu.git;a=blobdiff_plain;f=src%2Fgl%2Frender.c;h=68ab733d1da170d5e1b4ef6fd32be59d2a5a8903;hp=22bbcd99fa87e6f298419a021677baf85b43b349;hb=c0bb00824a48b78aee7140e3fa89ac69d59d7296;hpb=871d5f9b9cba5125dc65e52d6352730b9b650ba7 diff --git a/src/gl/render.c b/src/gl/render.c index 22bbcd9..68ab733 100644 --- a/src/gl/render.c +++ b/src/gl/render.c @@ -1,3 +1,18 @@ +/* Copyright (C) 2020 SovietPony + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License ONLY. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "glob.h" #include "render.h" #include "system.h" @@ -11,8 +26,8 @@ #include "dots.h" #include "items.h" -#include "sound.h" // snd_vol -#include "music.h" // mus_vol +#include "sound.h" +#include "music.h" #include "fx.h" #include "player.h" @@ -80,8 +95,15 @@ typedef struct image { } image; /* Render Specific */ -int SCRW = 320; // public -int SCRH = 200; // public +static int SCRW; +static int SCRH; +static float screen_scale; +static int screen_width = 320; +static int screen_height = 200; +static byte screen_full = 0; +static int init_screen_width = 0; +static int init_screen_height = 0; +static byte init_screen_full = 0xFF; static rgb playpal[256]; static byte bright[256]; static GLuint lastTexture; @@ -150,10 +172,12 @@ static const char *anm[ANIT - 1][5] = { {"W73A_1", "W73A_2", NULL, NULL, NULL}, {"RP2_1", "RP2_2", "RP2_3", "RP2_4", NULL} }; +static byte w_horiz = 1; static int max_wall_width; static int max_wall_height; static int max_textures; static image walp[256]; +static byte walswp[256]; static byte walani[256]; static image anip[ANIT][5]; static byte anic[ANIT]; @@ -533,7 +557,7 @@ static image R_gl_loadimage (const char name[8]) { } static image R_gl_get_special_spr (const char n[4], int s, int d, rgba *(*fn)(vgaimg*)) { - return R_gl_get_special_image(F_getsprid(n, s, d), fn); + return R_gl_get_special_image(F_getsprid(n, s, d, NULL), fn); } static void R_gl_free_image (image *img) { @@ -544,12 +568,16 @@ static void R_gl_free_image (image *img) { img->res = -1; } -static void R_gl_draw_quad (int x, int y, int w, int h) { - glBegin(GL_QUADS); +static void R_gl_quad_vetexes (int x, int y, int w, int h) { glVertex2i(x + w, y); glVertex2i(x, y); glVertex2i(x, y + h); glVertex2i(x + w, y + h); +} + +static void R_gl_draw_quad (int x, int y, int w, int h) { + glBegin(GL_QUADS); + R_gl_quad_vetexes(x, y, w, h); glEnd(); } @@ -605,12 +633,14 @@ static void R_gl_set_color (byte c) { } static void R_gl_setclip (int x, int y, int w, int h) { - glScissor(x, SCRH - h - y, w, h); + glScissor(x * screen_scale, (SCRH - h - y) * screen_scale, w * screen_scale, h * screen_scale); } static void R_gl_setmatrix (void) { - glScissor(0, 0, SCRW, SCRH); - glViewport(0, 0, SCRW, SCRH); + SCRW = screen_width / screen_scale; + SCRH = screen_height / screen_scale; + glScissor(0, 0, screen_width, screen_height); + glViewport(0, 0, screen_width, screen_height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, SCRW, SCRH, 0, 0, 1); @@ -621,10 +651,7 @@ static void R_gl_setmatrix (void) { /* --- Misc --- */ static image Z_getspr (const char n[4], int s, int d, char *dir) { - int h = F_getsprid(n, s, d); - if (dir != NULL) { - *dir = (h & 0x8000) ? 1 : 0; - } + int h = F_getsprid(n, s, d, dir); return R_gl_getimage(h); } @@ -791,58 +818,59 @@ static void get_entry_size (const menu_t *m, int i, int *w, int *h) { int type = 0; menu_msg_t msg; msg.type = GM_GETENTRY; - assert(GM_send(m, i, &msg)); - type = msg.integer.i; - switch (type) { - case GM_BUTTON: - case GM_SCROLLER: - case GM_TEXTFIELD: - case GM_TEXTFIELD_BUTTON: - msg.type = GM_GETCAPTION; - if (GM_send(m, i, &msg)) { - x = Z_get_big_string_width("%.*s", msg.string.maxlen, msg.string.s); - } - break; - case GM_SMALL_BUTTON: - msg.type = GM_GETCAPTION; - if (GM_send(m, i, &msg)) { - x = Z_get_small_string_width("%.*s", msg.string.maxlen, msg.string.s); - } - break; - default: - assert(0); - } - switch (type) { - case GM_BUTTON: - msg.type = GM_GETSTR; - if (GM_send(m, i, &msg)) { - x += Z_get_big_string_width("%.*s", msg.string.maxlen, msg.string.s); - } - y = 16; - break; - case GM_SMALL_BUTTON: - msg.type = GM_GETSTR; - if (GM_send(m, i, &msg)) { - x += Z_get_big_string_width("%.*s", msg.string.maxlen, msg.string.s); - } - y = 12; - break; - case GM_SCROLLER: - x += (SCROLLER_MIDDLE + 2) * 8; - y = 16; - break; - case GM_TEXTFIELD: - case GM_TEXTFIELD_BUTTON: - msg.type = GM_GETSTR; - if (GM_send(m, i, &msg)) { - x += (msg.string.maxlen + 2) * 8; - } else { - x += (TEXTFIELD_MIDDLE + 2) * 8; - } - y = 16; - break; - default: - assert(0); + if (GM_send(m, i, &msg)) { + type = msg.integer.i; + switch (type) { + case GM_BUTTON: + case GM_SCROLLER: + case GM_TEXTFIELD: + case GM_TEXTFIELD_BUTTON: + msg.type = GM_GETCAPTION; + if (GM_send(m, i, &msg)) { + x = Z_get_big_string_width("%.*s", msg.string.maxlen, msg.string.s); + } + break; + case GM_SMALL_BUTTON: + msg.type = GM_GETCAPTION; + if (GM_send(m, i, &msg)) { + x = Z_get_small_string_width("%.*s", msg.string.maxlen, msg.string.s); + } + break; + default: + assert(0); + } + switch (type) { + case GM_BUTTON: + msg.type = GM_GETSTR; + if (GM_send(m, i, &msg)) { + x += Z_get_big_string_width("%.*s", msg.string.maxlen, msg.string.s); + } + y = 16; + break; + case GM_SMALL_BUTTON: + msg.type = GM_GETSTR; + if (GM_send(m, i, &msg)) { + x += Z_get_big_string_width("%.*s", msg.string.maxlen, msg.string.s); + } + y = 12; + break; + case GM_SCROLLER: + x += (SCROLLER_MIDDLE + 2) * 8; + y = 16; + break; + case GM_TEXTFIELD: + case GM_TEXTFIELD_BUTTON: + msg.type = GM_GETSTR; + if (GM_send(m, i, &msg)) { + x += (msg.string.maxlen + 2) * 8; + } else { + x += (TEXTFIELD_MIDDLE + 2) * 8; + } + y = 16; + break; + default: + assert(0); + } } *w = x; *h = y; @@ -1031,11 +1059,11 @@ static void R_draw_dots (void) { glDisable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_TEXTURE_2D); - glBegin(GL_POINTS); + glBegin(GL_QUADS); for (i = 0; i < MAXDOT; i++) { if (dot[i].t != 0) { R_gl_set_color(dot[i].c); - glVertex2i(dot[i].o.x, dot[i].o.y + 1); + R_gl_quad_vetexes(dot[i].o.x, dot[i].o.y, 1, 1); } } glEnd(); @@ -1339,10 +1367,8 @@ static void R_draw_effects (void) { glDisable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_TEXTURE_2D); - glBegin(GL_POINTS); R_gl_set_color(0xC0 + fx[i].s); - glVertex2i(fx[i].x >> 8, (fx[i].y >> 8) + 1); - glEnd(); + R_gl_draw_quad(fx[i].x >> 8, fx[i].y >> 8, 1, 1); break; } } @@ -1853,14 +1879,16 @@ void R_set_videomode (int w, int h, int fullscreen) { ERR_failinit("Unable to set video mode\n"); } } - Y_get_videomode(&SCRW, &SCRH); + Y_get_videomode(&screen_width, &screen_height); + screen_full = Y_get_fullscreen(); + screen_scale = max(1, screen_width / 320); root = R_cache_new(); assert(root); R_alloc(); R_reload_textures(); } -static int video_menu_handler (menu_msg_t *msg, const menu_t *m, void *data, int i) { +static int video_menu_handler (menu_msg_t *msg, const menu_t *m, int i) { static int cur; static int w, h, fullscreen; static char buf[16]; @@ -1921,18 +1949,40 @@ static int video_menu_handler (menu_msg_t *msg, const menu_t *m, void *data, int return simple_menu_handler(msg, i, __NUM__, &sm, &cur); } -static const menu_t video_menu = { - NULL, &video_menu_handler -}; - const menu_t *R_menu (void) { - return &video_menu; + static const menu_t m = { video_menu_handler }; + return &m; +} + +const cfg_t *R_args (void) { + static const cfg_t args[] = { + { "fullscr", &init_screen_full, Y_SW_ON }, + { "window", &init_screen_full, Y_SW_OFF }, + { "width", &init_screen_width, Y_DWORD }, + { "height", &init_screen_height, Y_DWORD }, + { NULL, NULL, 0 } // end + }; + return args; +} + +const cfg_t *R_conf (void) { + static const cfg_t conf[] = { + { "sky", &w_horiz, Y_SW_ON }, + { "fullscreen", &screen_full, Y_SW_ON }, + { "screen_width", &screen_width, Y_DWORD }, + { "screen_height", &screen_height, Y_DWORD }, + { NULL, NULL, 0 } // end + }; + return conf; } void R_init (void) { logo("R_init: intialize opengl render\n"); R_init_playpal(); - R_set_videomode(SCRW, SCRH, 0); + init_screen_width = init_screen_width > 0 ? init_screen_width : screen_width; + init_screen_height = init_screen_height > 0 ? init_screen_height : screen_height; + init_screen_full = init_screen_full != 0xFF ? init_screen_full : screen_full; + R_set_videomode(init_screen_width, init_screen_height, init_screen_full); } void R_done (void) { @@ -1999,7 +2049,7 @@ void R_begin_load (void) { max_textures = 1; } -void R_load (char s[8], int f) { +void R_load (char s[8]) { assert(max_textures < 256); if (!s[0]) { walp[max_textures] = (image) { @@ -2021,9 +2071,6 @@ void R_load (char s[8], int f) { }; } else { walp[max_textures] = R_gl_loadimage(s); - if (f) { - walp[max_textures].res |= 0x8000; - } if (s[0] == 'S' && s[1] == 'W' && s[4] == '_') { walswp[max_textures] = 0; } @@ -2042,7 +2089,7 @@ void R_end_load (void) { if (walswp[i] == 0) { R_get_name(i, s); s[5] ^= 1; - g = F_getresid(s) | (walp[i].res & 0x8000); + g = F_getresid(s); k = 1; while (k < 256 && walp[k].res != g) { k += 1; @@ -2052,7 +2099,7 @@ void R_end_load (void) { j += 1; max_textures += 1; walp[k] = R_gl_getimage(g); - walf[k] = g & 0x8000 ? 1 : 0; + walf[k] = walf[i]; } walswp[i] = k; walswp[k] = i; @@ -2067,3 +2114,14 @@ void R_loadsky (int sky) { R_gl_free_image(&horiz); horiz = R_gl_loadimage(s); } + +void R_switch_texture (int x, int y) { + assert(x >= 0 && x < FLDW); + assert(y >= 0 && y < FLDH); + fldb[y][x] = walswp[fldb[y][x]]; +} + +int R_get_swp (int n) { + assert(n >= 0 && n < 256); + return walswp[n]; +}