| |
| |
|
|
| |
| |
| #ifdef _DEBUG |
| #define _STLP_DEBUG 1 |
| #endif |
| |
| #include "ext/StrokeDeformation.h" |
| #include "ext/SquarePotential.h" |
| #include "ext/StrokeParametricDeformer.h" |
| #include "ext/NotSymmetricBezierPotential.h" |
| #include "ext/SmoothDeformation.h" |
| #include "ext/ContextStatus.h" |
| #include "ext/Designer.h" |
| |
| |
| #include "ext/StraightCornerDeformation.h" |
| #include "ext/CornerDeformation.h" |
| #include "ext/SmoothDeformation.h" |
| |
| #include "ext/StrokeDeformationImpl.h" |
| #include "DeformationSelector.h" |
| |
| #include <tcurves.h> |
| #include <tstrokeutil.h> |
| #include <tmathutil.h> |
| |
| #include <algorithm> |
| #include <iterator> |
| #include <vector> |
| |
| #include "tthreadmessage.h" |
| |
| using namespace ToonzExt; |
| using namespace std; |
| |
| |
| |
| |
| static TThread::Mutex s_mutex; |
| |
| |
| |
| StrokeDeformation::StrokeDeformation() { |
| state_ = CREATED; |
| deformationImpl_ = SmoothDeformation::instance(); |
| } |
| |
| |
| |
| StrokeDeformation::~StrokeDeformation() {} |
| |
| |
| |
| void StrokeDeformation::activate(const ContextStatus *status) { |
| QMutexLocker sl(&s_mutex); |
| |
| assert(status && "Status is null!!!"); |
| if (!status) return; |
| |
| if (state_ == RESETTED) delete this->deactivate(); |
| |
| if (state_ == CREATED || state_ == DEACTIVE) { |
| deformationImpl_ = this->retrieveDeformator(status); |
| } else { |
| |
| assert(deformationImpl_ && "Can not find a valid deformator!!!"); |
| if (!deformationImpl_) return; |
| deformationImpl_->reset(); |
| deformationImpl_ = DeformationSelector::instance()->getDeformation(status); |
| } |
| |
| assert(deformationImpl_ && "Deformation is null!!!"); |
| if (!deformationImpl_) return; |
| |
| if (!deformationImpl_->activate_impl(status)) { |
| deformationImpl_->reset(); |
| state_ = DEACTIVE; |
| return; |
| } |
| |
| state_ = ACTIVE; |
| } |
| |
| |
| |
| void StrokeDeformation::update(const TPointD &delta) { |
| QMutexLocker sl(&s_mutex); |
| |
| assert(deformationImpl_ && "Deformation is null!!!"); |
| if (!deformationImpl_) { |
| state_ = DEACTIVE; |
| return; |
| } |
| |
| if (state_ != ACTIVE && state_ != UPDATING) { |
| deformationImpl_->reset(); |
| state_ = ACTIVE; |
| return; |
| } |
| |
| deformationImpl_->update_impl(delta); |
| state_ = UPDATING; |
| } |
| |
| |
| |
| TStroke *StrokeDeformation::deactivate() { |
| QMutexLocker sl(&s_mutex); |
| |
| if (!deformationImpl_) { |
| state_ = DEACTIVE; |
| return 0; |
| } |
| |
| if (state_ != ACTIVE && state_ != UPDATING) { |
| state_ = DEACTIVE; |
| deformationImpl_->reset(); |
| return 0; |
| } |
| |
| state_ = DEACTIVE; |
| TStroke *out = deformationImpl_->deactivate_impl(); |
| deformationImpl_ = 0; |
| return out; |
| } |
| |
| |
| |
| void StrokeDeformation::reset() { |
| QMutexLocker sl(&s_mutex); |
| |
| state_ = RESETTED; |
| } |
| |
| |
| |
| void StrokeDeformation::draw(Designer *designer) { |
| QMutexLocker sl(&s_mutex); |
| |
| assert(designer && "Designer is null!!!"); |
| if (!deformationImpl_ || !designer) return; |
| |
| |
| deformationImpl_->draw(designer); |
| |
| |
| designer->draw(this); |
| } |
| |
| |
| |
| void StrokeDeformation::check(const ContextStatus *status) { |
| QMutexLocker sl(&s_mutex); |
| if (state_ != UPDATING) deformationImpl_ = this->retrieveDeformator(status); |
| } |
| |
| |
| |
| const TStroke *StrokeDeformation::getCopiedStroke() const { |
| QMutexLocker sl(&s_mutex); |
| if (deformationImpl_) return deformationImpl_->getCopiedStroke(); |
| return 0; |
| } |
| |
| |
| |
| const TStroke *StrokeDeformation::getStroke() const { |
| QMutexLocker sl(&s_mutex); |
| if (deformationImpl_) return deformationImpl_->getStrokeSelected(); |
| return 0; |
| } |
| |
| |
| |
| const TStroke *StrokeDeformation::getTransformedStroke() const { |
| QMutexLocker sl(&s_mutex); |
| if (deformationImpl_) return deformationImpl_->getTransformedStroke(); |
| return 0; |
| } |
| |
| |
| |
| void StrokeDeformation::recover() { |
| QMutexLocker sl(&s_mutex); |
| assert(deformationImpl_ && "Deformation is null!!!"); |
| if (!deformationImpl_) return; |
| |
| deformationImpl_->reset(); |
| |
| |
| |
| |
| |
| |
| |
| } |
| |
| |
| |
| const ContextStatus *StrokeDeformation::getStatus() const { |
| QMutexLocker sl(&s_mutex); |
| if (deformationImpl_) return deformationImpl_->getImplStatus(); |
| return 0; |
| } |
| |
| |
| |
| ToonzExt::Interval StrokeDeformation::getExtremes() const { |
| QMutexLocker sl(&s_mutex); |
| if (!deformationImpl_) return Interval(-1, -1); |
| return deformationImpl_->getExtremes(); |
| } |
| |
| |
| |
| StrokeDeformationImpl *StrokeDeformation::retrieveDeformator( |
| const ContextStatus *status) { |
| QMutexLocker sl(&s_mutex); |
| return DeformationSelector::instance()->getDeformation(status); |
| } |
| |
| |
| |
| int StrokeDeformation::getCursorId() const { |
| QMutexLocker sl(&s_mutex); |
| if (!deformationImpl_) return -1; |
| return deformationImpl_->getCursorId(); |
| } |
| |
| |
| |
| #ifdef _DEBUG |
| |
| const Potential *StrokeDeformation::getPotential() const { |
| assert(deformationImpl_ && "Deformation is null!!!"); |
| if (!deformationImpl_) return 0; |
| return deformationImpl_->getPotential(); |
| } |
| |
| |
| |
| const StrokeDeformationImpl *StrokeDeformation::getDeformationImpl() const { |
| return deformationImpl_; |
| } |
| #endif |
| |
| |
| |
| |
| |