From c3b9256fc582eb1befa317d8052499c1c2436f72 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Thu, 12 Mar 2026 16:57:29 -0500 Subject: [PATCH] feat(ui): add CGCamera::UpdateCallback --- src/ui/game/CGCamera.cpp | 59 ++++++++++++++++++++++++++++++++++++++++ src/ui/game/CGCamera.hpp | 8 ++++++ 2 files changed, 67 insertions(+) diff --git a/src/ui/game/CGCamera.cpp b/src/ui/game/CGCamera.cpp index 7030eb7..9210341 100644 --- a/src/ui/game/CGCamera.cpp +++ b/src/ui/game/CGCamera.cpp @@ -1,4 +1,5 @@ #include "ui/game/CGCamera.hpp" +#include "common/Time.hpp" #include "console/CVar.hpp" #include "object/Client.hpp" #include "object/client/CVehicleCamera_C.hpp" @@ -39,10 +40,56 @@ bool ValidateCameraView(CVar* var, const char* oldValue, const char* value, void } +int32_t CGCamera::UpdateCallback(const void*, void* param) { + auto camera = static_cast(param); + + if (!camera) { + return true; + } + + auto timestamp = OsGetAsyncTimeMsPrecise(); + + camera->m_nearZ = CWorld::GetNearClip(); + camera->m_farZ = CWorld::GetFarClip(); + + // Model camera + + if (camera->HasModel()) { + camera->CalcModelCamera(timestamp); + camera->CheckUnderwater(); + + return true; + } + + // Target camera + + auto target = ClntObjMgrObjectPtr(camera->m_target, TYPE_OBJECT, __FILE__, __LINE__); + + if (target) { + camera->CalcTargetCamera(target, timestamp); + camera->CheckUnderwater(); + + return true; + } + + // Unknown camera + + auto object90 = ClntObjMgrObjectPtr(camera->guid90, TYPE_OBJECT, __FILE__, __LINE__); + + if (object90) { + // TODO + + return true; + } + + return true; +} + CGCamera::CGCamera() : CSimpleCamera(CWorld::GetNearClip(), CWorld::GetFarClip(), 90.0f * CMath::DEG2RAD) { this->m_model = nullptr; this->m_target = 0; + this->guid90 = 0; this->m_relativeTo = 0; this->m_view = s_cameraView->GetInt(); @@ -55,6 +102,18 @@ CGCamera::CGCamera() : CSimpleCamera(CWorld::GetNearClip(), CWorld::GetFarClip() this->m_fovOffset = 0.0f; } +void CGCamera::CalcModelCamera(uint32_t timestamp) { + // TODO +} + +void CGCamera::CalcTargetCamera(CGObject_C* target, uint32_t timestamp) { + // TODO +} + +void CGCamera::CheckUnderwater() { + // TODO +} + float CGCamera::FOV() const { // Clamp offset-adjusted FOV between 0pi and 1pi return std::min(std::max(this->m_fov + this->m_fovOffset, 0.0f), CMath::PI); diff --git a/src/ui/game/CGCamera.hpp b/src/ui/game/CGCamera.hpp index 5a3a5b2..f498990 100644 --- a/src/ui/game/CGCamera.hpp +++ b/src/ui/game/CGCamera.hpp @@ -4,6 +4,7 @@ #include "ui/simple/CSimpleCamera.hpp" #include "util/GUID.hpp" +class CGObject_C; class CM2Model; class CGCamera : public CSimpleCamera { @@ -18,6 +19,9 @@ class CGCamera : public CSimpleCamera { // Public static variables static CameraViewData s_cameraViewDataDefault[]; + // Public static functions + static int32_t UpdateCallback(const void*, void* param); + // Virtual public member functions virtual ~CGCamera() = default; virtual float FOV() const; @@ -27,6 +31,9 @@ class CGCamera : public CSimpleCamera { // Public member functions CGCamera(); + void CalcModelCamera(uint32_t timestamp); + void CalcTargetCamera(CGObject_C* target, uint32_t timestamp); + void CheckUnderwater(); const WOWGUID& GetTarget() const; int32_t HasModel() const; C33Matrix ParentToWorld() const; @@ -38,6 +45,7 @@ class CGCamera : public CSimpleCamera { CM2Model* m_model; // TODO WOWGUID m_target; + WOWGUID guid90; // TODO WOWGUID m_relativeTo; // TODO