X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=bd8acf8ef1904f4e322fb628b431814e42961064;hb=c414b87769c21e17010b8de0dfe36da681edcdbb;hp=d4fbcf1830150dc64250d74e257e790b0635fc5b;hpb=56fcde89a5a167007acdfa19d685dde09c7003df;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index d4fbcf1..bd8acf8 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -99,6 +99,8 @@ type function g_Map_ForEachPanelAt (x, y: Integer; cb: TForEachPanelCB; panelType: Word): Boolean; +function g_Map_HasAnyPanelAtPoint (x, y: Integer; panelType: Word): Boolean; + procedure g_Map_ProfilersBegin (); procedure g_Map_ProfilersEnd (); @@ -173,9 +175,9 @@ var gdbg_map_use_accel_render: Boolean = true; gdbg_map_use_accel_coldet: Boolean = true; - gdbg_map_use_tree_draw: Boolean = false; - gdbg_map_use_tree_coldet: Boolean = false; - gdbg_map_dump_coldet_tree_queries: Boolean = false; + //gdbg_map_use_tree_draw: Boolean = false; + //gdbg_map_use_tree_coldet: Boolean = false; + //gdbg_map_dump_coldet_tree_queries: Boolean = false; profMapCollision: TProfiler = nil; //WARNING: FOR DEBUGGING ONLY! gDrawPanelList: TBinaryHeapObj = nil; // binary heap of all walls we have to render, populated by `g_Map_CollectDrawPanels()` @@ -202,12 +204,15 @@ const type TPanelGrid = specialize TBodyGridBase; + { TDynAABBTreePanelBase = specialize TDynAABBTreeBase; TDynAABBTreeMap = class(TDynAABBTreePanelBase) function getFleshAABB (out aabb: AABB2D; pan: TPanel; tag: Integer): Boolean; override; end; + { +{ function TDynAABBTreeMap.getFleshAABB (out aabb: AABB2D; pan: TPanel; tag: Integer): Boolean; begin result := false; @@ -217,6 +222,7 @@ begin if not aabb.valid then raise Exception.Create('wutafuuuuuuu?!'); result := true; end; +} function panelTypeToTag (panelType: Word): Integer; @@ -268,7 +274,7 @@ var FlagPoints: Array [FLAG_RED..FLAG_BLUE] of PFlagPoint; //DOMFlagPoints: Array of TFlagPoint; gMapGrid: TPanelGrid = nil; - mapTree: TDynAABBTreeMap = nil; + //mapTree: TDynAABBTreeMap = nil; procedure g_Map_ProfilersBegin (); @@ -452,6 +458,48 @@ begin end; +function g_Map_HasAnyPanelAtPoint (x, y: Integer; panelType: Word): Boolean; + + function checker (pan: TPanel; tag: Integer): Boolean; + begin + result := false; // don't stop, ever + + if ((tag and (GridTagWall or GridTagDoor)) <> 0) then + begin + if not pan.Enabled then exit; + end; + + result := (x >= pan.X) and (y >= pan.Y) and (x < pan.X+pan.Width) and (y < pan.Y+pan.Height); + if not result then exit; + + if ((tag and GridTagLift) <> 0) then + begin + result := + ((WordBool(PanelType and PANEL_LIFTUP) and (pan.LiftType = 0)) or + (WordBool(PanelType and PANEL_LIFTDOWN) and (pan.LiftType = 1)) or + (WordBool(PanelType and PANEL_LIFTLEFT) and (pan.LiftType = 2)) or + (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = 3))); + end; + end; + +var + tagmask: Integer = 0; +begin + result := false; + + if WordBool(PanelType and (PANEL_WALL or PANEL_CLOSEDOOR or PANEL_OPENDOOR)) then tagmask := tagmask or (GridTagWall or GridTagDoor); + if WordBool(PanelType and PANEL_WATER) then tagmask := tagmask or GridTagWater; + if WordBool(PanelType and PANEL_ACID1) then tagmask := tagmask or GridTagAcid1; + if WordBool(PanelType and PANEL_ACID2) then tagmask := tagmask or GridTagAcid2; + if WordBool(PanelType and PANEL_STEP) then tagmask := tagmask or GridTagStep; + if WordBool(PanelType and (PANEL_LIFTUP or PANEL_LIFTDOWN or PANEL_LIFTLEFT or PANEL_LIFTRIGHT)) then tagmask := tagmask or GridTagLift; + if WordBool(PanelType and PANEL_BLOCKMON) then tagmask := tagmask or GridTagBlockMon; + + if (tagmask = 0) then exit;// just in case + result := gMapGrid.forEachAtPoint(x, y, checker, tagmask); +end; + + function g_Map_IsSpecialTexture(Texture: String): Boolean; begin Result := (Texture = TEXTURE_NAME_WATER) or @@ -1233,15 +1281,15 @@ var pan.tag := tag; if not pan.visvalid then continue; gMapGrid.insertBody(pan, pan.X, pan.Y, pan.Width, pan.Height, tag); - mapTree.insertObject(pan, tag, true); // as static object + //mapTree.insertObject(pan, tag, true); // as static object end; end; begin gMapGrid.Free(); gMapGrid := nil; - mapTree.Free(); - mapTree := nil; + //mapTree.Free(); + //mapTree := nil; calcBoundingBox(gWalls); calcBoundingBox(gRenderBackgrounds); @@ -1256,7 +1304,7 @@ begin e_WriteLog(Format('map dimensions: (%d,%d)-(%d,%d)', [mapX0, mapY0, mapX1, mapY1]), MSG_WARNING); gMapGrid := TPanelGrid.Create(mapX0, mapY0, mapX1-mapX0+1, mapY1-mapY0+1); - mapTree := TDynAABBTreeMap.Create(); + //mapTree := TDynAABBTreeMap.Create(); addPanelsToGrid(gWalls, PANEL_WALL); addPanelsToGrid(gWalls, PANEL_CLOSEDOOR); @@ -1271,8 +1319,8 @@ begin addPanelsToGrid(gBlockMon, PANEL_BLOCKMON); gMapGrid.dumpStats(); - e_WriteLog(Format('tree depth: %d; %d nodes used, %d nodes allocated', [mapTree.computeTreeHeight, mapTree.nodeCount, mapTree.nodeAlloced]), MSG_NOTIFY); - mapTree.forEachLeaf(nil); + //e_WriteLog(Format('tree depth: %d; %d nodes used, %d nodes allocated', [mapTree.computeTreeHeight, mapTree.nodeCount, mapTree.nodeAlloced]), MSG_NOTIFY); + //mapTree.forEachLeaf(nil); end; function g_Map_Load(Res: String): Boolean; @@ -1309,8 +1357,8 @@ var begin gMapGrid.Free(); gMapGrid := nil; - mapTree.Free(); - mapTree := nil; + //mapTree.Free(); + //mapTree := nil; Result := False; gMapInfo.Map := Res; @@ -2109,11 +2157,11 @@ begin dplClear(); //tagmask := panelTypeToTag(PanelType); - if gdbg_map_use_tree_draw then + {if gdbg_map_use_tree_draw then begin mapTree.aabbQuery(x0, y0, wdt, hgt, checker, (GridTagBack or GridTagStep or GridTagWall or GridTagDoor or GridTagAcid1 or GridTagAcid2 or GridTagWater or GridTagFore)); end - else + else} begin gMapGrid.forEachInAABB(x0, y0, wdt, hgt, checker, (GridTagBack or GridTagStep or GridTagWall or GridTagDoor or GridTagAcid1 or GridTagAcid2 or GridTagWater or GridTagFore)); end; @@ -2129,11 +2177,11 @@ procedure g_Map_DrawPanelShadowVolumes(lightX: Integer; lightY: Integer; radius: end; begin - if gdbg_map_use_tree_draw then + {if gdbg_map_use_tree_draw then begin mapTree.aabbQuery(lightX-radius, lightY-radius, radius*2, radius*2, checker, (GridTagWall or GridTagDoor)); end - else + else} begin gMapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker, (GridTagWall or GridTagDoor)); end; @@ -2346,7 +2394,7 @@ begin if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('*solids'); if gdbg_map_use_accel_coldet then begin - if gdbg_map_use_tree_coldet then + {if gdbg_map_use_tree_coldet then begin //e_WriteLog(Format('coldet query: x=%d; y=%d; w=%d; h=%d', [X, Y, Width, Height]), MSG_NOTIFY); result := (mapTree.aabbQuery(X, Y, Width, Height, checker, tagmask) <> nil); @@ -2356,7 +2404,7 @@ begin g_Console_Add(Format('map collision: %d nodes visited (%d deep)', [mapTree.nodesVisited, mapTree.nodesDeepVisited])); end; end - else + else} begin result := gMapGrid.forEachInAABB(X, Y, Width, Height, checker, tagmask); end; @@ -2402,11 +2450,11 @@ begin if gdbg_map_use_accel_coldet then begin texid := TEXTURE_NONE; - if gdbg_map_use_tree_coldet then + {if gdbg_map_use_tree_coldet then begin mapTree.aabbQuery(X, Y, Width, Height, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2)); end - else + else} begin gMapGrid.forEachInAABB(X, Y, Width, Height, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2)); end;