2017-03-29 16:11:09 +00:00
|
|
|
//============================================================================
|
|
|
|
// Copyright (c) Kitware, Inc.
|
|
|
|
// All rights reserved.
|
|
|
|
// See LICENSE.txt for details.
|
|
|
|
// This software is distributed WITHOUT ANY WARRANTY; without even
|
|
|
|
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
// PURPOSE. See the above copyright notice for more information.
|
|
|
|
//
|
|
|
|
// Copyright 2017 Sandia Corporation.
|
|
|
|
// Copyright 2017 UT-Battelle, LLC.
|
|
|
|
// Copyright 2017 Los Alamos National Security.
|
|
|
|
//
|
|
|
|
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
|
|
|
// the U.S. Government retains certain rights in this software.
|
|
|
|
//
|
|
|
|
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
|
|
|
// Laboratory (LANL), the U.S. Government retains certain rights in
|
|
|
|
// this software.
|
|
|
|
//============================================================================
|
|
|
|
#ifndef vtk_m_cont_ImplicitFunction_h
|
|
|
|
#define vtk_m_cont_ImplicitFunction_h
|
|
|
|
|
2017-05-23 14:49:52 +00:00
|
|
|
#include <vtkm/internal/Configure.h>
|
|
|
|
|
2017-03-29 16:11:09 +00:00
|
|
|
#include <vtkm/cont/VirtualObjectCache.h>
|
2017-05-18 14:51:24 +00:00
|
|
|
#include <vtkm/exec/ImplicitFunction.h>
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
namespace vtkm
|
|
|
|
{
|
|
|
|
namespace cont
|
|
|
|
{
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
class VTKM_CONT_EXPORT ImplicitFunction
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual ~ImplicitFunction();
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
template <typename DeviceAdapter>
|
2017-03-29 16:11:09 +00:00
|
|
|
vtkm::exec::ImplicitFunction PrepareForExecution(DeviceAdapter device) const
|
|
|
|
{
|
|
|
|
if (!this->Cache->GetValid())
|
|
|
|
{
|
|
|
|
this->SetDefaultDevices();
|
|
|
|
}
|
|
|
|
return this->Cache->GetVirtualObject(device);
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void Modified() { this->Cache->SetRefreshFlag(true); }
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
using CacheType = vtkm::cont::VirtualObjectCache<vtkm::exec::ImplicitFunction>;
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
ImplicitFunction()
|
|
|
|
: Cache(new CacheType)
|
2017-03-29 16:11:09 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
ImplicitFunction(ImplicitFunction&& other)
|
2017-03-29 16:11:09 +00:00
|
|
|
: Cache(std::move(other.Cache))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
ImplicitFunction& operator=(ImplicitFunction&& other)
|
2017-03-29 16:11:09 +00:00
|
|
|
{
|
|
|
|
if (this != &other)
|
|
|
|
{
|
|
|
|
this->Cache = std::move(other.Cache);
|
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void SetDefaultDevices() const = 0;
|
|
|
|
|
|
|
|
std::unique_ptr<CacheType> Cache;
|
|
|
|
};
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
template <typename Derived>
|
2017-03-29 16:11:09 +00:00
|
|
|
class VTKM_ALWAYS_EXPORT ImplicitFunctionImpl : public ImplicitFunction
|
|
|
|
{
|
|
|
|
public:
|
2017-05-18 14:29:41 +00:00
|
|
|
template <typename DeviceAdapterList>
|
2017-03-29 16:11:09 +00:00
|
|
|
void ResetDevices(DeviceAdapterList devices)
|
|
|
|
{
|
|
|
|
this->Cache->Bind(static_cast<const Derived*>(this), devices);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
ImplicitFunctionImpl() = default;
|
2017-05-18 14:29:41 +00:00
|
|
|
ImplicitFunctionImpl(const ImplicitFunctionImpl&)
|
|
|
|
: ImplicitFunction()
|
2017-03-29 16:11:09 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cannot default due to a bug in VS2013
|
2017-05-18 14:29:41 +00:00
|
|
|
ImplicitFunctionImpl(ImplicitFunctionImpl&& other)
|
2017-03-29 16:11:09 +00:00
|
|
|
: ImplicitFunction(std::move(other))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
ImplicitFunctionImpl& operator=(const ImplicitFunctionImpl&) { return *this; }
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
// Cannot default due to a bug in VS2013
|
2017-05-18 14:29:41 +00:00
|
|
|
ImplicitFunctionImpl& operator=(ImplicitFunctionImpl&& other)
|
2017-03-29 16:11:09 +00:00
|
|
|
{
|
|
|
|
ImplicitFunction::operator=(std::move(other));
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void SetDefaultDevices() const override { this->Cache->Bind(static_cast<const Derived*>(this)); }
|
2017-03-29 16:11:09 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
// ImplicitFunctions:
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
/// \brief Implicit function for a box
|
|
|
|
class VTKM_ALWAYS_EXPORT Box : public ImplicitFunctionImpl<Box>
|
|
|
|
{
|
|
|
|
public:
|
2017-05-15 20:08:51 +00:00
|
|
|
Box();
|
|
|
|
Box(vtkm::Vec<FloatDefault, 3> minPoint, vtkm::Vec<FloatDefault, 3> maxPoint);
|
2017-05-18 14:29:41 +00:00
|
|
|
Box(FloatDefault xmin, FloatDefault xmax, FloatDefault ymin, FloatDefault ymax, FloatDefault zmin,
|
|
|
|
FloatDefault zmax);
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void SetMinPoint(const vtkm::Vec<FloatDefault, 3>& point);
|
|
|
|
void SetMaxPoint(const vtkm::Vec<FloatDefault, 3>& point);
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-15 20:08:51 +00:00
|
|
|
const vtkm::Vec<FloatDefault, 3>& GetMinPoint() const;
|
|
|
|
const vtkm::Vec<FloatDefault, 3>& GetMaxPoint() const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
FloatDefault Value(const vtkm::Vec<FloatDefault, 3>& x) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
VTKM_EXEC_CONT
|
2017-05-15 20:08:51 +00:00
|
|
|
FloatDefault Value(FloatDefault x, FloatDefault y, FloatDefault z) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(const vtkm::Vec<FloatDefault, 3>& x) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(FloatDefault x, FloatDefault y, FloatDefault z) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
vtkm::Vec<FloatDefault, 3> MinPoint;
|
|
|
|
vtkm::Vec<FloatDefault, 3> MaxPoint;
|
|
|
|
};
|
|
|
|
|
|
|
|
//============================================================================
|
2017-05-15 20:08:51 +00:00
|
|
|
/// \brief Implicit function for a cylinder
|
|
|
|
class VTKM_ALWAYS_EXPORT Cylinder : public ImplicitFunctionImpl<Cylinder>
|
2017-03-29 16:11:09 +00:00
|
|
|
{
|
|
|
|
public:
|
2017-05-15 20:08:51 +00:00
|
|
|
Cylinder();
|
2017-05-18 14:29:41 +00:00
|
|
|
Cylinder(const vtkm::Vec<FloatDefault, 3>& axis, FloatDefault radius);
|
|
|
|
Cylinder(const vtkm::Vec<FloatDefault, 3>& center, const vtkm::Vec<FloatDefault, 3>& axis,
|
2017-05-15 20:08:51 +00:00
|
|
|
FloatDefault radius);
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void SetCenter(const vtkm::Vec<FloatDefault, 3>& center);
|
|
|
|
void SetAxis(const vtkm::Vec<FloatDefault, 3>& axis);
|
2017-05-15 20:08:51 +00:00
|
|
|
void SetRadius(FloatDefault radius);
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-15 20:08:51 +00:00
|
|
|
const vtkm::Vec<FloatDefault, 3>& GetCenter() const;
|
|
|
|
const vtkm::Vec<FloatDefault, 3>& GetAxis() const;
|
|
|
|
FloatDefault GetRadius() const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-15 20:08:51 +00:00
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
FloatDefault Value(const vtkm::Vec<FloatDefault, 3>& x) const;
|
2017-05-15 20:08:51 +00:00
|
|
|
VTKM_EXEC_CONT
|
|
|
|
FloatDefault Value(FloatDefault x, FloatDefault y, FloatDefault z) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-15 20:08:51 +00:00
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(const vtkm::Vec<FloatDefault, 3>& x) const;
|
2017-05-15 20:08:51 +00:00
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(FloatDefault x, FloatDefault y, FloatDefault z) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-15 20:08:51 +00:00
|
|
|
private:
|
|
|
|
vtkm::Vec<FloatDefault, 3> Center;
|
|
|
|
vtkm::Vec<FloatDefault, 3> Axis;
|
|
|
|
FloatDefault Radius;
|
|
|
|
};
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-15 20:08:51 +00:00
|
|
|
//============================================================================
|
|
|
|
/// \brief Implicit function for a frustum
|
|
|
|
class VTKM_ALWAYS_EXPORT Frustum : public ImplicitFunctionImpl<Frustum>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Frustum();
|
2017-05-18 14:29:41 +00:00
|
|
|
Frustum(const vtkm::Vec<FloatDefault, 3> points[6], const vtkm::Vec<FloatDefault, 3> normals[6]);
|
2017-05-15 20:08:51 +00:00
|
|
|
explicit Frustum(const vtkm::Vec<FloatDefault, 3> points[8]);
|
|
|
|
|
|
|
|
void SetPlanes(const vtkm::Vec<FloatDefault, 3> points[6],
|
|
|
|
const vtkm::Vec<FloatDefault, 3> normals[6]);
|
2017-05-18 14:29:41 +00:00
|
|
|
void SetPlane(int idx, vtkm::Vec<FloatDefault, 3>& point, vtkm::Vec<FloatDefault, 3>& normal);
|
2017-05-15 20:08:51 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void GetPlanes(vtkm::Vec<FloatDefault, 3> points[6], vtkm::Vec<FloatDefault, 3> normals[6]) const;
|
2017-05-15 20:08:51 +00:00
|
|
|
const vtkm::Vec<FloatDefault, 3>* GetPoints() const;
|
|
|
|
const vtkm::Vec<FloatDefault, 3>* GetNormals() const;
|
|
|
|
|
|
|
|
// The points should be specified in the order of hex-cell vertices
|
|
|
|
void CreateFromPoints(const vtkm::Vec<FloatDefault, 3> points[8]);
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-15 20:08:51 +00:00
|
|
|
FloatDefault Value(FloatDefault x, FloatDefault y, FloatDefault z) const;
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
FloatDefault Value(const vtkm::Vec<FloatDefault, 3>& x) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(FloatDefault, FloatDefault, FloatDefault) const;
|
2017-05-15 20:08:51 +00:00
|
|
|
VTKM_EXEC_CONT
|
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(const vtkm::Vec<FloatDefault, 3>&) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
vtkm::Vec<FloatDefault, 3> Points[6];
|
|
|
|
vtkm::Vec<FloatDefault, 3> Normals[6];
|
|
|
|
};
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
/// \brief Implicit function for a plane
|
|
|
|
class VTKM_ALWAYS_EXPORT Plane : public ImplicitFunctionImpl<Plane>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Plane();
|
2017-05-18 14:29:41 +00:00
|
|
|
explicit Plane(const vtkm::Vec<FloatDefault, 3>& normal);
|
|
|
|
Plane(const vtkm::Vec<FloatDefault, 3>& origin, const vtkm::Vec<FloatDefault, 3>& normal);
|
2017-05-15 20:08:51 +00:00
|
|
|
|
2017-05-18 14:29:41 +00:00
|
|
|
void SetOrigin(const vtkm::Vec<FloatDefault, 3>& origin);
|
|
|
|
void SetNormal(const vtkm::Vec<FloatDefault, 3>& normal);
|
2017-05-15 20:08:51 +00:00
|
|
|
|
|
|
|
const vtkm::Vec<FloatDefault, 3>& GetOrigin() const;
|
|
|
|
const vtkm::Vec<FloatDefault, 3>& GetNormal() const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-15 20:08:51 +00:00
|
|
|
FloatDefault Value(FloatDefault x, FloatDefault y, FloatDefault z) const;
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
FloatDefault Value(const vtkm::Vec<FloatDefault, 3>& x) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(FloatDefault, FloatDefault, FloatDefault) const;
|
2017-05-15 20:08:51 +00:00
|
|
|
VTKM_EXEC_CONT
|
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(const vtkm::Vec<FloatDefault, 3>&) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
vtkm::Vec<FloatDefault, 3> Origin;
|
|
|
|
vtkm::Vec<FloatDefault, 3> Normal;
|
|
|
|
};
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
/// \brief Implicit function for a sphere
|
|
|
|
class VTKM_ALWAYS_EXPORT Sphere : public ImplicitFunctionImpl<Sphere>
|
|
|
|
{
|
|
|
|
public:
|
2017-05-15 20:08:51 +00:00
|
|
|
Sphere();
|
|
|
|
explicit Sphere(FloatDefault radius);
|
|
|
|
Sphere(vtkm::Vec<FloatDefault, 3> center, FloatDefault radius);
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-15 20:08:51 +00:00
|
|
|
void SetRadius(FloatDefault radius);
|
2017-05-18 14:29:41 +00:00
|
|
|
void SetCenter(const vtkm::Vec<FloatDefault, 3>& center);
|
2017-03-29 16:11:09 +00:00
|
|
|
|
2017-05-15 20:08:51 +00:00
|
|
|
FloatDefault GetRadius() const;
|
|
|
|
const vtkm::Vec<FloatDefault, 3>& GetCenter() const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-15 20:08:51 +00:00
|
|
|
FloatDefault Value(FloatDefault x, FloatDefault y, FloatDefault z) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
FloatDefault Value(const vtkm::Vec<FloatDefault, 3>& x) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(FloatDefault x, FloatDefault y, FloatDefault z) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
VTKM_EXEC_CONT
|
2017-05-18 14:29:41 +00:00
|
|
|
vtkm::Vec<FloatDefault, 3> Gradient(const vtkm::Vec<FloatDefault, 3>& x) const;
|
2017-03-29 16:11:09 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
FloatDefault Radius;
|
|
|
|
vtkm::Vec<FloatDefault, 3> Center;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
} // vtkm::cont
|
|
|
|
|
|
|
|
#include <vtkm/cont/ImplicitFunction.hxx>
|
|
|
|
|
|
|
|
#endif // vtk_m_cont_ImplicitFunction_h
|