//============================================================================ // 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. //============================================================================ #ifndef vtk_m_cont_CoordinateSystem_h #define vtk_m_cont_CoordinateSystem_h #include #include #include #include #include namespace vtkm { namespace cont { /// @brief Manages a coordinate system for a `DataSet`. /// /// A coordinate system is really a field with a special meaning, so `CoordinateSystem` /// class inherits from the `Field` class. `CoordinateSystem` constrains the field to /// be associated with points and typically has 3D floating point vectors for values. class VTKM_CONT_EXPORT CoordinateSystem : public vtkm::cont::Field { using Superclass = vtkm::cont::Field; public: VTKM_CONT CoordinateSystem(); // It's OK for regular _point_ fields to become a CoordinateSystem object. VTKM_CONT CoordinateSystem(const vtkm::cont::Field& src); VTKM_CONT CoordinateSystem(std::string name, const vtkm::cont::UnknownArrayHandle& data); template VTKM_CONT CoordinateSystem(std::string name, const ArrayHandle& data) : Superclass(name, Association::Points, data) { } /// This constructor of coordinate system sets up a regular grid of points. /// VTKM_CONT CoordinateSystem(std::string name, vtkm::Id3 dimensions, vtkm::Vec3f origin = vtkm::Vec3f(0.0f, 0.0f, 0.0f), vtkm::Vec3f spacing = vtkm::Vec3f(1.0f, 1.0f, 1.0f)); VTKM_CONT vtkm::Id GetNumberOfPoints() const { return this->GetNumberOfValues(); } VTKM_CONT vtkm::cont::UncertainArrayHandle GetData() const; private: #ifdef VTKM_USE_DOUBLE_PRECISION using FloatNonDefault = vtkm::Float32; #else using FloatNonDefault = vtkm::Float64; #endif using Vec3f_nd = vtkm::Vec; struct StorageToArrayDefault { template using IsInvalid = vtkm::cont::internal::IsInvalidArrayHandle; template using Transform = vtkm::cont::ArrayHandle; }; struct StorageToArrayNonDefault { template using IsInvalid = vtkm::cont::internal::IsInvalidArrayHandle; template using Transform = vtkm::cont::ArrayHandleCast>; }; using ArraysFloatDefault = vtkm::ListTransform< vtkm::ListRemoveIf, StorageToArrayDefault::Transform>; using ArraysFloatNonDefault = vtkm::ListTransform< vtkm::ListRemoveIf, StorageToArrayNonDefault::Transform>; public: using MultiplexerArrayType = // vtkm::cont::ArrayHandleMultiplexerFromList< vtkm::ListAppend>; /// \brief Returns the data for the coordinate system as an `ArrayHandleMultiplexer`. /// /// This array will handle all potential types supported by CoordinateSystem, so all types can be /// handled with one compile pass. However, using this precludes specialization for special /// arrays such as `ArrayHandleUniformPointCoordinates` that could have optimized code paths /// VTKM_CONT MultiplexerArrayType GetDataAsMultiplexer() const; VTKM_CONT void GetRange(vtkm::Range* range) const { this->Superclass::GetRange(range); } VTKM_CONT vtkm::Vec GetRange() const { vtkm::Vec range; this->GetRange(&range[0]); return range; } VTKM_CONT vtkm::cont::ArrayHandle GetRangeAsArrayHandle() const { return this->Superclass::GetRange(); } VTKM_CONT vtkm::Bounds GetBounds() const { vtkm::Range ranges[3]; this->GetRange(ranges); return vtkm::Bounds(ranges[0], ranges[1], ranges[2]); } void PrintSummary(std::ostream& out) const override; /// Releases any resources being used in the execution environment (that are /// not being shared by the control environment). VTKM_CONT void ReleaseResourcesExecution() override { this->Superclass::ReleaseResourcesExecution(); this->GetData().ReleaseResourcesExecution(); } }; template void CastAndCall(const vtkm::cont::CoordinateSystem& coords, Functor&& f, Args&&... args) { CastAndCall(coords.GetData(), std::forward(f), std::forward(args)...); } template vtkm::cont::CoordinateSystem make_CoordinateSystem(std::string name, const std::vector& data, vtkm::CopyFlag copy = vtkm::CopyFlag::Off) { return vtkm::cont::CoordinateSystem(name, vtkm::cont::make_ArrayHandle(data, copy)); } template vtkm::cont::CoordinateSystem make_CoordinateSystem(std::string name, const T* data, vtkm::Id numberOfValues, vtkm::CopyFlag copy = vtkm::CopyFlag::Off) { return vtkm::cont::CoordinateSystem(name, vtkm::cont::make_ArrayHandle(data, numberOfValues, copy)); } namespace internal { template <> struct DynamicTransformTraits { using DynamicTag = vtkm::cont::internal::DynamicTransformTagCastAndCall; }; } // namespace internal } // namespace cont } // namespace vtkm //============================================================================= // Specializations of serialization related classes /// @cond SERIALIZATION namespace mangled_diy_namespace { template <> struct Serialization : Serialization { }; } // diy /// @endcond SERIALIZATION #endif //vtk_m_cont_CoordinateSystem_h