aboutsummaryrefslogtreecommitdiff
path: root/src/common/Collision
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-06 00:04:19 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-06 00:04:19 +0100
commita70e758ba5eef1e8aa966cbabaee020630d2c872 (patch)
treef323c8ac0f4bb31d75c3570b838de066190983ba /src/common/Collision
parent382e76f02df5a41c2ba1d964ac6d9258e68265e6 (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.cpp5
-rw-r--r--src/common/Collision/Management/VMapManager2.h4
-rw-r--r--src/common/Collision/Maps/MapTree.cpp2
-rw-r--r--src/common/Collision/Models/GameObjectModel.cpp17
-rw-r--r--src/common/Collision/Models/GameObjectModel.h5
-rw-r--r--src/common/Collision/Models/ModelInstance.cpp4
-rw-r--r--src/common/Collision/Models/ModelInstance.h7
-rw-r--r--src/common/Collision/Models/WorldModel.cpp15
-rw-r--r--src/common/Collision/Models/WorldModel.h15
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;