From 7082e8db17dd0b70b7cee060f221382f1b8f345b Mon Sep 17 00:00:00 2001 From: fallenoak Date: Mon, 9 Mar 2026 21:43:35 -0500 Subject: [PATCH] feat(ui): implement CGCamera::ParentToWorld --- lib/typhoon | 2 +- src/object/client/CGObject_C.cpp | 4 ++++ src/object/client/CGObject_C.hpp | 2 ++ src/object/client/CGUnit_C.cpp | 8 ++++++++ src/object/client/CGUnit_C.hpp | 5 +++++ src/object/client/CVehicleCamera_C.cpp | 6 ++++++ src/object/client/CVehicleCamera_C.hpp | 13 +++++++++++++ src/object/movement/CPassenger.cpp | 4 ++++ src/object/movement/CPassenger.hpp | 1 + src/ui/game/CGCamera.cpp | 25 +++++++++++++++++++++---- 10 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 src/object/client/CVehicleCamera_C.cpp create mode 100644 src/object/client/CVehicleCamera_C.hpp diff --git a/lib/typhoon b/lib/typhoon index 1e5366b..489f214 160000 --- a/lib/typhoon +++ b/lib/typhoon @@ -1 +1 @@ -Subproject commit 1e5366bbc6935e3363abf5921f0be12f902e790a +Subproject commit 489f2149b74b2ca8302ec1cbcec9c6250057f7a1 diff --git a/src/object/client/CGObject_C.cpp b/src/object/client/CGObject_C.cpp index 3ae73a7..0f7471b 100644 --- a/src/object/client/CGObject_C.cpp +++ b/src/object/client/CGObject_C.cpp @@ -111,6 +111,10 @@ C3Vector CGObject_C::GetPosition() const { return { 0.0f, 0.0f, 0.0f }; } +WOWGUID CGObject_C::GetTransportGUID() const { + return 0; +} + int32_t CGObject_C::IsInReenable() { return this->m_inReenable; } diff --git a/src/object/client/CGObject_C.hpp b/src/object/client/CGObject_C.hpp index f7d9400..71c2bf8 100644 --- a/src/object/client/CGObject_C.hpp +++ b/src/object/client/CGObject_C.hpp @@ -40,6 +40,8 @@ class CGObject_C : public CGObject, public TSHashObjectCGUnit::GetPosition(); } +float CGUnit_C::GetRawSmoothFacing() const { + return this->m_smoothFacing; +} + +WOWGUID CGUnit_C::GetTransportGUID() const { + return this->m_localMove.GetTransportGUID(); +} + void CGUnit_C::PostInit(uint32_t time, const CClientObjCreate& init, bool a4) { // TODO diff --git a/src/object/client/CGUnit_C.hpp b/src/object/client/CGUnit_C.hpp index 1af6a82..a3c7ecf 100644 --- a/src/object/client/CGUnit_C.hpp +++ b/src/object/client/CGUnit_C.hpp @@ -32,6 +32,8 @@ class CGUnit_C : public CGObject_C, public CGUnit { // TODO virtual float GetFacing() const; // TODO + virtual WOWGUID GetTransportGUID() const; + // TODO virtual int32_t GetModelFileName(const char*& name) const; // TODO virtual int32_t CanHighlight(); @@ -42,6 +44,7 @@ class CGUnit_C : public CGObject_C, public CGUnit { CGUnit_C(uint32_t time, CClientObjCreate& objCreate); int32_t GetDisplayID() const; CreatureModelDataRec* GetModelData() const; + float GetRawSmoothFacing() const; void PostInit(uint32_t time, const CClientObjCreate& init, bool a4); void PostMovementUpdate(const CClientMoveUpdate& move, int32_t activeMover); void SetStorage(uint32_t* storage, uint32_t* saved); @@ -65,6 +68,8 @@ class CGUnit_C : public CGObject_C, public CGUnit { // TODO int32_t m_localDisplayID = 0; // TODO + float m_smoothFacing; + // TODO }; #endif diff --git a/src/object/client/CVehicleCamera_C.cpp b/src/object/client/CVehicleCamera_C.cpp new file mode 100644 index 0000000..70f7588 --- /dev/null +++ b/src/object/client/CVehicleCamera_C.cpp @@ -0,0 +1,6 @@ +#include "object/client/CVehicleCamera_C.hpp" +#include "object/client/CGObject_C.hpp" + +int32_t CVehicleCamera_C::ConvertSmoothFacingFromRawToWorld(float& smoothFacing, CGObject_C* relativeTo) { + return 0; +} diff --git a/src/object/client/CVehicleCamera_C.hpp b/src/object/client/CVehicleCamera_C.hpp new file mode 100644 index 0000000..69f3470 --- /dev/null +++ b/src/object/client/CVehicleCamera_C.hpp @@ -0,0 +1,13 @@ +#ifndef OBJECT_CLIENT_C_VEHICLE_CAMERA_C_HPP +#define OBJECT_CLIENT_C_VEHICLE_CAMERA_C_HPP + +#include +class CGObject_C; + +class CVehicleCamera_C { + public: + // Public static functions + static int32_t ConvertSmoothFacingFromRawToWorld(float& smoothFacing, CGObject_C* relativeTo); +}; + +#endif diff --git a/src/object/movement/CPassenger.cpp b/src/object/movement/CPassenger.cpp index bb87896..bdf589e 100644 --- a/src/object/movement/CPassenger.cpp +++ b/src/object/movement/CPassenger.cpp @@ -32,3 +32,7 @@ C3Vector CPassenger::GetPosition(const C3Vector& position) const { return position; } + +WOWGUID CPassenger::GetTransportGUID() const { + return this->m_transportGUID; +} diff --git a/src/object/movement/CPassenger.hpp b/src/object/movement/CPassenger.hpp index d9a9e03..1b604fb 100644 --- a/src/object/movement/CPassenger.hpp +++ b/src/object/movement/CPassenger.hpp @@ -16,6 +16,7 @@ class CPassenger { float GetFacing(float facing) const; C3Vector GetPosition() const; C3Vector GetPosition(const C3Vector& position) const; + WOWGUID GetTransportGUID() const; protected: // Protected member variables diff --git a/src/ui/game/CGCamera.cpp b/src/ui/game/CGCamera.cpp index 60b736c..7030eb7 100644 --- a/src/ui/game/CGCamera.cpp +++ b/src/ui/game/CGCamera.cpp @@ -1,10 +1,12 @@ #include "ui/game/CGCamera.hpp" -#include "ui/game/Types.hpp" #include "console/CVar.hpp" +#include "object/Client.hpp" +#include "object/client/CVehicleCamera_C.hpp" +#include "ui/game/Types.hpp" #include "world/World.hpp" +#include #include #include -#include static CVar* s_cameraView; @@ -75,8 +77,23 @@ int32_t CGCamera::HasModel() const { } C33Matrix CGCamera::ParentToWorld() const { - // TODO - return {}; + auto relativeTo = ClntObjMgrObjectPtr(this->m_relativeTo, TYPE_OBJECT, __FILE__, __LINE__); + + if (!relativeTo) { + return {}; + } + + float facing; + + if (relativeTo->IsA(TYPE_UNIT)) { + facing = static_cast(relativeTo)->GetRawSmoothFacing(); + auto transport = ClntObjMgrObjectPtr(relativeTo->GetTransportGUID(), TYPE_OBJECT, __FILE__, __LINE__); + CVehicleCamera_C::ConvertSmoothFacingFromRawToWorld(facing, transport); + } else { + facing = relativeTo->GetFacing(); + } + + return C33Matrix::RotationAroundZ(facing); } C3Vector CGCamera::Right() const {