Blob Blame Raw


#ifndef STROKE_PARAMETRIC_DEFORMER_H
#define STROKE_PARAMETRIC_DEFORMER_H

/**
 * @author  Fabrizio Morciano <fabrizio.morciano@gmail.com>
 */

#include "tcommon.h"
#include "tstrokedeformations.h"

#undef DVAPI
#undef DVVAR
#ifdef TNZEXT_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

#if defined(_WIN32) && (_MSC_VER <= 1200)
// to avoid annoying warning
#pragma warning(push)
#pragma warning(disable : 4290)
#endif

class TStroke;

namespace ToonzExt
{
class Potential;
/**
   * @brief This class implements new deformer.
   *  
   * New stroke deformer doesn't change last point of stroke.
   */
class DVAPI StrokeParametricDeformer
	: public TStrokeDeformation
{
public:
	StrokeParametricDeformer(double actionLenght,
							 double startParameter,
							 TStroke *s,
							 Potential *);

	~StrokeParametricDeformer();

	/**
     * @brief Set mouse movement from last valid position.
     * @param vx  horyzontal
     * @param vy  vertical
     */
	void
	setMouseMove(double vx,
				 double vy);

	/**
     * @brief Return displacement to use with function increaseControlPoints
     * @param stroke to test
     * @param w stroke parameter 
     * @return displacement to apply to obtain deformation
     * @sa increaseControlPoints
     */
	TThickPoint
	getDisplacement(const TStroke &stroke,
					double w) const;

	/**
     * @brief Return displacement to use with function  modifyControlPoints
     * @param stroke to test
     * @param n control point to get
     * @return displacement to apply to obtain deformation
     * @sa modifyControlPoints
     */
	TThickPoint
	getDisplacementForControlPoint(const TStroke &stroke,
								   UINT n) const;
	TThickPoint
	getDisplacementForControlPointLen(const TStroke &stroke,
									  double cpLen) const;

	/**    
     * @brief This method compute the delta (gradient) referred to stroke in
     *        at parameter w.
     *
     *  This value is the result of \f$ \frac{getDisplacement(stroke,w)}{dw} \f$.
     * @note Sometimes this value can be approximated.
     * @param stroke Stroke to test
     * @param w Stroke parameter
     * @return the @b gradient in w
     */
	double
	getDelta(const TStroke &stroke,
			 double w) const;

	/**
     * @brief Max diff of delta (This value indicates when it's necessary
     *   to insert control point)
     * @return max displacement permitted
     */
	double
	getMaxDiff() const;

	// just for debug
	const Potential *
	getPotential() const
	{
		return pot_;
	}

	/**
     * @brief Change sensibility of deformer (just for debug).
     */
	void
	setDiff(double diff)
	{
		diff_ = diff;
	}

	/**
     * @brief Retrieve the parameters range where is applied deformation.
     */
	void
	getRange(double &from,
			 double &to);

private:
	StrokeParametricDeformer(const StrokeParametricDeformer &);
	StrokeParametricDeformer &operator=(const StrokeParametricDeformer &);

	// mouse incremental movement
	double vx_, vy_;

	// parameter where is applicated action
	double startParameter_;

	// like startParameter_ but recover lenght
	double startLenght_;

	// how many traits move
	double actionLenght_;

	// deformation shape
	Potential *pot_;

	// sensibility of deformer
	// Indica il valore minimo a partire dal quale
	//  l'inseritore comincia a mettere punti di controllo
	double diff_;

	TStroke *ref_copy_;
};
}

#if defined(_WIN32) && (_MSC_VER <= 1200)
#pragma warning(pop)
#endif

#endif /* STROKE_PARAMETRIC_DEFORMER_H */
//-----------------------------------------------------------------------------
//  End Of File
//-----------------------------------------------------------------------------