X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=7d13205d096c4f0e259fb3411d137dab0f01e917;hb=082b546b38711030b4490facbefa37a331cb1a37;hp=7d6f3dddd37d8472a5340620de86bdea06d6cb2f;hpb=747da9b7f35549ec88cec08069f6bfe725e508e2;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 7d6f3dd..7d13205 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -21,7 +21,7 @@ interface uses e_graphics, g_basic, MAPSTRUCT, g_textures, Classes, - g_phys, wadreader, BinEditor, g_panel, g_grid, z_aabbtree, md5, binheap, xprofiler; + g_phys, wadreader, BinEditor, g_panel, g_grid, md5, binheap, xprofiler; type TMapInfo = record @@ -181,9 +181,6 @@ 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; profMapCollision: TProfiler = nil; //WARNING: FOR DEBUGGING ONLY! gDrawPanelList: TBinaryHeapObj = nil; // binary heap of all walls we have to render, populated by `g_Map_CollectDrawPanels()` @@ -210,26 +207,6 @@ 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; - if (pan = nil) then begin aabb := AABB2D.Create(0, 0, 0, 0); exit; end; - aabb := AABB2D.Create(pan.X, pan.Y, pan.X+pan.Width-1, pan.Y+pan.Height-1); - if (pan.Width < 1) or (pan.Height < 1) then exit; - if not aabb.valid then raise Exception.Create('wutafuuuuuuu?!'); - result := true; -end; -} - function panelTypeToTag (panelType: Word): Integer; begin @@ -279,7 +256,6 @@ var FlagPoints: Array [FLAG_RED..FLAG_BLUE] of PFlagPoint; //DOMFlagPoints: Array of TFlagPoint; mapGrid: TPanelGrid = nil; - //mapTree: TDynAABBTreeMap = nil; procedure g_Map_ProfilersBegin (); @@ -302,123 +278,11 @@ begin end; -// wall index in `gWalls` or -1 -(* -function g_Map_traceToNearestWallOld (x0, y0, x1, y1: Integer; hitx: PInteger=nil; hity: PInteger=nil): Integer; - - function sqchecker (pan: TPanel; var ray: Ray2D): Single; - var - aabb: AABB2D; - tmin: Single; - begin - result := -666.0; // invalid - if not pan.Enabled then exit; - aabb := AABB2D.CreateWH(pan.X, pan.Y, pan.Width, pan.Height); - if not aabb.valid then exit; - if aabb.intersects(ray, @tmin) then - begin - //if (tmin*tmin > maxDistSq) then exit; - if (tmin >= 0.0) then - begin - //e_WriteLog(Format('sqchecker(%d,%d,%d,%d): panel #%d (%d,%d)-(%d,%d); tmin=%f', [x0, y0, x1, y1, pan.arrIdx, pan.X, pan.Y, pan.Width, pan.Height, tmin]), MSG_NOTIFY); - //if (tmin < 0.0) then tmin := 0.0; - result := tmin; - end; - end; - end; - -var - qr: TDynAABBTreeMap.TSegmentQueryResult; - ray: Ray2D; - hxf, hyf: Single; - hx, hy: Integer; - maxDistSq: Single; -begin - result := -1; - if (mapTree = nil) then exit; - if mapTree.segmentQuery(qr, x0, y0, x1, y1, sqchecker, (GridTagWall or GridTagDoor)) then - begin - maxDistSq := (x1-x0)*(x1-x0)+(y1-y0)*(y1-y0); - if (qr.flesh <> nil) and (qr.time*qr.time <= maxDistSq) then - begin - result := qr.flesh.arrIdx; - if (hitx <> nil) or (hity <> nil) then - begin - ray := Ray2D.Create(x0, y0, x1, y1); - hxf := ray.origX+ray.dirX*qr.time; - hyf := ray.origY+ray.dirY*qr.time; - while true do - begin - hx := trunc(hxf); - hy := trunc(hyf); - if (hx >= qr.flesh.X) and (hy >= qr.flesh.Y) and (hx < qr.flesh.X+qr.flesh.Width) and (hy < qr.flesh.Y+qr.flesh.Height) then - begin - // go back a little - hxf -= ray.dirX; - hyf -= ray.dirY; - end - else - begin - break; - end; - end; - if (hitx <> nil) then hitx^ := hx; - if (hity <> nil) then hity^ := hy; - end; - end; - end; -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, lastDistSq: Integer; - wasHit: Boolean = false; - - // pan=nil: before processing new tile - function sqchecker (pan: TPanel; tag: Integer; x, y, prevx, prevy: Integer): Boolean; - var - distSq: Integer; - begin - if (pan = nil) then - begin - // stop if something was hit at the previous tile - result := wasHit; - end - else - begin - result := false; - if ((tag and (GridTagWall or GridTagDoor)) <> 0) then - begin - if not pan.Enabled then exit; - end; - distSq := (prevx-x0)*(prevx-x0)+(prevy-y0)*(prevy-y0); - if (distSq < lastDistSq) then - begin - wasHit := true; - lastDistSq := distSq; - lastX := prevx; - lastY := prevy; - end; - end; - end; -*) var ex, ey: Integer; begin - (* - result := false; - if (mapGrid = nil) then exit; - lastDistSq := (x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)+1; - lastX := 0; - lastY := 0; - result := mapGrid.traceRay(x0, y0, x1, y1, sqchecker, (GridTagWall or GridTagDoor)); - if (hitx <> nil) then hitx^ := lastX; - if (hity <> nil) then hity^ := lastY; - *) result := (mapGrid.traceRay(ex, ey, x0, y0, x1, y1, nil, (GridTagWall or GridTagDoor)) <> nil); end; @@ -1037,7 +901,7 @@ end; procedure CreateArea(Area: TAreaRec_1); var a: Integer; - id: DWORD; + id: DWORD = 0; begin case Area.AreaType of AREA_DMPOINT, AREA_PLAYERPOINT1, AREA_PLAYERPOINT2, @@ -1222,6 +1086,7 @@ begin addResToExternalResList(mapHeader.SkyName); end; + procedure mapCreateGrid (); var mapX0: Integer = $3fffffff; @@ -1266,15 +1131,12 @@ var e_WriteLog(Format('INSERTED wall #%d(%d) enabled (%d)', [Integer(idx), Integer(pan.proxyId), Integer(mapGrid.proxyEnabled[pan.proxyId])]), MSG_NOTIFY); end; {$ENDIF} - //mapTree.insertObject(pan, tag, true); // as static object end; end; begin mapGrid.Free(); mapGrid := nil; - //mapTree.Free(); - //mapTree := nil; calcBoundingBox(gWalls); calcBoundingBox(gRenderBackgrounds); @@ -1289,7 +1151,6 @@ begin e_WriteLog(Format('map dimensions: (%d,%d)-(%d,%d)', [mapX0, mapY0, mapX1, mapY1]), MSG_WARNING); mapGrid := TPanelGrid.Create(mapX0-512, mapY0-512, mapX1-mapX0+1+512*2, mapY1-mapY0+1+512*2); - //mapTree := TDynAABBTreeMap.Create(); addPanelsToGrid(gWalls, PANEL_WALL); addPanelsToGrid(gWalls, PANEL_CLOSEDOOR); @@ -1304,10 +1165,11 @@ begin addPanelsToGrid(gBlockMon, PANEL_BLOCKMON); mapGrid.dumpStats(); - //e_WriteLog(Format('tree depth: %d; %d nodes used, %d nodes allocated', [mapTree.computeTreeHeight, mapTree.nodeCount, mapTree.nodeAlloced]), MSG_NOTIFY); - //mapTree.forEachLeaf(nil); + + g_Mons_InitTree(mapGrid.gridX0, mapGrid.gridY0, mapGrid.gridWidth, mapGrid.gridHeight); end; + function g_Map_Load(Res: String): Boolean; const DefaultMusRes = 'Standart.wad:STDMUS\MUS1'; @@ -1650,6 +1512,11 @@ begin end; end; + // create map grid, init other grids (for monsters, for example) + e_WriteLog('Creating map grid', MSG_NOTIFY); + mapCreateGrid(); + + // Åñëè íå LoadState, òî ñîçäàåì òðèããåðû: if (triggers <> nil) and not gLoadGameMode then begin @@ -1811,9 +1678,6 @@ begin sfsGCEnable(); // enable releasing unused volumes end; - e_WriteLog('Creating map grid', MSG_NOTIFY); - mapCreateGrid(); - e_WriteLog('Done loading map.', MSG_NOTIFY); Result := True; end;