25#include <G3D/Vector3.h>
48 if (fread(dest,
sizeof(
char), len, rf) != len)
return false;
49 return memcmp(dest, compare, len) == 0;
61 for (std::pair<uint32 const, StaticMapTree*>& iInstanceMapTree :
iInstanceMapTrees)
62 delete iInstanceMapTree.second;
64 for (std::pair<std::string const, ManagedModel*>& iLoadedModelFile :
iLoadedModelFiles)
65 delete iLoadedModelFile.second;
81 for (std::pair<
uint32 const, std::vector<uint32>>
const& mapId : mapData)
84 for (
uint32 childMapId : mapId.second)
94 const float mid = 0.5f * 64.0f * 533.33333333f;
105 std::stringstream fname;
121 instanceTree =
iInstanceMapTrees.insert(InstanceTreeMap::value_type(mapId,
nullptr)).first;
123 ABORT_MSG(
"Invalid mapId %u tile [%u, %u] passed to VMapManager2 after startup in thread unsafe environment",
127 if (!instanceTree->second)
135 return treeInitResult;
137 instanceTree->second = newTree;
140 return instanceTree->second->
LoadMapTile(x, y,
this);
148 instanceTree->second->UnloadMapTile(x, y,
this);
149 if (instanceTree->second->numLoadedTiles() == 0)
151 delete instanceTree->second;
152 instanceTree->second =
nullptr;
162 instanceTree->second->UnloadMap(
this);
163 if (instanceTree->second->numLoadedTiles() == 0)
165 delete instanceTree->second;
166 instanceTree->second =
nullptr;
182 return instanceTree->second->isInLineOfSight(pos1, pos2, ignoreFlags);
192 bool VMapManager2::getObjectHitPos(
unsigned int mapId,
float x1,
float y1,
float z1,
float x2,
float y2,
float z2,
float& rx,
float &ry,
float& rz,
float modifyDist)
202 bool result = instanceTree->second->getObjectHitPos(pos1, pos2, resultPos, modifyDist);
230 float height = instanceTree->second->getHeight(pos, maxSearchDist);
231 if (!(height < G3D::finf()))
243 InstanceTreeMap::const_iterator instanceTree =
GetMapTree(mapId);
248 if (instanceTree->second->GetLocationInfo(pos, info))
257 data.
liquidInfo.emplace(liquidType, liquidLevel);
281 TC_LOG_ERROR(
"misc",
"VMapManager2: could not load '{}{}.vmo'", basepath, filename);
285 TC_LOG_DEBUG(
"maps",
"VMapManager2: loading file '{}{}'", basepath, filename);
289 model =
iLoadedModelFiles.insert(std::pair<std::string, ManagedModel*>(filename, worldmodel)).first;
291 model->second->incRefCount();
292 return model->second->getModel();
303 TC_LOG_ERROR(
"misc",
"VMapManager2: trying to unload non-loaded file '{}'", filename);
306 if (model->second->decRefCount() == 0)
308 TC_LOG_DEBUG(
"maps",
"VMapManager2: unloading file '{}'", filename);
309 delete model->second;
328 return int32(itr->second);
#define VMAP_INVALID_HEIGHT_VALUE
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
#define MAP_FILENAME_EXTENSION2
uint32 GetLiquidType() const
uint32 GetMogpFlags() const
bool isHeightCalcEnabled() const
bool isMapLoadingEnabled() const
bool isLineOfSightCalcEnabled() const
bool GetLiquidLevel(G3D::Vector3 const &p, LocationInfo &info, float &liqHeight) const
LoadResult InitMap(std::string const &fname)
LoadResult LoadMapTile(uint32 tileX, uint32 tileY, VMapManager2 *vm)
static LoadResult CanLoadMap(const std::string &basePath, uint32 mapID, uint32 tileX, uint32 tileY, VMapManager2 *vm)
int32 getParentMapId(uint32 mapId) const
bool getAreaAndLiquidData(uint32 mapId, float x, float y, float z, Optional< uint8 > reqLiquidType, AreaAndLiquidData &data) const override
LoadResult loadMap(char const *pBasePath, unsigned int mapId, int x, int y) override
G3D::Vector3 convertPositionToInternalRep(float x, float y, float z) const
InstanceTreeMap::const_iterator GetMapTree(uint32 mapId) const
std::mutex LoadedModelFilesLock
ModelFileMap iLoadedModelFiles
void getInstanceMapTree(InstanceTreeMap &instanceMapTree)
void releaseModelInstance(std::string const &filename)
std::unordered_map< uint32, uint32 > iParentMapData
IsVMAPDisabledForFn IsVMAPDisabledForPtr
static bool IsVMAPDisabledForDummy(uint32, uint8)
bool thread_safe_environment
virtual LoadResult existsMap(char const *basePath, unsigned int mapId, int x, int y) override
void unloadMap(unsigned int mapId, int x, int y) override
bool isInLineOfSight(unsigned int mapId, float x1, float y1, float z1, float x2, float y2, float z2, ModelIgnoreFlags ignoreFlags) override
void InitializeThreadUnsafe(std::unordered_map< uint32, std::vector< uint32 > > const &mapData)
bool getObjectHitPos(unsigned int mapId, float x1, float y1, float z1, float x2, float y2, float z2, float &rx, float &ry, float &rz, float modifyDist) override
InstanceTreeMap iInstanceMapTrees
GetLiquidFlagsFn GetLiquidFlagsPtr
static std::string getMapFileName(unsigned int mapId)
WorldModel * acquireModelInstance(std::string const &basepath, std::string const &filename)
static uint32 GetLiquidFlagsDummy(uint32)
float getHeight(unsigned int mapId, float x, float y, float z, float maxSearchDist) override
bool readFile(const std::string &filename)
void SetName(std::string newName)
bool readChunk(FILE *rf, char *dest, const char *compare, uint32 len)
std::unordered_map< uint32, StaticMapTree * > InstanceTreeMap
@ VMAP_DISABLE_LIQUIDSTATUS
Optional< AreaInfo > areaInfo
Optional< LiquidInfo > liquidInfo
GroupModel const * hitModel
ModelInstance const * hitInstance