//============================================================================ // 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 2014 Sandia Corporation. // Copyright 2014 UT-Battelle, LLC. // Copyright 2014 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_worklet_PointElevation_h #define vtk_m_worklet_PointElevation_h #include #include namespace vtkm { namespace worklet { namespace internal { template VTKM_EXEC_EXPORT T clamp(const T& val, const T& min, const T& max) { return vtkm::Min(max, vtkm::Max(min, val)); } } class PointElevation : public vtkm::worklet::WorkletMapField { public: typedef void ControlSignature(FieldIn, FieldOut); typedef _2 ExecutionSignature(_1); VTKM_CONT_EXPORT PointElevation() : LowPoint(0.0, 0.0, 0.0), HighPoint(0.0, 0.0, 1.0), RangeLow(0.0), RangeHigh(1.0) {} VTKM_CONT_EXPORT void SetLowPoint(const vtkm::Vec &point) { this->LowPoint = point; } VTKM_CONT_EXPORT void SetHighPoint(const vtkm::Vec &point) { this->HighPoint = point; } VTKM_CONT_EXPORT void SetRange(vtkm::Float64 low, vtkm::Float64 high) { this->RangeLow = low; this->RangeHigh = high; } VTKM_EXEC_EXPORT vtkm::Float64 operator()(const vtkm::Vec &vec) const { vtkm::Vec direction = this->HighPoint - this->LowPoint; vtkm::Float64 lengthSqr = vtkm::dot(direction, direction); vtkm::Float64 rangeLength = this->RangeHigh - this->RangeLow; vtkm::Float64 s = vtkm::dot(vec - this->LowPoint, direction) / lengthSqr; s = internal::clamp(s, 0.0, 1.0); return this->RangeLow + (s * rangeLength); } template VTKM_EXEC_EXPORT vtkm::Float64 operator()(const vtkm::Vec &vec) const { return (*this)(vtkm::make_Vec(static_cast(vec[0]), static_cast(vec[1]), static_cast(vec[2]))); } private: vtkm::Vec LowPoint, HighPoint; vtkm::Float64 RangeLow, RangeHigh; }; } } // namespace vtkm::worklet #endif // vtk_m_worklet_PointElevation_h