Skip to content

Commit

Permalink
#5338: Add combined update method to set origin and angles at the sam…
Browse files Browse the repository at this point in the history
…e time, triggering one single callback
  • Loading branch information
codereader committed Sep 27, 2020
1 parent 292c04a commit 9040df9
Show file tree
Hide file tree
Showing 8 changed files with 66 additions and 9 deletions.
6 changes: 6 additions & 0 deletions include/icameraview.h
Expand Up @@ -28,6 +28,9 @@ class ICameraView :
virtual const Vector3& getCameraAngles() const = 0;
virtual void setCameraAngles(const Vector3& newAngles) = 0;

// Combined setter for position and angles - triggers only one callback to potential observers
virtual void setOriginAndAngles(const Vector3& newOrigin, const Vector3& newAngles) = 0;

// Returns the vector pointing to the "right"
virtual const Vector3& getRightVector() const = 0;
// Returns the vector pointing "up"
Expand Down Expand Up @@ -74,6 +77,9 @@ class ICameraViewManager :
// Releases this camera instance, clearing any internal references to it
virtual void destroyCamera(const ICameraView::Ptr& camera) = 0;

// Sets the position and angles of all active cameras to the given values
virtual void focusAllCameras(const Vector3& position, const Vector3& angles) = 0;

// Signal emitted when any camera position or angles changed
virtual sigc::signal<void>& signal_cameraChanged() = 0;
};
Expand Down
8 changes: 6 additions & 2 deletions radiant/camera/CamWnd.cpp
Expand Up @@ -594,8 +594,7 @@ void CamWnd::performFreeMove(int dx, int dy)
angles[camera::CAMERA_YAW] += 360;
}

_camera->setCameraOrigin(origin);
_camera->setCameraAngles(angles);
_camera->setOriginAndAngles(origin, angles);
}

void CamWnd::onDeferredMotionDelta(int x, int y)
Expand Down Expand Up @@ -957,6 +956,11 @@ void CamWnd::setCameraAngles(const Vector3& angles)
_camera->setCameraAngles(angles);
}

void CamWnd::setOriginAndAngles(const Vector3& newOrigin, const Vector3& newAngles)
{
_camera->setOriginAndAngles(newOrigin, newAngles);
}

const Matrix4& CamWnd::getModelView() const
{
return _camera->getModelView();
Expand Down
2 changes: 2 additions & 0 deletions radiant/camera/CamWnd.h
Expand Up @@ -131,6 +131,8 @@ class CamWnd :
const Vector3& getCameraAngles() const override;
void setCameraAngles(const Vector3& angles) override;

void setOriginAndAngles(const Vector3& newOrigin, const Vector3& newAngles) override;

virtual const Matrix4& getModelView() const override;
virtual const Matrix4& getProjection() const override;

Expand Down
3 changes: 1 addition & 2 deletions radiant/camera/GlobalCameraWndManager.cpp
Expand Up @@ -270,8 +270,7 @@ void GlobalCameraWndManager::focusCamera(const Vector3& point, const Vector3& an
{
doWithActiveCamWnd([&](CamWnd& camWnd)
{
camWnd.setCameraOrigin(point);
camWnd.setCameraAngles(angles);
camWnd.setOriginAndAngles(point, angles);
});
}

Expand Down
41 changes: 36 additions & 5 deletions radiantcore/camera/Camera.cpp
Expand Up @@ -103,10 +103,8 @@ const Vector3& Camera::getCameraOrigin() const

void Camera::setCameraOrigin(const Vector3& newOrigin)
{
_origin = newOrigin;
_prevOrigin = _origin;

updateModelview();
doSetOrigin(newOrigin, true);

queueDraw();
CameraManager::GetInstanceInternal().onCameraViewChanged();
}
Expand All @@ -118,11 +116,44 @@ const Vector3& Camera::getCameraAngles() const

void Camera::setCameraAngles(const Vector3& newAngles)
{
_angles = newAngles;
doSetAngles(newAngles, true);

queueDraw();
CameraManager::GetInstanceInternal().onCameraViewChanged();
}

void Camera::doSetOrigin(const Vector3& origin, bool updateModelView)
{
_origin = origin;
_prevOrigin = _origin;

if (updateModelView)
{
updateModelview();
queueDraw();
}
}

void Camera::doSetAngles(const Vector3& angles, bool updateModelView)
{
_angles = angles;
_prevAngles = _angles;

if (updateModelView)
{
updateModelview();
freemoveUpdateAxes();
}
}

void Camera::setOriginAndAngles(const Vector3& newOrigin, const Vector3& newAngles)
{
doSetOrigin(newOrigin, false); // hold back matrix recalculation
doSetAngles(newAngles, false); // hold back matrix recalculation

updateModelview();
freemoveUpdateAxes();

queueDraw();
CameraManager::GetInstanceInternal().onCameraViewChanged();
}
Expand Down
5 changes: 5 additions & 0 deletions radiantcore/camera/Camera.h
Expand Up @@ -52,6 +52,8 @@ class Camera :
const Vector3& getCameraAngles() const override;
void setCameraAngles(const Vector3& newAngles) override;

void setOriginAndAngles(const Vector3& newOrigin, const Vector3& newAngles) override;

const Vector3& getRightVector() const override;
const Vector3& getUpVector() const override;
const Vector3& getForwardVector() const override;
Expand All @@ -70,6 +72,9 @@ class Camera :
void forceRedraw() override;

private:
// Set the origin without triggering any nofifications
void doSetOrigin(const Vector3& origin, bool updateModelView);
void doSetAngles(const Vector3& angles, bool updateModelView);
void updateProjection();
};

Expand Down
8 changes: 8 additions & 0 deletions radiantcore/camera/CameraManager.cpp
Expand Up @@ -34,6 +34,14 @@ void CameraManager::destroyCamera(const ICameraView::Ptr& camera)
_cameras.remove(camera);
}

void CameraManager::focusAllCameras(const Vector3& position, const Vector3& angles)
{
for (const auto& camera : _cameras)
{
camera->setOriginAndAngles(position, angles);
}
}

sigc::signal<void>& CameraManager::signal_cameraChanged()
{
return _sigCameraChanged;
Expand Down
2 changes: 2 additions & 0 deletions radiantcore/camera/CameraManager.h
Expand Up @@ -28,6 +28,8 @@ class CameraManager :

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

void focusAllCameras(const Vector3& position, const Vector3& angles) override;

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

void onCameraViewChanged();
Expand Down

0 comments on commit 9040df9

Please sign in to comment.