DEADSOFTWARE

manager: remove flag 0x8000 from resource handle id
[flatwaifu.git] / src / gl / render.c
index 22bbcd99fa87e6f298419a021677baf85b43b349..c4da0dc3844e8644cb14ecdadf740ca49d989e9d 100644 (file)
@@ -80,8 +80,15 @@ typedef struct image {
 } 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;
@@ -150,10 +157,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];
@@ -533,7 +542,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) {
@@ -544,12 +553,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 +618,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);
@@ -621,10 +636,7 @@ 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);
 }
 
@@ -1031,11 +1043,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 +1337,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 +1352,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,7 +1864,9 @@ 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_full = Y_get_fullscreen();
+  screen_scale = max(1, screen_width / 320);
   root = R_cache_new();
   assert(root);
   R_alloc();
@@ -1929,10 +1942,35 @@ 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) {
@@ -1999,7 +2037,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) {
@@ -2021,9 +2059,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;
     }
@@ -2042,7 +2077,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;
@@ -2052,7 +2087,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;
@@ -2067,3 +2102,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];
+}