DEADSOFTWARE

render: opengl: add screen scaling
[flatwaifu.git] / src / gl / render.c
index ca9d4519b125364de58d5a3b53adf12348fc006e..f0619ba5ccfa89b5862939bfdfe14b5fdfbc42dc 100644 (file)
@@ -80,8 +80,11 @@ typedef struct image {
 } image;
 
 /* Render Specific */
-int SCRW = 320; // public
-int SCRH = 200; // public
+static int SCRW = 320;
+static int SCRH = 200;
+static int screen_width = 320;
+static int screen_height = 200;
+static float screen_scale = 1.0;
 static rgb playpal[256];
 static byte bright[256];
 static GLuint lastTexture;
@@ -544,12 +547,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 +612,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);
@@ -781,7 +790,7 @@ static image *PL_getspr (int s, int d, int msk) {
 #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);
@@ -789,7 +798,7 @@ static void get_entry_size (const new_menu_t *m, int i, int *w, int *h) {
   int x = 0;
   int y = 0;
   int type = 0;
-  new_msg_t msg;
+  menu_msg_t msg;
   msg.type = GM_GETENTRY;
   assert(GM_send(m, i, &msg));
   type = msg.integer.i;
@@ -848,12 +857,12 @@ static void get_entry_size (const new_menu_t *m, int i, int *w, int *h) {
   *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, n, x, y, xx, yy, type;
-  new_msg_t msg;
+  menu_msg_t msg;
   msg.type = GM_QUERY;
   if (GM_send_this(m, &msg)) {
     n = msg.integer.b;
@@ -883,8 +892,8 @@ static void get_menu_size (const new_menu_t *m, int *w, int *h) {
 
 static int GM_draw (void) {
   int i, j, n, x, y, xoff, yoff, cur, w, type, recv;
-  const new_menu_t *m = GM_get();
-  new_msg_t msg;
+  const menu_t *m = GM_get();
+  menu_msg_t msg;
   if (m != NULL) {
     get_menu_size(m, &x, &y);
     x = SCRW / 2 - x / 2;
@@ -1031,11 +1040,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();
@@ -1325,6 +1334,7 @@ static void R_draw_smoke (void) {
 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:
@@ -1339,10 +1349,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,81 +1861,80 @@ 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_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;
 }