diff --git a/src/gl/render.c b/src/gl/render.c
index c057b90e4fa84bc6d0d1a7d3647089995c33c047..0dc1ac30144082ebe1a292f9bf0e419cfd42fe25 100644 (file)
--- a/src/gl/render.c
+++ b/src/gl/render.c
#include "view.h"
#include "switch.h" // sw_secrets
+#include "cp866.h"
+
#ifdef __APPLE__
# include <OpenGL/gl.h>
#else
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
#include <assert.h>
#define VGA_TRANSPARENT_COLOR 0
} 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;
{"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) {
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();
}
}
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);
/* --- 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;
}
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);
- }
- y = 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;
+ 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_printbf("%s", m->title);
- break;
- case GM_SMALL:
- yoff = 8;
- 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);
+ }
}
}
}
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();
static void R_draw_effects (void) {
enum {NONE, TFOG, IFOG, BUBL}; // copypasted from fx.c
int i, s;
+ glPointSize(screen_scale);
for (i = 0; i < MAXFX; ++i) {
switch (fx[i].t) {
case TFOG:
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;
}
}
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 R_video_menu_handler (new_msg_t *msg, const new_menu_t *m, void *data) {
- const videomode_t *v;
- intptr_t i = (intptr_t)data;
- static int w, h;
+static int video_menu_handler (menu_msg_t *msg, const menu_t *m, void *data, int i) {
+ static int cur;
+ static int w, h, fullscreen;
+ static char buf[16];
+ static int buflen;
static int vmode;
- static int fullscreen;
- static char str[16];
- switch (i) {
- case -1:
- switch (msg->type) {
- case GM_ENTER:
+ 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);
- 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(str, 16, "%ix%i", w, h);
- return 1;
- }
- break;
- case 0:
- switch (msg->type) {
- 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(str, 16, "%ix%i", w, h);
- return 1;
- case GM_GETSTR:
- return GM_init_str(msg, str, 16);
- }
- break;
- case 1:
- switch (msg->type) {
- case GM_SELECT: fullscreen = !fullscreen; return 1;
- case GM_GETSTR: return GM_init_str(msg, fullscreen ? "Yes" : "No", 3);
- }
- break;
- case 2:
- switch (msg->type) {
- case GM_SELECT: R_set_videomode(w, h, fullscreen); return 1;
- }
+ }
+ 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 0;
+ return simple_menu_handler(msg, i, __NUM__, &sm, &cur);
}
-static const new_menu_t video_menu = {
- GM_BIG, "Video", (void*)-1, &R_video_menu_handler,
- {
- { GM_BUTTON, "Videomode: ", (void*)0, &R_video_menu_handler, NULL },
- { GM_BUTTON, "Fullscreen: ", (void*)1, &R_video_menu_handler, NULL },
- { GM_BUTTON, "Apply", (void*)2, &R_video_menu_handler, NULL },
- { 0, NULL, NULL, NULL, NULL } // end
- }
+static const menu_t video_menu = {
+ NULL, &video_menu_handler
};
-const new_menu_t *R_menu (void) {
+const menu_t *R_menu (void) {
return &video_menu;
}
+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];
+}