DEADSOFTWARE

gl: fix invalid color cache
[d2df-sdl.git] / src / game / renders / opengl / r_map.pas
index a1d781c5bf7f502aee87e3691457fa14f9c97657..1d9a0f3caed772cdf073b79d83aa559b0c968435 100644 (file)
@@ -236,6 +236,7 @@ implementation
 
   var
     DebugCameraScale: Single;
+    FillOutsizeArea: Boolean;
     SkyTexture: TGLTexture;
     RenTextures: array of record
       spec: LongInt;
@@ -1124,6 +1125,7 @@ implementation
       glEnable(GL_BLEND);
       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
+      r_Draw_SetColor(255, 255, 255, 255);
       glBegin(GL_POINTS);
         for i := 0 to High(Particles) do
         begin
@@ -1136,6 +1138,7 @@ implementation
           end;
         end;
       glEnd;
+      r_Draw_SetColor(0, 0, 0, 255);
 
       glDisable(GL_BLEND);
     end;
@@ -1383,10 +1386,9 @@ implementation
   end;
 
   procedure r_Map_Draw (x, y, w, h, camx, camy: Integer; player: TPlayer);
-    var iter: TPanelGrid.Iter; p: PPanel; cx, cy, cw, ch, xx, yy, ww, hh: Integer; sx, sy, sw, sh: LongInt; l, t, r, b: Integer;
+    var iter: TPanelGrid.Iter; p: PPanel; cx, cy, cw, ch, xx, yy, ww, hh, ml, mt, mr, mb, mcx, mcy: Integer; sx, sy, sw, sh: LongInt; l, t, r, b: Integer;
   begin
     r_Draw_GetRect(l, t, r, b);
-    r_Draw_SetRect(x, y, x + w, y + h);
     glTranslatef(x, y, 0);
 
     (* camera rect *)
@@ -1398,13 +1400,18 @@ implementation
     (* camera bounds *)
     if g_dbg_ignore_bounds = false then
     begin
-      if cx + cw > gMapInfo.Width then
-        cx := gMapInfo.Width - cw;
-      if cy + ch > gMapInfo.Height then
-        cy := gMapInfo.Height - ch;
-      if cx < 0 then
+      if w > gMapInfo.Width then
+        cx := gMapInfo.Width div 2 - w div 2
+      else if cx + cw > gMapInfo.Width then
+        cx := gMapInfo.Width - cw
+      else if cx < 0 then
         cx := 0;
-      if cy < 0 then
+
+      if h > gMapInfo.Height then
+        cy := gMapInfo.Height div 2 - h div 2
+      else if cy + ch > gMapInfo.Height then
+        cy := gMapInfo.Height - ch
+      else if cy < 0 then
         cy := 0;
     end;
 
@@ -1422,6 +1429,17 @@ implementation
     if yy < 0 then
       yy := 0;
 
+    (* view bounds *)
+    ml := x; mt := y; mr := x + w; mb := y + h;
+    if FillOutsizeArea and (DebugCameraScale = 1.0) then
+    begin
+      ml := MAX(cx + ml, 0) - cx;
+      mt := MAX(cy + mt, 0) - cy;
+      mr := MIN(cx + mr, gMapInfo.Width - 1) - cx;
+      mb := MIN(cy + mb, gMapInfo.Height - 1) - cy;
+    end;
+    r_Draw_SetRect(ml, mt, mr, mb);
+
     plist.Clear;
     iter := mapGrid.ForEachInAABB(xx, yy, ww, hh, GridDrawableMask);
     for p in iter do
@@ -1502,5 +1520,7 @@ implementation
 
 initialization
   conRegVar('r_debug_camera_scale', @DebugCameraScale, 0.0001, 1000.0, '', '');
+  conRegVar('r_gl_fill_outside', @FillOutsizeArea, '', '');
   DebugCameraScale := 1.0;
+  FillOutsizeArea := true;
 end.