From 0b2e4df9bd833e6f9119bde6c7148d343067e2b5 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 27 Sep 2020 05:40:28 +0200 Subject: [PATCH] #5338: Remove CameraObserver interface in favour of a signal exposed by the CameraManager. --- include/icameraview.h | 3 +++ radiant/camera/CamWnd.cpp | 3 --- radiant/camera/CameraObserver.h | 18 ------------- radiant/camera/GlobalCameraWndManager.cpp | 33 ----------------------- radiant/camera/GlobalCameraWndManager.h | 11 -------- radiant/xyview/XYWnd.cpp | 15 ++++++----- radiant/xyview/XYWnd.h | 9 +++---- radiantcore/camera/CameraManager.cpp | 7 ++++- radiantcore/camera/CameraManager.h | 5 ++++ tools/msvc/DarkRadiant.vcxproj | 1 - tools/msvc/DarkRadiant.vcxproj.filters | 3 --- 11 files changed, 26 insertions(+), 82 deletions(-) delete mode 100644 radiant/camera/CameraObserver.h diff --git a/include/icameraview.h b/include/icameraview.h index bbfcad5ea6..65477c9f70 100644 --- a/include/icameraview.h +++ b/include/icameraview.h @@ -66,6 +66,9 @@ class ICameraViewManager : virtual ICameraView::Ptr createCamera(render::IRenderView& view, const std::function& queueDraw, const std::function& forceRedraw) = 0; + + // Signal emitted when any camera position or angles changed + virtual sigc::signal& signal_cameraChanged() = 0; }; } diff --git a/radiant/camera/CamWnd.cpp b/radiant/camera/CamWnd.cpp index f672f23b2a..5e26b2ad59 100644 --- a/radiant/camera/CamWnd.cpp +++ b/radiant/camera/CamWnd.cpp @@ -431,7 +431,6 @@ void CamWnd::changeFloor(const bool up) _camera->setCameraOrigin(Vector3(org[0], org[1], current + 48)); update(); - GlobalCamera().movedNotify(); } void CamWnd::setFreeMoveFlags(unsigned int mask) @@ -521,7 +520,6 @@ void CamWnd::onFreeMoveTimer(wxTimerEvent& ev) handleFreeMovement(time_seconds * 5.0f); queueDraw(); - GlobalCamera().movedNotify(); } void CamWnd::enableFreeMove() @@ -601,7 +599,6 @@ void CamWnd::onDeferredMotionDelta(int x, int y) { performFreeMove(-x, -y); queueDraw(); - GlobalCamera().movedNotify(); } void CamWnd::Cam_Draw() diff --git a/radiant/camera/CameraObserver.h b/radiant/camera/CameraObserver.h deleted file mode 100644 index f56163c66c..0000000000 --- a/radiant/camera/CameraObserver.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef CAMERAOBSERVER_H_ -#define CAMERAOBSERVER_H_ - -#include - -class CameraObserver -{ -public: - // destructor - virtual ~CameraObserver() {} - // This gets called as soon as the camera is moved - virtual void cameraMoved() = 0; - -}; // class CameraObserver - -typedef std::list CameraObserverList; - -#endif /*CAMERAOBSERVER_H_*/ diff --git a/radiant/camera/GlobalCameraWndManager.cpp b/radiant/camera/GlobalCameraWndManager.cpp index 087b296edb..d9086dbef4 100644 --- a/radiant/camera/GlobalCameraWndManager.cpp +++ b/radiant/camera/GlobalCameraWndManager.cpp @@ -252,39 +252,6 @@ void GlobalCameraWndManager::changeFloorDown(const cmd::ArgumentList& args) doWithActiveCamWnd([](CamWnd& camWnd) { camWnd.changeFloor(false); }); } -void GlobalCameraWndManager::addCameraObserver(CameraObserver* observer) { - if (observer != NULL) { - // Add the passed observer to the list - _cameraObservers.push_back(observer); - } -} - -void GlobalCameraWndManager::removeCameraObserver(CameraObserver* observer) -{ - // Cycle through the list of observers and call the moved method - for (CameraObserverList::iterator i = _cameraObservers.begin(); i != _cameraObservers.end(); i++) - { - CameraObserver* registered = *i; - - if (registered == observer) { - _cameraObservers.erase(i++); - return; // Don't continue the loop, the iterator is obsolete - } - } -} - -void GlobalCameraWndManager::movedNotify() -{ - // Cycle through the list of observers and call the moved method - for (CameraObserver* observer : _cameraObservers) - { - if (observer != nullptr) - { - observer->cameraMoved(); - } - } -} - void GlobalCameraWndManager::toggleLightingMode(const cmd::ArgumentList& args) { getCameraSettings()->toggleLightingMode(); } diff --git a/radiant/camera/GlobalCameraWndManager.h b/radiant/camera/GlobalCameraWndManager.h index 3812b6a621..a4bdd2f11d 100644 --- a/radiant/camera/GlobalCameraWndManager.h +++ b/radiant/camera/GlobalCameraWndManager.h @@ -8,7 +8,6 @@ #include "CamWnd.h" #include "FloatingCamWnd.h" -#include "CameraObserver.h" class wxWindow; @@ -32,9 +31,6 @@ class GlobalCameraWndManager : // The currently active camera window (-1 if no cam active) int _activeCam; - // The connected callbacks (get invoked when movedNotify() is called) - CameraObserverList _cameraObservers; - unsigned int _toggleStrafeModifierFlags; unsigned int _toggleStrafeForwardModifierFlags; @@ -95,13 +91,6 @@ class GlobalCameraWndManager : void update(); void forceDraw(); - // Add a "CameraMoved" callback to the signal member - void addCameraObserver(CameraObserver* observer); - void removeCameraObserver(CameraObserver* observer); - - // Notify the attached "CameraMoved" callbacks - void movedNotify(); - // Movement commands (the calls are passed on to the Camera class) void moveCameraCmd(const cmd::ArgumentList& args); void moveLeftDiscrete(const cmd::ArgumentList& args); diff --git a/radiant/xyview/XYWnd.cpp b/radiant/xyview/XYWnd.cpp index 9c78873866..2486b78d81 100644 --- a/radiant/xyview/XYWnd.cpp +++ b/radiant/xyview/XYWnd.cpp @@ -36,6 +36,7 @@ #include "render/RenderableCollectionWalker.h" #include +#include #include namespace ui @@ -136,7 +137,8 @@ XYWnd::XYWnd(int id, wxWindow* parent) : GlobalSceneGraph().addSceneObserver(this); // greebo: Connect as CameraObserver to the CamWindow. This way this class gets notified on camera change - GlobalCamera().addCameraObserver(this); + _sigCameraChanged = GlobalCameraManager().signal_cameraChanged().connect( + sigc::mem_fun(this, &XYWnd::onCameraMoved)); } // Destructor @@ -163,9 +165,7 @@ void XYWnd::destroyXYView() // Remove from the scene change callback list GlobalSceneGraph().removeSceneObserver(this); - // greebo: Remove as CameraObserver from the CamWindow. - GlobalCamera().removeCameraObserver(this); - + _sigCameraChanged.disconnect(); _wxGLWidget = nullptr; } @@ -431,9 +431,10 @@ void XYWnd::setCursorType(CursorType type) }; } -// Callback that gets invoked on camera move -void XYWnd::cameraMoved() { - if (GlobalXYWnd().camXYUpdate()) { +void XYWnd::onCameraMoved() +{ + if (GlobalXYWnd().camXYUpdate()) + { queueDraw(); } } diff --git a/radiant/xyview/XYWnd.h b/radiant/xyview/XYWnd.h index a770c48d7a..137459b2f4 100644 --- a/radiant/xyview/XYWnd.h +++ b/radiant/xyview/XYWnd.h @@ -12,8 +12,8 @@ #include #include +#include -#include "camera/CameraObserver.h" #include "render/View.h" #include "imousetool.h" #include "tools/XYMouseToolEvent.h" @@ -25,7 +25,6 @@ namespace ui class XYWnd : public wxEvtHandler, public IOrthoView, - public CameraObserver, public scene::Graph::Observer, protected wxutil::MouseToolHandler { @@ -85,6 +84,8 @@ class XYWnd : int _width; int _height; + sigc::connection _sigCameraChanged; + public: // Constructor, this allocates the GL widget XYWnd(int uniqueId, wxWindow* parent); @@ -149,9 +150,6 @@ class XYWnd : int getWidth() const override; int getHeight() const override; - // greebo: CameraObserver implementation; gets called when the camera is moved - void cameraMoved() override; - // greebo: This gets called upon scene change void onSceneGraphChange() override; @@ -177,6 +175,7 @@ class XYWnd : bool checkChaseMouse(unsigned int state); void performChaseMouse(); void onIdle(wxIdleEvent& ev); + void onCameraMoved(); // The method responsible for mouseMove situations according to void handleGLMouseMotion(int x, int y, unsigned int state, bool isDelta); diff --git a/radiantcore/camera/CameraManager.cpp b/radiantcore/camera/CameraManager.cpp index e89091d0c8..aa05c377fd 100644 --- a/radiantcore/camera/CameraManager.cpp +++ b/radiantcore/camera/CameraManager.cpp @@ -29,9 +29,14 @@ ICameraView::Ptr CameraManager::createCamera(render::IRenderView& view, return std::make_shared(view, queueDraw, forceRedraw); } +sigc::signal& CameraManager::signal_cameraChanged() +{ + return _sigCameraChanged; +} + void CameraManager::onCameraViewChanged() { - // TODO + _sigCameraChanged.emit(); } CameraManager& CameraManager::GetInstanceInternal() diff --git a/radiantcore/camera/CameraManager.h b/radiantcore/camera/CameraManager.h index 2f2fb22a43..6a35f7cb4b 100644 --- a/radiantcore/camera/CameraManager.h +++ b/radiantcore/camera/CameraManager.h @@ -9,6 +9,9 @@ namespace camera class CameraManager : public ICameraViewManager { +private: + sigc::signal _sigCameraChanged; + public: // RegisterableModule const std::string& getName() const override; @@ -19,6 +22,8 @@ class CameraManager : ICameraView::Ptr createCamera(render::IRenderView& view, const std::function& queueDraw, const std::function& forceRedraw) override; + sigc::signal& signal_cameraChanged() override; + void onCameraViewChanged(); // Module-internal accessor diff --git a/tools/msvc/DarkRadiant.vcxproj b/tools/msvc/DarkRadiant.vcxproj index d400ceaabe..f9e14e416d 100644 --- a/tools/msvc/DarkRadiant.vcxproj +++ b/tools/msvc/DarkRadiant.vcxproj @@ -455,7 +455,6 @@ - diff --git a/tools/msvc/DarkRadiant.vcxproj.filters b/tools/msvc/DarkRadiant.vcxproj.filters index d66c8e867e..e66368044a 100644 --- a/tools/msvc/DarkRadiant.vcxproj.filters +++ b/tools/msvc/DarkRadiant.vcxproj.filters @@ -675,9 +675,6 @@ - - src\camera - src\camera