mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
110 lines
4.2 KiB
C++
110 lines
4.2 KiB
C++
/*
|
|
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
|
*
|
|
* 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 _GAMEOBJECT_MODEL_H
|
|
#define _GAMEOBJECT_MODEL_H
|
|
|
|
#include "Define.h"
|
|
#include <G3D/AABox.h>
|
|
#include <G3D/Matrix3.h>
|
|
#include <G3D/Quat.h>
|
|
#include <G3D/Ray.h>
|
|
#include <G3D/Vector3.h>
|
|
#include <memory>
|
|
|
|
namespace VMAP
|
|
{
|
|
class WorldModel;
|
|
struct AreaInfo;
|
|
struct LocationInfo;
|
|
enum class ModelIgnoreFlags : uint32;
|
|
}
|
|
|
|
class GameObject;
|
|
class PhaseShift;
|
|
struct GameObjectDisplayInfoEntry;
|
|
|
|
class TC_COMMON_API GameObjectModelOwnerBase
|
|
{
|
|
public:
|
|
virtual ~GameObjectModelOwnerBase() = default;
|
|
|
|
virtual bool IsSpawned() const = 0;
|
|
virtual uint32 GetDisplayId() const = 0;
|
|
virtual uint8 GetNameSetId() const = 0;
|
|
virtual bool IsInPhase(PhaseShift const& /*phaseShift*/) const = 0;
|
|
virtual G3D::Vector3 GetPosition() const = 0;
|
|
virtual G3D::Quat GetRotation() const = 0;
|
|
virtual int64 GetPackedRotation() const = 0;
|
|
virtual float GetScale() const = 0;
|
|
virtual void DebugVisualizeCorner(G3D::Vector3 const& /*corner*/) const = 0;
|
|
};
|
|
|
|
class TC_COMMON_API GameObjectModel /*, public Intersectable*/
|
|
{
|
|
GameObjectModel() : iCollisionEnabled(false), iLosBlockingDisabled(false), iIncludeInNavMesh(false), iInvScale(0), iScale(0), iModel(nullptr) { }
|
|
public:
|
|
const G3D::AABox& getBounds() const { return iBound; }
|
|
|
|
~GameObjectModel();
|
|
|
|
uint32 GetDisplayId() const { return owner->GetDisplayId(); }
|
|
G3D::Vector3 const& GetPosition() const { return iPos; }
|
|
G3D::Quat GetRotation() const { return owner->GetRotation(); }
|
|
G3D::Matrix3 const& GetInvRot() const { return iInvRot; }
|
|
int64 GetPackedRotation() const { return owner->GetPackedRotation(); }
|
|
float GetScale() const { return iScale; }
|
|
|
|
/* Enables/disables collision */
|
|
void EnableCollision(bool enable) { iCollisionEnabled = enable; }
|
|
bool IsCollisionEnabled() const { return iCollisionEnabled; }
|
|
void DisableLosBlocking(bool enable) { iLosBlockingDisabled = enable; }
|
|
bool IsLosBlockingDisabled() const { return iLosBlockingDisabled; }
|
|
void IncludeInNavMesh(bool enable) { iIncludeInNavMesh = enable; }
|
|
bool IsIncludedInNavMesh() const { return iIncludeInNavMesh; }
|
|
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;
|
|
bool GetLocationInfo(G3D::Vector3 const& point, VMAP::LocationInfo& info, PhaseShift const& phaseShift) const;
|
|
bool GetLiquidLevel(G3D::Vector3 const& point, VMAP::LocationInfo& info, float& liqHeight) const;
|
|
|
|
static std::unique_ptr<GameObjectModel> Create(std::unique_ptr<GameObjectModelOwnerBase> modelOwner, std::string const& dataPath);
|
|
|
|
bool UpdatePosition();
|
|
|
|
std::shared_ptr<VMAP::WorldModel const> GetWorldModel() const { return iModel; }
|
|
|
|
private:
|
|
bool initialize(std::unique_ptr<GameObjectModelOwnerBase> modelOwner, std::string const& dataPath);
|
|
|
|
bool iCollisionEnabled; ///< Is model ignored in all checks
|
|
bool iLosBlockingDisabled; ///< Is model ignored during line of sight checks (but is always included in location/height checks)
|
|
bool iIncludeInNavMesh; ///< Is model included when generating navigation mesh
|
|
G3D::AABox iBound;
|
|
G3D::Matrix3 iInvRot;
|
|
G3D::Vector3 iPos;
|
|
float iInvScale;
|
|
float iScale;
|
|
std::shared_ptr<VMAP::WorldModel> iModel;
|
|
std::unique_ptr<GameObjectModelOwnerBase> owner;
|
|
};
|
|
|
|
TC_COMMON_API bool LoadGameObjectModelList(std::string const& dataPath);
|
|
|
|
#endif // _GAMEOBJECT_MODEL_H
|