X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=inline;f=src%2Fgl%2Frender.c;h=948a7b5cc8d3abb22ffd6484fde0957fa3c0d201;hb=06c726c585fe8bb4a7b61d9d7b100f4da371a4e6;hp=bfd379c146f84a8f4d63e06a717806b6053638b6;hpb=ed5485b32c76bbe0cbb37ca1da2fbf5e99237bff;p=flatwaifu.git
diff --git a/src/gl/render.c b/src/gl/render.c
index bfd379c..948a7b5 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"
@@ -22,6 +37,8 @@
#include "view.h"
#include "switch.h" // sw_secrets
+#include "cp866.h"
+
#ifdef __APPLE__
# include
#else
@@ -30,7 +47,6 @@
#include
#include
#include
-#include
#include
#define VGA_TRANSPARENT_COLOR 0
@@ -79,10 +95,15 @@ typedef struct image {
} image;
/* Render Specific */
-int SCRW = 320; // public
-int SCRH = 200; // public
-static int gamma;
-static int fullscreen;
+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;
@@ -151,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];
@@ -534,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) {
@@ -606,12 +629,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);
@@ -622,20 +647,15 @@ 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);
}
static image *Z_get_char_image (image *img, int ch) {
image *p = NULL;
+ ch = cp866_toupper(ch);
if (ch > 32 && ch < 160) {
p = &img[ch - '!'];
- if (p->n == NULL) {
- p = &img[toupper(ch) - '!'];
- }
}
return p;
}
@@ -781,190 +801,208 @@ static image *PL_getspr (int s, int d, int msk) {
return msk ? &plr_msk[i] : &plr_spr[i];
}
-static int count_menu_entries (const new_menu_t *m) {
- assert(m != NULL);
- int i = 0;
- while (m->entries[i].type != 0) {
- i += 1;
- }
- return i;
-}
-
#define SCROLLER_MIDDLE 10
#define TEXTFIELD_MIDDLE 2
-static void get_entry_size (const new_menu_t *m, int i, int *w, int *h) {
+static void get_entry_size (const menu_t *m, int i, int *w, int *h) {
assert(m != NULL);
assert(i >= 0);
assert(w != NULL);
assert(h != NULL);
- int x, y;
- new_msg_t msg;
- switch (m->entries[i].type) {
- case GM_BUTTON:
- case GM_SCROLLER:
- case GM_TEXTFIELD:
- case GM_TEXTFIELD_BUTTON:
- x = Z_get_big_string_width("%s", m->entries[i].caption);
- break;
- case GM_SMALL_BUTTON:
- x = Z_get_small_string_width("%s", m->entries[i].caption);
- break;
- default:
- assert(0);
- }
- switch (m->entries[i].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);
+ int x = 0;
+ int y = 0;
+ int type = 0;
+ menu_msg_t msg;
+ msg.type = GM_GETENTRY;
+ 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;
}
-static void get_menu_size (const new_menu_t *m, int *w, int *h) {
+static void get_menu_size (const menu_t *m, int *w, int *h) {
assert(m != NULL);
assert(w != NULL);
assert(h != NULL);
- int i, x, y, xx, yy;
- int n = count_menu_entries(m);
- switch (m->type) {
- case GM_BIG: x = Z_get_big_string_width("%s", m->title); break;
- case GM_SMALL: x = Z_get_small_string_width("%s", m->title); break;
- default: assert(0);
- }
- for (i = 0; i < n; i++) {
- get_entry_size(m, i, &xx, &yy);
- x = max(x, xx);
- y += yy;
+ int i, n, x, y, xx, yy, type;
+ menu_msg_t msg;
+ msg.type = GM_QUERY;
+ if (GM_send_this(m, &msg)) {
+ n = msg.integer.b;
+ type = msg.integer.s;
+ x = 0;
+ y = 0;
+ msg.type = GM_GETTITLE;
+ if (GM_send_this(m, &msg)) {
+ switch (type) {
+ case GM_BIG: x = Z_get_big_string_width("%.*s", msg.string.maxlen, msg.string.s); break;
+ case GM_SMALL: x = Z_get_small_string_width("%.*s", msg.string.maxlen, msg.string.s); break;
+ default: assert(0);
+ }
+ }
+ for (i = 0; i < n; i++) {
+ get_entry_size(m, i, &xx, &yy);
+ x = max(x, xx);
+ y += yy;
+ }
+ *w = x;
+ *h = y;
+ } else {
+ *w = 0;
+ *h = 0;
}
- *w = x;
- *h = y;
}
static int GM_draw (void) {
- int i, j, xoff, yoff, n, x, y, cur, curoff, w, recv;
- const new_menu_t *m = GM_get();
- new_msg_t msg;
+ int i, j, n, x, y, xoff, yoff, cur, w, type, recv;
+ const menu_t *m = GM_get();
+ menu_msg_t msg;
if (m != NULL) {
get_menu_size(m, &x, &y);
x = SCRW / 2 - x / 2;
y = SCRH / 2 - y / 2;
// --- title ---
- switch (m->type) {
- case GM_BIG:
- yoff = 20;
- Z_gotoxy(x, y - 10);
- Z_printbf("%s", m->title);
- break;
- case GM_SMALL:
- yoff = 8;
+ msg.type = GM_QUERY;
+ if (GM_send_this(m, &msg)) {
+ cur = msg.integer.i;
+ n = msg.integer.a;
+ type = msg.integer.s;
+ msg.type = GM_GETTITLE;
+ if (GM_send_this(m, &msg)) {
Z_gotoxy(x, y - 10);
- Z_printsf("%s", m->title);
- break;
- default:
- assert(0);
- }
- // --- entries ---
- curoff = yoff;
- cur = GM_geti();
- n = count_menu_entries(m);
- for (i = 0; i < n; i++) {
- if (i == cur) {
- curoff = yoff;
- if (m->entries[cur].type == GM_SMALL_BUTTON) {
- Z_gotoxy(x - 8, y + curoff);
- Z_printsf(">");
- } else {
- R_gl_draw_image(&msklh[(gm_tm / 6) & 1], x - 25, y + curoff - 8, 0);
+ switch (type) {
+ case GM_SMALL: yoff = 8; Z_printsf("%.*s", msg.string.maxlen, msg.string.s); break;
+ case GM_BIG: yoff = 20; Z_printbf("%.*s", msg.string.maxlen, msg.string.s); break;
+ default: assert(0);
}
+ } else {
+ yoff = 0;
}
- switch (m->entries[i].type) {
- case GM_BUTTON:
- Z_gotoxy(x, y + yoff);
- w = Z_printbf("%s", m->entries[i].caption);
- msg.type = GM_GETSTR;
- if (GM_send(m, i, &msg)) {
- Z_gotoxy(x + w, y + yoff);
- Z_printbf("%.*s", msg.string.maxlen, msg.string.s);
+ for (i = 0; i < n; i++) {
+ msg.type = GM_GETENTRY;
+ if (GM_send(m, i, &msg)) {
+ type = msg.integer.i;
+ if (i == cur) {
+ if (type == GM_SMALL_BUTTON) {
+ Z_gotoxy(x - 8, y + yoff);
+ Z_printsf(">");
+ } else {
+ R_gl_draw_image(&msklh[(gm_tm / 6) & 1], x - 25, y + yoff - 8, 0);
+ }
}
- yoff += 16;
- break;
- case GM_SMALL_BUTTON:
- Z_gotoxy(x, y + yoff);
- w = Z_printsf("%s", m->entries[i].caption);
- msg.type = GM_GETSTR;
+ msg.type = GM_GETCAPTION;
if (GM_send(m, i, &msg)) {
- Z_gotoxy(x + w, y + yoff);
- Z_printsf("%.*s", msg.string.maxlen, msg.string.s);
- }
- yoff += 12;
- break;
- case GM_TEXTFIELD:
- case GM_TEXTFIELD_BUTTON:
- msg.type = GM_GETSTR;
- recv = GM_send(m, i, &msg);
- Z_gotoxy(x, y + yoff);
- xoff = Z_printbf("%s", m->entries[i].caption);
- yoff += 9;
- w = (recv ? msg.string.maxlen : TEXTFIELD_MIDDLE) + 1;
- R_gl_draw_image(&mslotl, x + xoff, y + yoff, 0);
- for (j = 1; j < w; j++) {
- R_gl_draw_image(&mslotm, x + xoff + j * 8, y + yoff, 0);
- }
- R_gl_draw_image(&mslotr, x + xoff + j * 8, y + yoff, 0);
- Z_gotoxy(x + xoff + 4, y + yoff - 7);
- if (input && i == cur) {
- Z_printsf("%.*s_", imax, ibuf);
- } else if (recv) {
- Z_printsf("%.*s", msg.string.maxlen, msg.string.s);
- }
- yoff += 7;
- break;
- case GM_SCROLLER:
- Z_gotoxy(x, y + yoff);
- xoff = Z_printbf("%s", m->entries[i].caption);
- R_gl_draw_image(&mbarl, x + xoff, y + yoff, 0);
- for (j = 1; j < SCROLLER_MIDDLE + 1; j++) {
- R_gl_draw_image(&mbarm, x + xoff + j * 8, y + yoff, 0);
+ Z_gotoxy(x, y + yoff);
+ if (type == GM_SMALL_BUTTON) {
+ xoff = Z_printsf("%.*s", msg.string.maxlen, msg.string.s);
+ } else {
+ xoff = Z_printbf("%.*s", msg.string.maxlen, msg.string.s);
+ }
+ } else {
+ xoff = 0;
}
- R_gl_draw_image(&mbarr, x + xoff + j * 8, y + yoff, 0);
- msg.type = GM_GETINT;
- if (GM_send(m, i, &msg)) {
- int lev = (msg.integer.i - msg.integer.a) * ((SCROLLER_MIDDLE - 1) * 8) / msg.integer.b;
- R_gl_draw_image(&mbaro, x + xoff + lev + 8, y + yoff, 0);
+ switch (type) {
+ case GM_BUTTON:
+ case GM_SMALL_BUTTON:
+ msg.type = GM_GETSTR;
+ if (GM_send(m, i, &msg)) {
+ Z_gotoxy(x + xoff, y + yoff);
+ if (type == GM_SMALL_BUTTON) {
+ Z_printsf("%.*s", msg.string.maxlen, msg.string.s);
+ } else {
+ Z_printbf("%.*s", msg.string.maxlen, msg.string.s);
+ }
+ }
+ yoff += type == GM_BUTTON ? 16 : 12;
+ break;
+ case GM_TEXTFIELD:
+ case GM_TEXTFIELD_BUTTON:
+ yoff += 9;
+ msg.type = GM_GETSTR;
+ recv = GM_send(m, i, &msg);
+ w = recv ? msg.string.maxlen : TEXTFIELD_MIDDLE;
+ R_gl_draw_image(&mslotl, x + xoff, y + yoff, 0);
+ for (j = 1; j <= w; j++) {
+ R_gl_draw_image(&mslotm, x + xoff + j * 8, y + yoff, 0);
+ }
+ R_gl_draw_image(&mslotr, x + xoff + j * 8, y + yoff, 0);
+ Z_gotoxy(x + xoff + 4, y + yoff - 7);
+ if (input && i == cur) {
+ Z_printsf("%.*s_", imax, ibuf);
+ } else if (recv) {
+ Z_printsf("%.*s", msg.string.maxlen, msg.string.s);
+ }
+ yoff += 7;
+ break;
+ case GM_SCROLLER:
+ R_gl_draw_image(&mbarl, x + xoff, y + yoff, 0);
+ for (j = 1; j < SCROLLER_MIDDLE; j++) {
+ R_gl_draw_image(&mbarm, x + xoff + j * 8, y + yoff, 0);
+ }
+ R_gl_draw_image(&mbarr, x + xoff + j * 8, y + yoff, 0);
+ msg.type = GM_GETINT;
+ if (GM_send(m, i, &msg)) {
+ int lev = (msg.integer.i - msg.integer.a) * ((SCROLLER_MIDDLE - 2) * 8) / msg.integer.b;
+ R_gl_draw_image(&mbaro, x + xoff + lev + 8, y + yoff, 0);
+ }
+ yoff += 16;
+ break;
+ default:
+ assert(0);
}
- yoff += 16;
- break;
- default:
- assert(0);
+ }
}
}
}
@@ -1017,11 +1055,15 @@ 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);
+ int x = dot[i].o.x;
+ int y = dot[i].o.y;
+ R_gl_set_color(dot[i].c); glVertex2i(x + 1, y);
+ R_gl_set_color(dot[i].c); glVertex2i(x, y);
+ R_gl_set_color(dot[i].c); glVertex2i(x, y + 1);
+ R_gl_set_color(dot[i].c); glVertex2i(x + 1, y + 1);
}
}
glEnd();
@@ -1099,7 +1141,7 @@ static int wpnspr (player_t *p) {
}
static void R_draw_player (player_t *p) {
- enum {STAND, GO, DIE, SLOP, DEAD, MESS, OUT, FALL}; // copypasted from player.c!
+ enum {STAND, GO, DIE, SLOP, DEAD, MESS, OUT_, FALL}; // copypasted from player.c!
static const int wytab[] = {-1, -2, -1, 0};
int s = 'A';
int w = 0;
@@ -1145,7 +1187,7 @@ static void R_draw_player (player_t *p) {
case SLOP:
s = plr_slopanim[p->s];
break;
- case OUT:
+ case OUT_:
s = 0;
break;
}
@@ -1325,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;
}
}
@@ -1598,7 +1638,7 @@ void R_draw (void) {
Y_swap_buffers();
}
-void R_alloc (void) {
+static void R_alloc (void) {
char s[10];
int i, j, n;
logo("R_alloc: load graphics\n");
@@ -1838,30 +1878,111 @@ void R_set_videomode (int w, int h, int fullscreen) {
if (was == 0) {
ERR_failinit("Unable to set video mode\n");
}
- } else {
- Y_get_videomode(&SCRW, &SCRH);
- root = R_cache_new();
- assert(root);
- R_alloc();
- R_reload_textures();
}
-}
-
-void R_toggle_fullscreen (void) {
- R_cache_free(root, 0);
- Y_set_fullscreen(!Y_get_fullscreen());
- fullscreen = Y_get_fullscreen();
- 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, int i) {
+ static int cur;
+ static int w, h, fullscreen;
+ static char buf[16];
+ static int buflen;
+ static int vmode;
+ const videomode_t *v;
+ enum { VIDEOMODE, FULLSCREEN, APPLY, __NUM__ };
+ static const simple_menu_t sm = {
+ GM_BIG, "Video", NULL,
+ {
+ { "Mode: ", NULL },
+ { "Fullscreen: ", NULL },
+ { "Apply ", NULL },
+ }
+ };
+ if (msg->type == GM_ENTER) {
+ Y_get_videomode(&w, &h);
+ fullscreen = Y_get_fullscreen();
+ v = Y_get_videomode_list_opengl(fullscreen);
+ vmode = 0;
+ while (vmode < v->n && v->modes[vmode].w != w && v->modes[vmode].h != h) {
+ vmode += 1;
+ }
+ if (vmode < v->n) {
+ w = v->modes[vmode].w;
+ h = v->modes[vmode].h;
+ }
+ snprintf(buf, 16, "%ix%i", w, h);
+ buflen = strlen(buf);
+ return 1;
+ }
+ if (i == VIDEOMODE) {
+ switch (msg->type) {
+ case GM_GETSTR: return GM_init_str(msg, buf, buflen);
+ case GM_SELECT:
+ v = Y_get_videomode_list_opengl(fullscreen);
+ vmode = vmode + 1 >= v->n ? 0 : vmode + 1;
+ if (v->n > 0) {
+ w = v->modes[vmode].w;
+ h = v->modes[vmode].h;
+ } else {
+ Y_get_videomode(&w, &h);
+ }
+ snprintf(buf, 16, "%ix%i", w, h);
+ buflen = strlen(buf);
+ return 1;
+ }
+ } else if (i == FULLSCREEN) {
+ switch (msg->type) {
+ case GM_GETSTR: return GM_init_str(msg, fullscreen ? "Yes" : "No ", 3);
+ case GM_SELECT: fullscreen = !fullscreen; return 1;
+ }
+ } else if (i == APPLY) {
+ switch (msg->type) {
+ case GM_SELECT: R_set_videomode(w, h, fullscreen); return 1;
+ }
+ }
+ return simple_menu_handler(msg, i, __NUM__, &sm, &cur);
+}
+
+const menu_t *R_menu (void) {
+ 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, fullscreen);
+ 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) {
@@ -1870,14 +1991,6 @@ void R_done (void) {
root = NULL;
}
-void R_setgamma (int g) {
- gamma = g < 0 ? 0 : (g > 4 ? 4 : g);
-}
-
-int R_getgamma (void) {
- return gamma;
-}
-
void R_get_name (int n, char s[8]) {
assert(n >= 0 && n < 256);
if (walp[n].res == -1) {
@@ -1894,7 +2007,7 @@ void R_get_name (int n, char s[8]) {
static short getani (char n[8]) {
short i = 0;
- while (i < ANIT - 1 && strncasecmp(n, anm[i][0], 8) != 0) {
+ while (i < ANIT - 1 && cp866_strncasecmp(n, anm[i][0], 8) != 0) {
i++;
}
return i < ANIT - 1 ? i + 1 : 0;
@@ -1936,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) {
@@ -1947,7 +2060,7 @@ void R_load (char s[8], int f) {
.h = 0,
.res = -1,
};
- } else if (strncasecmp(s, "_WATER_", 7) == 0) {
+ } else if (cp866_strncasecmp(s, "_WATER_", 7) == 0) {
walp[max_textures] = (image) {
.n = (void*)((intptr_t)s[7] - '0' + 1),
.x = 0,
@@ -1958,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;
}
@@ -1979,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;
@@ -1989,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;
@@ -2004,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];
+}