From 93a1d67a1cb34cb02937559cd0d15194ca80728c Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Wed, 16 Aug 2017 11:28:27 +0300 Subject: [PATCH] removed "potentially visible panels" code in favor of grid --- src/game/g_game.pas | 5 -- src/game/g_map.pas | 110 ++++++-------------------------------------- 2 files changed, 13 insertions(+), 102 deletions(-) diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 26bca25..96c9856 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -2601,7 +2601,6 @@ begin glTranslatef(-x, -y, 0); - g_Map_BuildPVP(sX, sY, sX+sWidth-1, sY+sHeight-1); g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_BACK); g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_STEP); g_Items_Draw(); @@ -2623,7 +2622,6 @@ begin g_Monsters_DrawHealth(); g_Player_DrawHealth(); end; - g_Map_ResetPVP(); glPopMatrix(); end; @@ -2720,8 +2718,6 @@ begin glTranslatef(a, b+p.IncCam, 0); - g_Map_BuildPVP(sX, sY, sX+sWidth-1, sY+sHeight-1); - g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_BACK); g_Map_DrawPanels(sX, sY, sWidth, sHeight, PANEL_STEP); g_Items_Draw(); @@ -2848,7 +2844,6 @@ begin } glPopMatrix(); - g_Map_ResetPVP(); p.DrawPain(); p.DrawPickup(); diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 53b4ae2..730812c 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -63,10 +63,6 @@ function g_Map_Exist(Res: String): Boolean; procedure g_Map_Free(); procedure g_Map_Update(); -// build "potentially visible panels" set, so we can avoid looping over all level panels again and again -procedure g_Map_BuildPVP (minx, miny, maxx, maxy: Integer); -procedure g_Map_ResetPVP (); -// do not call this without calling `g_Map_BuildPVP()` or `g_Map_ResetPVP()` first! procedure g_Map_DrawPanels(x0, y0, wdt, hgt: Integer; PanelType: Word); procedure g_Map_DrawBack(dx, dy: Integer); @@ -1742,11 +1738,7 @@ begin end; -var - pvpset: array of TPanel = nil; // potentially lit panels - pvpb, pvpe: array [0..7] of Integer; // start/end (inclusive) of the correspoinding type panels in pvpset - pvpcount: Integer = -1; // to avoid constant reallocations - +{ function pvpType (panelType: Word): Integer; begin case panelType of @@ -1760,55 +1752,8 @@ begin else result := -1; end; end; +} -procedure g_Map_ResetPVP (); -begin - pvpcount := -1; // special -end; - -procedure g_Map_BuildPVP (minx, miny, maxx, maxy: Integer); -var - idx: Integer; - tpc: Integer; - - procedure checkPanels (var panels: TPanelArray; stp: Integer); - var - idx, x, y, w, h: Integer; - begin - if panels = nil then exit; - tpc := tpc+Length(panels); - if (stp < 0) or (stp > 6) then exit; - pvpb[stp] := pvpcount; - for idx := 0 to High(panels) do - begin - w := panels[idx].Width; - h := panels[idx].Height; - if (w < 1) or (h < 1) then continue; - x := panels[idx].X; - y := panels[idx].Y; - if (x > maxx) or (y > maxy) then continue; - if (x+w <= minx) or (y+h <= miny) then continue; - if pvpcount = length(pvpset) then SetLength(pvpset, pvpcount+32768); - pvpset[pvpcount] := panels[idx]; - Inc(pvpcount); - end; - pvpe[stp] := pvpcount-1; - end; - -begin - //e_WriteLog(Format('visible rect: (%d,%d)-(%d,%d)', [minx, miny, maxx, maxy]), MSG_NOTIFY); - pvpcount := 0; - for idx := 0 to High(pvpb) do begin pvpb[idx] := 0; pvpe[idx] := -1; end; - tpc := 0; - checkPanels(gWalls, 0); - checkPanels(gRenderBackgrounds, 1); - checkPanels(gRenderForegrounds, 2); - checkPanels(gWater, 3); - checkPanels(gAcid1, 4); - checkPanels(gAcid2, 5); - checkPanels(gSteps, 6); - //e_WriteLog(Format('total panels: %d; visible panels: %d', [tpc, pvpcount]), MSG_NOTIFY); -end; procedure g_Map_DrawPanelsOld(PanelType: Word); @@ -1818,24 +1763,10 @@ procedure g_Map_DrawPanelsOld(PanelType: Word); begin if (panels <> nil) and (stp >= 0) and (stp <= 6) then begin - if pvpcount < 0 then - begin - // alas, no visible set - for idx := 0 to High(panels) do - begin - if not (drawDoors xor panels[idx].Door) then panels[idx].Draw(); - end; - end - else + // alas, no visible set + for idx := 0 to High(panels) do begin - // wow, use visible set - if pvpb[stp] <= pvpe[stp] then - begin - for idx := pvpb[stp] to pvpe[stp] do - begin - if not (drawDoors xor pvpset[idx].Door) then pvpset[idx].Draw(); - end; - end; + if not (drawDoors xor panels[idx].Door) then panels[idx].Draw(); end; end; end; @@ -1935,31 +1866,16 @@ procedure g_Map_DrawPanels(x0, y0, wdt, hgt: Integer; PanelType: Word); begin if (panels <> nil) and (stp >= 0) and (stp <= 6) then begin - if pvpcount < 0 then - begin - // alas, no visible set - for idx := 0 to High(panels) do - begin - if not (drawDoors xor panels[idx].Door) then - begin - pan := panels[idx]; - e_WriteLog(Format(' *body hit: (%d,%d)-(%dx%d) tag: %d; qtag:%d', [pan.X, pan.Y, pan.Width, pan.Height, PanelType, PanelType]), MSG_NOTIFY); - end; - end; - end - else + // alas, no visible set + for idx := 0 to High(panels) do begin - // wow, use visible set - if pvpb[stp] <= pvpe[stp] then + if not (drawDoors xor panels[idx].Door) then begin - for idx := pvpb[stp] to pvpe[stp] do - begin - if not (drawDoors xor pvpset[idx].Door) then - begin - pan := pvpset[idx]; - e_WriteLog(Format(' *body hit: (%d,%d)-(%dx%d) tag: %d; qtag:%d', [pan.X, pan.Y, pan.Width, pan.Height, PanelType, PanelType]), MSG_NOTIFY); - end; - end; + pan := panels[idx]; + if (pan.Width < 1) or (pan.Height < 1) then continue; + if (pan.X+pan.Width <= x0) or (pan.Y+pan.Height <= y0) then continue; + if (pan.X >= x0+wdt) or (pan.Y >= y0+hgt) then continue; + e_WriteLog(Format(' *body hit: (%d,%d)-(%dx%d) tag: %d; qtag:%d', [pan.X, pan.Y, pan.Width, pan.Height, PanelType, PanelType]), MSG_NOTIFY); end; end; end; -- 2.29.2