diff --git a/toonz/sources/include/tools/inputmanager.h b/toonz/sources/include/tools/inputmanager.h index 3f6f51a..f3e9548 100644 --- a/toonz/sources/include/tools/inputmanager.h +++ b/toonz/sources/include/tools/inputmanager.h @@ -247,8 +247,7 @@ public: virtual void inputInvalidateRect(const TRectD &bounds) { } - virtual TAffine toWorld() { return TAffine(); }; - virtual TTool* getTool() { return nullptr; }; + virtual TTool* inputGetTool() { return nullptr; }; }; diff --git a/toonz/sources/include/tools/modifiers/modifierassistants.h b/toonz/sources/include/tools/modifiers/modifierassistants.h index e0f8a76..9de8d00 100644 --- a/toonz/sources/include/tools/modifiers/modifierassistants.h +++ b/toonz/sources/include/tools/modifiers/modifierassistants.h @@ -36,21 +36,28 @@ public: TTrackPoint calcPoint(double originalIndex) override; }; +private: + bool scanAssistants( + const TPointD *positions, + int positionsCount, + TGuidelineList *outGuidelines, + bool draw ) const; + public: + const bool drawOnly; const double sensitiveLength; - TModifierAssistants(); - - void findGuidelines( - const TPointD &position, - TGuidelineList &outGuidelines ) const; + explicit TModifierAssistants(bool drawOnly = false); void modifyTrack( const TTrack &track, const TInputSavePoint::Holder &savePoint, TTrackList &outTracks ) override; - void drawHover(const TPointD &hover) override; - void drawTrack(const TTrack &track) override; + + TRectD calcDrawBounds(const TTrackList &tracks, const THoverList &hovers) override; + + void drawTrack(const TTrack &track) override; + void draw(const TTrackList &tracks, const THoverList &hovers) override; }; diff --git a/toonz/sources/tnztools/assistant.cpp b/toonz/sources/tnztools/assistant.cpp index 8e33f1d..f245002 100644 --- a/toonz/sources/tnztools/assistant.cpp +++ b/toonz/sources/tnztools/assistant.cpp @@ -42,7 +42,7 @@ TGuideline::calcTrackWeight(const TTrack &track, const TAffine &toScreen, bool & const double snapLenght = 20.0; const double snapScale = 1.0; - const double maxLength = 20.0*snapLenght*snapScale; + const double maxLength = 2.0*snapLenght*snapScale; double sumWeight = 0.0; double sumLength = 0.0; @@ -225,7 +225,7 @@ TAssistant::drawSegment(const TPointD &p0, const TPointD &p1, double pixelSize) TPointD d = p1 - p0; double k = norm2(d); if (k > TConsts::epsilon*TConsts::epsilon) { - double k = 0.5*pixelSize/sqrt(k); + k = 0.5*pixelSize/sqrt(k); d = TPointD(-k*d.y, k*d.x); glColor4dv(colorWhite); tglDrawSegment(p0 - d, p1 - d); diff --git a/toonz/sources/tnztools/assistants/guidelineline.cpp b/toonz/sources/tnztools/assistants/guidelineline.cpp index 55287df..26c2c0d 100644 --- a/toonz/sources/tnztools/assistants/guidelineline.cpp +++ b/toonz/sources/tnztools/assistants/guidelineline.cpp @@ -17,7 +17,7 @@ TPointD TGuidelineLineBase::calcDirection(const TPointD &p0, const TPointD &p1) { TPointD d = p1 - p0; double k = norm2(d); - return k > TConsts::epsilon ? d*(1.0/k) : TPointD(); + return k > TConsts::epsilon*TConsts::epsilon ? d*(1.0/sqrt(k)) : TPointD(); } void diff --git a/toonz/sources/tnztools/editassistantstool.cpp b/toonz/sources/tnztools/editassistantstool.cpp index 4cef33a..68bb9a6 100644 --- a/toonz/sources/tnztools/editassistantstool.cpp +++ b/toonz/sources/tnztools/editassistantstool.cpp @@ -119,13 +119,10 @@ public: m_currentPointIndex(-1) { bind(MetaImage); - m_prop.add(&m_assistantType); + m_prop.bind(m_assistantType); updateTranslation(); } - ~EditAssistantsTool() - { m_prop.clear(); } - ToolType getToolType() const override { return TTool::LevelWriteTool; } int getCursorId() const override diff --git a/toonz/sources/tnztools/fullcolorbrushtool.cpp b/toonz/sources/tnztools/fullcolorbrushtool.cpp index de714ce..ff80a93 100644 --- a/toonz/sources/tnztools/fullcolorbrushtool.cpp +++ b/toonz/sources/tnztools/fullcolorbrushtool.cpp @@ -137,7 +137,8 @@ FullColorBrushTool::FullColorBrushTool(std::string name) m_inputmanager.setHandler(this); m_modifierTest = new TModifierTest(); m_modifierTangents = new TModifierTangents(); - m_modifierSegmentation = new TModifierSegmentation(); + m_modifierAssistants = new TModifierAssistants(); + m_modifierSegmentation = new TModifierSegmentation(0.25); m_thickness.setNonLinearSlider(); @@ -296,6 +297,7 @@ bool FullColorBrushTool::preLeftButtonDown() { m_inputmanager.clearModifiers(); m_inputmanager.addModifier( TInputModifierP(m_modifierTangents.getPointer()) ); m_inputmanager.addModifier( TInputModifierP(m_modifierSegmentation.getPointer()) ); + m_inputmanager.addModifier( TInputModifierP(m_modifierAssistants.getPointer()) ); m_inputmanager.addModifier( TInputModifierP(m_modifierTest.getPointer()) ); touchImage(); diff --git a/toonz/sources/tnztools/fullcolorbrushtool.h b/toonz/sources/tnztools/fullcolorbrushtool.h index b3d6b63..67dd22d 100644 --- a/toonz/sources/tnztools/fullcolorbrushtool.h +++ b/toonz/sources/tnztools/fullcolorbrushtool.h @@ -8,6 +8,7 @@ #include <tools/inputmanager.h> #include <tools/modifiers/modifiertest.h> #include <tools/modifiers/modifiertangents.h> +#include <tools/modifiers/modifierassistants.h> #include <tools/modifiers/modifiersegmentation.h> #include "toonzrasterbrushtool.h" @@ -67,6 +68,7 @@ public: void inputLeftButtonUp(const TTrackPoint &point, const TTrack &track) override; void inputMouseMove(const TPointD &position, const TInputState &state) override; void inputInvalidateRect(const TRectD &bounds) override; + TTool* inputGetTool() override { return this; }; void draw() override; @@ -102,6 +104,7 @@ protected: TInputManager m_inputmanager; TSmartPointerT<TModifierTest> m_modifierTest; TSmartPointerT<TModifierTangents> m_modifierTangents; + TSmartPointerT<TModifierAssistants> m_modifierAssistants; TSmartPointerT<TModifierSegmentation> m_modifierSegmentation; TPropertyGroup m_prop; diff --git a/toonz/sources/tnztools/inputmanager.cpp b/toonz/sources/tnztools/inputmanager.cpp index b65a2f5..3930177 100644 --- a/toonz/sources/tnztools/inputmanager.cpp +++ b/toonz/sources/tnztools/inputmanager.cpp @@ -330,6 +330,12 @@ TInputManager::paintTracks() { newSavePoint.savePoint()->available = false; if (allFinished) { paintApply((int)m_savePoints.size(), subTracks); + // send to tool final + if (!subTracks.empty()) { + m_handler->inputPaintTracks(subTracks); + for(TTrackList::const_iterator i = subTracks.begin(); i != subTracks.end(); ++i) + (*i)->resetChanges(); + } for(std::vector<TTrackList>::iterator i = m_tracks.begin(); i != m_tracks.end(); ++i) i->clear(); if (m_handler) m_handler->inputSetBusy(false); @@ -613,7 +619,12 @@ TInputManager::hoverEvent(const THoverList &hovers) { m_hovers[i+1].clear(); m_modifiers[i]->modifyHovers(m_hovers[i], m_hovers[i+1]); } - if (m_handler) m_handler->inputHoverEvent(*this); + if (m_handler) { + TRectD bounds = calcDrawBounds(); + if (!bounds.isEmpty()) + m_handler->inputInvalidateRect(bounds); + m_handler->inputHoverEvent(*this); + } } @@ -637,7 +648,7 @@ TInputManager::calcDrawBounds() { } if (!bounds.isEmpty()) - bounds.enlarge(2.0); + bounds.enlarge(4.0); return bounds; } diff --git a/toonz/sources/tnztools/modifiers/modifierassistants.cpp b/toonz/sources/tnztools/modifiers/modifierassistants.cpp index fb0af74..60001dd 100644 --- a/toonz/sources/tnztools/modifiers/modifierassistants.cpp +++ b/toonz/sources/tnztools/modifiers/modifierassistants.cpp @@ -14,6 +14,7 @@ #include <toonz/tobjecthandle.h> // TnzCore includes +#include <tgl.h> #include <tmetaimage.h> @@ -40,21 +41,31 @@ TModifierAssistants::Modifier::calcPoint(double originalIndex) { //***************************************************************************************** -TModifierAssistants::TModifierAssistants(): +TModifierAssistants::TModifierAssistants(bool drawOnly): + drawOnly(drawOnly), sensitiveLength(50.0) { } -void -TModifierAssistants::findGuidelines(const TPointD &position, TGuidelineList &outGuidelines) const { +bool +TModifierAssistants::scanAssistants( + const TPointD *positions, + int positionsCount, + TGuidelineList *outGuidelines, + bool draw ) const +{ + bool found = false; if (TInputManager *manager = getManager()) if (TInputHandler *handler = manager->getHandler()) - if (TTool *tool = handler->getTool()) + if (TTool *tool = handler->inputGetTool()) if (TToolViewer *viewer = tool->getViewer()) if (TApplication *application = tool->getApplication()) if (TFrameHandle *frameHandle = application->getCurrentFrame()) if (TXsheetHandle *XsheetHandle = application->getCurrentXsheet()) if (TXsheet *Xsheet = XsheetHandle->getXsheet()) { + bool findGuidelines = (positions && positionsCount > 0 && outGuidelines); + bool doSomething = findGuidelines || draw; + int frame = frameHandle->getFrame(); int count = Xsheet->getColumnCount(); TAffine worldToTrack = viewer->getViewMatrix(); @@ -66,14 +77,25 @@ TModifierAssistants::findGuidelines(const TPointD &position, TGuidelineList &out { TAffine imageToTrack = tool->getColumnMatrix(i) * worldToTrack; - TMetaImage::Reader reader(*metaImage); + if (draw) { glPushMatrix(); tglMultMatrix(imageToTrack); } + TMetaImage::Reader reader(*metaImage); for(TMetaObjectRefList::const_iterator i = reader->begin(); i != reader->end(); ++i) if (*i) if (const TAssistant *assistant = (*i)->getHandler<TAssistant>()) - assistant->getGuidelines(position, imageToTrack, outGuidelines); + { + found = true; + if (findGuidelines) + for(int i = 0; i < positionsCount; ++i) + assistant->getGuidelines(positions[i], imageToTrack, *outGuidelines); + if (draw) assistant->draw(viewer); + if (!doSomething) return true; + } + + if (draw) glPopMatrix(); } } + return found; } @@ -86,7 +108,8 @@ TModifierAssistants::modifyTrack( if (!track.handler) { track.handler = new TTrackHandler(track); Modifier *modifier = new Modifier(*track.handler); - findGuidelines(track[0].position, modifier->guidelines); + if (!drawOnly) + scanAssistants(&track[0].position, 1, &modifier->guidelines, false); track.handler->tracks.push_back(new TTrack(modifier)); @@ -110,7 +133,7 @@ TModifierAssistants::modifyTrack( bool longEnough = false; if (TInputManager *manager = getManager()) if (TInputHandler *handler = manager->getHandler()) - if (TTool *tool = handler->getTool()) + if (TTool *tool = handler->inputGetTool()) if (TToolViewer *viewer = tool->getViewer()) { TAffine trackToScreen = tool->getMatrix(); if (tool->getToolType() & TTool::LevelTool) @@ -118,7 +141,6 @@ TModifierAssistants::modifyTrack( if (!objHandle->isSpline()) trackToScreen *= TScale(viewer->getDpiScale().x, viewer->getDpiScale().y); trackToScreen *= viewer->get3dViewMatrix().get2d().inv(); - TGuidelineP guideline = TGuideline::findBest(modifier->guidelines, track, trackToScreen, longEnough); if (guideline != modifier->guidelines.front()) for(int i = 1; i < (int)modifier->guidelines.size(); ++i) @@ -142,12 +164,11 @@ TModifierAssistants::modifyTrack( } -void -TModifierAssistants::drawHover(const TPointD &hover) { - TGuidelineList guidelines; - findGuidelines(hover, guidelines); - for(TGuidelineList::const_iterator i = guidelines.begin(); i != guidelines.end(); ++i) - (*i)->draw(); +TRectD +TModifierAssistants::calcDrawBounds(const TTrackList&, const THoverList&) { + if (scanAssistants(NULL, 0, NULL, false)) + return TConsts::infiniteRectD; + return TRectD(); } @@ -164,3 +185,29 @@ TModifierAssistants::drawTrack(const TTrack &track) { } } } + + +void +TModifierAssistants::draw(const TTrackList &tracks, const THoverList &hovers) { + THoverList allHovers; + allHovers.reserve(hovers.size() + tracks.size()); + allHovers.insert(allHovers.end(), hovers.begin(), hovers.end()); + for(TTrackList::const_iterator i = tracks.begin(); i != tracks.end(); ++i) + if ((*i)->handler && !(*i)->handler->tracks.empty() && !(*i)->handler->tracks.front()->empty()) + allHovers.push_back( (*i)->handler->tracks.front()->back().position ); + + // draw assistants + TGuidelineList guidelines; + scanAssistants( + allHovers.empty() ? NULL : &allHovers.front(), + (int)allHovers.size(), + &guidelines, + true ); + + // draw guidelines + for(TGuidelineList::const_iterator i = guidelines.begin(); i != guidelines.end(); ++i) + (*i)->draw(); + + // draw tracks + TInputModifier::drawTracks(tracks); +} diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index f65e6e7..a7cfaa1 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -2247,11 +2247,10 @@ TRect SceneViewer::getActualClipRect(const TAffine &aff) { else if (m_clipRect.isEmpty()) clipRect -= TPointD(viewerSize.lx / 2, viewerSize.ly / 2); else { - TRectD app = aff * (m_clipRect.enlarge(3)); - clipRect = - TRectD(tceil(app.x0), tceil(app.y0), tfloor(app.x1), tfloor(app.y1)); + clipRect = aff * (m_clipRect.enlarge(3)); } + clipRect *= TRectD(viewerSize) - TPointD(viewerSize.lx/2, viewerSize.ly/2); return convert(clipRect); }