#pragma once
#ifndef STROKEDEFORMATION_IMPL_H
#define STROKEDEFORMATION_IMPL_H
/**
* @author Fabrizio Morciano <fabrizio.morciano@gmail.com>
*/
#include "ext/StrokeDeformation.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 "ExtUtil.h"
#if defined(_WIN32) && (_MSC_VER <= 1200)
// to avoid annoying warning
#pragma warning(push)
#pragma warning(disable : 4251)
#endif
namespace ToonzExt
{
class DVAPI
StrokeDeformationImpl
{
private:
bool
init(const ContextStatus *);
bool
computeStroke2Transform(const ContextStatus *s,
TStroke *&stroke2transform,
double &w,
ToonzExt::Interval &extremes);
ToonzExt::Potential
*potential_;
static TStroke *
copyOfLastSelectedStroke_; // deep copy stroke selected previously
int
cursorId_;
protected:
TStroke
*stroke2manipulate_;
static TStroke *&
getLastSelectedStroke();
static void
setLastSelectedStroke(TStroke *);
static int &
getLastSelectedDegree();
static void
setLastSelectedDegree(int degree);
static ToonzExt::Intervals &
getSpiresList();
static ToonzExt::Intervals &
getStraightsList();
ToonzExt::StrokeParametricDeformer
*deformer_;
int
shortcutKey_;
double
old_w0_;
TPointD
old_w0_pos_;
// ref to simplify access
std::vector<TStroke *>
strokes_;
StrokeDeformationImpl();
/**
* Is this the correct deformation?
*/
virtual bool
check_(const ContextStatus *) = 0;
/**
* Retrieve the nearest extremes to point selected.
*/
virtual bool
findExtremes_(const ContextStatus *,
Interval &) = 0;
virtual double
findActionLength() = 0;
public:
virtual ~StrokeDeformationImpl();
ToonzExt::Interval
getExtremes();
static const ContextStatus *&
getImplStatus();
const TStroke *
getStrokeSelected() const
{
if (getImplStatus())
return this->getImplStatus()->stroke2change_;
return 0;
}
const TStroke *
getCopiedStroke() const
{
return this->getStrokeSelected();
}
/**
* Wrapper for activate.
*/
virtual bool
activate_impl(const ContextStatus *);
/**
* Modify stroke.
*/
virtual void
update_impl(const TPointD &delta);
/**
* Reduce control points and change stroke.
*/
virtual TStroke *
deactivate_impl();
bool
check(const ContextStatus *);
/**
* Restore last good status.
*/
virtual void
reset();
void
setPotential(Potential *);
/**
* Apply a designer on current deformation.
*/
virtual void
draw(Designer *);
TStroke *
getTransformedStroke();
ToonzExt::Potential *
getPotential();
TPointD &
oldW0();
int
getShortcutKey() const
{
return shortcutKey_;
}
int
getCursorId() const
{
return cursorId_;
}
void
setCursorId(int id)
{
cursorId_ = id;
}
};
}
#if defined(_WIN32) && (_MSC_VER <= 1200)
#pragma warning(pop)
#endif
#endif /* STROKEDEFORMATION_IMPL_H */
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------