Blob Blame Raw


#ifndef STROKE_DEFORMATION_H
#define STROKE_DEFORMATION_H

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

#include "tcommon.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

#include "tgeometry.h"
//#include "ext/TriParam.h"
#include "ext/Types.h"
#include "ext/ContextStatus.h"

#include <vector>

// forward declarations

class TStroke;

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

namespace ToonzExt
{
class Designer;
class Potential;
class StrokeParametricDeformer;
class StrokeDeformationImpl;

//===========================================================================

/**
   * @brief This class is the interface for manipulation 
   *        algorihms.
   *
   * StrokeDeformation is a wrapper for for StrokeDeformationImpl,
   * its function is to verify state and parameteres before 
   * to call the implementation methods of deformation.
   * 
   * There is an internal status to verify that actions:
   * @arg @c CREATED on constructor
   * @arg @c ACTIVE on active 
   * @arg @c UPDATING on updating
   * @arg @c DEACTIVE on deactive
   *
   * If some error of state occurs @c reset method is called.
   * ContextStatus contains information about deformation parameter,
   * and it occurs to reduce the number of parameters required.
   */
class DVAPI
	StrokeDeformation
{
private:
	StrokeDeformationImpl *
		deformationImpl_;

	/**
     * @brief Internal status.
     */
	enum StrokeDeformationState {
		CREATED,
		ACTIVE,
		UPDATING,
		DEACTIVE,
		RESETTED
	};

	StrokeDeformationState
		state_;

	/**
     * @brief Recover from an invalid state
     */
	void
	recover();

	/**
     * @brief Retrieve the current deformator.
     */
	StrokeDeformationImpl *
	retrieveDeformator(const ContextStatus *status);

public:
	StrokeDeformation();

	~StrokeDeformation();

	/**
     * @brief Init deformation and add control points.
     */
	void
	activate(const ContextStatus *);

	/**
     * @brief Modify stroke.
     */
	void
	update(const TPointD &delta);

	/**
     * @brief Return a stroke deformed.
     * @return A stroke deformed.
     */
	TStroke *
	deactivate();

	/**
     * @brief Clear inner status of Deformation.
     */
	void
	reset();

	/**
     * @brief Just select correct Deformation.
     */
	void
	check(const ContextStatus *);

	/**
     * @brief Apply a designer on current deformation.
     */
	void
	draw(Designer *);

	/**
     * @brief Retrieve valid extremes for current manipulator/deformator.
     */
	ToonzExt::Interval
	getExtremes() const;

	/**
     * @brief Return the stroke selected from user.
     */
	const TStroke *
	getStroke() const;

	/**
     * @brief Return the stroke selected from user.
     */
	const TStroke *
	getCopiedStroke() const;

	/**
     * @brief Return a reference to the stroke created to be manipulated.
     * @note This stroke is different from stroke selected by user.
     * @sa getStroke
     */
	const TStroke *
	getTransformedStroke() const;

	/**
     * @brief Return the internal status of current deformation.
     * @sa ContextStatus
     */
	const ContextStatus *
	getStatus() const;

	/**
     * @brief Retrieve cursor associated to current deformator.
     */
	int
	getCursorId() const;

#ifdef _DEBUG
	/**
     * @brief Return the potential used in implementation.
     * @note This is useful just for debug, please do not use directly.
     * @sa Potential
     */
	const Potential *
	getPotential() const;

	/**
     * @brief Return the potential used in implementation.
     * @note This is useful just for debug, please do not use directly.
     * @sa Potential
     */
	const StrokeDeformationImpl *
	getDeformationImpl() const;
#endif
};
}

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

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