From 7c7225c00c491a133504e0ba5f5a9e5a675b1f4c Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: May 01 2023 08:50:49 +0000 Subject: #assistants: improve vanishing point --- diff --git a/toonz/sources/tnztools/assistant.cpp b/toonz/sources/tnztools/assistant.cpp index 84d2725..2756531 100644 --- a/toonz/sources/tnztools/assistant.cpp +++ b/toonz/sources/tnztools/assistant.cpp @@ -424,13 +424,13 @@ TAssistant::drawDot(const TPointD &p, double alpha) const { tglEnableBlending(); glColor4dv(colorWhite); - tglEnablePointSmooth(4.0); + tglEnablePointSmooth(6.0); glBegin(GL_POINTS); glVertex2d(p.x, p.y); glEnd(); glColor4dv(colorBlack); - tglEnablePointSmooth(2.0); + tglEnablePointSmooth(3.0); glBegin(GL_POINTS); glVertex2d(p.x, p.y); glEnd(); diff --git a/toonz/sources/tnztools/assistants/assistantvanishingpoint.cpp b/toonz/sources/tnztools/assistants/assistantvanishingpoint.cpp index 9eb7718..fb50040 100644 --- a/toonz/sources/tnztools/assistants/assistantvanishingpoint.cpp +++ b/toonz/sources/tnztools/assistants/assistantvanishingpoint.cpp @@ -29,9 +29,6 @@ protected: TAssistantPoint &m_grid0; TAssistantPoint &m_grid1; - int m_gridRays; //!< for simple grid only, not perspective - double m_gridRadiusPart; - public: TAssistantVanishingPoint(TMetaObject &object): TAssistant(object), @@ -39,14 +36,12 @@ public: m_idGrid("grid"), m_idPerspective("perspective"), m_center( addPoint("center", TAssistantPoint::CircleCross) ), - m_a0 ( addPoint("A0", TAssistantPoint::Circle, TPointD(-50.0, 0.0)) ), - m_a1 ( addPoint("A1", TAssistantPoint::Circle, TPointD(-75.0, 0.0)) ), - m_b0 ( addPoint("B0", TAssistantPoint::Circle, TPointD( 50.0, 0.0)) ), - m_b1 ( addPoint("B1", TAssistantPoint::Circle, TPointD( 75.0, 0.0)) ), - m_grid0 ( addPoint("grid0", TAssistantPoint::CircleDoubleDots, TPointD(-12.5,-25.0)) ), - m_grid1 ( addPoint("grid1", TAssistantPoint::CircleDots, TPointD( 12.5,-25.0)) ), - m_gridRays(), - m_gridRadiusPart() + m_a0 ( addPoint("a0", TAssistantPoint::Circle, TPointD(-50.0, 0.0)) ), + m_a1 ( addPoint("a1", TAssistantPoint::Circle, TPointD(-75.0, 0.0)) ), + m_b0 ( addPoint("b0", TAssistantPoint::Circle, TPointD( 50.0, 0.0)) ), + m_b1 ( addPoint("b1", TAssistantPoint::Circle, TPointD( 75.0, 0.0)) ), + m_grid0 ( addPoint("grid0", TAssistantPoint::CircleDoubleDots, TPointD( 0.0,-50.0)) ), + m_grid1 ( addPoint("grid1", TAssistantPoint::CircleDots, TPointD( 25.0,-50.0)) ) { addProperty( new TBoolProperty(m_idPassThrough.str(), getPassThrough()) ); addProperty( new TBoolProperty(m_idGrid.str(), getGrid()) ); @@ -127,31 +122,11 @@ private: m_grid1.position = m_grid0.position + dx*x + dy*y; } - void recalcGrid() { - const double minStep = 5.0; - - TPointD d0 = m_grid0.position - m_center.position; - TPointD d1 = m_grid1.position - m_center.position; - double l = norm(d0); - if (l <= TConsts::epsilon) return; - if (norm2(d1) <= TConsts::epsilon*TConsts::epsilon) return; - double a0 = atan(d0); - double a1 = atan(d1); - double da = fabs(a1 - a0); - if (da > M_PI) da = M_PI - da; - if (da < TConsts::epsilon) da = TConsts::epsilon; - double count = M_2PI/da; - m_gridRadiusPart = minStep/da/l; - m_gridRays = count < 1e6 && m_gridRadiusPart < 1.0 - ? (int)round(count) : 0; - } - public: void onFixPoints() override { fixSidePoint(m_a0, m_a1); fixSidePoint(m_b0, m_b1); fixCenter(); - recalcGrid(); } void onMovePoint(TAssistantPoint &point, const TPointD &position) override { @@ -187,8 +162,6 @@ public: if (&point != &m_grid1) { fixGrid1(previousCenter, m_grid0.position); } - - recalcGrid(); } void getGuidelines( @@ -214,7 +187,28 @@ public: } void drawSimpleGrid() const { - if (m_gridRays <= 0) return; + const double minStep = 5.0; + double alpha = getDrawingGridAlpha(); + const TPointD &p = m_center.position; + + // calculate rays count and step + TPointD d0 = m_grid0.position - p; + TPointD d1 = m_grid1.position - p; + TPointD dp = d0; + double l = norm(d0); + if (l <= TConsts::epsilon) return; + if (norm2(d1) <= TConsts::epsilon*TConsts::epsilon) return; + double a0 = atan(d0); + double a1 = atan(d1); + double da = fabs(a1 - a0); + if (da > M_PI) da = M_PI - da; + if (da < TConsts::epsilon) da = TConsts::epsilon; + double count = M_2PI/da; + if (count > 1e6) return; + double radiusPart = minStep/(da*l); + if (radiusPart > 1.0) return; + int raysCount = (int)round(count); + double step = M_2PI/(double)raysCount; // common data about viewport const TRectD oneBox(-1.0, -1.0, 1.0, 1.0); @@ -225,14 +219,7 @@ public: TAffine matrixInv = matrix.inv(); double pixelSize = sqrt(tglGetPixelSize2()); - // initial calculations - double alpha = getDrawingGridAlpha(); - const TPointD &p = m_center.position; - TPointD dp = m_grid0.position - p; - double step = M_2PI/(double)m_gridRays; - // calculate range - int raysCount = m_gridRays; if (!(matrixInv*oneBox).contains(p)) { TPointD corners[4] = { TPointD(oneBox.x0, oneBox.y0), @@ -265,9 +252,9 @@ public: double s = sin(step); double c = cos(step); for(int i = 0; i < raysCount; ++i) { - TPointD p0 = matrix*(p + dp*m_gridRadiusPart); + TPointD p0 = matrix*(p + dp*radiusPart); TPointD p1 = matrix*(p + dp); - if (TGuidelineLineBase::truncateInfiniteRay(oneBox, p0, p1)) + if (TGuidelineLineBase::truncateRay(oneBox, p0, p1)) drawSegment(matrixInv*p0, matrixInv*p1, pixelSize, alpha); dp = TPointD(c*dp.x - s*dp.y, s*dp.x + c*dp.y); } @@ -345,7 +332,7 @@ public: TPointD p = smallGrid0 + smallStep*x - center; TPointD p0 = matrix*(center + p); TPointD p1 = matrix*(center + p*2.0); - if (TGuidelineLineBase::truncateInfiniteRay(oneBox, p0, p1)) + if (TGuidelineLineBase::truncateRay(oneBox, p0, p1)) drawSegment(matrixInv*p0, matrixInv*p1, pixelSize, alpha); } diff --git a/toonz/sources/tnztools/assistants/guidelineline.cpp b/toonz/sources/tnztools/assistants/guidelineline.cpp index 5d47771..e3f3b50 100644 --- a/toonz/sources/tnztools/assistants/guidelineline.cpp +++ b/toonz/sources/tnztools/assistants/guidelineline.cpp @@ -58,7 +58,7 @@ TGuidelineLineBase::truncateInfiniteLine(const TRectD &bounds, TPointD &p0, TPoi if (bounds.isEmpty()) return false; TPointD d = p0 - p1; TDimensionD size = bounds.getSize(); - if (fabs(d.x)*(bounds.y1 - bounds.y0) > fabs(d.y)*(bounds.x1 - bounds.x0)) { + if (fabs(d.x)*size.ly > fabs(d.y)*size.lx) { // horizontal if (!fitX (p0.x, p0.y, p1.x, p1.y, bounds.x0, bounds.x1)) return false; if (!truncateX(p0.y, p0.x, p1.y, p1.x, bounds.y0, bounds.y1)) return false; @@ -71,19 +71,28 @@ TGuidelineLineBase::truncateInfiniteLine(const TRectD &bounds, TPointD &p0, TPoi } bool -TGuidelineLineBase::truncateInfiniteRay(const TRectD &bounds, TPointD &p0, TPointD &p1) { +TGuidelineLineBase::truncateRay(const TRectD &bounds, TPointD &p0, TPointD &p1) { if (bounds.isEmpty()) return false; TRectD b(bounds); - if (p0.x <= p1.x && b.x0 <= p0.x) b.x0 = p0.x; - if (p0.x > p1.x && b.x1 > p0.x) b.x1 = p0.x; - if (p0.y <= p1.y && b.y0 <= p0.y) b.y0 = p0.y; - if (p0.y > p1.y && b.y1 > p0.y) b.y1 = p0.y; + + if (p0.x <= p1.x) { if (b.x0 < p0.x) b.x0 = p0.x; } + else { if (b.x1 > p0.x) b.x1 = p0.x; } + if (p0.y <= p1.y) { if (b.y0 < p0.y) b.y0 = p0.y; } + else { if (b.y1 > p0.y) b.y1 = p0.y; } + + if (b.isEmpty()) return false; + return truncateInfiniteLine(b, p0, p1); +} + +bool +TGuidelineLineBase::truncateLine(const TRectD &bounds, TPointD &p0, TPointD &p1) { + TRectD b = bounds * boundingBox(p0, p1); if (b.isEmpty()) return false; return truncateInfiniteLine(b, p0, p1); } void -TGuidelineLineBase::drawInfiniteLine(const TPointD &p0, const TPointD &p1, bool ray, bool active, bool enabled) const { +TGuidelineLineBase::drawLine(const TPointD &p0, const TPointD &p1, bool restrict0, bool restrict1, bool active, bool enabled) const { TAffine4 modelview, projection; glGetDoublev(GL_MODELVIEW_MATRIX, modelview.a); glGetDoublev(GL_PROJECTION_MATRIX, projection.a); @@ -91,9 +100,11 @@ TGuidelineLineBase::drawInfiniteLine(const TPointD &p0, const TPointD &p1, bool TAffine matrix = (projection*modelview).get2d(); TPointD pp0 = matrix*p0; TPointD pp1 = matrix*p1; - if ( ray - ? !truncateInfiniteRay (TRectD(-1.0, -1.0, 1.0, 1.0), pp0, pp1) - : !truncateInfiniteLine(TRectD(-1.0, -1.0, 1.0, 1.0), pp0, pp1) ) return; + const TRectD oneBox(-1.0, -1.0, 1.0, 1.0); + if ( restrict0 && restrict1 ? !truncateLine(oneBox, pp0, pp1) + : restrict0 ? !truncateRay (oneBox, pp0, pp1) + : restrict1 ? !truncateRay (oneBox, pp1, pp0) // pp1 first + : !truncateInfiniteLine(oneBox, pp0, pp1) ) return; double pixelSize = sqrt(tglGetPixelSize2()); TAffine matrixInv = matrix.inv(); @@ -119,7 +130,7 @@ TGuidelineLine::transformPoint(const TTrackPoint &point) const { void TGuidelineLine::draw(bool active, bool enabled) const - { drawSegment(p0, p1, sqrt(tglGetPixelSize2()), active, enabled); } + { drawLine(p0, p1, true, true, active, enabled); } //***************************************************************************************** @@ -139,7 +150,7 @@ TGuidelineInfiniteLine::transformPoint(const TTrackPoint &point) const { void TGuidelineInfiniteLine::draw(bool active, bool enabled) const - { drawInfiniteLine(p0, p1, false, active, enabled); } + { drawLine(p0, p1, false, false, active, enabled); } //***************************************************************************************** @@ -159,5 +170,5 @@ TGuidelineRay::transformPoint(const TTrackPoint &point) const { void TGuidelineRay::draw(bool active, bool enabled) const - { drawInfiniteLine(p0, p1, true, active, enabled); } + { drawLine(p0, p1, true, false, active, enabled); } diff --git a/toonz/sources/tnztools/assistants/guidelineline.h b/toonz/sources/tnztools/assistants/guidelineline.h index 27262ca..e2954e4 100644 --- a/toonz/sources/tnztools/assistants/guidelineline.h +++ b/toonz/sources/tnztools/assistants/guidelineline.h @@ -32,10 +32,11 @@ public: const TPointD p1; TGuidelineLineBase(bool enabled, double magnetism, const TPointD &p0, const TPointD &p1); - void drawInfiniteLine(const TPointD &p0, const TPointD &p1, bool ray, bool active, bool enabled) const; + void drawLine(const TPointD &p0, const TPointD &p1, bool restrict0, bool restrict1, bool active, bool enabled) const; static TPointD calcDirection(const TPointD &p0, const TPointD &p1); static bool truncateInfiniteLine(const TRectD &bounds, TPointD &p0, TPointD &p1); - static bool truncateInfiniteRay(const TRectD &bounds, TPointD &p0, TPointD &p1); + static bool truncateRay(const TRectD &bounds, TPointD &p0, TPointD &p1); + static bool truncateLine(const TRectD &bounds, TPointD &p0, TPointD &p1); };