Skip to content

Commit

Permalink
use opaque state objects
Browse files Browse the repository at this point in the history
  • Loading branch information
snoyer committed Apr 27, 2023
1 parent 625b1b8 commit 5616f15
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 34 deletions.
2 changes: 1 addition & 1 deletion application/F3DStarter.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ int F3DStarter::Start(int argc, char** argv)
const auto camState = cam.saveState();
this->LoadFile(index, true);
cam.restoreState(camState);
cam.deleteState(camState);
delete camState;
}
else
{
Expand Down
14 changes: 11 additions & 3 deletions library/private/camera_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,21 @@

#include "camera.h"

#include <vtkCamera.h>

#include <memory>

class vtkRenderer;
class vtkCamera;
namespace f3d::detail
{
class cameraState_impl : public cameraState
{
public:
vtkNew<vtkCamera> Camera;
cameraState_impl(vtkCamera* vtkCamera) { this->Camera->DeepCopy(vtkCamera); }
};

class camera_impl : public camera
{
public:
Expand Down Expand Up @@ -59,9 +68,8 @@ class camera_impl : public camera
camera& resetToDefault() override;
camera& resetToBounds() override;

CameraStateKey saveState() override;
bool restoreState(const CameraStateKey&) override;
bool deleteState(const CameraStateKey&) override;
cameraState* saveState() override;
void restoreState(const cameraState*) override;
///@}

/**
Expand Down
11 changes: 7 additions & 4 deletions library/public/camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@

namespace f3d
{
typedef uint CameraStateKey;
class F3D_EXPORT cameraState
{
public:
virtual ~cameraState() = default;
};

/**
* @class camera
Expand Down Expand Up @@ -70,9 +74,8 @@ class F3D_EXPORT camera
*/
virtual camera& resetToBounds() = 0;

virtual CameraStateKey saveState() = 0;
virtual bool restoreState(const CameraStateKey&) = 0;
virtual bool deleteState(const CameraStateKey&) = 0;
virtual cameraState* saveState() = 0;
virtual void restoreState(const cameraState*) = 0;

protected:
//! @cond
Expand Down
31 changes: 5 additions & 26 deletions library/src/camera_impl.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ class camera_impl::internals
public:
vtkRenderer* VTKRenderer = nullptr;
vtkNew<vtkCamera> DefaultVTKCamera;
std::map<CameraStateKey, vtkSmartPointer<vtkCamera> > SavedStates;
CameraStateKey NextCameraStateKey = 0;
};

//----------------------------------------------------------------------------
Expand Down Expand Up @@ -223,34 +221,15 @@ vtkCamera* camera_impl::GetVTKCamera()
return this->Internals->VTKRenderer->GetActiveCamera();
}

//----------------------------------------------------------------------------
CameraStateKey camera_impl::saveState()
{
vtkNew<vtkCamera> cam;
cam->DeepCopy(this->GetVTKCamera());

const CameraStateKey key = this->Internals->NextCameraStateKey++;
this->Internals->SavedStates[key] = cam;
return key;
}

//----------------------------------------------------------------------------
bool camera_impl::restoreState(const CameraStateKey& key)
cameraState* camera_impl::saveState()
{
if (this->Internals->SavedStates.count(key))
{
this->GetVTKCamera()->DeepCopy(this->Internals->SavedStates[key]);
return true;
}
else
{
return false;
}
return new cameraState_impl(this->GetVTKCamera());
}

//----------------------------------------------------------------------------
bool camera_impl::deleteState(const CameraStateKey& key)
void camera_impl::restoreState(const cameraState* cameraState)
{
return this->Internals->SavedStates.erase(key) > 0;
const cameraState_impl* state_impl = dynamic_cast<const cameraState_impl*>(cameraState);
this->GetVTKCamera()->DeepCopy(state_impl->Camera);
}
};

0 comments on commit 5616f15

Please sign in to comment.