/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkSampleImplicitFunctionFilter.h

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm 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.

=========================================================================*/
/**
 * @class   vtkSampleImplicitFunctionFilter
 * @brief   sample an implicit function over a dataset,
 * generating scalar values and optional gradient vectors
 *
 *
 * vtkSampleImplicitFunctionFilter is a filter that evaluates an implicit function and
 * (optional) gradients at each point in an input vtkDataSet. The output
 * of the filter are new scalar values (the function values) and the
 * optional vector (function gradient) array.
 *
 * @warning
 * This class has been threaded with vtkSMPTools. Using TBB or other
 * non-sequential type (set in the CMake variable
 * VTK_SMP_IMPLEMENTATION_TYPE) may improve performance significantly.
 *
 * @sa
 * vtkSampleFunction vtkImplicitModeller
 */

#ifndef vtkSampleImplicitFunctionFilter_h
#define vtkSampleImplicitFunctionFilter_h

#include "vtkDataSetAlgorithm.h"
#include "vtkFiltersGeneralModule.h" // For export macro

class vtkImplicitFunction;
class vtkDataArray;

class VTKFILTERSGENERAL_EXPORT vtkSampleImplicitFunctionFilter : public vtkDataSetAlgorithm
{
public:
  ///@{
  /**
   * Standard instantiation, type information, and print methods.
   */
  static vtkSampleImplicitFunctionFilter* New();
  vtkTypeMacro(vtkSampleImplicitFunctionFilter, vtkDataSetAlgorithm);
  void PrintSelf(ostream& os, vtkIndent indent) override;
  ///@}

  ///@{
  /**
   * Specify the implicit function to use to generate data.
   */
  virtual void SetImplicitFunction(vtkImplicitFunction*);
  vtkGetObjectMacro(ImplicitFunction, vtkImplicitFunction);
  ///@}

  ///@{
  /**
   * Turn on/off the computation of gradients.
   */
  vtkSetMacro(ComputeGradients, vtkTypeBool);
  vtkGetMacro(ComputeGradients, vtkTypeBool);
  vtkBooleanMacro(ComputeGradients, vtkTypeBool);
  ///@}

  ///@{
  /**
   * Set/get the scalar array name for this data set. The initial value is
   * "Implicit scalars".
   */
  vtkSetStringMacro(ScalarArrayName);
  vtkGetStringMacro(ScalarArrayName);
  ///@}

  ///@{
  /**
   * Set/get the gradient array name for this data set. The initial value is
   * "Implicit gradients".
   */
  vtkSetStringMacro(GradientArrayName);
  vtkGetStringMacro(GradientArrayName);
  ///@}

  /**
   * Return the MTime also taking into account the implicit function.
   */
  vtkMTimeType GetMTime() override;

protected:
  vtkSampleImplicitFunctionFilter();
  ~vtkSampleImplicitFunctionFilter() override;

  vtkImplicitFunction* ImplicitFunction;
  vtkTypeBool ComputeGradients;
  char* ScalarArrayName;
  char* GradientArrayName;

  void ReportReferences(vtkGarbageCollector*) override;

  int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
  int FillInputPortInformation(int port, vtkInformation* info) override;

private:
  vtkSampleImplicitFunctionFilter(const vtkSampleImplicitFunctionFilter&) = delete;
  void operator=(const vtkSampleImplicitFunctionFilter&) = delete;
};

#endif
