diff --git a/toonz/sources/include/tools/assistant.h b/toonz/sources/include/tools/assistant.h index 5f88920..c908f7d 100644 --- a/toonz/sources/include/tools/assistant.h +++ b/toonz/sources/include/tools/assistant.h @@ -57,8 +57,13 @@ typedef std::vector<TAssistantPoint> TAssistantPointList; class DVAPI TGuideline : public TSmartObject { public: + const double magnetism; + TGuideline(double magnetism): magnetism(magnetism) { } + virtual TTrackPoint transformPoint(const TTrackPoint &point) const { return point; } + TTrackPoint smoothTransformPoint(const TTrackPoint &point, double magnetism = 1.0) const + { return TTrack::interpolationLinear(point, transformPoint(point), magnetism*this->magnetism); } virtual void draw(bool active) const { } void draw() const diff --git a/toonz/sources/include/tools/modifiers/modifierassistants.h b/toonz/sources/include/tools/modifiers/modifierassistants.h index 71bb3bb..8a4fc3d 100644 --- a/toonz/sources/include/tools/modifiers/modifierassistants.h +++ b/toonz/sources/include/tools/modifiers/modifierassistants.h @@ -41,7 +41,8 @@ private: const TPointD *positions, int positionsCount, TGuidelineList *outGuidelines, - bool draw ) const; + bool draw, + bool enabledOnly ) const; public: const bool drawOnly; diff --git a/toonz/sources/tnztools/assistants/assistantvanishingpoint.cpp b/toonz/sources/tnztools/assistants/assistantvanishingpoint.cpp index 2d5fb4b..bae4abf 100644 --- a/toonz/sources/tnztools/assistants/assistantvanishingpoint.cpp +++ b/toonz/sources/tnztools/assistants/assistantvanishingpoint.cpp @@ -33,6 +33,7 @@ public: { outGuidelines.push_back(TGuidelineP( new TGuidelineInfiniteLine( + getMagnetism(), toTool*m_points.front().position, position ))); } diff --git a/toonz/sources/tnztools/assistants/guidelineline.cpp b/toonz/sources/tnztools/assistants/guidelineline.cpp index 26c2c0d..fe18b80 100644 --- a/toonz/sources/tnztools/assistants/guidelineline.cpp +++ b/toonz/sources/tnztools/assistants/guidelineline.cpp @@ -10,8 +10,8 @@ // TGuidelineLineBase implementation //***************************************************************************************** -TGuidelineLineBase::TGuidelineLineBase(const TPointD &p0, const TPointD &p1): - p0(p0), p1(p1) { } +TGuidelineLineBase::TGuidelineLineBase(double magnetism, const TPointD &p0, const TPointD &p1): + TGuideline(magnetism), p0(p0), p1(p1) { } TPointD TGuidelineLineBase::calcDirection(const TPointD &p0, const TPointD &p1) { @@ -60,8 +60,8 @@ TGuidelineLineBase::drawInliniteLine(const TPointD &p0, const TPointD &p1, bool // TGuidelineLine implementation //***************************************************************************************** -TGuidelineLine::TGuidelineLine(const TPointD &p0, const TPointD &p1): - TGuidelineLineBase(p0, p1), +TGuidelineLine::TGuidelineLine(double magnetism, const TPointD &p0, const TPointD &p1): + TGuidelineLineBase(magnetism, p0, p1), dir(calcDirection(p0, p1)), dist(norm(p1 - p0)) { } @@ -81,8 +81,8 @@ TGuidelineLine::draw(bool active) const // TGuidelineInfiniteLine implementation //***************************************************************************************** -TGuidelineInfiniteLine::TGuidelineInfiniteLine(const TPointD &p0, const TPointD &p1): - TGuidelineLineBase(p0, p1), +TGuidelineInfiniteLine::TGuidelineInfiniteLine(double magnetism, const TPointD &p0, const TPointD &p1): + TGuidelineLineBase(magnetism, p0, p1), dir(calcDirection(p0, p1)) { } TTrackPoint @@ -101,8 +101,8 @@ TGuidelineInfiniteLine::draw(bool active) const // TGuidelineRay implementation //***************************************************************************************** -TGuidelineRay::TGuidelineRay(const TPointD &p0, const TPointD &p1): - TGuidelineLineBase(p0, p1), +TGuidelineRay::TGuidelineRay(double magnetism, const TPointD &p0, const TPointD &p1): + TGuidelineLineBase(magnetism, p0, p1), dir(calcDirection(p0, p1)) { } TTrackPoint diff --git a/toonz/sources/tnztools/assistants/guidelineline.h b/toonz/sources/tnztools/assistants/guidelineline.h index f283940..6719453 100644 --- a/toonz/sources/tnztools/assistants/guidelineline.h +++ b/toonz/sources/tnztools/assistants/guidelineline.h @@ -31,7 +31,7 @@ public: const TPointD p0; const TPointD p1; - TGuidelineLineBase(const TPointD &p0, const TPointD &p1); + TGuidelineLineBase(double magnetism, const TPointD &p0, const TPointD &p1); void drawInliniteLine(const TPointD &p0, const TPointD &p1, bool ray, bool active) const; static TPointD calcDirection(const TPointD &p0, const TPointD &p1); static void truncateInfiniteLine(const TRectD &bounds, TPointD &p0, TPointD &p1); @@ -47,7 +47,7 @@ public: const TPointD dir; const double dist; - TGuidelineLine(const TPointD &p0, const TPointD &p1); + TGuidelineLine(double magnetism, const TPointD &p0, const TPointD &p1); TTrackPoint transformPoint(const TTrackPoint &point) const override; void draw(bool active) const override; }; @@ -61,7 +61,7 @@ class DVAPI TGuidelineInfiniteLine : public TGuidelineLineBase { public: const TPointD dir; - TGuidelineInfiniteLine(const TPointD &p0, const TPointD &p1); + TGuidelineInfiniteLine(double magnetism, const TPointD &p0, const TPointD &p1); TTrackPoint transformPoint(const TTrackPoint &point) const override; void draw(bool active) const override; }; @@ -75,7 +75,7 @@ class DVAPI TGuidelineRay : public TGuidelineLineBase { public: const TPointD dir; - TGuidelineRay(const TPointD &p0, const TPointD &p1); + TGuidelineRay(double magnetism, const TPointD &p0, const TPointD &p1); TTrackPoint transformPoint(const TTrackPoint &point) const override; void draw(bool active) const override; }; diff --git a/toonz/sources/tnztools/modifiers/modifierassistants.cpp b/toonz/sources/tnztools/modifiers/modifierassistants.cpp index 03a71c0..0658dc8 100644 --- a/toonz/sources/tnztools/modifiers/modifierassistants.cpp +++ b/toonz/sources/tnztools/modifiers/modifierassistants.cpp @@ -33,7 +33,7 @@ TModifierAssistants::Modifier::Modifier(TTrackHandler &handler): TTrackPoint TModifierAssistants::Modifier::calcPoint(double originalIndex) { TTrackPoint p = TTrackModifier::calcPoint(originalIndex); - return guidelines.empty() ? p : guidelines.front()->transformPoint(p); + return guidelines.empty() ? p : guidelines.front()->smoothTransformPoint(p); } @@ -52,7 +52,8 @@ TModifierAssistants::scanAssistants( const TPointD *positions, int positionsCount, TGuidelineList *outGuidelines, - bool draw ) const + bool draw, + bool enabledOnly ) const { bool found = false; if (TInputManager *manager = getManager()) @@ -89,6 +90,7 @@ TModifierAssistants::scanAssistants( for(TMetaObjectListCW::iterator i = reader->begin(); i != reader->end(); ++i) if (*i) if (const TAssistant *assistant = (*i)->getHandler<TAssistant>()) + if (!enabledOnly || assistant->getEnabled()) { found = true; if (findGuidelines) @@ -115,7 +117,7 @@ TModifierAssistants::modifyTrack( track.handler = new TTrackHandler(track); Modifier *modifier = new Modifier(*track.handler); if (!drawOnly) - scanAssistants(&track[0].position, 1, &modifier->guidelines, false); + scanAssistants(&track[0].position, 1, &modifier->guidelines, false, true); track.handler->tracks.push_back(new TTrack(modifier)); @@ -172,7 +174,7 @@ TModifierAssistants::modifyTrack( TRectD TModifierAssistants::calcDrawBounds(const TTrackList&, const THoverList&) { - if (scanAssistants(NULL, 0, NULL, false)) + if (scanAssistants(NULL, 0, NULL, false, false)) return TConsts::infiniteRectD; return TRectD(); } @@ -208,7 +210,8 @@ TModifierAssistants::draw(const TTrackList &tracks, const THoverList &hovers) { allHovers.empty() ? NULL : &allHovers.front(), (int)allHovers.size(), &guidelines, - true ); + true, + false ); // draw guidelines for(TGuidelineList::const_iterator i = guidelines.begin(); i != guidelines.end(); ++i)