DEADSOFTWARE

"t_dump_node_queries" (temp debug, DO NOT TOUCH)
[d2df-sdl.git] / src / game / g_game.pas
index f45ac3d7e55ae8284caabcf6987912b6bdb3c905..2d3fb588db863d074a7e3ae0f7c16c3ae954100e 100644 (file)
@@ -311,7 +311,9 @@ var
   P2MoveButton: Byte = 0;
 
   g_profile_frame_update: Boolean = false;
-  g_profile_frame_draw: Boolean = true;
+  g_profile_frame_draw: Boolean = false;
+  g_profile_collision: Boolean = false;
+  g_profile_history_size: Integer = 1000;
 
 procedure g_ResetDynlights ();
 procedure g_AddDynLight (x, y, radius: Integer; r, g, b, a: Single);
@@ -329,6 +331,11 @@ uses
   utils, sfs;
 
 
+// ////////////////////////////////////////////////////////////////////////// //
+var
+  profileFrameDraw: TProfiler = nil;
+
+
 // ////////////////////////////////////////////////////////////////////////// //
 type
   TDynLight = record
@@ -405,15 +412,17 @@ end;
 
 
 // ////////////////////////////////////////////////////////////////////////// //
-procedure drawProfiles (x, y: Integer; title: AnsiString);
+(*
+procedure drawProfiles (x, y: Integer; title: AnsiString); overload;
 var
   wdt, hgt: Integer;
   yy: Integer;
 
+  {
   procedure drawItems ();
   begin
     repeat
-      e_TextureFontPrintEx(x+2+4*xprofItDepth, yy, Format('%s: %d', [xprofItName, xprofItMicro]), gStdFont, 255, 255, 0, 1, false);
+      e_TextureFontPrintEx(x+2+4*xprofItLevel, yy, Format('%s: %d', [xprofItName, Integer(xprofItMicro)]), gStdFont, 255, 255, 0, 1, false);
       Inc(yy, 16+2);
       if xprofItHasChildren then
       begin
@@ -421,20 +430,72 @@ var
         drawItems();
         xprofItPop();
       end;
-    until xprofItNext();
+    until not xprofItNext();
+  end;
+  }
+
+  procedure drawItems ();
+  var
+    ii, idx: Integer;
+  begin
+    for ii := 0 to xprofTotalCount-1 do
+    begin
+      e_TextureFontPrintEx(x+2+4*xprofLevelAt(ii), yy, Format('%s: %d', [xprofNameAt(ii), Integer(xprofMicroAt(ii))]), gStdFont, 255, 255, 0, 1, false);
+      Inc(yy, 16+2);
+    end;
   end;
 
 begin
   // gScreenWidth
-  if not xprofItReset() then exit;
+  //if not xprofItReset() then exit;
+  if (xprofTotalCount = 0) then exit;
   wdt := 256;
   hgt := 16+2+xprofTotalCount*(16+2); // title, items
   // background
-  e_DrawFillQuad(x, y, x+wdt-1, y+hgt-1, 255, 255, 255, 200, B_BLEND);
+  //e_DrawFillQuad(x, y, x+wdt-1, y+hgt-1, 255, 255, 255, 200, B_BLEND);
+  e_DrawFillQuad(x, y, x+wdt-1, y+hgt-1, 20, 20, 20, 0, B_NONE);
   // title
   e_TextureFontPrintEx(x+2, y+2, Format('%s: %d', [title, Integer(xprofTotalMicro)]), gStdFont, 255, 255, 0, 1, false);
   yy := y+16+2;
-  //drawItems();
+  drawItems();
+end;
+*)
+
+
+function calcProfilesHeight (prof: TProfiler): Integer;
+begin
+  result := 0;
+  if (prof = nil) then exit;
+  if (length(prof.bars) = 0) then exit;
+  result := length(prof.bars)*(16+2);
+end;
+
+// returns width
+function drawProfiles (x, y: Integer; prof: TProfiler): Integer;
+var
+  wdt, hgt: Integer;
+  yy: Integer;
+  ii: Integer;
+begin
+  result := 0;
+  if (prof = nil) then exit;
+  // gScreenWidth
+  if (length(prof.bars) = 0) then exit;
+  wdt := 192;
+  hgt := calcProfilesHeight(prof);
+  if (x < 0) then x := gScreenWidth-(wdt-1)+x;
+  if (y < 0) then y := gScreenHeight-(hgt-1)+y;
+  // background
+  //e_DrawFillQuad(x, y, x+wdt-1, y+hgt-1, 255, 255, 255, 200, B_BLEND);
+  e_DrawFillQuad(x, y, x+wdt-1, y+hgt-1, 20, 20, 20, 0, B_NONE);
+  // title
+  yy := y+2;
+  for ii := 0 to High(prof.bars) do
+  begin
+    e_TextureFontPrintEx(x+2+4*prof.bars[ii].level, yy, Format('%s: %d', [prof.bars[ii].name, prof.bars[ii].value]), gStdFont, 255, 255, 0, 1, false);
+    Inc(yy, 16+2);
+  end;
+  result := wdt;
 end;
 
 
@@ -2689,6 +2750,9 @@ begin
     Exit;
   end;
 
+  if (profileFrameDraw = nil) then profileFrameDraw := TProfiler.Create('MAP RENDER', g_profile_history_size);
+  profileFrameDraw.mainBegin(g_profile_frame_draw);
+
   gPlayerDrawn := p;
 
   glPushMatrix();
@@ -2756,9 +2820,9 @@ begin
     else
       d := Round((py-p.IncCam-(gPlayerScreenSize.Y div 2))/(gMapInfo.Height-gPlayerScreenSize.Y)*(gBackSize.Y-gPlayerScreenSize.Y));
 
-  xprofBeginSection('map background');
+  profileFrameDraw.sectionBegin('map background');
   g_Map_DrawBack(-c, -d);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
   sX := -a;
   sY := -(b+p.IncCam);
@@ -2767,73 +2831,73 @@ begin
 
   glTranslatef(a, b+p.IncCam, 0);
 
-  xprofBeginSection('map rendering');
+  profileFrameDraw.sectionBegin('map rendering');
 
-  xprofBeginSection('panel_back');
+  profileFrameDraw.sectionBegin('panel_back');
   g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_BACK);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('panel_step');
+  profileFrameDraw.sectionBegin('panel_step');
   g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_STEP);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('items');
+  profileFrameDraw.sectionBegin('items');
   g_Items_Draw();
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('weapons');
+  profileFrameDraw.sectionBegin('weapons');
   g_Weapon_Draw();
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('shells');
+  profileFrameDraw.sectionBegin('shells');
   g_Player_DrawShells();
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('drawall');
+  profileFrameDraw.sectionBegin('drawall');
   g_Player_DrawAll();
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('corpses');
+  profileFrameDraw.sectionBegin('corpses');
   g_Player_DrawCorpses();
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('panel_wall');
+  profileFrameDraw.sectionBegin('panel_wall');
   g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_WALL);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('monsters');
+  profileFrameDraw.sectionBegin('monsters');
   g_Monsters_Draw();
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('panel_closedoor');
+  profileFrameDraw.sectionBegin('panel_closedoor');
   g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_CLOSEDOOR);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('gfx');
+  profileFrameDraw.sectionBegin('gfx');
   g_GFX_Draw();
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('flags');
+  profileFrameDraw.sectionBegin('flags');
   g_Map_DrawFlags();
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('panel_acid1');
+  profileFrameDraw.sectionBegin('panel_acid1');
   g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_ACID1);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('panel_acid2');
+  profileFrameDraw.sectionBegin('panel_acid2');
   g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_ACID2);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
-  xprofBeginSection('panel_water');
+  profileFrameDraw.sectionBegin('panel_water');
   g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_WATER);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
   //TODO: lights should be in separate grid, i think
   //      but on the other side: grid may be slower for dynlights, as their lifetime is short
   if gwin_has_stencil and (g_dynLightCount > 0) then
   begin
-    xprofBeginSection('dynlights');
+    profileFrameDraw.sectionBegin('dynlights');
 
     // setup OpenGL parameters
     glStencilMask($FFFFFFFF);
@@ -2888,27 +2952,27 @@ begin
     glDisable(GL_SCISSOR_TEST);
     glScissor(0, 0, sWidth, sHeight);
 
-    xprofEndSection();
+    profileFrameDraw.sectionEnd();
   end
   else
   begin
-    xprofBeginSection('dynlights');
-    xprofEndSection();
+    profileFrameDraw.sectionBegin('dynlights');
+    profileFrameDraw.sectionEnd();
   end;
 
-  xprofBeginSection('panel_fore');
+  profileFrameDraw.sectionBegin('panel_fore');
   g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_FORE);
-  xprofEndSection();
+  profileFrameDraw.sectionEnd();
 
   if g_debug_HealthBar then
   begin
-    xprofBeginSection('monster health');
+    profileFrameDraw.sectionBegin('monster health');
     g_Monsters_DrawHealth();
-    xprofEndSection();
+    profileFrameDraw.sectionEnd();
 
-    xprofBeginSection('player health');
+    profileFrameDraw.sectionBegin('player health');
     g_Player_DrawHealth();
-    xprofEndSection();
+    profileFrameDraw.sectionEnd();
   end;
 
   if p.FSpectator then
@@ -2935,7 +2999,7 @@ begin
 
   glPopMatrix();
 
-  xprofEndSection(); // map rendering
+  profileFrameDraw.mainEnd(); // map rendering
 
   p.DrawPain();
   p.DrawPickup();
@@ -2946,6 +3010,14 @@ begin
   p.DrawGUI();
 end;
 
+procedure drawProfilers ();
+var
+  px: Integer = -1;
+begin
+  if g_profile_frame_draw then px := px-drawProfiles(px, -1, profileFrameDraw);
+  if g_profile_collision then px := px-drawProfiles(px, -1, profMapCollision);
+end;
+
 procedure g_Game_Draw();
 var
   ID: DWORD;
@@ -2967,8 +3039,6 @@ begin
     FPSTime := Time;
   end;
 
-  xprofBegin(g_profile_frame_draw);
-
   if gGameOn or (gState = STATE_FOLD) then
   begin
     if (gPlayer1 <> nil) and (gPlayer2 <> nil) then
@@ -3270,8 +3340,7 @@ begin
                      Format('%d:%.2d:%.2d', [gTime div 1000 div 3600, (gTime div 1000 div 60) mod 60, gTime div 1000 mod 60]),
                      gStdFont);
 
-  xprofEnd();
-  if g_profile_frame_draw then drawProfiles(0, 0, 'MAP RENDER');
+  drawProfilers();
 end;
 
 procedure g_Game_Quit();
@@ -4937,19 +5006,75 @@ end;
 procedure ProfilerCommands (P: SArray);
 var
   cmd: string;
+
+  function getBool (idx: Integer): Integer;
+  begin
+    if (idx < 0) or (idx > High(P)) then begin result := -1; exit; end;
+    result := 0;
+    if (P[idx] = '1') or (P[idx] = 'on') or (P[idx] = 'true') or (P[idx] = 'tan') then result := 1;
+  end;
+
 begin
   //if not gDebugMode then exit;
   cmd := LowerCase(P[0]);
+
   if cmd = 'dpp' then
   begin
     g_profile_frame_draw := not g_profile_frame_draw;
     exit;
   end;
+
   if cmd = 'dpu' then
   begin
     g_profile_frame_update := not g_profile_frame_update;
     exit;
   end;
+
+  if cmd = 'dpc' then
+  begin
+    g_profile_collision := not g_profile_collision;
+    exit;
+  end;
+
+  if cmd = 'r_gridrender' then
+  begin
+    case getBool(1) of
+      -1: begin end;
+       0: gdbg_map_use_grid_render := false;
+       1: gdbg_map_use_grid_render := true;
+    end;
+    if gdbg_map_use_grid_render then g_Console_Add('grid rendering: tan') else g_Console_Add('grid rendering: ona');
+    exit;
+  end;
+
+  if cmd = 'dbg_coldet_grid' then
+  begin
+    case getBool(1) of
+      -1: begin end;
+       0: gdbg_map_use_grid_coldet := false;
+       1: gdbg_map_use_grid_coldet := true;
+    end;
+    if gdbg_map_use_grid_coldet then g_Console_Add('grid coldet: tan') else g_Console_Add('grid coldet: ona');
+    exit;
+  end;
+
+  if (cmd = 'sq_use_grid') or (cmd = 'sq_use_tree') then
+  begin
+    gdbg_map_use_tree_coldet := (cmd = 'sq_use_tree');
+    if gdbg_map_use_tree_coldet then g_Console_Add('coldet: tree') else g_Console_Add('coldet: grid');
+    exit;
+  end;
+
+  if (cmd = 't_dump_node_queries') then
+  begin
+    case getBool(1) of
+      -1: begin end;
+       0: gdbg_map_dump_coldet_tree_queries := false;
+       1: gdbg_map_dump_coldet_tree_queries := true;
+    end;
+    if gdbg_map_dump_coldet_tree_queries then g_Console_Add('grid coldet tree queries: tan') else g_Console_Add('grid coldet tree queries: ona');
+    exit;
+  end;
 end;
 
 procedure DebugCommands(P: SArray);
@@ -6774,6 +6899,12 @@ var
 begin
   Parse_Params(pars);
 
+  s := Find_Param_Value(pars, '--profile-frame');
+  if (s <> '') then g_profile_frame_draw := true;
+
+  s := Find_Param_Value(pars, '--profile-coldet');
+  if (s <> '') then g_profile_collision := true;
+
 // Debug mode:
   s := Find_Param_Value(pars, '--debug');
   if (s <> '') then
@@ -6799,6 +6930,12 @@ begin
     Exit;
   end;
 
+  s := LowerCase(Find_Param_Value(pars, '-dbg-mainwad'));
+  if (s <> '') then
+  begin
+    gDefaultMegawadStart := s;
+  end;
+
 // Start map when game loads:
   map := LowerCase(Find_Param_Value(pars, '-map'));
   if isWadPath(map) then