diff --git a/src/gl/render.c b/src/gl/render.c
index bfd379c146f84a8f4d63e06a717806b6053638b6..ca9d4519b125364de58d5a3b53adf12348fc006e 100644 (file)
--- a/src/gl/render.c
+++ b/src/gl/render.c
#include "view.h"
#include "switch.h" // sw_secrets
#include "view.h"
#include "switch.h" // sw_secrets
+#include "cp866.h"
+
#ifdef __APPLE__
# include <OpenGL/gl.h>
#else
#ifdef __APPLE__
# include <OpenGL/gl.h>
#else
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
#include <assert.h>
#define VGA_TRANSPARENT_COLOR 0
#include <assert.h>
#define VGA_TRANSPARENT_COLOR 0
/* Render Specific */
int SCRW = 320; // public
int SCRH = 200; // public
/* Render Specific */
int SCRW = 320; // public
int SCRH = 200; // public
-static int gamma;
-static int fullscreen;
static rgb playpal[256];
static byte bright[256];
static GLuint lastTexture;
static rgb playpal[256];
static byte bright[256];
static GLuint lastTexture;
static image *Z_get_char_image (image *img, int ch) {
image *p = NULL;
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 (ch > 32 && ch < 160) {
p = &img[ch - '!'];
- if (p->n == NULL) {
- p = &img[toupper(ch) - '!'];
- }
}
return p;
}
}
return p;
}
return msk ? &plr_msk[i] : &plr_spr[i];
}
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
#define SCROLLER_MIDDLE 10
#define TEXTFIELD_MIDDLE 2
assert(i >= 0);
assert(w != NULL);
assert(h != NULL);
assert(i >= 0);
assert(w != NULL);
assert(h != NULL);
- int x, y;
+ int x = 0;
+ int y = 0;
+ int type = 0;
new_msg_t msg;
new_msg_t msg;
- switch (m->entries[i].type) {
+ 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:
case GM_BUTTON:
case GM_SCROLLER:
case GM_TEXTFIELD:
case GM_TEXTFIELD_BUTTON:
- x = Z_get_big_string_width("%s", m->entries[i].caption);
+ 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:
break;
case GM_SMALL_BUTTON:
- x = Z_get_small_string_width("%s", m->entries[i].caption);
+ 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);
}
break;
default:
assert(0);
}
- switch (m->entries[i].type) {
+ switch (type) {
case GM_BUTTON:
msg.type = GM_GETSTR;
if (GM_send(m, i, &msg)) {
case GM_BUTTON:
msg.type = GM_GETSTR;
if (GM_send(m, i, &msg)) {
assert(m != NULL);
assert(w != NULL);
assert(h != NULL);
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;
+ new_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) {
}
static int GM_draw (void) {
- int i, j, xoff, yoff, n, x, y, cur, curoff, w, recv;
+ int i, j, n, x, y, xoff, yoff, cur, w, type, recv;
const new_menu_t *m = GM_get();
new_msg_t msg;
if (m != NULL) {
const new_menu_t *m = GM_get();
new_msg_t msg;
if (m != NULL) {
x = SCRW / 2 - x / 2;
y = SCRH / 2 - y / 2;
// --- title ---
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_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)) {
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);
+ }
}
}
}
}
}
}
Y_swap_buffers();
}
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");
char s[10];
int i, j, n;
logo("R_alloc: load graphics\n");
if (was == 0) {
ERR_failinit("Unable to set video mode\n");
}
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);
root = R_cache_new();
assert(root);
Y_get_videomode(&SCRW, &SCRH);
root = R_cache_new();
assert(root);
R_reload_textures();
}
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 vmode;
+ static int fullscreen;
+ static char str[16];
+ switch (i) {
+ case -1:
+ switch (msg->type) {
+ case 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(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;
+ }
+ }
+ return 0;
+}
+
+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
+ }
+};
+
+const new_menu_t *R_menu (void) {
+ return &video_menu;
+}
+
void R_init (void) {
logo("R_init: intialize opengl render\n");
R_init_playpal();
void R_init (void) {
logo("R_init: intialize opengl render\n");
R_init_playpal();
- R_set_videomode(SCRW, SCRH, fullscreen);
+ R_set_videomode(SCRW, SCRH, 0);
}
void R_done (void) {
}
void R_done (void) {
root = NULL;
}
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) {
void R_get_name (int n, char s[8]) {
assert(n >= 0 && n < 256);
if (walp[n].res == -1) {