use unique_ptr for PIMPL Actor

This commit is contained in:
Li-Ta Lo 2023-06-01 11:28:49 -06:00
parent fe211adfd8
commit 6b0d2e369c
5 changed files with 35 additions and 24 deletions

@ -55,7 +55,7 @@ int main(int argc, char* argv[])
tangleData.GetField(fieldName),
colorTable);
vtkm::rendering::Scene scene;
scene.AddActor(actor);
scene.AddActor(std::move(actor));
// 2048x2048 pixels in the canvas:
CanvasRayTracer canvas(2048, 2048);
// Create a view and use it to render the input data using OS Mesa
@ -78,7 +78,7 @@ int main(int argc, char* argv[])
// from, so we want the scalar range to match that of the previous image.
isoActor.SetScalarRange(actor.GetScalarRange());
vtkm::rendering::Scene isoScene;
isoScene.AddActor(isoActor);
isoScene.AddActor(std::move(isoActor));
// Wireframe surface:
vtkm::rendering::View3D isoView(isoScene, MapperWireframer(), canvas, camera, bg);

@ -10,10 +10,11 @@
#include <vtkm/rendering/Actor.h>
#include <vtkm/Assert.h>
#include <vtkm/cont/TryExecute.h>
#include <vtkm/cont/UnknownCellSet.h>
#include <utility>
namespace vtkm
{
namespace rendering
@ -30,25 +31,25 @@ struct Actor::InternalsType
vtkm::Bounds SpatialBounds;
VTKM_CONT
InternalsType(const vtkm::cont::UnknownCellSet& cells,
const vtkm::cont::CoordinateSystem& coordinates,
const vtkm::cont::Field& scalarField,
InternalsType(vtkm::cont::UnknownCellSet cells,
vtkm::cont::CoordinateSystem coordinates,
vtkm::cont::Field scalarField,
const vtkm::rendering::Color& color)
: Cells(cells)
, Coordinates(coordinates)
, ScalarField(scalarField)
: Cells(std::move(cells))
, Coordinates(std::move(coordinates))
, ScalarField(std::move(scalarField))
, ColorTable(vtkm::Range{ 0, 1 }, color.Components, color.Components)
{
}
VTKM_CONT
InternalsType(const vtkm::cont::UnknownCellSet& cells,
const vtkm::cont::CoordinateSystem& coordinates,
const vtkm::cont::Field& scalarField,
InternalsType(vtkm::cont::UnknownCellSet cells,
vtkm::cont::CoordinateSystem coordinates,
vtkm::cont::Field scalarField,
const vtkm::cont::ColorTable& colorTable = vtkm::cont::ColorTable::Preset::Default)
: Cells(cells)
, Coordinates(coordinates)
, ScalarField(scalarField)
: Cells(std::move(cells))
, Coordinates(std::move(coordinates))
, ScalarField(std::move(scalarField))
, ColorTable(colorTable)
{
}
@ -57,7 +58,7 @@ struct Actor::InternalsType
Actor::Actor(const vtkm::cont::UnknownCellSet& cells,
const vtkm::cont::CoordinateSystem& coordinates,
const vtkm::cont::Field& scalarField)
: Internals(new InternalsType(cells, coordinates, scalarField))
: Internals(std::make_unique<InternalsType>(cells, coordinates, scalarField))
{
this->Init(coordinates, scalarField);
}
@ -66,7 +67,7 @@ Actor::Actor(const vtkm::cont::UnknownCellSet& cells,
const vtkm::cont::CoordinateSystem& coordinates,
const vtkm::cont::Field& scalarField,
const vtkm::rendering::Color& color)
: Internals(new InternalsType(cells, coordinates, scalarField, color))
: Internals(std::make_unique<InternalsType>(cells, coordinates, scalarField, color))
{
this->Init(coordinates, scalarField);
}
@ -75,11 +76,15 @@ Actor::Actor(const vtkm::cont::UnknownCellSet& cells,
const vtkm::cont::CoordinateSystem& coordinates,
const vtkm::cont::Field& scalarField,
const vtkm::cont::ColorTable& colorTable)
: Internals(new InternalsType(cells, coordinates, scalarField, colorTable))
: Internals(std::make_unique<InternalsType>(cells, coordinates, scalarField, colorTable))
{
this->Init(coordinates, scalarField);
}
Actor::~Actor() = default;
Actor::Actor(vtkm::rendering::Actor&&) noexcept = default;
Actor& Actor::operator=(Actor&&) noexcept = default;
void Actor::Init(const vtkm::cont::CoordinateSystem& coordinates,
const vtkm::cont::Field& scalarField)
{

@ -40,6 +40,14 @@ public:
const vtkm::cont::Field& scalarField,
const vtkm::rendering::Color& color);
// Disable copying due to unique_ptr;
Actor(const Actor&) = delete;
Actor& operator=(const Actor&) = delete;
Actor(Actor&&) noexcept;
Actor& operator=(Actor&&) noexcept;
~Actor();
void Render(vtkm::rendering::Mapper& mapper,
vtkm::rendering::Canvas& canvas,
const vtkm::rendering::Camera& camera) const;
@ -60,9 +68,7 @@ public:
private:
struct InternalsType;
std::shared_ptr<InternalsType> Internals;
struct RangeFunctor;
std::unique_ptr<InternalsType> Internals;
void Init(const vtkm::cont::CoordinateSystem& coordinates, const vtkm::cont::Field& scalarField);
};

@ -27,9 +27,9 @@ Scene::Scene()
{
}
void Scene::AddActor(const vtkm::rendering::Actor& actor)
void Scene::AddActor(vtkm::rendering::Actor&& actor)
{
this->Internals->Actors.push_back(actor);
this->Internals->Actors.push_back(std::move(actor));
}
const vtkm::rendering::Actor& Scene::GetActor(vtkm::IdComponent index) const

@ -29,7 +29,7 @@ class VTKM_RENDERING_EXPORT Scene
public:
Scene();
void AddActor(const vtkm::rendering::Actor& actor);
void AddActor(vtkm::rendering::Actor&& actor);
const vtkm::rendering::Actor& GetActor(vtkm::IdComponent index) const;