aboutsummaryrefslogtreecommitdiff
path: root/src/common/Collision/Models
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-07-04 22:56:00 +0200
committerShauren <shauren.trinity@gmail.com>2024-07-04 22:56:00 +0200
commitff4fc1ad4e91e3da9cd8c011f30473a19a3d47bd (patch)
treea37fc61a59a39520a88d024846a900c63988a0b0 /src/common/Collision/Models
parentfd329ee8483da81585db484c005a6fe22448bc63 (diff)
Core/Vmaps: Replace manual reference counting with shared_ptr and slightly reduce memory use by deduplicating model name strings
Diffstat (limited to 'src/common/Collision/Models')
-rw-r--r--src/common/Collision/Models/GameObjectModel.cpp6
-rw-r--r--src/common/Collision/Models/GameObjectModel.h9
-rw-r--r--src/common/Collision/Models/ModelInstance.cpp2
-rw-r--r--src/common/Collision/Models/ModelInstance.h14
-rw-r--r--src/common/Collision/Models/WorldModel.h8
5 files changed, 17 insertions, 22 deletions
diff --git a/src/common/Collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp
index f2b19e038fa..24e9489326e 100644
--- a/src/common/Collision/Models/GameObjectModel.cpp
+++ b/src/common/Collision/Models/GameObjectModel.cpp
@@ -93,11 +93,7 @@ bool LoadGameObjectModelList(std::string const& dataPath)
return true;
}
-GameObjectModel::~GameObjectModel()
-{
- if (iModel)
- VMAP::VMapFactory::createOrGetVMapManager()->releaseModelInstance(iModel->GetName());
-}
+GameObjectModel::~GameObjectModel() = default;
bool GameObjectModel::initialize(std::unique_ptr<GameObjectModelOwnerBase> modelOwner, std::string const& dataPath)
{
diff --git a/src/common/Collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h
index f875d9e3197..1cfe27a050e 100644
--- a/src/common/Collision/Models/GameObjectModel.h
+++ b/src/common/Collision/Models/GameObjectModel.h
@@ -18,12 +18,11 @@
#ifndef _GAMEOBJECT_MODEL_H
#define _GAMEOBJECT_MODEL_H
-#include <G3D/Matrix3.h>
-#include <G3D/Vector3.h>
+#include "Define.h"
#include <G3D/AABox.h>
+#include <G3D/Matrix3.h>
#include <G3D/Ray.h>
-
-#include "Define.h"
+#include <G3D/Vector3.h>
#include <memory>
namespace G3D
@@ -91,7 +90,7 @@ private:
G3D::Vector3 iPos;
float iInvScale;
float iScale;
- VMAP::WorldModel* iModel;
+ std::shared_ptr<VMAP::WorldModel> iModel;
std::unique_ptr<GameObjectModelOwnerBase> owner;
};
diff --git a/src/common/Collision/Models/ModelInstance.cpp b/src/common/Collision/Models/ModelInstance.cpp
index 6838babcbe2..2205d10833a 100644
--- a/src/common/Collision/Models/ModelInstance.cpp
+++ b/src/common/Collision/Models/ModelInstance.cpp
@@ -24,7 +24,7 @@ using G3D::Ray;
namespace VMAP
{
- ModelInstance::ModelInstance(ModelSpawn const& spawn, WorldModel* model) : ModelMinimalData(spawn), iModel(model)
+ ModelInstance::ModelInstance(ModelSpawn const& spawn, std::shared_ptr<WorldModel> model) : ModelMinimalData(spawn), iModel(std::move(model))
{
iInvRot = G3D::Matrix3::fromEulerAnglesZYX(G3D::pif() * spawn.iRot.y / 180.f, G3D::pif() * spawn.iRot.x / 180.f, G3D::pif() * spawn.iRot.z / 180.f).inverse();
iInvScale = 1.f / iScale;
diff --git a/src/common/Collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h
index 7361fbb9335..78b07f11f4b 100644
--- a/src/common/Collision/Models/ModelInstance.h
+++ b/src/common/Collision/Models/ModelInstance.h
@@ -18,12 +18,12 @@
#ifndef _MODELINSTANCE_H_
#define _MODELINSTANCE_H_
-#include <G3D/Matrix3.h>
-#include <G3D/Vector3.h>
+#include "Define.h"
+#include <memory>
#include <G3D/AABox.h>
+#include <G3D/Matrix3.h>
#include <G3D/Ray.h>
-
-#include "Define.h"
+#include <G3D/Vector3.h>
namespace VMAP
{
@@ -70,17 +70,17 @@ namespace VMAP
{
public:
ModelInstance() : iInvScale(0.0f), iModel(nullptr) { }
- ModelInstance(ModelSpawn const& spawn, WorldModel* model);
+ ModelInstance(ModelSpawn const& spawn, std::shared_ptr<WorldModel> model);
void setUnloaded() { iModel = nullptr; }
bool intersectRay(G3D::Ray const& pRay, float& pMaxDist, bool pStopAtFirstHit, ModelIgnoreFlags ignoreFlags) const;
bool GetLocationInfo(G3D::Vector3 const& p, LocationInfo& info) const;
bool GetLiquidLevel(G3D::Vector3 const& p, LocationInfo& info, float& liqHeight) const;
G3D::Matrix3 const& GetInvRot() const { return iInvRot; }
- WorldModel const* getWorldModel() const { return iModel; }
+ WorldModel const* getWorldModel() const { return iModel.get(); }
protected:
G3D::Matrix3 iInvRot;
float iInvScale;
- WorldModel* iModel;
+ std::shared_ptr<WorldModel> iModel;
};
} // namespace VMAP
diff --git a/src/common/Collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h
index 48e75f3b797..9d2ba99bb80 100644
--- a/src/common/Collision/Models/WorldModel.h
+++ b/src/common/Collision/Models/WorldModel.h
@@ -117,7 +117,7 @@ namespace VMAP
class TC_COMMON_API WorldModel
{
public:
- WorldModel(): Flags(ModelFlags::None), RootWMOID(0) { }
+ WorldModel(): Flags(ModelFlags::None), RootWMOID(0), name(nullptr) { }
//! pass group models to WorldModel and create BIH. Passed vector is swapped with old geometry!
void setGroupModels(std::vector<GroupModel> &models);
@@ -129,14 +129,14 @@ namespace VMAP
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); }
+ std::string const& GetName() const { return *name; }
+ void SetName(std::string const* newName) { name = newName; }
protected:
EnumFlag<ModelFlags> Flags;
uint32 RootWMOID;
std::vector<GroupModel> groupModels;
BIH groupTree;
- std::string name;
+ std::string const* name; // valid only while model is held in VMapManager2::iLoadedModelFiles
};
} // namespace VMAP