rendered paste body#ifndef _GRIDMAPMANAGER_H#define _GRIDMAPMANAGER_H#include <string>namespace VMAP{ #define MAX_NUMBER_OF_GRIDS 64 #define SIZE_OF_GRIDS 533.33333f #define CENTER_GRID_ID (MAX_NUMBER_OF_GRIDS/2) #define CENTER_GRID_OFFSET (SIZE_OF_GRIDS/2) #define MAX_NUMBER_OF_CELLS 8 #define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS) #define CENTER_GRID_CELL_ID (MAX_NUMBER_OF_CELLS*MAX_NUMBER_OF_GRIDS/2) #define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2) #define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS) #define MAP_RESOLUTION 128 #define MAP_SIZE (SIZE_OF_GRIDS*MAX_NUMBER_OF_GRIDS) #define MAP_HALFSIZE (MAP_SIZE/2) //================================================ static char const* MAP_MAGIC = "MAPS"; static char const* MAP_VERSION_MAGIC = "v1.1"; static char const* MAP_AREA_MAGIC = "AREA"; static char const* MAP_HEIGHT_MAGIC = "MHGT"; static char const* MAP_LIQUID_MAGIC = "MLIQ"; typedef unsigned int uint32; typedef unsigned short uint16; typedef unsigned char uint8; typedef signed int int32; struct map_fileheader { uint32 mapMagic; uint32 versionMagic; uint32 buildMagic; uint32 areaMapOffset; uint32 areaMapSize; uint32 heightMapOffset; uint32 heightMapSize; uint32 liquidMapOffset; uint32 liquidMapSize; }; #define MAP_AREA_NO_AREA 0x0001 struct map_areaHeader { uint32 fourcc; uint16 flags; uint16 gridArea; }; #define MAP_HEIGHT_NO_HEIGHT 0x0001 #define MAP_HEIGHT_AS_INT16 0x0002 #define MAP_HEIGHT_AS_INT8 0x0004 struct map_heightHeader { uint32 fourcc; uint32 flags; float gridHeight; float gridMaxHeight; }; #define MAP_LIQUID_NO_TYPE 0x0001 #define MAP_LIQUID_NO_HEIGHT 0x0002 struct map_liquidHeader { uint32 fourcc; uint16 flags; uint16 liquidType; uint8 offsetX; uint8 offsetY; uint8 width; uint8 height; float liquidLevel; }; enum ZLiquidStatus { LIQUID_MAP_NO_WATER = 0x00000000, LIQUID_MAP_ABOVE_WATER = 0x00000001, LIQUID_MAP_WATER_WALK = 0x00000002, LIQUID_MAP_IN_WATER = 0x00000004, LIQUID_MAP_UNDER_WATER = 0x00000008 }; #define MAP_LIQUID_TYPE_NO_WATER 0x00 #define MAP_LIQUID_TYPE_WATER 0x01 #define MAP_LIQUID_TYPE_OCEAN 0x02 #define MAP_LIQUID_TYPE_MAGMA 0x04 #define MAP_LIQUID_TYPE_SLIME 0x08 #define MAP_ALL_LIQUIDS (MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN | MAP_LIQUID_TYPE_MAGMA | MAP_LIQUID_TYPE_SLIME) #define MAP_LIQUID_TYPE_DARK_WATER 0x10 #define MAP_LIQUID_TYPE_WMO_WATER 0x20 struct LiquidData { uint32 type; float level; float depth_level; }; class GridMap { uint32 m_flags; // Area data uint16 m_gridArea; uint16 *m_area_map; // Height level data float m_gridHeight; float m_gridIntHeightMultiplier; union{ float *m_V9; uint16 *m_uint16_V9; uint8 *m_uint8_V9; }; union{ float *m_V8; uint16 *m_uint16_V8; uint8 *m_uint8_V8; }; // Liquid data uint16 m_liquidType; uint8 m_liquid_offX; uint8 m_liquid_offY; uint8 m_liquid_width; uint8 m_liquid_height; float m_liquidLevel; uint8 *m_liquid_type; float *m_liquid_map; bool loadAreaData(FILE *in, uint32 offset, uint32 size); bool loadHeightData(FILE *in, uint32 offset, uint32 size); bool loadLiquidData(FILE *in, uint32 offset, uint32 size); // Get height functions and pointers typedef float (GridMap::*pGetHeightPtr) (float x, float y) const; pGetHeightPtr m_gridGetHeight; float getHeightFromFloat(float x, float y) const; float getHeightFromUint16(float x, float y) const; float getHeightFromUint8(float x, float y) const; float getHeightFromFlat(float x, float y) const; public: GridMap(); ~GridMap(); bool loadData(char *filaname); void unloadData(); //uint16 getArea(float x, float y); inline float getHeight(float x, float y) {return (this->*m_gridGetHeight)(x, y);} //float getLiquidLevel(float x, float y); //uint8 getTerrainType(float x, float y); //ZLiquidStatus getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData *data = 0); }; //================================================ class GridMapManager { private: GridMap *iGridMaps[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS]; bool iMapExist[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS]; std::string iBasePath; unsigned int iMapId; public: GridMapManager (const char* pBasePath, unsigned int pMapId); ~GridMapManager (); bool loadMap (int pX, int pY); void unloadMap (int pX, int pY); float getHeight (float pX, float pY); }; //================================================}#endif