// // Filename : AdvancedStrokeShaders.h // Author : Fredo Durand // Purpose : Fredo's stroke shaders // Date of creation : 17/12/2002 // /////////////////////////////////////////////////////////////////////////////// // // Copyright (C) : Please refer to the COPYRIGHT file distributed // with this source distribution. // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // /////////////////////////////////////////////////////////////////////////////// #ifndef ADVANCEDSTROKESHADERS_H # define ADVANCEDSTROKESHADERS_H # include "BasicStrokeShaders.h" /*! [ Thickness Shader ]. * Assigns thicknesses to the stroke vertices * so that the stroke looks like made with a calligraphic tool. * i.e. The stroke will be the thickest in a main direction, * the thinest in the direction perpendicular to this one, * and an interpolation inbetween. */ class LIB_STROKE_EXPORT CalligraphicShader : public StrokeShader { public: /*! Builds the shader. * \param iMinThickness * The minimum thickness in the direction perpandicular * to the main direction. * \param iMaxThickness * The maximum thickness in the main direction. * \param iOrientation * The 2D vector giving the main direction. * \param clamp * Tells ??? */ CalligraphicShader (real iMinThickness, real iMaxThickness, const Vec2f &iOrientation, bool clamp); /*! Destructor. */ virtual ~CalligraphicShader () {} /*! The shading method */ virtual void shade(Stroke &ioStroke) const; protected: real _maxThickness; real _minThickness; Vec2f _orientation; bool _clamp; }; /*! [ Geometry Shader ]. * Spatial Noise stroke shader. * Moves the vertices to make the stroke more noisy. * @see \htmlonly noise/noise.html \endhtmlonly */ class LIB_STROKE_EXPORT SpatialNoiseShader : public StrokeShader { public: /*! Builds the shader. * \param iAmount * The amplitude of the noise. * \param ixScale * The noise frequency * \param nbOctave * The number of octaves * \param smooth * If you want the noise to be smooth * \param pureRandom * If you don't want any coherence */ SpatialNoiseShader (float iAmount, float ixScale, int nbOctave, bool smooth, bool pureRandom); /*! Destructor. */ virtual ~SpatialNoiseShader () {} /*! The shading method. */ virtual void shade(Stroke &ioStroke) const; protected: float _amount; float _xScale; int _nbOctave; bool _smooth; bool _pureRandom; }; /*! [ Geometry Shader ]. * Smoothes the stroke. * (Moves the vertices to make the stroke smoother). * Uses curvature flow to converge towards a curve of constant * curvature. The diffusion method we use is anisotropic * to prevent the diffusion accross corners. * @see \htmlonly smoothing/smoothing.html endhtmlonly */ class LIB_STROKE_EXPORT SmoothingShader : public StrokeShader { public: /*! Builds the shader. * \param iNbIteration * The number of iterations. (400) * \param iFactorPoint * 0 * \param ifactorCurvature * 0 * \param iFactorCurvatureDifference * 0.2 * \param iAnisoPoint * 0 * \param iAnisNormal * 0 * \param iAnisoCurvature * 0 * \param icarricatureFactor * 1 */ SmoothingShader (int iNbIteration, real iFactorPoint, real ifactorCurvature, real iFactorCurvatureDifference, real iAnisoPoint, real iAnisoNormal, real iAnisoCurvature, real icarricatureFactor); /*! Destructor. */ virtual ~SmoothingShader () {} /*! The shading method. */ virtual void shade(Stroke &ioStroke) const; protected: int _nbIterations; real _factorPoint; real _factorCurvature; real _factorCurvatureDifference; real _anisoPoint; real _anisoNormal; real _anisoCurvature; real _carricatureFactor; }; class LIB_STROKE_EXPORT Smoother { public: Smoother (Stroke &ioStroke); virtual ~Smoother () {} void smooth (int nbIterations, real iFactorPoint, real ifactorCurvature, real iFactorCurvatureDifference, real iAnisoPoint, real iAnisoNormal, real iAnisoCurvature, real icarricatureFactor); void computeCurvature (); protected: real _factorPoint; real _factorCurvature; real _factorCurvatureDifference; real _anisoPoint; real _anisoNormal; real _anisoCurvature; real _carricatureFactor; void iteration(); void copyVertices (); Stroke *_stroke; int _nbVertices; Vec2r *_vertex; Vec2r *_normal; real *_curvature; bool *_isFixedVertex; bool _isClosedCurve; bool _safeTest; }; class LIB_STROKE_EXPORT Omitter : public Smoother { public: Omitter (Stroke &ioStroke); virtual ~Omitter () {} void omit (real sizeWindow, real thrVari, real thrFlat, real lFlat); protected: real *_u; real _sizeWindow; real _thresholdVariation; real _thresholdFlat; real _lengthFlat; }; /*! Omission shader */ class LIB_STROKE_EXPORT OmissionShader : public StrokeShader { public: OmissionShader (real sizeWindow, real thrVari, real thrFlat, real lFlat); virtual ~OmissionShader () {} virtual void shade(Stroke &ioStroke) const; protected: real _sizeWindow; real _thresholdVariation; real _thresholdFlat; real _lengthFlat; }; #endif // ADVANCEDSTROKESHADERS_H