diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-03-06 00:04:19 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-03-06 00:04:19 +0100 |
commit | a70e758ba5eef1e8aa966cbabaee020630d2c872 (patch) | |
tree | f323c8ac0f4bb31d75c3570b838de066190983ba /src/common/Collision | |
parent | 382e76f02df5a41c2ba1d964ac6d9258e68265e6 (diff) |
Tools/vmap_extractor: Move information about model type from spawns in vmap tiles to model file itself
Diffstat (limited to 'src/common/Collision')
-rw-r--r-- | src/common/Collision/Management/VMapManager2.cpp | 5 | ||||
-rw-r--r-- | src/common/Collision/Management/VMapManager2.h | 4 | ||||
-rw-r--r-- | src/common/Collision/Maps/MapTree.cpp | 2 | ||||
-rw-r--r-- | src/common/Collision/Models/GameObjectModel.cpp | 17 | ||||
-rw-r--r-- | src/common/Collision/Models/GameObjectModel.h | 5 | ||||
-rw-r--r-- | src/common/Collision/Models/ModelInstance.cpp | 4 | ||||
-rw-r--r-- | src/common/Collision/Models/ModelInstance.h | 7 | ||||
-rw-r--r-- | src/common/Collision/Models/WorldModel.cpp | 15 | ||||
-rw-r--r-- | src/common/Collision/Models/WorldModel.h | 15 |
9 files changed, 48 insertions, 26 deletions
diff --git a/src/common/Collision/Management/VMapManager2.cpp b/src/common/Collision/Management/VMapManager2.cpp index 5ae50115486..78d5be2b79c 100644 --- a/src/common/Collision/Management/VMapManager2.cpp +++ b/src/common/Collision/Management/VMapManager2.cpp @@ -315,7 +315,7 @@ namespace VMAP } } - WorldModel* VMapManager2::acquireModelInstance(const std::string& basepath, const std::string& filename, uint32 flags/* Only used when creating the model */) + WorldModel* VMapManager2::acquireModelInstance(std::string const& basepath, std::string const& filename) { //! Critical section, thread safe access to iLoadedModelFiles std::lock_guard<std::mutex> lock(LoadedModelFilesLock); @@ -333,7 +333,6 @@ namespace VMAP TC_LOG_DEBUG("maps", "VMapManager2: loading file '{}{}'", basepath, filename); worldmodel->getModel()->SetName(filename); - worldmodel->getModel()->Flags = flags; model = iLoadedModelFiles.insert(std::pair<std::string, ManagedModel*>(filename, worldmodel)).first; } @@ -341,7 +340,7 @@ namespace VMAP return model->second->getModel(); } - void VMapManager2::releaseModelInstance(const std::string &filename) + void VMapManager2::releaseModelInstance(std::string const& filename) { //! Critical section, thread safe access to iLoadedModelFiles std::lock_guard<std::mutex> lock(LoadedModelFilesLock); diff --git a/src/common/Collision/Management/VMapManager2.h b/src/common/Collision/Management/VMapManager2.h index b18d52ac042..3dda9c54cd2 100644 --- a/src/common/Collision/Management/VMapManager2.h +++ b/src/common/Collision/Management/VMapManager2.h @@ -107,8 +107,8 @@ namespace VMAP bool GetLiquidLevel(uint32 mapId, float x, float y, float z, uint8 reqLiquidType, float& level, float& floor, uint32& type, uint32& mogpFlags) const override; void getAreaAndLiquidData(uint32 mapId, float x, float y, float z, uint8 reqLiquidType, AreaAndLiquidData& data) const override; - WorldModel* acquireModelInstance(const std::string& basepath, const std::string& filename, uint32 flags = 0); - void releaseModelInstance(const std::string& filename); + WorldModel* acquireModelInstance(std::string const& basepath, std::string const& filename); + void releaseModelInstance(std::string const& filename); // what's the use of this? o.O virtual std::string getDirFileName(unsigned int mapId, int /*x*/, int /*y*/) const override diff --git a/src/common/Collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp index 0ff4dfff4b9..88eb9d2c6df 100644 --- a/src/common/Collision/Maps/MapTree.cpp +++ b/src/common/Collision/Maps/MapTree.cpp @@ -391,7 +391,7 @@ namespace VMAP if (ModelSpawn::readFromFile(fileResult.File, spawn)) { // acquire model instance - WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name, spawn.flags); + WorldModel* model = vm->acquireModelInstance(iBasePath, spawn.name); if (!model) TC_LOG_ERROR("misc", "StaticMapTree::LoadMapTile() : could not acquire WorldModel pointer [{}, {}]", tileX, tileY); diff --git a/src/common/Collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp index 946fe5b3e8b..363863f5759 100644 --- a/src/common/Collision/Models/GameObjectModel.cpp +++ b/src/common/Collision/Models/GameObjectModel.cpp @@ -32,12 +32,11 @@ using G3D::AABox; struct GameobjectModelData { - GameobjectModelData(char const* name_, uint32 nameLength, Vector3 const& lowBound, Vector3 const& highBound, bool isWmo_) : - bound(lowBound, highBound), name(name_, nameLength), isWmo(isWmo_) { } + GameobjectModelData(char const* name_, uint32 nameLength, Vector3 const& lowBound, Vector3 const& highBound) : + bound(lowBound, highBound), name(name_, nameLength) { } AABox bound; std::string name; - bool isWmo; }; typedef std::unordered_map<uint32, GameobjectModelData> ModelList; @@ -63,7 +62,6 @@ bool LoadGameObjectModelList(std::string const& dataPath) } uint32 name_length, displayId; - uint8 isWmo; char buff[500]; while (true) { @@ -72,8 +70,7 @@ bool LoadGameObjectModelList(std::string const& dataPath) if (feof(model_list_file.get())) // EOF flag is only set after failed reading attempt break; - if (fread(&isWmo, sizeof(uint8), 1, model_list_file.get()) != 1 - || fread(&name_length, sizeof(uint32), 1, model_list_file.get()) != 1 + if (fread(&name_length, sizeof(uint32), 1, model_list_file.get()) != 1 || name_length >= sizeof(buff) || fread(&buff, sizeof(char), name_length, model_list_file.get()) != name_length || fread(&v1, sizeof(Vector3), 1, model_list_file.get()) != 1 @@ -89,7 +86,7 @@ bool LoadGameObjectModelList(std::string const& dataPath) continue; } - model_list.emplace(std::piecewise_construct, std::forward_as_tuple(displayId), std::forward_as_tuple(&buff[0], name_length, v1, v2, isWmo != 0)); + model_list.emplace(std::piecewise_construct, std::forward_as_tuple(displayId), std::forward_as_tuple(&buff[0], name_length, v1, v2)); } TC_LOG_INFO("server.loading", ">> Loaded {} GameObject models in {} ms", uint32(model_list.size()), GetMSTimeDiffToNow(oldMSTime)); @@ -144,7 +141,6 @@ bool GameObjectModel::initialize(std::unique_ptr<GameObjectModelOwnerBase> model #endif owner = std::move(modelOwner); - isWmo = it->second.isWmo; return true; } @@ -160,6 +156,11 @@ GameObjectModel* GameObjectModel::Create(std::unique_ptr<GameObjectModelOwnerBas return mdl; } +bool GameObjectModel::isMapObject() const +{ + return !iModel->IsM2(); +} + bool GameObjectModel::intersectRay(G3D::Ray const& ray, float& maxDist, bool stopAtFirstHit, PhaseShift const& phaseShift, VMAP::ModelIgnoreFlags ignoreFlags) const { if (!isCollisionEnabled() || !owner->IsSpawned()) diff --git a/src/common/Collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h index a84fac60aa2..fd11e5c1909 100644 --- a/src/common/Collision/Models/GameObjectModel.h +++ b/src/common/Collision/Models/GameObjectModel.h @@ -60,7 +60,7 @@ public: class TC_COMMON_API GameObjectModel /*, public Intersectable*/ { - GameObjectModel() : _collisionEnabled(false), iInvScale(0), iScale(0), iModel(nullptr), isWmo(false) { } + GameObjectModel() : _collisionEnabled(false), iInvScale(0), iScale(0), iModel(nullptr) { } public: const G3D::AABox& getBounds() const { return iBound; } @@ -71,7 +71,7 @@ public: /* Enables/disables collision */ void enableCollision(bool enable) { _collisionEnabled = enable; } bool isCollisionEnabled() const { return _collisionEnabled; } - bool isMapObject() const { return isWmo; } + bool isMapObject() const; uint8 GetNameSetId() const { return owner->GetNameSetId(); } bool intersectRay(G3D::Ray const& ray, float& maxDist, bool stopAtFirstHit, PhaseShift const& phaseShift, VMAP::ModelIgnoreFlags ignoreFlags) const; @@ -94,7 +94,6 @@ private: float iScale; VMAP::WorldModel* iModel; std::unique_ptr<GameObjectModelOwnerBase> owner; - bool isWmo; }; TC_COMMON_API bool LoadGameObjectModelList(std::string const& dataPath); diff --git a/src/common/Collision/Models/ModelInstance.cpp b/src/common/Collision/Models/ModelInstance.cpp index 783db84caca..989a5710afe 100644 --- a/src/common/Collision/Models/ModelInstance.cpp +++ b/src/common/Collision/Models/ModelInstance.cpp @@ -74,7 +74,7 @@ namespace VMAP } // M2 files don't contain area info, only WMO files - if (flags & MOD_M2) + if (iModel->IsM2()) return; if (!iBound.contains(p)) return; @@ -108,7 +108,7 @@ namespace VMAP } // M2 files don't contain area info, only WMO files - if (flags & MOD_M2) + if (iModel->IsM2()) return false; if (!iBound.contains(p)) return false; diff --git a/src/common/Collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h index 6ea4264a7c6..d44a867ae3c 100644 --- a/src/common/Collision/Models/ModelInstance.h +++ b/src/common/Collision/Models/ModelInstance.h @@ -32,11 +32,10 @@ namespace VMAP struct LocationInfo; enum class ModelIgnoreFlags : uint32; - enum ModelFlags + enum ModelInstanceFlags { - MOD_M2 = 1, - MOD_HAS_BOUND = 1 << 1, - MOD_PARENT_SPAWN = 1 << 2 + MOD_HAS_BOUND = 1 << 0, + MOD_PARENT_SPAWN = 1 << 1 }; struct ModelMinimalData diff --git a/src/common/Collision/Models/WorldModel.cpp b/src/common/Collision/Models/WorldModel.cpp index 70e21e544db..1e9b2e44ddb 100644 --- a/src/common/Collision/Models/WorldModel.cpp +++ b/src/common/Collision/Models/WorldModel.cpp @@ -471,7 +471,7 @@ namespace VMAP if ((ignoreFlags & ModelIgnoreFlags::M2) != ModelIgnoreFlags::Nothing) { // M2 models are not taken into account for LoS calculation if caller requested their ignoring. - if (Flags & MOD_M2) + if (Flags.HasFlag(ModelFlags::None)) return false; } @@ -569,6 +569,11 @@ namespace VMAP if (result && fwrite("WMOD", 1, 4, wf) != 4) result = false; chunkSize = sizeof(uint32) + sizeof(uint32); if (result && fwrite(&chunkSize, sizeof(uint32), 1, wf) != 1) result = false; + if (result) + { + uint32 flags = Flags.AsUnderlyingType(); + if (fwrite(&flags, sizeof(uint32), 1, wf) != 1) result = false; + } if (result && fwrite(&RootWMOID, sizeof(uint32), 1, wf) != 1) result = false; // write group models @@ -605,6 +610,14 @@ namespace VMAP if (result && !readChunk(rf, chunk, "WMOD", 4)) result = false; if (result && fread(&chunkSize, sizeof(uint32), 1, rf) != 1) result = false; + if (result) + { + ModelFlags flags; + if (fread(&flags, sizeof(flags), 1, rf) == 1) + Flags = flags; + else + result = false; + } if (result && fread(&RootWMOID, sizeof(uint32), 1, rf) != 1) result = false; // read group models diff --git a/src/common/Collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h index 57ac1941e48..35ffa57b4d2 100644 --- a/src/common/Collision/Models/WorldModel.h +++ b/src/common/Collision/Models/WorldModel.h @@ -24,6 +24,7 @@ #include "BoundingIntervalHierarchy.h" #include "Define.h" +#include "EnumFlag.h" namespace VMAP { @@ -33,6 +34,14 @@ namespace VMAP struct GroupLocationInfo; enum class ModelIgnoreFlags : uint32; + enum class ModelFlags : uint32 + { + None = 0x0, + IsM2 = 0x1 + }; + + DEFINE_ENUM_FLAG(ModelFlags); + struct MeshTriangle { uint32 idx0; @@ -106,21 +115,23 @@ namespace VMAP class TC_COMMON_API WorldModel { public: - WorldModel(): Flags(0), RootWMOID(0) { } + WorldModel(): Flags(ModelFlags::None), RootWMOID(0) { } //! pass group models to WorldModel and create BIH. Passed vector is swapped with old geometry! void setGroupModels(std::vector<GroupModel> &models); + void setFlags(ModelFlags flags) { Flags = flags; } void setRootWmoID(uint32 id) { RootWMOID = id; } bool IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; bool IntersectPoint(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, AreaInfo &info) const; bool GetLocationInfo(const G3D::Vector3 &p, const G3D::Vector3 &down, float &dist, GroupLocationInfo& info) const; bool writeFile(const std::string &filename); bool readFile(const std::string &filename); + bool IsM2() const { return Flags.HasFlag(ModelFlags::IsM2); } std::vector<GroupModel> const& getGroupModels() const { return groupModels; } std::string const& GetName() const { return name; } void SetName(std::string newName) { name = std::move(newName); } - uint32 Flags; protected: + EnumFlag<ModelFlags> Flags; uint32 RootWMOID; std::vector<GroupModel> groupModels; BIH groupTree; |