Skip to content

Commit

Permalink
#5338: CameraManager is keeping track of Camera instances.
Browse files Browse the repository at this point in the history
Use one function object taking an argument for creating Cameras instead of two.
  • Loading branch information
codereader committed Sep 27, 2020
1 parent 0b2e4df commit 292c04a
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 16 deletions.
11 changes: 9 additions & 2 deletions include/icameraview.h
Expand Up @@ -64,8 +64,15 @@ class ICameraViewManager :
public:
virtual ~ICameraViewManager() {}

virtual ICameraView::Ptr createCamera(render::IRenderView& view,
const std::function<void()>& queueDraw, const std::function<void()>& 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<void(bool)>& 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<void>& signal_cameraChanged() = 0;
Expand Down
17 changes: 16 additions & 1 deletion radiant/camera/CamWnd.cpp
Expand Up @@ -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),
Expand Down Expand Up @@ -264,6 +264,9 @@ CamWnd::~CamWnd()

removeHandlersMove();

// Release the camera instance
GlobalCameraManager().destroyCamera(_camera);

// Notify the camera manager about our destruction
GlobalCamera().removeCamWnd(_id);
}
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions radiant/camera/CamWnd.h
Expand Up @@ -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));

Expand Down
9 changes: 4 additions & 5 deletions radiantcore/camera/Camera.cpp
Expand Up @@ -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<void(bool)>& requestRedraw) :
_origin(_prevOrigin), // Use previous origin for camera position
_angles(_prevAngles),
_queueDraw(queueDraw),
_forceRedraw(forceRedraw),
_requestRedraw(requestRedraw),
_fieldOfView(75.0f),
_farClipPlane(32768),
_width(0),
Expand Down Expand Up @@ -193,12 +192,12 @@ const VolumeTest& Camera::getVolumeTest() const

void Camera::queueDraw()
{
_queueDraw();
_requestRedraw(false);
}

void Camera::forceRedraw()
{
_forceRedraw();
_requestRedraw(true);
}

void Camera::moveUpdateAxes()
Expand Down
5 changes: 2 additions & 3 deletions radiantcore/camera/Camera.h
Expand Up @@ -17,8 +17,7 @@ class Camera :
Vector3 _origin;
Vector3 _angles;

Callback _queueDraw;
Callback _forceRedraw;
std::function<void(bool)> _requestRedraw;

float _fieldOfView;
float _farClipPlane;
Expand All @@ -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<void(bool)>& requestRedraw);
Camera(const Camera& other) = delete;
Camera& operator=(const Camera& other) = delete;

Expand Down
11 changes: 8 additions & 3 deletions radiantcore/camera/CameraManager.cpp
Expand Up @@ -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<void()>& queueDraw, const std::function<void()>& forceRedraw)
ICameraView::Ptr CameraManager::createCamera(render::IRenderView& view, const std::function<void(bool)>& requestRedraw)
{
return std::make_shared<Camera>(view, queueDraw, forceRedraw);
_cameras.emplace_back(std::make_shared<Camera>(view, requestRedraw));
return _cameras.back();
}

void CameraManager::destroyCamera(const ICameraView::Ptr& camera)
{
_cameras.remove(camera);
}

sigc::signal<void>& CameraManager::signal_cameraChanged()
Expand Down
10 changes: 8 additions & 2 deletions radiantcore/camera/CameraManager.h
@@ -1,5 +1,6 @@
#pragma once

#include <list>
#include "icamera.h"
#include "icameraview.h"

Expand All @@ -12,15 +13,20 @@ class CameraManager :
private:
sigc::signal<void> _sigCameraChanged;

// We keep track of created cameras to be able to
// issue focusCamera calls to them
std::list<ICameraView::Ptr> _cameras;

public:
// RegisterableModule
const std::string& getName() const override;
const StringSet& getDependencies() const override;
void initialiseModule(const IApplicationContext& ctx) override;

// ICameraManager
ICameraView::Ptr createCamera(render::IRenderView& view,
const std::function<void()>& queueDraw, const std::function<void()>& forceRedraw) override;
ICameraView::Ptr createCamera(render::IRenderView& view, const std::function<void(bool)>& requestRedraw) override;

void destroyCamera(const ICameraView::Ptr& camera) override;

sigc::signal<void>& signal_cameraChanged() override;

Expand Down

0 comments on commit 292c04a

Please sign in to comment.