diff --git a/src/game/g_map.pas b/src/game/g_map.pas
index b84bf3aaca6170f165147659879aa9e2971c8f28..55f1e4aae46348be6ac6d66fdb93f255f39bbb22 100644 (file)
--- a/src/game/g_map.pas
+++ b/src/game/g_map.pas
uses
e_graphics, g_basic, MAPSTRUCT, g_textures, Classes,
- g_phys, wadreader, BinEditor, g_panel, g_grid, md5, xprofiler;
+ g_phys, wadreader, BinEditor, g_panel, g_grid, g_sap, md5, xprofiler;
type
TMapInfo = record
gdbg_map_use_grid_render: Boolean = true;
gdbg_map_use_grid_coldet: Boolean = true;
+ gdbg_map_use_sap_draw: Boolean = true;
+ gdbg_map_use_sap_coldet: Boolean = false;
profMapCollision: TProfiler = nil; //WARNING: FOR DEBUGGING ONLY!
implementation
GL, GLExt, g_weapons, g_game, g_sound, e_sound, CONFIG,
g_options, MAPREADER, g_triggers, g_player, MAPDEF,
Math, g_monsters, g_saveload, g_language, g_netmsg,
- utils, sfs,
+ utils, sfs, binheap,
ImagingTypes, Imaging, ImagingUtility,
ImagingGif, ImagingNetworkGraphics;
FlagPoints: Array [FLAG_RED..FLAG_BLUE] of PFlagPoint;
//DOMFlagPoints: Array of TFlagPoint;
gMapGrid: TBodyGrid = nil;
+ gMapSAP: TSweepAndPrune = nil;
procedure g_Map_ProfilersBegin ();
begin
- if (profMapCollision = nil) then profMapCollision := TProfiler.Create('MAP COLLISION');
+ if (profMapCollision = nil) then profMapCollision := TProfiler.Create('MAP COLLISION', g_profile_history_size);
profMapCollision.mainBegin(g_profile_collision);
// create sections
if g_profile_collision then
begin
- profMapCollision.sectionBeginAccum('wall coldet');
+ profMapCollision.sectionBegin('wall coldet');
profMapCollision.sectionEnd();
- profMapCollision.sectionBeginAccum('liquid coldet');
+ profMapCollision.sectionBegin('liquid coldet');
profMapCollision.sectionEnd();
end;
end;
for idx := High(panels) downto 0 do
begin
gMapGrid.insertBody(panels[idx], panels[idx].X, panels[idx].Y, panels[idx].Width, panels[idx].Height, tag);
+ gMapSAP.insertBody(panels[idx], panels[idx].X, panels[idx].Y, panels[idx].Width, panels[idx].Height, tag);
end;
end;
begin
gMapGrid.Free();
gMapGrid := nil;
+ gMapSAP.Free();
+ gMapSAP := nil;
fixMinMax(gWalls);
fixMinMax(gRenderBackgrounds);
end;
gMapGrid := TBodyGrid.Create(mapX0, mapY0, mapX1-mapX0+1, mapY1-mapY0+1);
+ gMapSAP := TSweepAndPrune.Create();
+
+ gMapSAP.batchUpdateBegin();
addPanelsToGrid(gWalls, PANEL_WALL); // and PANEL_CLOSEDOOR
addPanelsToGrid(gRenderBackgrounds, PANEL_BACK);
addPanelsToGrid(gLifts, PANEL_LIFTUP); // it doesn't matter which LIFT type is used here
addPanelsToGrid(gBlockMon, PANEL_BLOCKMON);
+ gMapSAP.batchUpdateEnd();
+
gMapGrid.dumpStats();
+ gMapSAP.dumpStats();
end;
function g_Map_Load(Res: String): Boolean;
begin
gMapGrid.Free();
gMapGrid := nil;
+ gMapSAP.Free();
+ gMapSAP := nil;
Result := False;
gMapInfo.Map := Res;
if gdbg_map_use_grid_render then
begin
- gMapGrid.forEachInAABB(x0, y0, wdt, hgt, checker);
+ if gdbg_map_use_sap_draw then
+ begin
+ gMapSAP.forEachInAABB(x0, y0, wdt, hgt, checker);
+ end
+ else
+ begin
+ gMapGrid.forEachInAABB(x0, y0, wdt, hgt, checker);
+ end;
// sort and draw the list (we need to sort it, or rendering is fucked)
while gDrawPanelList.count > 0 do
begin
@@ -1956,7 +1977,14 @@ procedure g_Map_DrawPanelShadowVolumes(lightX: Integer; lightY: Integer; radius:
end;
begin
- gMapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker);
+ if gdbg_map_use_sap_draw then
+ begin
+ gMapSAP.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker);
+ end
+ else
+ begin
+ gMapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker);
+ end;
end;
try
if gdbg_map_use_grid_coldet then
begin
- result := gMapGrid.forEachInAABB(X, Y, Width, Height, checker);
+ if gdbg_map_use_sap_coldet then
+ begin
+ gMapSAP.forEachInAABB(X, Y, Width, Height, checker);
+ end
+ else
+ begin
+ result := gMapGrid.forEachInAABB(X, Y, Width, Height, checker);
+ end;
end
else
begin
//TODO: detailed profile?
if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('liquid coldet');
try
- if not gdbg_map_use_grid_coldet then
+ if gdbg_map_use_grid_coldet then
begin
- result := g_Map_CollideLiquid_TextureOld(X, Y, Width, Height);
+ texid := TEXTURE_NONE;
+ if gdbg_map_use_sap_coldet then
+ begin
+ gMapSAP.forEachInAABB(X, Y, Width, Height, checker);
+ end
+ else
+ begin
+ gMapGrid.forEachInAABB(X, Y, Width, Height, checker);
+ end;
+ result := texid;
end
else
begin
- texid := TEXTURE_NONE;
- gMapGrid.forEachInAABB(X, Y, Width, Height, checker);
- result := texid;
+ result := g_Map_CollideLiquid_TextureOld(X, Y, Width, Height);
end;
finally
if (profMapCollision <> nil) then profMapCollision.sectionEnd();