diff --git a/.gitmodules b/.gitmodules index 6fb56bde..a4f06061 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,6 @@ [submodule "thirdparty/AccountManager"] path = thirdparty/AccountManager url = https://github.com/DarkflameUniverse/AccountManager +[submodule "thirdparty/raylib"] + path = thirdparty/raylib + url = https://github.com/raysan5/raylib diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a977a64..f7800d32 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,9 @@ endforeach() # Set the version set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") +# Set our compile options +option(BUILD_VISUAL_DEBUGGER "Toggle for building visual debugger (default off)" OFF) + # Echo the version message(STATUS "Version: ${PROJECT_VERSION}") @@ -140,6 +143,7 @@ set(INCLUDED_DIRECTORIES "dDatabase/Tables" "dNet" "dScripts" + "dWorldServer" "thirdparty/raknet/Source" "thirdparty/tinyxml2" @@ -216,6 +220,10 @@ add_subdirectory(dZoneManager) add_subdirectory(dNavigation) add_subdirectory(dPhysics) +if (BUILD_VISUAL_DEBUGGER) + add_subdirectory(dVisualDebugger) +endif() + # Create a list of common libraries shared between all binaries set(COMMON_LIBRARIES "dCommon" "dDatabase" "dNet" "raknet" "mariadbConnCpp") diff --git a/dCommon/Metrics.cpp b/dCommon/Metrics.cpp index b97b5435..df90b9cb 100644 --- a/dCommon/Metrics.cpp +++ b/dCommon/Metrics.cpp @@ -14,6 +14,9 @@ std::vector Metrics::m_Variables = { MetricVariable::CPUTime, MetricVariable::Sleep, MetricVariable::Frame, +#ifdef BUILD_VISUAL_DEBUGGER + MetricVariable::VisualDebugger, +#endif }; void Metrics::AddMeasurement(MetricVariable variable, int64_t value) { @@ -132,7 +135,10 @@ std::string Metrics::MetricVariableToString(MetricVariable variable) { return "Frame"; case MetricVariable::Ghosting: return "Ghosting"; - +#ifdef BUILD_VISUAL_DEBUGGER + case MetricVariable::VisualDebugger: + return "VisualDebugger"; +#endif default: return "Invalid"; } diff --git a/dCommon/Metrics.hpp b/dCommon/Metrics.hpp index c03c914f..fe02fbe8 100644 --- a/dCommon/Metrics.hpp +++ b/dCommon/Metrics.hpp @@ -20,6 +20,9 @@ enum class MetricVariable : int32_t CPUTime, Sleep, Frame, +#ifdef BUILD_VISUAL_DEBUGGER + VisualDebugger +#endif }; struct Metric diff --git a/dCommon/NiPoint3.cpp b/dCommon/NiPoint3.cpp index a539c4df..43b7c8f1 100644 --- a/dCommon/NiPoint3.cpp +++ b/dCommon/NiPoint3.cpp @@ -80,13 +80,13 @@ float NiPoint3::SquaredLength(void) const { } //! Returns the dot product of the vector dotted with another vector -float NiPoint3::DotProduct(const Vector3& vec) const { +float NiPoint3::DotProduct(const NiPoint3& vec) const { return ((this->x * vec.x) + (this->y * vec.y) + (this->z * vec.z)); } //! Returns the cross product of the vector crossed with another vector -Vector3 NiPoint3::CrossProduct(const Vector3& vec) const { - return Vector3(((this->y * vec.z) - (this->z * vec.y)), +NiPoint3 NiPoint3::CrossProduct(const NiPoint3& vec) const { + return NiPoint3(((this->y * vec.z) - (this->z * vec.y)), ((this->z * vec.x) - (this->x * vec.z)), ((this->x * vec.y) - (this->y * vec.x))); } @@ -171,7 +171,7 @@ bool NiPoint3::IsWithinAxisAlignedBox(const NiPoint3& minPoint, const NiPoint3& //! Checks to see if the point (or vector) is within a sphere bool NiPoint3::IsWithinSpehere(const NiPoint3& sphereCenter, float radius) { - Vector3 diffVec = Vector3(x - sphereCenter.GetX(), y - sphereCenter.GetY(), z - sphereCenter.GetZ()); + NiPoint3 diffVec = NiPoint3(x - sphereCenter.GetX(), y - sphereCenter.GetY(), z - sphereCenter.GetZ()); return (diffVec.SquaredLength() <= (radius * radius)); } @@ -226,7 +226,7 @@ NiPoint3 NiPoint3::MoveTowards(const NiPoint3& current, const NiPoint3& target, //This code is yoinked from the MS XNA code, so it should be right, even if it's horrible. NiPoint3 NiPoint3::RotateByQuaternion(const NiQuaternion& rotation) { - Vector3 vector; + NiPoint3 vector; float num12 = rotation.x + rotation.x; float num2 = rotation.y + rotation.y; float num = rotation.z + rotation.z; diff --git a/dCommon/NiPoint3.h b/dCommon/NiPoint3.h index 6c0b9d3d..5086011d 100644 --- a/dCommon/NiPoint3.h +++ b/dCommon/NiPoint3.h @@ -7,7 +7,6 @@ class NiPoint3; class NiQuaternion; -typedef NiPoint3 Vector3; //!< The Vector3 class is technically the NiPoint3 class, but typedef'd for clarity in some cases //! A custom class the defines a point in space class NiPoint3 { @@ -102,14 +101,14 @@ public: \param vec The second vector \return The dot product of the two vectors */ - float DotProduct(const Vector3& vec) const; + float DotProduct(const NiPoint3& vec) const; //! Returns the cross product of the vector crossed with another vector /*! \param vec The second vector \return The cross product of the two vectors */ - Vector3 CrossProduct(const Vector3& vec) const; + NiPoint3 CrossProduct(const NiPoint3& vec) const; //! Unitize the vector /*! diff --git a/dCommon/NiQuaternion.cpp b/dCommon/NiQuaternion.cpp index 33c5c976..96307d94 100644 --- a/dCommon/NiQuaternion.cpp +++ b/dCommon/NiQuaternion.cpp @@ -72,22 +72,22 @@ void NiQuaternion::SetZ(float z) { // MARK: Member Functions //! Returns the forward vector from the quaternion -Vector3 NiQuaternion::GetForwardVector(void) const { - return Vector3(2 * (x * z + w * y), 2 * (y * z - w * x), 1 - 2 * (x * x + y * y)); +NiPoint3 NiQuaternion::GetForwardVector(void) const { + return NiPoint3(2 * (x * z + w * y), 2 * (y * z - w * x), 1 - 2 * (x * x + y * y)); } //! Returns the up vector from the quaternion -Vector3 NiQuaternion::GetUpVector(void) const { - return Vector3(2 * (x * y - w * z), 1 - 2 * (x * x + z * z), 2 * (y * z + w * x)); +NiPoint3 NiQuaternion::GetUpVector(void) const { + return NiPoint3(2 * (x * y - w * z), 1 - 2 * (x * x + z * z), 2 * (y * z + w * x)); } //! Returns the right vector from the quaternion -Vector3 NiQuaternion::GetRightVector(void) const { - return Vector3(1 - 2 * (y * y + z * z), 2 * (x * y + w * z), 2 * (x * z - w * y)); +NiPoint3 NiQuaternion::GetRightVector(void) const { + return NiPoint3(1 - 2 * (y * y + z * z), 2 * (x * y + w * z), 2 * (x * z - w * y)); } -Vector3 NiQuaternion::GetEulerAngles() const { - Vector3 angles; +NiPoint3 NiQuaternion::GetEulerAngles() const { + NiPoint3 angles; // roll (x-axis rotation) const float sinr_cosp = 2 * (w * x + y * z); @@ -164,7 +164,7 @@ NiQuaternion NiQuaternion::LookAtUnlocked(const NiPoint3& sourcePoint, const NiP } //! Creates a Quaternion from a specific axis and angle relative to that axis -NiQuaternion NiQuaternion::CreateFromAxisAngle(const Vector3& axis, float angle) { +NiQuaternion NiQuaternion::CreateFromAxisAngle(const NiPoint3& axis, float angle) { float halfAngle = angle * 0.5f; float s = static_cast(sin(halfAngle)); diff --git a/dCommon/NiQuaternion.h b/dCommon/NiQuaternion.h index b7d60f4e..2faf611b 100644 --- a/dCommon/NiQuaternion.h +++ b/dCommon/NiQuaternion.h @@ -9,7 +9,6 @@ */ class NiQuaternion; -typedef NiQuaternion Quaternion; //!< A typedef for a shorthand version of NiQuaternion //! A class that defines a rotation in space class NiQuaternion { @@ -95,21 +94,21 @@ public: /*! \return The forward vector of the quaternion */ - Vector3 GetForwardVector(void) const; + NiPoint3 GetForwardVector(void) const; //! Returns the up vector from the quaternion /*! \return The up vector fo the quaternion */ - Vector3 GetUpVector(void) const; + NiPoint3 GetUpVector(void) const; //! Returns the right vector from the quaternion /*! \return The right vector of the quaternion */ - Vector3 GetRightVector(void) const; + NiPoint3 GetRightVector(void) const; - Vector3 GetEulerAngles() const; + NiPoint3 GetEulerAngles() const; // MARK: Operators @@ -145,7 +144,7 @@ public: \param angle The angle relative to this axis \return A quaternion created from the axis and angle */ - static NiQuaternion CreateFromAxisAngle(const Vector3& axis, float angle); + static NiQuaternion CreateFromAxisAngle(const NiPoint3& axis, float angle); static NiQuaternion FromEulerAngles(const NiPoint3& eulerAngles); }; diff --git a/dCommon/dCommonVars.h b/dCommon/dCommonVars.h index 4c0e15fa..3fe74461 100644 --- a/dCommon/dCommonVars.h +++ b/dCommon/dCommonVars.h @@ -48,7 +48,9 @@ const uint64_t LWOZONEID_INVALID = 0; //!< Invalid LWOZONEID typedef std::set TSetObjID; -const float PI = 3.14159f; +#ifndef PI +#define PI 3.14159265358979323846f +#endif #if defined(__unix) || defined(__APPLE__) //For Linux: diff --git a/dGame/dBehaviors/AreaOfEffectBehavior.cpp b/dGame/dBehaviors/AreaOfEffectBehavior.cpp index 898d1f99..5c217b34 100644 --- a/dGame/dBehaviors/AreaOfEffectBehavior.cpp +++ b/dGame/dBehaviors/AreaOfEffectBehavior.cpp @@ -54,7 +54,7 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream auto* presetTarget = EntityManager::Instance()->GetEntity(branch.target); if (presetTarget != nullptr) { - if (this->m_radius * this->m_radius >= Vector3::DistanceSquared(reference, presetTarget->GetPosition())) { + if (this->m_radius * this->m_radius >= NiPoint3::DistanceSquared(reference, presetTarget->GetPosition())) { targets.push_back(presetTarget); } } @@ -90,7 +90,7 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream continue; } - const auto distance = Vector3::DistanceSquared(reference, entity->GetPosition()); + const auto distance = NiPoint3::DistanceSquared(reference, entity->GetPosition()); if (this->m_radius * this->m_radius >= distance && (this->m_maxTargets == 0 || targets.size() < this->m_maxTargets)) { targets.push_back(entity); @@ -98,8 +98,8 @@ void AreaOfEffectBehavior::Calculate(BehaviorContext* context, RakNet::BitStream } std::sort(targets.begin(), targets.end(), [reference](Entity* a, Entity* b) { - const auto aDistance = Vector3::DistanceSquared(a->GetPosition(), reference); - const auto bDistance = Vector3::DistanceSquared(b->GetPosition(), reference); + const auto aDistance = NiPoint3::DistanceSquared(a->GetPosition(), reference); + const auto bDistance = NiPoint3::DistanceSquared(b->GetPosition(), reference); return aDistance > bDistance; }); diff --git a/dGame/dBehaviors/ProjectileAttackBehavior.cpp b/dGame/dBehaviors/ProjectileAttackBehavior.cpp index 350234e2..222faf3a 100644 --- a/dGame/dBehaviors/ProjectileAttackBehavior.cpp +++ b/dGame/dBehaviors/ProjectileAttackBehavior.cpp @@ -78,7 +78,7 @@ void ProjectileAttackBehavior::Calculate(BehaviorContext* context, RakNet::BitSt const auto position = entity->GetPosition() + this->m_offset; - const auto distance = Vector3::Distance(position, other->GetPosition()); + const auto distance = NiPoint3::Distance(position, other->GetPosition()); const auto time = distance / this->m_projectileSpeed; diff --git a/dGame/dBehaviors/TacArcBehavior.cpp b/dGame/dBehaviors/TacArcBehavior.cpp index 8789f9b6..2ddbb1ec 100644 --- a/dGame/dBehaviors/TacArcBehavior.cpp +++ b/dGame/dBehaviors/TacArcBehavior.cpp @@ -154,19 +154,19 @@ void TacArcBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS // reference is the position of the caster. // If we cast a ray forward from the caster, does it come within m_farWidth of the target? - const auto distance = Vector3::Distance(reference, otherPosition); + const auto distance = NiPoint3::Distance(reference, otherPosition); if (m_method == 2) { NiPoint3 rayPoint = casterPosition + forward * distance; - if (m_farWidth > 0 && Vector3::DistanceSquared(rayPoint, otherPosition) > this->m_farWidth * this->m_farWidth) { + if (m_farWidth > 0 && NiPoint3::DistanceSquared(rayPoint, otherPosition) > this->m_farWidth * this->m_farWidth) { continue; } } auto normalized = (reference - otherPosition) / distance; - const float degreeAngle = std::abs(Vector3::Angle(forward, normalized) * (180 / 3.14) - 180); + const float degreeAngle = std::abs(NiPoint3::Angle(forward, normalized) * (180 / 3.14) - 180); if (distance >= this->m_minDistance && this->m_maxDistance >= distance && degreeAngle <= 2 * this->m_angle) { targets.push_back(entity); @@ -174,8 +174,8 @@ void TacArcBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS } std::sort(targets.begin(), targets.end(), [reference](Entity* a, Entity* b) { - const auto aDistance = Vector3::DistanceSquared(reference, a->GetPosition()); - const auto bDistance = Vector3::DistanceSquared(reference, b->GetPosition()); + const auto aDistance = NiPoint3::DistanceSquared(reference, a->GetPosition()); + const auto bDistance = NiPoint3::DistanceSquared(reference, b->GetPosition()); return aDistance > bDistance; }); diff --git a/dGame/dBehaviors/VerifyBehavior.cpp b/dGame/dBehaviors/VerifyBehavior.cpp index 608e965b..10831abd 100644 --- a/dGame/dBehaviors/VerifyBehavior.cpp +++ b/dGame/dBehaviors/VerifyBehavior.cpp @@ -23,7 +23,7 @@ void VerifyBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS return; } - const auto distance = Vector3::DistanceSquared(self->GetPosition(), entity->GetPosition()); + const auto distance = NiPoint3::DistanceSquared(self->GetPosition(), entity->GetPosition()); if (distance > this->m_range * this->m_range) { success = false; diff --git a/dGame/dComponents/BaseCombatAIComponent.cpp b/dGame/dComponents/BaseCombatAIComponent.cpp index c035a807..f8e61476 100644 --- a/dGame/dComponents/BaseCombatAIComponent.cpp +++ b/dGame/dComponents/BaseCombatAIComponent.cpp @@ -402,7 +402,7 @@ LWOOBJID BaseCombatAIComponent::FindTarget() { if (target != nullptr && !m_DirtyThreat) { const auto targetPosition = target->GetPosition(); - if (Vector3::DistanceSquared(targetPosition, m_StartPosition) < m_HardTetherRadius * m_HardTetherRadius) { + if (NiPoint3::DistanceSquared(targetPosition, m_StartPosition) < m_HardTetherRadius * m_HardTetherRadius) { return m_Target; } @@ -433,7 +433,7 @@ LWOOBJID BaseCombatAIComponent::FindTarget() { const auto maxDistanceSquared = m_HardTetherRadius * m_HardTetherRadius; - if (Vector3::DistanceSquared(targetPosition, m_StartPosition) > maxDistanceSquared) { + if (NiPoint3::DistanceSquared(targetPosition, m_StartPosition) > maxDistanceSquared) { if (threat > 0) { SetThreat(entry, 0); } @@ -448,7 +448,7 @@ LWOOBJID BaseCombatAIComponent::FindTarget() { continue; } - const auto proximityThreat = -(Vector3::DistanceSquared(targetPosition, reference) - maxDistanceSquared) / 100; // Proximity threat takes last priority + const auto proximityThreat = -(NiPoint3::DistanceSquared(targetPosition, reference) - maxDistanceSquared) / 100; // Proximity threat takes last priority if (proximityThreat > biggestThreat) { biggestThreat = proximityThreat; @@ -477,7 +477,7 @@ LWOOBJID BaseCombatAIComponent::FindTarget() { const auto targetPosition = entity->GetPosition(); - if (Vector3::DistanceSquared(targetPosition, m_StartPosition) > m_HardTetherRadius * m_HardTetherRadius) { + if (NiPoint3::DistanceSquared(targetPosition, m_StartPosition) > m_HardTetherRadius * m_HardTetherRadius) { deadThreats.push_back(threatTarget.first); continue; @@ -508,7 +508,7 @@ std::vector BaseCombatAIComponent::GetTargetWithinAggroRange() const { for (auto id : m_Parent->GetTargetsInPhantom()) { auto* other = EntityManager::Instance()->GetEntity(id); - const auto distance = Vector3::DistanceSquared(m_Parent->GetPosition(), other->GetPosition()); + const auto distance = NiPoint3::DistanceSquared(m_Parent->GetPosition(), other->GetPosition()); if (distance > m_AggroRadius * m_AggroRadius) continue; @@ -657,7 +657,7 @@ void BaseCombatAIComponent::Wander() { destination.y = dpWorld::Instance().GetNavMesh()->GetHeightAtPoint(destination); } - if (Vector3::DistanceSquared(destination, m_MovementAI->GetCurrentPosition()) < 2 * 2) { + if (NiPoint3::DistanceSquared(destination, m_MovementAI->GetCurrentPosition()) < 2 * 2) { m_MovementAI->Stop(); return; @@ -685,16 +685,16 @@ void BaseCombatAIComponent::OnAggro() { NiPoint3 currentPos = m_MovementAI->GetCurrentPosition(); // If the player's position is within range, attack - if (Vector3::DistanceSquared(currentPos, targetPos) <= m_AttackRadius * m_AttackRadius) { + if (NiPoint3::DistanceSquared(currentPos, targetPos) <= m_AttackRadius * m_AttackRadius) { m_MovementAI->Stop(); - } else if (Vector3::DistanceSquared(m_StartPosition, targetPos) > m_HardTetherRadius * m_HardTetherRadius) //Return to spawn if we're too far + } else if (NiPoint3::DistanceSquared(m_StartPosition, targetPos) > m_HardTetherRadius * m_HardTetherRadius) //Return to spawn if we're too far { m_MovementAI->SetSpeed(m_PursuitSpeed); m_MovementAI->SetDestination(m_StartPosition); } else //Chase the player's new position { - if (IsMech() && Vector3::DistanceSquared(targetPos, currentPos) > m_AttackRadius * m_AttackRadius * 3 * 3) return; + if (IsMech() && NiPoint3::DistanceSquared(targetPos, currentPos) > m_AttackRadius * m_AttackRadius * 3 * 3) return; m_MovementAI->SetSpeed(m_PursuitSpeed); @@ -718,9 +718,9 @@ void BaseCombatAIComponent::OnTether() { NiPoint3 targetPos = target->GetPosition(); NiPoint3 currentPos = m_MovementAI->ApproximateLocation(); - if (Vector3::DistanceSquared(currentPos, targetPos) <= m_AttackRadius * m_AttackRadius) { + if (NiPoint3::DistanceSquared(currentPos, targetPos) <= m_AttackRadius * m_AttackRadius) { m_MovementAI->Stop(); - } else if (Vector3::DistanceSquared(m_StartPosition, targetPos) > m_HardTetherRadius * m_HardTetherRadius) //Return to spawn if we're too far + } else if (NiPoint3::DistanceSquared(m_StartPosition, targetPos) > m_HardTetherRadius * m_HardTetherRadius) //Return to spawn if we're too far { m_MovementAI->SetSpeed(m_PursuitSpeed); @@ -728,7 +728,7 @@ void BaseCombatAIComponent::OnTether() { m_State = AiState::aggro; } else { - if (IsMech() && Vector3::DistanceSquared(targetPos, currentPos) > m_AttackRadius * m_AttackRadius * 3 * 3) return; + if (IsMech() && NiPoint3::DistanceSquared(targetPos, currentPos) > m_AttackRadius * m_AttackRadius * 3 * 3) return; m_MovementAI->SetSpeed(m_PursuitSpeed); diff --git a/dGame/dComponents/InventoryComponent.cpp b/dGame/dComponents/InventoryComponent.cpp index 930ace8d..27882700 100644 --- a/dGame/dComponents/InventoryComponent.cpp +++ b/dGame/dComponents/InventoryComponent.cpp @@ -815,7 +815,7 @@ void InventoryComponent::EquipItem(Item* item, const bool skipChecks) { const auto position = m_Parent->GetPosition(); for (auto* lauchPad : rocketLauchPads) { - if (Vector3::DistanceSquared(lauchPad->GetPosition(), position) > 13 * 13) continue; + if (NiPoint3::DistanceSquared(lauchPad->GetPosition(), position) > 13 * 13) continue; auto* characterComponent = m_Parent->GetComponent(); diff --git a/dGame/dComponents/MovementAIComponent.cpp b/dGame/dComponents/MovementAIComponent.cpp index ed6ed483..404c3ea9 100644 --- a/dGame/dComponents/MovementAIComponent.cpp +++ b/dGame/dComponents/MovementAIComponent.cpp @@ -55,7 +55,7 @@ void MovementAIComponent::Update(const float deltaTime) { SetPosition(source + velocity); - if (Vector3::DistanceSquared(GetCurrentPosition(), m_PullPoint) < 2 * 2) { + if (NiPoint3::DistanceSquared(GetCurrentPosition(), m_PullPoint) < 2 * 2) { m_Interrupted = false; } @@ -68,7 +68,7 @@ void MovementAIComponent::Update(const float deltaTime) { } if (m_HaltDistance > 0) { - if (Vector3::DistanceSquared(ApproximateLocation(), GetDestination()) < m_HaltDistance * m_HaltDistance) // Prevent us from hugging the target + if (NiPoint3::DistanceSquared(ApproximateLocation(), GetDestination()) < m_HaltDistance * m_HaltDistance) // Prevent us from hugging the target { Stop(); @@ -373,7 +373,7 @@ void MovementAIComponent::SetDestination(const NiPoint3& value) { return; } - /*if (Vector3::DistanceSquared(value, GetDestination()) < 2 * 2) + /*if (NiPoint3::DistanceSquared(value, GetDestination()) < 2 * 2) { return; }*/ diff --git a/dGame/dComponents/MovingPlatformComponent.cpp b/dGame/dComponents/MovingPlatformComponent.cpp index 42699672..2d646744 100644 --- a/dGame/dComponents/MovingPlatformComponent.cpp +++ b/dGame/dComponents/MovingPlatformComponent.cpp @@ -177,7 +177,7 @@ void MovingPlatformComponent::StartPathing() { SetMovementState(MovementPlatformState::Moving); }); - const auto travelTime = Vector3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5f; + const auto travelTime = NiPoint3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5f; const auto travelNext = subComponent->mWaitTime + travelTime; @@ -285,7 +285,7 @@ void MovingPlatformComponent::ContinuePathing() { SetMovementState(MovementPlatformState::Moving); }); - auto travelTime = Vector3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5; + auto travelTime = NiPoint3::Distance(targetPosition, subComponent->mPosition) / subComponent->mSpeed + 1.5; if (m_Parent->GetLOT() == 9483) { travelTime += 20; diff --git a/dGame/dComponents/PetComponent.cpp b/dGame/dComponents/PetComponent.cpp index 8863f9be..059cf2af 100644 --- a/dGame/dComponents/PetComponent.cpp +++ b/dGame/dComponents/PetComponent.cpp @@ -400,7 +400,7 @@ void PetComponent::Update(float deltaTime) { auto destination = owner->GetPosition(); NiPoint3 position = m_MovementAI->GetCurrentPosition(); - float distanceToOwner = Vector3::DistanceSquared(position, destination); + float distanceToOwner = NiPoint3::DistanceSquared(position, destination); if (distanceToOwner > 50 * 50 || m_TimerAway > 5) { m_MovementAI->Warp(destination); @@ -430,7 +430,7 @@ void PetComponent::Update(float deltaTime) { if (closestSwitch != nullptr) { if (!closestSwitch->GetActive()) { NiPoint3 switchPosition = closestSwitch->GetParentEntity()->GetPosition(); - float distance = Vector3::DistanceSquared(position, switchPosition); + float distance = NiPoint3::DistanceSquared(position, switchPosition); if (distance < 3 * 3) { m_Interaction = closestSwitch->GetParentEntity()->GetObjectID(); closestSwitch->EntityEnter(m_Parent); @@ -451,7 +451,7 @@ void PetComponent::Update(float deltaTime) { } NiPoint3 tresurePosition = closestTresure->GetPosition(); - float distance = Vector3::DistanceSquared(position, tresurePosition); + float distance = NiPoint3::DistanceSquared(position, tresurePosition); if (distance < 3 * 3) { m_Interaction = closestTresure->GetObjectID(); @@ -825,7 +825,7 @@ void PetComponent::Wander() { destination.y = dpWorld::Instance().GetNavMesh()->GetHeightAtPoint(destination); } - if (Vector3::DistanceSquared(destination, m_MovementAI->GetCurrentPosition()) < 2 * 2) { + if (NiPoint3::DistanceSquared(destination, m_MovementAI->GetCurrentPosition()) < 2 * 2) { m_MovementAI->Stop(); return; diff --git a/dGame/dComponents/RacingControlComponent.cpp b/dGame/dComponents/RacingControlComponent.cpp index 75465669..eee0b051 100644 --- a/dGame/dComponents/RacingControlComponent.cpp +++ b/dGame/dComponents/RacingControlComponent.cpp @@ -794,7 +794,7 @@ void RacingControlComponent::Update(float deltaTime) { continue; } - if (Vector3::DistanceSquared(position, vehiclePosition) > 50 * 50) { + if (NiPoint3::DistanceSquared(position, vehiclePosition) > 50 * 50) { ++respawnIndex; continue; diff --git a/dGame/dComponents/ShootingGalleryComponent.h b/dGame/dComponents/ShootingGalleryComponent.h index c43f20c2..7e186583 100644 --- a/dGame/dComponents/ShootingGalleryComponent.h +++ b/dGame/dComponents/ShootingGalleryComponent.h @@ -12,12 +12,12 @@ struct DynamicShootingGalleryParams { /** * The distance from the camera to the barrel */ - Vector3 cameraBarrelOffset; + NiPoint3 cameraBarrelOffset; /** * The area the barrel is looking at */ - Vector3 facing; + NiPoint3 facing; /** * The velocity of the cannonballs @@ -58,12 +58,12 @@ struct StaticShootingGalleryParams { /** * The position of the camera */ - Vector3 cameraPosition; + NiPoint3 cameraPosition; /** * The position that the camera is looking at */ - Vector3 cameraLookatPosition; + NiPoint3 cameraLookatPosition; }; /** diff --git a/dGame/dComponents/SkillComponent.cpp b/dGame/dComponents/SkillComponent.cpp index f7e8e7d9..216ef7cc 100644 --- a/dGame/dComponents/SkillComponent.cpp +++ b/dGame/dComponents/SkillComponent.cpp @@ -314,9 +314,9 @@ void SkillComponent::CalculateUpdate(const float deltaTime) { const auto targetPosition = target->GetPosition(); - const auto closestPoint = Vector3::ClosestPointOnLine(entry.lastPosition, position, targetPosition); + const auto closestPoint = NiPoint3::ClosestPointOnLine(entry.lastPosition, position, targetPosition); - const auto distance = Vector3::DistanceSquared(targetPosition, closestPoint); + const auto distance = NiPoint3::DistanceSquared(targetPosition, closestPoint); if (distance > 3 * 3) { /* @@ -328,7 +328,7 @@ void SkillComponent::CalculateUpdate(const float deltaTime) { const auto homingTarget = rotation.GetForwardVector() * speed; - Vector3 homing; + NiPoint3 homing; // Move towards diff --git a/dGame/dComponents/SwitchComponent.cpp b/dGame/dComponents/SwitchComponent.cpp index 2263a866..55b9ec92 100644 --- a/dGame/dComponents/SwitchComponent.cpp +++ b/dGame/dComponents/SwitchComponent.cpp @@ -108,7 +108,7 @@ SwitchComponent* SwitchComponent::GetClosestSwitch(NiPoint3 position) { SwitchComponent* closest = nullptr; for (SwitchComponent* petSwitch : petSwitches) { - float distance = Vector3::DistanceSquared(petSwitch->m_Parent->GetPosition(), position); + float distance = NiPoint3::DistanceSquared(petSwitch->m_Parent->GetPosition(), position); if (closest == nullptr || distance < closestDistance) { closestDistance = distance; diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 772cb691..2613f474 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -4919,7 +4919,7 @@ void GameMessages::HandlePlayEmote(RakNet::BitStream* inStream, Entity* entity) const auto& referencePoint = entity->GetPosition(); for (auto* scripted : scriptedEntities) { - if (Vector3::DistanceSquared(scripted->GetPosition(), referencePoint) > 5.0f * 5.0f) continue; + if (NiPoint3::DistanceSquared(scripted->GetPosition(), referencePoint) > 5.0f * 5.0f) continue; scripted->OnEmoteReceived(emoteID, entity); } diff --git a/dNavigation/dTerrain/RawFile.cpp b/dNavigation/dTerrain/RawFile.cpp index d4496b2f..29d138b3 100644 --- a/dNavigation/dTerrain/RawFile.cpp +++ b/dNavigation/dTerrain/RawFile.cpp @@ -32,6 +32,8 @@ RawFile::RawFile(std::string fileName) { m_Chunks.push_back(chunk); } + m_FinalMesh = new RawMesh(); + this->GenerateFinalMeshFromChunks(); } diff --git a/dNavigation/dTerrain/RawFile.h b/dNavigation/dTerrain/RawFile.h index 84afae94..36053965 100644 --- a/dNavigation/dTerrain/RawFile.h +++ b/dNavigation/dTerrain/RawFile.h @@ -11,6 +11,8 @@ public: RawFile(std::string filePath); ~RawFile(); + RawMesh* GetMesh() { return m_FinalMesh; } + private: void GenerateFinalMeshFromChunks(); @@ -23,5 +25,5 @@ private: uint32_t m_Height; std::vector m_Chunks; - RawMesh* m_FinalMesh; + RawMesh* m_FinalMesh = nullptr; }; diff --git a/dPhysics/dpCollisionChecks.cpp b/dPhysics/dpCollisionChecks.cpp index c2efee90..d8d9443d 100644 --- a/dPhysics/dpCollisionChecks.cpp +++ b/dPhysics/dpCollisionChecks.cpp @@ -25,7 +25,7 @@ bool dpCollisionChecks::CheckSpheres(dpEntity* a, dpEntity* b) { if (!a || !b) return false; auto posA = a->GetPosition(); - auto distance = Vector3::DistanceSquared(posA, b->GetPosition()); + auto distance = NiPoint3::DistanceSquared(posA, b->GetPosition()); auto sphereA = static_cast(a->GetShape()); auto sphereB = static_cast(b->GetShape()); diff --git a/dPhysics/dpWorld.h b/dPhysics/dpWorld.h index 45e550cb..b66f70b3 100644 --- a/dPhysics/dpWorld.h +++ b/dPhysics/dpWorld.h @@ -32,6 +32,8 @@ public: void RemoveEntity(dpEntity* entity); dNavMesh* GetNavMesh() { return m_NavMesh; } + std::vector* GetStaticEntities() { return &m_StaticEntities; } + std::vector* GetDynamicEntities() { return &m_DynamicEntites; } private: dpGrid* m_Grid; diff --git a/dScripts/AgLaserSensorServer.cpp b/dScripts/AgLaserSensorServer.cpp index 9efae1ca..013f0c24 100644 --- a/dScripts/AgLaserSensorServer.cpp +++ b/dScripts/AgLaserSensorServer.cpp @@ -33,16 +33,16 @@ void AgLaserSensorServer::OnCollisionPhantom(Entity* self, Entity* target) { const auto source = script->GetPosition(); const auto obj = self->GetObjectID(); - if (obj == 76690936093053 && Vector3::DistanceSquared(source, NiPoint3(149.007f, 417.083f, 218.346f)) <= 1.0f) { + if (obj == 76690936093053 && NiPoint3::DistanceSquared(source, NiPoint3(149.007f, 417.083f, 218.346f)) <= 1.0f) { laser = script; break; - } else if (obj == 75866302318824 && Vector3::DistanceSquared(source, NiPoint3(48.6403f, 403.803f, 196.711f)) <= 1.0f) { + } else if (obj == 75866302318824 && NiPoint3::DistanceSquared(source, NiPoint3(48.6403f, 403.803f, 196.711f)) <= 1.0f) { laser = script; break; - } else if (obj == 75866302318822 && Vector3::DistanceSquared(source, NiPoint3(19.2155f, 420.083f, 249.226f)) <= 1.0f) { + } else if (obj == 75866302318822 && NiPoint3::DistanceSquared(source, NiPoint3(19.2155f, 420.083f, 249.226f)) <= 1.0f) { laser = script; break; - } else if (obj == 75866302318823 && Vector3::DistanceSquared(source, NiPoint3(-6.61596f, 404.633f, 274.323f)) <= 1.0f) { + } else if (obj == 75866302318823 && NiPoint3::DistanceSquared(source, NiPoint3(-6.61596f, 404.633f, 274.323f)) <= 1.0f) { laser = script; break; } diff --git a/dScripts/ExplodingAsset.cpp b/dScripts/ExplodingAsset.cpp index 46ff1522..ff77eb39 100644 --- a/dScripts/ExplodingAsset.cpp +++ b/dScripts/ExplodingAsset.cpp @@ -20,7 +20,7 @@ void ExplodingAsset::OnHit(Entity* self, Entity* attacker) { if (!self->GetBoolean(u"bIsHit")) { for (Entity* en : entities) { if (en->GetObjectID() == attacker->GetObjectID()) { - if (Vector3::DistanceSquared(en->GetPosition(), self->GetPosition()) > 10 * 10) continue; + if (NiPoint3::DistanceSquared(en->GetPosition(), self->GetPosition()) > 10 * 10) continue; auto* destroyable = en->GetComponent(); if (destroyable == nullptr) { diff --git a/dScripts/MastTeleport.cpp b/dScripts/MastTeleport.cpp index ebde7b20..48950c42 100644 --- a/dScripts/MastTeleport.cpp +++ b/dScripts/MastTeleport.cpp @@ -69,7 +69,7 @@ void MastTeleport::OnTimerDone(Entity* self, std::string timerName) { const auto rads = degrees * (static_cast(M_PI) / 180.0f); - const Vector3 newPlayerRot = { 0, rads, 0 }; + const NiPoint3 newPlayerRot = { 0, rads, 0 }; auto position = self->GetPosition(); diff --git a/dScripts/PetDigServer.cpp b/dScripts/PetDigServer.cpp index e26b079a..2e097c7d 100644 --- a/dScripts/PetDigServer.cpp +++ b/dScripts/PetDigServer.cpp @@ -222,7 +222,7 @@ Entity* PetDigServer::GetClosestTresure(NiPoint3 position) { if (tresure == nullptr) continue; - float distance = Vector3::DistanceSquared(tresure->GetPosition(), position); + float distance = NiPoint3::DistanceSquared(tresure->GetPosition(), position); if (closest == nullptr || distance < closestDistance) { closestDistance = distance; diff --git a/dScripts/SGCannon.cpp b/dScripts/SGCannon.cpp index 049837a4..a5d354b2 100644 --- a/dScripts/SGCannon.cpp +++ b/dScripts/SGCannon.cpp @@ -21,19 +21,19 @@ void SGCannon::OnStartup(Entity* self) { ResetVars(self); self->SetVar(GameStartedVariable, false); - self->SetVar(InitialVelocityVariable, {}); + self->SetVar(InitialVelocityVariable, {}); self->SetVar(ImpactSkillVariale, constants.impactSkillID); auto* shootingGalleryComponent = self->GetComponent(); if (shootingGalleryComponent != nullptr) { shootingGalleryComponent->SetStaticParams({ - Vector3 { -327.8609924316406, 256.8999938964844, 1.6482199430465698 }, - Vector3 { -181.4320068359375, 212.39999389648438, 2.5182199478149414 } + NiPoint3 { -327.8609924316406, 256.8999938964844, 1.6482199430465698 }, + NiPoint3 { -181.4320068359375, 212.39999389648438, 2.5182199478149414 } }); shootingGalleryComponent->SetDynamicParams({ - Vector3 { 0.0, 4.3, 9.0 }, - Vector3 { }, + NiPoint3 { 0.0, 4.3, 9.0 }, + NiPoint3 { }, 129.0, 800.0, 30.0, @@ -1030,17 +1030,17 @@ void SGCannon::ResetVars(Entity* self) { SGConstants SGCannon::GetConstants() { return { - Vector3 { -908.542480, 229.773178, -908.542480 }, - Quaternion { 0.91913521289825, 0, 0.39394217729568, 0 }, + NiPoint3 { -908.542480, 229.773178, -908.542480 }, + NiQuaternion { 0.91913521289825, 0, 0.39394217729568, 0 }, 1864, 34, 1822, - Vector3 { 6.652, -2, 1.5 }, + NiPoint3 { 6.652, -2, 1.5 }, 157, 129.0, 30.0, 800.0, - Vector3 { 0, 4.3, 9 }, + NiPoint3 { 0, 4.3, 9 }, 6297, 1822, 249, diff --git a/dScripts/SGCannon.h b/dScripts/SGCannon.h index df9831ad..2da4c8cc 100644 --- a/dScripts/SGCannon.h +++ b/dScripts/SGCannon.h @@ -21,17 +21,17 @@ struct SGEnemy { }; struct SGConstants { - Vector3 playerStartPosition; - Quaternion playerStartRotation; + NiPoint3 playerStartPosition; + NiQuaternion playerStartRotation; LOT cannonLot; uint32_t impactSkillID; LOT projectileLot; - Vector3 playerOffset; + NiPoint3 playerOffset; uint32_t rewardModelMatrix; float_t cannonVelocity; float_t cannonMinDistance; float_t cannonRefireRate; - Vector3 cannonBarrelOffset; + NiPoint3 cannonBarrelOffset; LOT cannonSuperchargedProjectileLot; LOT cannonProjectileLot; uint32_t cannonSuperChargeSkill; diff --git a/dVisualDebugger/CMakeLists.txt b/dVisualDebugger/CMakeLists.txt new file mode 100644 index 00000000..c685df55 --- /dev/null +++ b/dVisualDebugger/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(dVisualDebugger dVisualDebugger.cpp) +target_link_libraries(dVisualDebugger raylib Recast Detour) diff --git a/dVisualDebugger/dVisualDebugger.cpp b/dVisualDebugger/dVisualDebugger.cpp new file mode 100644 index 00000000..44668b2f --- /dev/null +++ b/dVisualDebugger/dVisualDebugger.cpp @@ -0,0 +1,150 @@ +#include "dVisualDebugger.h" + +#include + +#include "raylib.h" + +#include "Game.h" +#include "dpWorld.h" +#include "dpEntity.h" +#include "dpShapeBox.h" +#include "dpShapeSphere.h" +#include "EntityManager.h" +#include "PerformanceManager.h" +#include "dTerrain/RawFile.h" +#include "dTerrain/RawMesh.h" +#include "SimplePhysicsComponent.h" +#include "dZoneManager.h" + +inline Vector3 NiPointToVector3(NiPoint3 pos) { return { pos.x, pos.y, pos.z }; }; + +dVisualDebugger::dVisualDebugger(std::string zoneName) { + SetTraceLogLevel(LOG_FATAL); + InitWindow(m_Width, m_Height, ("dVisualDebugger: " + zoneName).c_str()); + + CreateCamera(); + CreateInGameCamera(); + + std::string zonePath = dZoneManager::Instance()->GetZone()->GetFilePathForZoneID(); + + zonePath = zonePath.substr(0, zonePath.rfind('/') + 1); + zonePath += dZoneManager::Instance()->GetZone()->GetZoneRawPath(); + + m_Terrain = new RawFile(zonePath); +} + +dVisualDebugger::~dVisualDebugger() { + if (m_Camera) delete m_Camera; + if (m_Terrain) delete m_Terrain; +} + +void dVisualDebugger::CreateInGameCamera() { + EntityInfo info; + info.lot = m_CameraID; + info.pos = { m_Camera->position.x, m_Camera->position.y, m_Camera->position.z }; + info.rot = NiQuaternion::LookAt(info.pos, { m_Camera->target.x, m_Camera->target.y, m_Camera->target.z }); + info.spawner = nullptr; + info.spawnerID = 0; + info.spawnerNodeID = 0; + + Entity* newEntity = EntityManager::Instance()->CreateEntity(info, nullptr); + m_CameraObjid = newEntity->GetObjectID(); + EntityManager::Instance()->ConstructEntity(newEntity); +} + +void dVisualDebugger::CreateCamera() { + Camera3D* camera = new Camera3D(); + + camera->position = { 0.f, 0.f, 0.f }; + camera->target = { 0.f, 1.f, 0.f }; + camera->up = { 0.f, 1.f, 0.f }; + camera->fovy = 40.0f; + camera->projection = CAMERA_PERSPECTIVE; + + m_Camera = camera; + + SetCameraMode(*m_Camera, CAMERA_FIRST_PERSON); + + float frameRateAprox = 1000 / PerformanceManager::GetServerFramerate(); + + SetTargetFPS((int32_t)frameRateAprox); // truncate exact frame rate +} + +void dVisualDebugger::Step(float delta) { + if (WindowShouldClose()) { + CloseWindow(); + exit(0); // Kill entire server, this is a dev tool at the end of the day + } + + UpdateCamera(m_Camera); + this->AttachToCharacter(); + + if (IsKeyDown(KEY_SPACE)) m_BindToGM = !m_BindToGM; + delete m_Camera; + + BeginDrawing(); + ClearBackground(RAYWHITE); + BeginMode3D(*m_Camera); + this->RenderEntities(Game::physicsWorld->GetDynamicEntities(), true); + this->RenderEntities(Game::physicsWorld->GetStaticEntities(), false); + this->RenderTerrainMesh(); + EndMode3D(); + + DrawText((std::to_string(m_Camera->position.x) + " " + std::to_string(m_Camera->position.y) + " " + std::to_string(m_Camera->position.z)).c_str(), 20, 20, 10, BLACK); + DrawFPS(10, 10); + EndDrawing(); +} + +void dVisualDebugger::AttachToCharacter() { + if (!m_BindToGM) return; + + auto characters = EntityManager::Instance()->GetEntitiesByLOT(1); + if (characters.size() != 1) return; + + m_Camera->position = NiPointToVector3(characters[0]->GetPosition()); + m_Camera->target = NiPointToVector3(characters[0]->GetRotation().GetForwardVector()); + + // Reposition our camera + + auto* camera = EntityManager::Instance()->GetEntity(m_CameraObjid); + if (!camera) return; + auto* physComp = camera->GetComponent(); + physComp->SetPosition(characters[0]->GetPosition()); + physComp->SetRotation(characters[0]->GetRotation()); + EntityManager::Instance()->SerializeEntity(camera); +} + +void dVisualDebugger::RenderTerrainMesh() { + if (!m_Terrain->GetMesh()) return; + + for (int i = 0; i < m_Terrain->GetMesh()->m_Triangles.size(); i += 3) { + auto v1 = m_Terrain->GetMesh()->m_Vertices[m_Terrain->GetMesh()->m_Triangles[i]]; + auto v2 = m_Terrain->GetMesh()->m_Vertices[m_Terrain->GetMesh()->m_Triangles[i + 1]]; + auto v3 = m_Terrain->GetMesh()->m_Vertices[m_Terrain->GetMesh()->m_Triangles[i + 2]]; + DrawTriangle3D(NiPointToVector3(v1), NiPointToVector3(v2), NiPointToVector3(v3), GRAY); + } +} + +void dVisualDebugger::RenderEntities(std::vector* entities, bool dynamic) { + auto colour = dynamic ? RED : BLUE; + + for (auto* item : *entities) { + auto* shape = item->GetShape(); + + switch (shape->GetShapeType()) { + case dpShapeType::Box: { + auto box = static_cast(shape); + DrawCube(NiPointToVector3(item->GetPosition()), box->GetWidth(), box->GetHeight(), box->GetDepth(), colour); + break; + }; + case dpShapeType::Sphere: { + auto sphere = static_cast(shape); + DrawSphere(NiPointToVector3(item->GetPosition()), sphere->GetRadius(), colour); + break; + }; + default: { + break; // We can ignore this + } + }; + } +} diff --git a/dVisualDebugger/dVisualDebugger.h b/dVisualDebugger/dVisualDebugger.h new file mode 100644 index 00000000..6f860da5 --- /dev/null +++ b/dVisualDebugger/dVisualDebugger.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include + +class Camera3D; +class dpEntity; +class RawFile; + +class dVisualDebugger { +public: + dVisualDebugger(std::string zoneName); + ~dVisualDebugger(); + + void Step(float delta); + + void RenderEntities(std::vector* entities, bool dynamic); + void RenderTerrainMesh(); + void AttachToCharacter(); +private: + Camera3D* m_Camera; + RawFile* m_Terrain; + uint64_t m_CameraObjid; + bool m_BindToGM = false; + + void CreateCamera(); + void CreateInGameCamera(); + + const int32_t m_Width = 800; + const int32_t m_Height = 450; + const int32_t m_CameraID = 2181; +}; diff --git a/dWorldServer/CMakeLists.txt b/dWorldServer/CMakeLists.txt index fcf29838..e8dfd9ce 100644 --- a/dWorldServer/CMakeLists.txt +++ b/dWorldServer/CMakeLists.txt @@ -1,6 +1,17 @@ +if (BUILD_VISUAL_DEBUGGER) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBUILD_VISUAL_DEBUGGER=1") +endif() + set(DWORLDSERVER_SOURCES "ObjectIDManager.cpp" "PerformanceManager.cpp" "WorldServer.cpp") add_executable(WorldServer ${DWORLDSERVER_SOURCES}) -target_link_libraries(WorldServer ${COMMON_LIBRARIES} dChatFilter dGame dZoneManager Detour Recast dPhysics tinyxml2 dNavigation) + +set(DWORLDSERVER_LIBRARIES dChatFilter dGame dZoneManager Detour Recast dPhysics tinyxml2 dNavigation) + +if (BUILD_VISUAL_DEBUGGER) + set(DWORLDSERVER_LIBRARIES ${DWORLDSERVER_LIBRARIES} dVisualDebugger raylib) +endif() + +target_link_libraries(WorldServer ${COMMON_LIBRARIES} ${DWORLDSERVER_LIBRARIES}) diff --git a/dWorldServer/WorldServer.cpp b/dWorldServer/WorldServer.cpp index 495053fa..a786ca02 100644 --- a/dWorldServer/WorldServer.cpp +++ b/dWorldServer/WorldServer.cpp @@ -56,6 +56,10 @@ #include "Player.h" #include "PropertyManagementComponent.h" +#ifdef BUILD_VISUAL_DEBUGGER +#include "../dVisualDebugger/dVisualDebugger.h" +#endif + #include "ZCompression.h" namespace Game { @@ -66,6 +70,9 @@ namespace Game { dChatFilter* chatFilter; dConfig* config; dLocale* locale; +#ifdef BUILD_VISUAL_DEBUGGER + dVisualDebugger* visualDebugger; +#endif std::mt19937 randomEngine; RakPeerInterface* chatServer; @@ -237,7 +244,9 @@ int main(int argc, char** argv) { Game::physicsWorld = &dpWorld::Instance(); //just in case some old code references it dZoneManager::Instance()->Initialize(LWOZONEID(zoneID, instanceID, cloneID)); g_CloneID = cloneID; - +#ifdef BUILD_VISUAL_DEBUGGER + Game::visualDebugger = new dVisualDebugger(dZoneManager::Instance()->GetZone()->GetZoneName()); +#endif // pre calculate the FDB checksum if (Game::config->GetValue("check_fdb") == "1") { std::ifstream fileStream; @@ -347,6 +356,12 @@ int main(int argc, char** argv) { Metrics::StartMeasurement(MetricVariable::UpdateSpawners); dZoneManager::Instance()->Update(deltaTime); Metrics::EndMeasurement(MetricVariable::UpdateSpawners); + +#ifdef BUILD_VISUAL_DEBUGGER + Metrics::StartMeasurement(MetricVariable::VisualDebugger); + Game::visualDebugger->Step(deltaTime); + Metrics::EndMeasurement(MetricVariable::VisualDebugger); +#endif } Metrics::StartMeasurement(MetricVariable::PacketHandling); diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index 978c5532..19df9c2a 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -25,6 +25,11 @@ include(CMakeMariaDBLists.txt) # Create our third party library objects add_subdirectory(raknet) +if(BUILD_VISUAL_DEBUGGER) + # If we are supposed to build the visual debugger include raylib + add_subdirectory(raylib) +endif() + # Download Backtrace if configured if(UNIX AND NOT APPLE) include(FetchContent)