123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /*
- EQ2Emulator: Everquest II Server Emulator
- Copyright (C) 2007 EQ2EMulator Development Team (http://www.eq2emulator.net)
- This file is part of EQ2Emulator.
- EQ2Emulator is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- EQ2Emulator is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with EQ2Emulator. If not, see <http://www.gnu.org/licenses/>.
- */
- #pragma once
- #include <vector>
- #include <map>
- #include "../../common/types.h"
- #include <cmath>
- class Spawn;
- #define CELLSIZEDEFAULT 150
- #define FACECELLSIZEDEFAULT 15
- struct Face {
- float Vertex1[3];
- float Vertex2[3];
- float Vertex3[3];
- int32 grid_id;
- };
- /*struct GridBounds {
- int32 Grid;
- float MinBounds[3];
- float MaxBounds[3];
- };*/
- struct Cell {
- std::vector<Spawn*> SpawnList;
- //std::map<int32, vector<Face*> > FaceList;
- //std::map<int32, GridBounds*> GridBounds;
- };
- struct FaceCell {
- std::map<int32, vector<Face*> > FaceList;
- };
- class SPGrid {
- public:
- SPGrid(string file, int32 cellSize);
- ~SPGrid();
- // Sets up the spacial partioning grid
- bool Init();
- // Get cell based on cell coordinates
- Cell* GetCell(int32 x, int32 z);
- // Get cell based on world coordinates
- Cell* GetCell(float x, float z);
- // Adds a face to the cells it needs to be in and sets its GridID
- void AddFace(Face* face, int32 grid);
- // Checks the faces below the given spawn to determine the GridID
- int32 GetGridID(Spawn* spawn);
- int32 GetGridIDByLocation(float x, float y, float z);
- // Get cell based on cell coordinates
- FaceCell* GetFaceCell(int32 x, int32 z);
- // Get cell based on world coordinates
- FaceCell* GetFaceCell(float x, float z);
- float GetBestY(float x, float y, float z);
- Face* GetClosestFace(float x, float y, float z);
- Face* FindPath(float x, float y, float z, float targX, float targY, float targZ, bool forceEndCell=false);
- void InitValues(float minX, float maxX, float minZ, float maxZ, int32 numCellsX, int32 numCellsZ)
- {
- m_MinX = minX;
- m_MaxX = maxX;
- m_MinZ = minZ;
- m_MaxZ = maxZ;
- m_NumCellsX = numCellsX;
- m_NumCellsZ = numCellsZ;
- float width = m_MaxX - m_MinX;
- float height = m_MaxZ - m_MinZ;
- // Allocate all the cells
- m_Cells.resize(m_NumCellsZ * m_NumCellsX);
- m_NumFaceCellsX = ceil(width / FACECELLSIZEDEFAULT);
- m_NumFaceCellsZ = ceil(height / FACECELLSIZEDEFAULT);
- m_FaceCells.resize(m_NumFaceCellsX * m_NumFaceCellsZ);
- }
- private:
- // 1-D array for cells as it is better performance wise then 2-D
- std::vector<Cell> m_Cells;
- std::vector<FaceCell> m_FaceCells;
- string m_ZoneFile;
- int32 m_CellSize;
- float m_MinX;
- float m_MinZ;
- float m_MaxX;
- float m_MaxZ;
- int32 m_NumCellsX;
- int32 m_NumCellsZ;
- int32 m_NumFaceCellsX;
- int32 m_NumFaceCellsZ;
- };
|