tahoma2d/toonz/sources/tnzext/StraightCornerDeformation.cpp
Toshihiro Shimizu 890dddabbd first commit
2016-03-19 02:57:51 +09:00

141 lines
3.3 KiB
C++

#ifdef _DEBUG
#define _STLP_DEBUG 1
#endif
#include "ext/StraightCornerDeformation.h"
#include "ext/StrokeDeformation.h"
#include "ext/LinearPotential.h"
//#include "ext/StrokeParametricDeformer.h"
//#include "ext/NotSimmetricBezierPotential.h"
#include "ext/ContextStatus.h"
#include "ext/Designer.h"
//#include "ext/TriParam.h"
#include "ext/ExtUtil.h"
#include "DeformationSelector.h"
//#include <tcurves.h>
//#include <tstrokeutil.h>
#include <algorithm>
#include <iterator>
#include <vector>
#include <tstroke.h>
using namespace ToonzExt;
REGISTER(StraightCornerDeformation, 3);
//-----------------------------------------------------------------------------
StraightCornerDeformation::StraightCornerDeformation()
{
setPotential(new LinearPotential);
shortcutKey_ = ContextStatus::CTRL;
}
//-----------------------------------------------------------------------------
StraightCornerDeformation::~StraightCornerDeformation()
{
}
//-----------------------------------------------------------------------------
bool StraightCornerDeformation::findExtremes_(const ContextStatus *status,
Interval &ret)
{
bool
found = ToonzExt::findNearestStraightCorners(status->stroke2change_,
status->w_,
ret,
&this->getStraightsList());
// it is not a forced solution
if ((status->key_event_ != shortcutKey_) &&
found)
return found;
else {
// it is forced then probably i want to find
found = ToonzExt::findNearestSpireCorners(status->stroke2change_,
status->w_,
ret,
status->cornerSize_,
&this->getSpiresList());
}
return found;
}
//-----------------------------------------------------------------------------
void StraightCornerDeformation::draw(Designer *designer)
{
StrokeDeformationImpl::draw(0);
designer->draw(this);
}
//-----------------------------------------------------------------------------
bool StraightCornerDeformation::check_(const ContextStatus *status)
{
assert(status && "Not status available");
TStroke *s = status->stroke2change_;
double
w = status->w_;
// check extremes in another way.
if (!s->isSelfLoop() &&
areAlmostEqual(w, 0.0) ||
areAlmostEqual(w, 1.0)) {
return isAStraightCorner(s,
w,
&this->getStraightsList());
}
ToonzExt::Interval
ret;
if (ToonzExt::findNearestStraightCorners(status->stroke2change_,
status->w_,
ret,
&this->getStraightsList()) &&
isAStraightCorner(s,
w,
&this->getStraightsList())) {
if (ret.first > ret.second) {
assert(s->isSelfLoop());
if ((ret.first < w &&
w <= 1.0) ||
(0.0 <= w &&
w < ret.second))
return true;
} else {
if (ret.first < w &&
w < ret.second)
return true;
}
}
return false;
}
//-----------------------------------------------------------------------------
double
StraightCornerDeformation::findActionLength()
{
return stroke2manipulate_->getLength();
}
//-----------------------------------------------------------------------------
StraightCornerDeformation *
StraightCornerDeformation::instance()
{
static StraightCornerDeformation singleton;
return &singleton;
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------