/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* ***** END GPL LICENSE BLOCK *****
*/
#ifndef __FREESTYLE_ADVANCED_STROKE_SHADERS_H__
#define __FREESTYLE_ADVANCED_STROKE_SHADERS_H__
/** \file blender/freestyle/intern/stroke/AdvancedStrokeShaders.h
* \ingroup freestyle
* \brief Fredo's stroke shaders
* \author Fredo Durand
* \date 17/12/2002
*/
#include "BasicStrokeShaders.h"
namespace Freestyle {
/*! [ 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 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 int 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 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 int 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 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 int shade(Stroke &ioStroke) const;
protected:
int _nbIterations;
real _factorPoint;
real _factorCurvature;
real _factorCurvatureDifference;
real _anisoPoint;
real _anisoNormal;
real _anisoCurvature;
real _carricatureFactor;
};
class 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 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 OmissionShader : public StrokeShader
{
public:
OmissionShader(real sizeWindow, real thrVari, real thrFlat, real lFlat);
virtual ~OmissionShader() {}
virtual int shade(Stroke &ioStroke) const;
protected:
real _sizeWindow;
real _thresholdVariation;
real _thresholdFlat;
real _lengthFlat;
};
} /* namespace Freestyle */
#endif // __FREESTYLE_ADVANCED_STROKE_SHADERS_H__