X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=e439d17db2b9643ea8451966dc98354690f15be7;hb=e126054922c9113731c77ee2a8315eb01951461b;hp=b97cc00a24f2a3ed8a6a06dc51b9b10e54b850fd;hpb=1ac9fc74d98d56a450774702aae19fa1546f2849;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index b97cc00..e439d17 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -134,8 +134,8 @@ var BackID: DWORD = DWORD(-1); gExternalResources: TStringList; - gdbg_map_use_grid_render: Boolean = true; - gdbg_map_use_grid_coldet: Boolean = true; + 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; @@ -202,14 +202,13 @@ var pan: TPanel; begin result := false; - if (flesh = nil) then exit; + if (flesh = nil) then begin aabb := AABB2D.Create(0, 0, 0, 0); exit; end; pan := (flesh as TPanel); - if (pan.Width < 1) or (pan.Height < 1) then exit; aabb := AABB2D.Create(pan.X, pan.Y, pan.X+pan.Width, pan.Y+pan.Height); + if (pan.Width < 1) or (pan.Height < 1) then exit; //if (pan.Width = 1) then aabb.maxX += 1; //if (pan.Height = 1) then aabb.maxY += 1; if not aabb.valid then raise Exception.Create('wutafuuuuuuu?!'); - //e_WriteLog(Format('getFleshAABB(%d;%d) AABB:(%f,%f)-(%f,%f); valid=%d; volume=%f; x=%d; y=%d; w=%d; h=%d', [pan.tag, pan.ArrIdx, aabb.minX, aabb.minY, aabb.maxX, aabb.maxY, Integer(aabb.valid), aabb.volume, pan.X, pan.Y, pan.Width, pan.Height]), MSG_NOTIFY); result := aabb.valid; end; @@ -1950,7 +1949,7 @@ begin dplClear(); ptag := panelTypeToTag(PanelType); - if gdbg_map_use_grid_render then + if gdbg_map_use_accel_render then begin if gdbg_map_use_tree_draw then begin @@ -1958,7 +1957,7 @@ begin end else begin - gMapGrid.forEachInAABB(x0, y0, wdt, hgt, checker); + gMapGrid.forEachInAABB(x0, y0, wdt, hgt, checker, ptag); end; // sort and draw the list (we need to sort it, or rendering is fucked) while gDrawPanelList.count > 0 do @@ -2004,7 +2003,7 @@ begin end else begin - gMapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker); + gMapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker, GridTagWallDoor); end; end; @@ -2264,30 +2263,27 @@ function g_Map_CollidePanel(X, Y: Integer; Width, Height: Word; PanelType: Word; begin //TODO: detailed profile if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('wall coldet'); - try - if gdbg_map_use_grid_coldet then + if gdbg_map_use_accel_coldet then + begin + if gdbg_map_use_tree_coldet then begin - if gdbg_map_use_tree_coldet 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 - 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); - g_Console_Add(Format('map collision: %d nodes visited (%d deep)', [mapTree.nodesVisited, mapTree.nodesDeepVisited])); - end; - end - else - begin - result := gMapGrid.forEachInAABB(X, Y, Width, Height, checker); + //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 - result := g_Map_CollidePanelOld(X, Y, Width, Height, PanelType, b1x3); + result := gMapGrid.forEachInAABB(X, Y, Width, Height, checker, (GridTagWallDoor or GridTagWater or GridTagAcid1 or GridTagAcid2 or GridTagStep or GridTagLift or GridTagBlockMon)); end; - finally - if (profMapCollision <> nil) then profMapCollision.sectionEnd(); + end + else + begin + result := g_Map_CollidePanelOld(X, Y, Width, Height, PanelType, b1x3); end; + if (profMapCollision <> nil) then profMapCollision.sectionEnd(); end; @@ -2338,43 +2334,27 @@ var end; end; -{var - cctype1: Integer = 3; // priority: 0: water, 1: acid1, 2: acid2; 3: others (nothing) - texid1: DWORD;} begin //TODO: detailed profile? if (profMapCollision <> nil) then profMapCollision.sectionBeginAccum('liquid coldet'); - try - if gdbg_map_use_grid_coldet then + if gdbg_map_use_accel_coldet then + begin + texid := TEXTURE_NONE; + if gdbg_map_use_tree_coldet then begin - texid := TEXTURE_NONE; - if gdbg_map_use_tree_coldet then - begin - mapTree.aabbQuery(X, Y, Width, Height, checker); - { - cctype1 := cctype; - texid1 := texid; - cctype := 3; - texid := TEXTURE_NONE; - gMapGrid.forEachInAABB(X, Y, Width, Height, checker); - if (cctype1 <> cctype) or (texid1 <> texid) then - begin - e_WriteLog(Format('g_Map_CollideLiquid_Texture(%d, %d, %u, %u): tree(cctype:%d;texid:%u); grid(cctype:%d;texid:%u)', [X, Y, Width, Height, cctype1, texid1, cctype, texid]), MSG_WARNING); - end;} - end - else - begin - gMapGrid.forEachInAABB(X, Y, Width, Height, checker); - end; - result := texid; + mapTree.aabbQuery(X, Y, Width, Height, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2)); end else begin - result := g_Map_CollideLiquid_TextureOld(X, Y, Width, Height); + gMapGrid.forEachInAABB(X, Y, Width, Height, checker, (GridTagWater or GridTagAcid1 or GridTagAcid2)); end; - finally - if (profMapCollision <> nil) then profMapCollision.sectionEnd(); + result := texid; + end + else + begin + result := g_Map_CollideLiquid_TextureOld(X, Y, Width, Height); end; + if (profMapCollision <> nil) then profMapCollision.sectionEnd(); end; procedure g_Map_EnableWall(ID: DWORD);