diff --git a/src/gl/render.c b/src/gl/render.c
index f0619ba5ccfa89b5862939bfdfe14b5fdfbc42dc..e38e63c9184730c4daeb6911df6cb1b3aa122605 100644 (file)
--- a/src/gl/render.c
+++ b/src/gl/render.c
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
#include "glob.h"
#include "render.h"
#include "system.h"
#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"
} image;
/* Render Specific */
-static int SCRW = 320;
-static int SCRH = 200;
+static int SCRW;
+static int SCRH;
+static float screen_scale;
static int screen_width = 320;
static int screen_height = 200;
-static float screen_scale = 1.0;
+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;
{"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];
}
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) {
/* --- 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);
}
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;
}
}
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_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];
@@ -1930,18 +1950,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) {
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) {
};
} 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;
}
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;
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;
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];
+}