DEADSOFTWARE

gl: draw game time
[d2df-sdl.git] / src / game / renders / opengl / r_render.pas
index 3209f2ad1a50ea3e4b81e6e803a750fb44129507..a11ca7fc02fbf4843d4b051c25532c59a54a7165 100644 (file)
@@ -82,8 +82,8 @@ implementation
     {$ENDIF}
     SysUtils, Classes, Math,
     g_basic,
-    e_log, utils, wadreader,
-    g_game, g_map, g_options, g_console, g_player, g_weapons, g_language, g_triggers,
+    e_log, utils, wadreader, mapdef,
+    g_game, g_map, g_panel, g_options, g_console, g_player, g_weapons, g_language, g_triggers, g_monsters,
     g_net, g_netmaster,
     r_draw, r_textures, r_fonts, r_common, r_console, r_map
   ;
@@ -101,6 +101,8 @@ implementation
     hudrflag, hudrflags, hudrflagd: TGLTexture;
     hudbflag, hudbflags, hudbflagd: TGLTexture;
 
+    FPS, FPSCounter, FPSTime: LongWord;
+
   procedure r_Render_LoadTextures;
   begin
     r_Map_LoadTextures;
@@ -935,12 +937,124 @@ implementation
     result := p;
   end;
 
+  procedure r_Render_DrawMinimap (x, y: Integer; alpha: Byte);
+    const scale = 16;
+
+    function IsMinimapPanel (const p: TPanel): Boolean;
+    begin
+      result := (p <> nil) and p.Enabled;
+      if result then
+      begin
+        case p.PanelType of
+          PANEL_WALL, PANEL_WATER, PANEL_ACID1, PANEL_ACID2,
+          PANEL_STEP, PANEL_OPENDOOR, PANEL_CLOSEDOOR,
+          PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT:
+            result := true;
+          otherwise
+            result := false;
+        end;
+      end;
+    end;
+
+    procedure DrawObject (xx, yy, ww, hh: Integer; r, g, b: Byte);
+      var x0, y0, x1, y1: Integer;
+    begin
+      x0 := x + xx div scale;
+      y0 := y + yy div scale;
+      x1 := x + (xx + ww - 1) div scale;
+      y1 := y + (yy + hh - 1) div scale;
+      r_Draw_FillRect(x0, y0, x1, y1, r, g, b, alpha);
+    end;
+
+    procedure DrawPanels (const a: TPanelArray);
+      var i: Integer; p: TPanel; c: TRGB;
+    begin
+      if a <> nil then
+      begin
+        for i := 0 to HIGH(a) do
+        begin
+          p := a[i];
+          if IsMinimapPanel(p) then
+          begin
+            case p.PanelType of
+              PANEL_WALL:       c := _RGB(208, 208, 208);
+              PANEL_OPENDOOR:   c := _RGB(160, 160, 160);
+              PANEL_CLOSEDOOR:  c := _RGB(160, 160, 160);
+              PANEL_STEP:       c := _RGB(128, 128, 128);
+              PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT:
+              case p.LiftType of
+                LIFTTYPE_UP:    c := _RGB(116, 72, 36);
+                LIFTTYPE_DOWN:  c := _RGB(116, 124, 96);
+                LIFTTYPE_LEFT:  c := _RGB(116, 200, 80);
+                LIFTTYPE_RIGHT: c := _RGB(116, 252, 140);
+                otherwise       c := _RGB(255, 0, 0);
+              end;
+              PANEL_WATER:      c := _RGB(0, 0, 192);
+              PANEL_ACID1:      c := _RGB(0, 176, 0);
+              PANEL_ACID2:      c := _RGB(176, 0, 0);
+              otherwise         c := _RGB(255, 0, 0);
+            end;
+            DrawObject(p.x, p.y, p.width, p.height, c.r, c.g, c.b);
+          end;
+        end;
+      end;
+    end;
+
+    procedure DrawPlayers;
+      var i: Integer; p: TPlayer; c: TRGB;
+    begin
+      if gPlayers <> nil then
+      begin
+        for i := 0 to HIGH(gPlayers) do
+        begin
+          p := gPlayers[i];
+          if p.Alive then
+          begin
+            case p.Team of
+              TEAM_RED:  c := _RGB(255, 0, 0);
+              TEAM_BLUE: c := _RGB(0, 0, 255);
+              otherwise  c := _RGB(255, 128, 0);
+            end;
+            DrawObject(p.obj.x, p.obj.y, p.obj.rect.width, p.obj.rect.height, c.r, c.g, c.b);
+          end;
+        end;
+      end;
+    end;
+
+    function DrawMonster (m: TMonster): Boolean;
+    begin
+      result := false; // don't stop
+      if m.alive then
+        DrawObject(m.obj.x, m.obj.y, m.obj.rect.width, m.obj.rect.height, 255, 255, 0);
+    end;
+
+  begin
+    r_Draw_FillRect(x, y, (x + gMapInfo.Width - 1) div scale, (y + gMapInfo.Height - 1) div scale, 0, 0, 0, alpha);
+    DrawPanels(gSteps);
+    DrawPanels(gLifts);
+    DrawPanels(gWater);
+    DrawPanels(gAcid1);
+    DrawPanels(gAcid2);
+    DrawPanels(gWalls);
+    g_Mons_ForEach(DrawMonster);
+    DrawPlayers;
+  end;
+
   procedure r_Render_Draw;
-    var p1, p2: TPlayer;
+    var p1, p2: TPlayer; time: LongWord;
   begin
     if gExit = EXIT_QUIT then
       exit;
 
+    INC(FPSCounter);
+    time := GetTickCount64();
+    if time - FPSTime >= 1000 then
+    begin
+      FPS := FPSCounter;
+      FPSCounter := 0;
+      FPSTime := time;
+    end;
+
     r_Draw_Setup(gScreenWidth, gScreenHeight);
 
     glClearColor(0.0, 0.0, 0.0, 0.0);
@@ -993,8 +1107,6 @@ implementation
 
     if gGameOn or ((gState in [STATE_FOLD]) and (EndingGameCounter < 255)) then
     begin
-      // TODO setup player hear point
-
       if gSpectMode = SPECT_MAPVIEW then
       begin
         r_Render_DrawMapView(0, 0, gScreenWidth, gScreenHeight, gSpectX + gScreenWidth div 2, gSpectY + gScreenHeight div 2);
@@ -1013,6 +1125,9 @@ implementation
         r_Render_DrawPlayerView(0, 0, gScreenWidth, gScreenHeight, p2);
       end;
 
+      if gShowMap then
+        r_Render_DrawMiniMap(0, 0, 160);
+
       // TODO draw holmes inspector
 
       if MessageText <> '' then
@@ -1033,6 +1148,7 @@ implementation
 
     if not gGameOn then
     begin
+      // TODO F key handle
       case gState of
         STATE_NONE: (* do nothing *) ;
         STATE_MENU: r_Render_DrawBackground(GameWad + ':TEXTURES/TITLE');
@@ -1105,8 +1221,25 @@ implementation
 
     r_Console_Draw(false);
 
+    // TODO g_debug_Sounds
+
+    if gShowFPS then
+    begin
+      r_Common_DrawText('FPS: ' + IntToStr(FPS), 0, 0, 255, 255, 255, 255, stdfont, TBasePoint.BP_LEFTUP);
+      r_Common_DrawText('UPS: ' + IntToStr(UPS), 0, 16, 255, 255, 255, 255, stdfont, TBasePoint.BP_LEFTUP);
+    end;
+
+    if gGameOn and gShowTime then
+    begin
+      r_Common_DrawText(r_Common_TimeToStr(gTime), gScreenWidth - 4, gScreenHeight - 1, 255, 255, 255, 255, stdfont, TBasePoint.BP_RIGHTDOWN);
+    end;
+
+    // TODO draw profilers
+
     // TODO draw holmes interface
 
+    // TODO draw touch screen controls
+
     glFlush();
     glFinish();
     sys_Repaint;
@@ -1135,6 +1268,7 @@ implementation
 
   function r_Render_WriteScreenShot (filename: String): Boolean;
   begin
+    // TODO write screenshot file
     Result := False;
   end;
 
@@ -1155,6 +1289,7 @@ implementation
 {$IFDEF ENABLE_TOUCH}
   procedure r_Render_GetKeyRect (key: Integer; out x, y, w, h: Integer; out founded: Boolean);
   begin
+    // TODO implement touchscreen
     founded := False;
   end;
 {$ENDIF}