#ifndef qwt3d_parametricsurface_h
#define qwt3d_parametricsurface_h

#include "qwt3d_gridmapping.h"

namespace Qwt3D {

class SurfacePlot;

//! Abstract base class for parametric surfaces
/**

*/
class QWT3D_EXPORT ParametricSurface : public GridMapping
{

public:
    ParametricSurface(); //!< Constructs ParametricSurface object w/o assigned SurfacePlot.
    //! Constructs ParametricSurface object and assigns a SurfacePlot
    explicit ParametricSurface(Qwt3D::SurfacePlot &plotWidget);
    //! Constructs ParametricSurface object and assigns a SurfacePlot
    explicit ParametricSurface(Qwt3D::SurfacePlot *plotWidget);
    //! Overwrite this
    virtual Qwt3D::Triple operator()(double u, double v) = 0;
    //! Assigns a new SurfacePlot and creates a data representation for it.
    virtual bool create(Qwt3D::SurfacePlot &plotWidget);
    //! Creates data representation for the actual assigned SurfacePlot.
    virtual bool create();
    //! Assigns the object to another widget. To see the changes, you have to call this function before create().
    void assign(Qwt3D::SurfacePlot &plotWidget);
    //! Assigns the object to another widget. To see the changes, you have to call this function before create().
    void assign(Qwt3D::SurfacePlot *plotWidget);
    //! Provide information about periodicity of the 'u' resp. 'v' domains.
    void setPeriodic(bool u, bool v);

private:
    bool uperiodic_, vperiodic_;
};

} // ns

#endif /* include guarded */
