X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=45a3fa3ccfb5b5c0e48acc5281dd295b55d782a3;hb=2b79b90a46d647d1d5bf4205862be5ffa296add1;hp=d4fbcf1830150dc64250d74e257e790b0635fc5b;hpb=56fcde89a5a167007acdfa19d685dde09c7003df;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index d4fbcf1..45a3fa3 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -97,7 +97,7 @@ function g_Map_traceToNearestWall (x0, y0, x1, y1: Integer; hitx: PInteger=nil; type TForEachPanelCB = function (pan: TPanel): Boolean; // return `true` to stop -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 (); @@ -173,9 +173,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 +202,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 +220,7 @@ begin if not aabb.valid then raise Exception.Create('wutafuuuuuuu?!'); result := true; end; +} function panelTypeToTag (panelType: Word): Integer; @@ -268,7 +272,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 (); @@ -363,13 +367,13 @@ end; // wall index in `gWalls` or -1 function g_Map_traceToNearestWall (x0, y0, x1, y1: Integer; hitx: PInteger=nil; hity: PInteger=nil): Boolean; var - lastX, lastY, lastDist: Integer; + lastX, lastY, lastDistSq: Integer; wasHit: Boolean = false; // pan=nil: before processing new tile function sqchecker (pan: TPanel; tag: Integer; x, y, prevx, prevy: Integer): Boolean; var - dist: Integer; + distSq: Integer; begin if (pan = nil) then begin @@ -383,11 +387,11 @@ var begin if not pan.Enabled then exit; end; - dist := (prevx-x0)*(prevx-x0)+(prevy-y0)*(prevy-y0); - if (dist < lastDist) then + distSq := (prevx-x0)*(prevx-x0)+(prevy-y0)*(prevy-y0); + if (distSq < lastDistSq) then begin wasHit := true; - lastDist := dist; + lastDistSq := distSq; lastX := prevx; lastY := prevy; end; @@ -397,7 +401,7 @@ var begin result := false; if (gMapGrid = nil) then exit; - lastDist := (x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)+1; + lastDistSq := (x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)+1; lastX := 0; lastY := 0; result := gMapGrid.traceRay(x0, y0, x1, y1, sqchecker, (GridTagWall or GridTagDoor)); @@ -406,7 +410,7 @@ begin end; -function g_Map_ForEachPanelAt (x, y: Integer; cb: TForEachPanelCB; panelType: Word): Boolean; +function g_Map_HasAnyPanelAtPoint (x, y: Integer; panelType: Word): Boolean; function checker (pan: TPanel; tag: Integer): Boolean; begin @@ -428,16 +432,12 @@ function g_Map_ForEachPanelAt (x, y: Integer; cb: TForEachPanelCB; panelType: Wo (WordBool(PanelType and PANEL_LIFTLEFT) and (pan.LiftType = 2)) or (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = 3))); end; - - // other shit - if result then result := cb(pan); end; var tagmask: Integer = 0; begin result := false; - if not assigned(cb) then exit; 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; @@ -448,7 +448,7 @@ begin if WordBool(PanelType and PANEL_BLOCKMON) then tagmask := tagmask or GridTagBlockMon; if (tagmask = 0) then exit;// just in case - result := gMapGrid.forEachInAABB(x, y, 1, 1, checker, tagmask); + result := gMapGrid.forEachAtPoint(x, y, checker, tagmask); end; @@ -1233,15 +1233,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 +1256,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 +1271,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 +1309,8 @@ var begin gMapGrid.Free(); gMapGrid := nil; - mapTree.Free(); - mapTree := nil; + //mapTree.Free(); + //mapTree := nil; Result := False; gMapInfo.Map := Res; @@ -2109,11 +2109,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 +2129,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; @@ -2315,8 +2315,8 @@ function g_Map_CollidePanel(X, Y: Integer; Width, Height: Word; PanelType: Word; ((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))) and - g_Collide(X, Y, Width, Height, pan.X, pan.Y, pan.Width, pan.Height); + (WordBool(PanelType and PANEL_LIFTRIGHT) and (pan.LiftType = 3))) {and + g_Collide(X, Y, Width, Height, pan.X, pan.Y, pan.Width, pan.Height)}; exit; end; @@ -2327,7 +2327,8 @@ function g_Map_CollidePanel(X, Y: Integer; Width, Height: Word; PanelType: Word; end; // other shit - result := g_Collide(X, Y, Width, Height, pan.X, pan.Y, pan.Width, pan.Height); + //result := g_Collide(X, Y, Width, Height, pan.X, pan.Y, pan.Width, pan.Height); + result := true; end; var @@ -2346,7 +2347,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,9 +2357,16 @@ 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); + if (Width = 1) and (Height = 1) then + begin + result := gMapGrid.forEachAtPoint(X, Y, checker, tagmask); + end + else + begin + result := gMapGrid.forEachInAABB(X, Y, Width, Height, checker, tagmask); + end; end; end else @@ -2386,7 +2394,7 @@ var //2: if ((tag and (GridTagWater or GridTagAcid1 or GridTagAcid2) = 0) then exit; // allowed: water, acid1, acid2 end; // collision? - if not g_Collide(X, Y, Width, Height, pan.X, pan.Y, pan.Width, pan.Height) then exit; + //if not g_Collide(X, Y, Width, Height, pan.X, pan.Y, pan.Width, pan.Height) then exit; // yeah texid := pan.GetTextureID(); // water? water has the highest priority, so stop right here @@ -2402,13 +2410,20 @@ 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)); + if (Width = 1) and (Height = 1) then + begin + gMapGrid.forEachAtPoint(X, Y, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2)); + end + else + begin + gMapGrid.forEachInAABB(X, Y, Width, Height, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2)); + end; end; result := texid; end