| |
| |
| #ifdef _DEBUG |
| #define _STLP_DEBUG 1 |
| #endif |
| #include "ext/StraightCornerDeformation.h" |
| #include "ext/StrokeDeformation.h" |
| #include "ext/LinearPotential.h" |
| |
| |
| #include "ext/ContextStatus.h" |
| #include "ext/Designer.h" |
| |
| #include "ext/ExtUtil.h" |
| |
| #include "DeformationSelector.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()); |
| |
| if ((status->key_event_ != shortcutKey_) && |
| found) |
| return found; |
| else { |
| |
| 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_; |
| |
| |
| 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; |
| } |
| |
| |
| |
| |
| |