diff options
Diffstat (limited to 'src/common/Collision/Models')
-rw-r--r-- | src/common/Collision/Models/GameObjectModel.cpp | 4 | ||||
-rw-r--r-- | src/common/Collision/Models/GameObjectModel.h | 3 | ||||
-rw-r--r-- | src/common/Collision/Models/ModelIgnoreFlags.h | 34 | ||||
-rw-r--r-- | src/common/Collision/Models/ModelInstance.cpp | 4 | ||||
-rw-r--r-- | src/common/Collision/Models/ModelInstance.h | 3 | ||||
-rw-r--r-- | src/common/Collision/Models/WorldModel.cpp | 11 | ||||
-rw-r--r-- | src/common/Collision/Models/WorldModel.h | 4 |
7 files changed, 55 insertions, 8 deletions
diff --git a/src/common/Collision/Models/GameObjectModel.cpp b/src/common/Collision/Models/GameObjectModel.cpp index b111b0de301..2950a48c21b 100644 --- a/src/common/Collision/Models/GameObjectModel.cpp +++ b/src/common/Collision/Models/GameObjectModel.cpp @@ -153,7 +153,7 @@ GameObjectModel* GameObjectModel::Create(std::unique_ptr<GameObjectModelOwnerBas return mdl; } -bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask) const +bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask, VMAP::ModelIgnoreFlags ignoreFlags) const { if (!(phasemask & ph_mask) || !owner->IsSpawned()) return false; @@ -166,7 +166,7 @@ bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool Sto Vector3 p = iInvRot * (ray.origin() - iPos) * iInvScale; Ray modRay(p, iInvRot * ray.direction()); float distance = MaxDist * iInvScale; - bool hit = iModel->IntersectRay(modRay, distance, StopAtFirstHit); + bool hit = iModel->IntersectRay(modRay, distance, StopAtFirstHit, ignoreFlags); if (hit) { distance *= iScale; diff --git a/src/common/Collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h index a9fce400146..c121e421e6d 100644 --- a/src/common/Collision/Models/GameObjectModel.h +++ b/src/common/Collision/Models/GameObjectModel.h @@ -30,6 +30,7 @@ namespace VMAP { class WorldModel; + enum class ModelIgnoreFlags : uint32; } class GameObject; @@ -65,7 +66,7 @@ public: bool isEnabled() const {return phasemask != 0;} - bool intersectRay(const G3D::Ray& Ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask) const; + bool intersectRay(const G3D::Ray& Ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask, VMAP::ModelIgnoreFlags ignoreFlags) const; static GameObjectModel* Create(std::unique_ptr<GameObjectModelOwnerBase> modelOwner, std::string const& dataPath); diff --git a/src/common/Collision/Models/ModelIgnoreFlags.h b/src/common/Collision/Models/ModelIgnoreFlags.h new file mode 100644 index 00000000000..beb9f965523 --- /dev/null +++ b/src/common/Collision/Models/ModelIgnoreFlags.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2008-2017 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef ModelIgnoreFlags_h__ +#define ModelIgnoreFlags_h__ + +#include "Define.h" + +namespace VMAP +{ +enum class ModelIgnoreFlags : uint32 +{ + Nothing = 0x00, + M2 = 0x01 +}; + +inline ModelIgnoreFlags operator&(ModelIgnoreFlags left, ModelIgnoreFlags right) { return ModelIgnoreFlags(uint32(left) & uint32(right)); } +} + +#endif // ModelIgnoreFlags_h__ diff --git a/src/common/Collision/Models/ModelInstance.cpp b/src/common/Collision/Models/ModelInstance.cpp index b38f455e546..3390b233c82 100644 --- a/src/common/Collision/Models/ModelInstance.cpp +++ b/src/common/Collision/Models/ModelInstance.cpp @@ -31,7 +31,7 @@ namespace VMAP iInvScale = 1.f/iScale; } - bool ModelInstance::intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool pStopAtFirstHit) const + bool ModelInstance::intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool pStopAtFirstHit, ModelIgnoreFlags ignoreFlags) const { if (!iModel) { @@ -55,7 +55,7 @@ namespace VMAP Vector3 p = iInvRot * (pRay.origin() - iPos) * iInvScale; Ray modRay(p, iInvRot * pRay.direction()); float distance = pMaxDist * iInvScale; - bool hit = iModel->IntersectRay(modRay, distance, pStopAtFirstHit); + bool hit = iModel->IntersectRay(modRay, distance, pStopAtFirstHit, ignoreFlags); if (hit) { distance *= iScale; diff --git a/src/common/Collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h index 91ce194ddf1..3036ac10117 100644 --- a/src/common/Collision/Models/ModelInstance.h +++ b/src/common/Collision/Models/ModelInstance.h @@ -31,6 +31,7 @@ namespace VMAP class WorldModel; struct AreaInfo; struct LocationInfo; + enum class ModelIgnoreFlags : uint32; enum ModelFlags { @@ -66,7 +67,7 @@ namespace VMAP ModelInstance(): iInvScale(0.0f), iModel(nullptr) { } ModelInstance(const ModelSpawn &spawn, WorldModel* model); void setUnloaded() { iModel = nullptr; } - bool intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool pStopAtFirstHit) const; + bool intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool pStopAtFirstHit, ModelIgnoreFlags ignoreFlags) const; void intersectPoint(const G3D::Vector3& p, AreaInfo &info) const; bool GetLocationInfo(const G3D::Vector3& p, LocationInfo &info) const; bool GetLiquidLevel(const G3D::Vector3& p, LocationInfo &info, float &liqHeight) const; diff --git a/src/common/Collision/Models/WorldModel.cpp b/src/common/Collision/Models/WorldModel.cpp index 50144a7b9fe..f653fe04d92 100644 --- a/src/common/Collision/Models/WorldModel.cpp +++ b/src/common/Collision/Models/WorldModel.cpp @@ -19,6 +19,7 @@ #include "WorldModel.h" #include "VMapDefinitions.h" #include "MapTree.h" +#include "ModelIgnoreFlags.h" using G3D::Vector3; using G3D::Ray; @@ -444,8 +445,16 @@ namespace VMAP bool hit; }; - bool WorldModel::IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit) const + bool WorldModel::IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit, ModelIgnoreFlags ignoreFlags) const { + // If the caller asked us to ignore certain objects we should check flags + 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) + return false; + } + // small M2 workaround, maybe better make separate class with virtual intersection funcs // in any case, there's no need to use a bound tree if we only have one submodel if (groupModels.size() == 1) diff --git a/src/common/Collision/Models/WorldModel.h b/src/common/Collision/Models/WorldModel.h index 89a0ce472ee..59f0b74f31d 100644 --- a/src/common/Collision/Models/WorldModel.h +++ b/src/common/Collision/Models/WorldModel.h @@ -32,6 +32,7 @@ namespace VMAP class TreeNode; struct AreaInfo; struct LocationInfo; + enum class ModelIgnoreFlags : uint32; class TC_COMMON_API MeshTriangle { @@ -111,12 +112,13 @@ namespace VMAP //! pass group models to WorldModel and create BIH. Passed vector is swapped with old geometry! void setGroupModels(std::vector<GroupModel> &models); void setRootWmoID(uint32 id) { RootWMOID = id; } - bool IntersectRay(const G3D::Ray &ray, float &distance, bool stopAtFirstHit) const; + 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, LocationInfo &info) const; bool writeFile(const std::string &filename); bool readFile(const std::string &filename); void getGroupModels(std::vector<GroupModel>& outGroupModels); + uint32 Flags; protected: uint32 RootWMOID; std::vector<GroupModel> groupModels; |