From 292c04ab435ce5c08beff78ba46ba70813f55004 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 27 Sep 2020 05:55:25 +0200 Subject: [PATCH] #5338: CameraManager is keeping track of Camera instances. Use one function object taking an argument for creating Cameras instead of two. --- include/icameraview.h | 11 +++++++++-- radiant/camera/CamWnd.cpp | 17 ++++++++++++++++- radiant/camera/CamWnd.h | 1 + radiantcore/camera/Camera.cpp | 9 ++++----- radiantcore/camera/Camera.h | 5 ++--- radiantcore/camera/CameraManager.cpp | 11 ++++++++--- radiantcore/camera/CameraManager.h | 10 ++++++++-- 7 files changed, 48 insertions(+), 16 deletions(-) diff --git a/include/icameraview.h b/include/icameraview.h index 65477c9f70..895bf97cf2 100644 --- a/include/icameraview.h +++ b/include/icameraview.h @@ -64,8 +64,15 @@ class ICameraViewManager : public: virtual ~ICameraViewManager() {} - virtual ICameraView::Ptr createCamera(render::IRenderView& view, - const std::function& queueDraw, const std::function& forceRedraw) = 0; + // Create a new camera instance. The ICameraViewManager is keeping a reference to this + // object for broadcasting the focusCamera() calls, so be sure to notify the manager + // if this camera is no longer in use by invoking destroyCamera(). + // The requestRedraw takes a bool indicating whether the redraw should be queued (false) + // or a redraw should be forced (true) + virtual ICameraView::Ptr createCamera(render::IRenderView& view, const std::function& requestRedraw) = 0; + + // Releases this camera instance, clearing any internal references to it + virtual void destroyCamera(const ICameraView::Ptr& camera) = 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 5e26b2ad59..e24f4097b6 100644 --- a/radiant/camera/CamWnd.cpp +++ b/radiant/camera/CamWnd.cpp @@ -79,7 +79,7 @@ CamWnd::CamWnd(wxWindow* parent) : _mainWxWidget(loadNamedPanel(parent, "CamWndPanel")), _id(++_maxId), _view(true), - _camera(GlobalCameraManager().createCamera(_view, std::bind(&CamWnd::queueDraw, this), std::bind(&CamWnd::forceRedraw, this))), + _camera(GlobalCameraManager().createCamera(_view, std::bind(&CamWnd::requestRedraw, this, std::placeholders::_1))), _drawing(false), _wxGLWidget(new wxutil::GLWidget(_mainWxWidget, std::bind(&CamWnd::onRender, this), "CamWnd")), _timer(this), @@ -264,6 +264,9 @@ CamWnd::~CamWnd() removeHandlersMove(); + // Release the camera instance + GlobalCameraManager().destroyCamera(_camera); + // Notify the camera manager about our destruction GlobalCamera().removeCamWnd(_id); } @@ -1131,6 +1134,18 @@ void CamWnd::forceRedraw() _wxGLWidget->Update(); } +void CamWnd::requestRedraw(bool force) +{ + if (force) + { + forceRedraw(); + } + else + { + queueDraw(); + } +} + void CamWnd::onGLMouseButtonPress(wxMouseEvent& ev) { // The focus might be on some editable child window - since the diff --git a/radiant/camera/CamWnd.h b/radiant/camera/CamWnd.h index d1d3525c05..3fcdc62f82 100644 --- a/radiant/camera/CamWnd.h +++ b/radiant/camera/CamWnd.h @@ -208,6 +208,7 @@ class CamWnd : void Cam_Draw(); bool onRender(); void drawTime(); + void requestRedraw(bool force); CameraMouseToolEvent createMouseEvent(const Vector2& point, const Vector2& delta = Vector2(0, 0)); diff --git a/radiantcore/camera/Camera.cpp b/radiantcore/camera/Camera.cpp index c7a927d6c2..4acb0a185b 100644 --- a/radiantcore/camera/Camera.cpp +++ b/radiantcore/camera/Camera.cpp @@ -47,11 +47,10 @@ namespace Vector3 Camera::_prevOrigin(0,0,0); Vector3 Camera::_prevAngles(0,0,0); -Camera::Camera(render::IRenderView& view, const Callback& queueDraw, const Callback& forceRedraw) : +Camera::Camera(render::IRenderView& view, const std::function& requestRedraw) : _origin(_prevOrigin), // Use previous origin for camera position _angles(_prevAngles), - _queueDraw(queueDraw), - _forceRedraw(forceRedraw), + _requestRedraw(requestRedraw), _fieldOfView(75.0f), _farClipPlane(32768), _width(0), @@ -193,12 +192,12 @@ const VolumeTest& Camera::getVolumeTest() const void Camera::queueDraw() { - _queueDraw(); + _requestRedraw(false); } void Camera::forceRedraw() { - _forceRedraw(); + _requestRedraw(true); } void Camera::moveUpdateAxes() diff --git a/radiantcore/camera/Camera.h b/radiantcore/camera/Camera.h index 2e78021205..435c500e8c 100644 --- a/radiantcore/camera/Camera.h +++ b/radiantcore/camera/Camera.h @@ -17,8 +17,7 @@ class Camera : Vector3 _origin; Vector3 _angles; - Callback _queueDraw; - Callback _forceRedraw; + std::function _requestRedraw; float _fieldOfView; float _farClipPlane; @@ -34,7 +33,7 @@ class Camera : render::IRenderView& _view; public: - Camera(render::IRenderView& view, const Callback& queueDraw, const Callback& forceRedraw); + Camera(render::IRenderView& view, const std::function& requestRedraw); Camera(const Camera& other) = delete; Camera& operator=(const Camera& other) = delete; diff --git a/radiantcore/camera/CameraManager.cpp b/radiantcore/camera/CameraManager.cpp index aa05c377fd..35fc7b9137 100644 --- a/radiantcore/camera/CameraManager.cpp +++ b/radiantcore/camera/CameraManager.cpp @@ -23,10 +23,15 @@ void CameraManager::initialiseModule(const IApplicationContext& ctx) rMessage() << getName() << "::initialiseModule called." << std::endl; } -ICameraView::Ptr CameraManager::createCamera(render::IRenderView& view, - const std::function& queueDraw, const std::function& forceRedraw) +ICameraView::Ptr CameraManager::createCamera(render::IRenderView& view, const std::function& requestRedraw) { - return std::make_shared(view, queueDraw, forceRedraw); + _cameras.emplace_back(std::make_shared(view, requestRedraw)); + return _cameras.back(); +} + +void CameraManager::destroyCamera(const ICameraView::Ptr& camera) +{ + _cameras.remove(camera); } sigc::signal& CameraManager::signal_cameraChanged() diff --git a/radiantcore/camera/CameraManager.h b/radiantcore/camera/CameraManager.h index 6a35f7cb4b..438e3651ef 100644 --- a/radiantcore/camera/CameraManager.h +++ b/radiantcore/camera/CameraManager.h @@ -1,5 +1,6 @@ #pragma once +#include #include "icamera.h" #include "icameraview.h" @@ -12,6 +13,10 @@ class CameraManager : private: sigc::signal _sigCameraChanged; + // We keep track of created cameras to be able to + // issue focusCamera calls to them + std::list _cameras; + public: // RegisterableModule const std::string& getName() const override; @@ -19,8 +24,9 @@ class CameraManager : void initialiseModule(const IApplicationContext& ctx) override; // ICameraManager - ICameraView::Ptr createCamera(render::IRenderView& view, - const std::function& queueDraw, const std::function& forceRedraw) override; + ICameraView::Ptr createCamera(render::IRenderView& view, const std::function& requestRedraw) override; + + void destroyCamera(const ICameraView::Ptr& camera) override; sigc::signal& signal_cameraChanged() override;