diff --git a/src/game/g_map.pas b/src/game/g_map.pas
index b448103ab23601f6630d783d284ddf516f54675a..1a7a4d8f18eb54d2add20148f04a97b20c4ec890 100644 (file)
--- a/src/game/g_map.pas
+++ b/src/game/g_map.pas
gdbg_map_use_grid_coldet: Boolean = true;
gdbg_map_use_tree_draw: Boolean = true;
gdbg_map_use_tree_coldet: Boolean = false;
+ gdbg_map_dump_coldet_tree_queries: Boolean = false;
profMapCollision: TProfiler = nil; //WARNING: FOR DEBUGGING ONLY!
implementation
MUSIC_SIGNATURE = $4953554D; // 'MUSI'
FLAG_SIGNATURE = $47414C46; // 'FLAG'
- GridTagInvalid = -1;
- GridTagWallDoor = 0;
- GridTagBack = 1;
- GridTagFore = 2;
- GridTagWater = 3;
- GridTagAcid1 = 4;
- GridTagAcid2 = 5;
- GridTagStep = 6;
- GridTagLift = 7;
- GridTagBlockMon = 8;
+ GridTagInvalid = 0;
+ GridTagWallDoor = $0001;
+ GridTagBack = $0002;
+ GridTagFore = $0004;
+ GridTagWater = $0008;
+ GridTagAcid1 = $0010;
+ GridTagAcid2 = $0020;
+ GridTagStep = $0040;
+ GridTagLift = $0080;
+ GridTagBlockMon = $0100;
function panelTypeToTag (panelType: Word): Integer;
begin
panels[idx].tag := tag;
gMapGrid.insertBody(panels[idx], panels[idx].X, panels[idx].Y, panels[idx].Width, panels[idx].Height, tag);
- mapTree.insertObject(panels[idx], true); // as static object
+ mapTree.insertObject(panels[idx], tag, true); // as static object
end;
end;
pan: TPanel;
begin
result := false; // don't stop, ever
+ //e_WriteLog(Format(' *body: tag:%d; ptag:%d; pantype=%d', [tag, ptag, PanelType]), MSG_NOTIFY);
if (tag <> ptag) then exit;
- //e_WriteLog(Format(' *body: tag:%d; qtag:%d', [tag, PanelType]), MSG_NOTIFY);
if obj = nil then begin e_WriteLog(Format(' !bodyFUUUUU0: tag:%d; qtag:%d', [tag, PanelType]), MSG_NOTIFY); exit; end;
if not (obj is TPanel) then begin e_WriteLog(Format(' !bodyFUUUUU1: tag:%d; qtag:%d', [tag, PanelType]), MSG_NOTIFY); exit; end;
dplAddPanel(pan);
end;
- function checkerTree (obj: TObject): Boolean;
- var
- pan: TPanel;
- begin
- result := false; // don't stop, ever
- pan := (obj as TPanel);
- if (pan.tag <> ptag) then exit;
- if (PanelType = PANEL_CLOSEDOOR) then begin if not pan.Door then exit; end else begin if pan.Door then exit; end;
- //e_WriteLog(Format(' body hit: (%d,%d)-(%dx%d) tag: %d; qtag:%d', [pan.X, pan.Y, pan.Width, pan.Height, tag, PanelType]), MSG_NOTIFY);
- dplAddPanel(pan);
- end;
-
procedure DrawPanels (stp: Integer; var panels: TPanelArray; drawDoors: Boolean=False);
var
idx: Integer;
begin
if gdbg_map_use_tree_draw then
begin
- mapTree.aabbQuery(x0, y0, wdt, hgt, checkerTree);
+ mapTree.aabbQuery(x0, y0, wdt, hgt, checker, ptag);
end
else
begin
@@ -2003,20 +1992,10 @@ procedure g_Map_DrawPanelShadowVolumes(lightX: Integer; lightY: Integer; radius:
pan.DrawShadowVolume(lightX, lightY, radius);
end;
- function checkerTree (obj: TObject): Boolean;
- var
- pan: TPanel;
- begin
- result := false; // don't stop, ever
- pan := (obj as TPanel);
- if (pan.tag <> GridTagWallDoor) then exit; // only walls
- pan.DrawShadowVolume(lightX, lightY, radius);
- end;
-
begin
if gdbg_map_use_tree_draw then
begin
- mapTree.aabbQuery(lightX-radius, lightY-radius, radius*2, radius*2, checkerTree);
+ mapTree.aabbQuery(lightX-radius, lightY-radius, radius*2, radius*2, checker, GridTagWallDoor);
end
else
begin
@@ -2277,14 +2256,6 @@ function g_Map_CollidePanel(X, Y: Integer; Width, Height: Word; PanelType: Word;
end;
end;
- function checkerTree (obj: TObject): Boolean;
- var
- pan: TPanel;
- begin
- pan := (obj as TPanel);
- result := checker(obj, pan.tag);
- end;
-
begin
//TODO: detailed profile
if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('wall coldet');
begin
if gdbg_map_use_tree_coldet then
begin
- result := mapTree.aabbQuery(X, Y, Width, Height, checkerTree);
- {
- if (mapTree.nodesVisited <> 0) then
+ result := (mapTree.aabbQuery(X, Y, Width, Height, checker, (GridTagWallDoor or GridTagWater or GridTagAcid1 or GridTagAcid2 or GridTagStep or GridTagLift or GridTagBlockMon)) <> nil);
+ if (gdbg_map_dump_coldet_tree_queries) and (mapTree.nodesVisited <> 0) then
begin
- e_WriteLog(Format('map collision: %d nodes visited (%d deep)', [mapTree.nodesVisited, mapTree.nodesDeepVisited]), MSG_NOTIFY);
+ //e_WriteLog(Format('map collision: %d nodes visited (%d deep)', [mapTree.nodesVisited, mapTree.nodesDeepVisited]), MSG_NOTIFY);
+ g_Console_Add(Format('map collision: %d nodes visited (%d deep)', [mapTree.nodesVisited, mapTree.nodesDeepVisited]));
end;
- }
end
else
begin
a: Integer;
begin
result := false; // don't stop, ever
+ if (tag <> GridTagWater) and (tag <> GridTagAcid1) and (tag <> GridTagAcid2) then exit;
pan := (obj as TPanel);
a := pan.ArrIdx;
// water
end;
end;
- function checkerTree (obj: TObject): Boolean;
- var
- pan: TPanel;
- begin
- result := false;
- pan := (obj as TPanel);
- if (pan.tag = GridTagWater) or (pan.tag = GridTagAcid1) or (pan.tag = GridTagAcid2) then result := checker(obj, pan.tag);
- end;
-
{var
cctype1: Integer = 3; // priority: 0: water, 1: acid1, 2: acid2; 3: others (nothing)
texid1: DWORD;}
texid := TEXTURE_NONE;
if gdbg_map_use_tree_coldet then
begin
- mapTree.aabbQuery(X, Y, Width, Height, checkerTree);
+ mapTree.aabbQuery(X, Y, Width, Height, checker);
{
cctype1 := cctype;
texid1 := texid;