From 9c4ead854ccc7e167e5c4e814b6f058c567342e0 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Aug 09 2023 05:10:40 +0000 Subject: #assistants: tr: improve m_painting --- diff --git a/toonz/sources/tnztools/toonzrasterbrushtool.cpp b/toonz/sources/tnztools/toonzrasterbrushtool.cpp index b10005b..b10a4ef 100644 --- a/toonz/sources/tnztools/toonzrasterbrushtool.cpp +++ b/toonz/sources/tnztools/toonzrasterbrushtool.cpp @@ -1360,25 +1360,28 @@ void ToonzRasterBrushTool::leftButtonDown(const TPointD &pos, invalidateRect += TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset); } else if (m_hardness.getValue() == 100 || m_pencil.getValue()) { + m_painting.pencil.realPencil = m_pencil.getValue(); + /*-- Pencilモードでなく、Hardness=100 の場合のブラシサイズを1段階下げる * --*/ - if (!m_pencil.getValue() && !m_painting.straight.isStraight) thickness -= 1.0; + if (!m_painting.pencil.realPencil && !m_painting.straight.isStraight) thickness -= 1.0; TThickPoint thickPoint(centeredPos + convert(ras->getCenter()), thickness); - m_painting.pencil.rasterTrack = new RasterStrokeGenerator( + m_painting.pencil.brush = new RasterStrokeGenerator( ras, BRUSH, NONE, m_painting.styleId, thickPoint, drawOrder != OverAll, 0, - m_modifierLockAlpha.getValue(), !m_pencil.getValue(), + m_modifierLockAlpha.getValue(), !m_painting.pencil.realPencil, drawOrder == PaletteOrder); if (drawOrder == PaletteOrder) - m_painting.pencil.rasterTrack->setAboveStyleIds(aboveStyleIds); + m_painting.pencil.brush->setAboveStyleIds(aboveStyleIds); - m_painting.tileSaver->save( m_painting.pencil.rasterTrack->getLastRect() ); + m_painting.tileSaver->save( m_painting.pencil.brush->getLastRect() ); if (!m_painting.straight.isStraight) - m_painting.pencil.rasterTrack->generateLastPieceOfStroke( m_pencil.getValue() ); + m_painting.pencil.brush->generateLastPieceOfStroke( m_painting.pencil.realPencil ); - if (m_smooth.getValue()) { + m_painting.smooth = m_smooth.getValue() > 0; + if (m_painting.smooth) { std::vector pts; m_painting.smoothStroke.beginStroke(m_smooth.getValue()); m_painting.smoothStroke.addPoint(thickPoint); @@ -1388,22 +1391,23 @@ void ToonzRasterBrushTool::leftButtonDown(const TPointD &pos, m_painting.blured.points.clear(); TThickPoint point(centeredPos + rasCenter, thickness); m_painting.blured.points.push_back(point); - m_painting.blured.bluredBrush = new BluredBrush(m_workRas, maxThick, m_brushPad, false); + m_painting.blured.brush = new BluredBrush(m_workRas, maxThick, m_brushPad, false); if (drawOrder == PaletteOrder) - m_painting.blured.bluredBrush->setAboveStyleIds(aboveStyleIds); + m_painting.blured.brush->setAboveStyleIds(aboveStyleIds); - TRect strokeRect = m_painting.blured.bluredBrush->getBoundFromPoints( m_painting.blured.points ); + TRect strokeRect = m_painting.blured.brush->getBoundFromPoints( m_painting.blured.points ); updateWorkAndBackupRasters(strokeRect); m_painting.tileSaver->save(strokeRect); - m_painting.blured.bluredBrush->addPoint(point, 1); + m_painting.blured.brush->addPoint(point, 1); if (!m_painting.straight.isStraight) - m_painting.blured.bluredBrush->updateDrawing( ri->getRaster(), m_backupRas, strokeRect, - m_painting.styleId, drawOrder, - m_modifierLockAlpha.getValue() ); + m_painting.blured.brush->updateDrawing( ri->getRaster(), m_backupRas, strokeRect, + m_painting.styleId, drawOrder, + m_modifierLockAlpha.getValue() ); m_painting.lastRect = strokeRect; - if (m_smooth.getValue()) { + m_painting.smooth = m_smooth.getValue() > 0; + if (m_painting.smooth) { std::vector pts; m_painting.smoothStroke.beginStroke(m_smooth.getValue()); m_painting.smoothStroke.addPoint(point); @@ -1488,7 +1492,7 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos, return; } - if (m_isMyPaintStyleSelected) { + if (m_painting.myPaint.brush) { TRasterP ras = ti->getRaster(); TPointD point(centeredPos + rasCenter); @@ -1507,15 +1511,15 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos, TRectD(centeredPos - thickOffset, centeredPos + thickOffset); invalidateRect += TRectD(m_brushPos - thickOffset, m_brushPos + thickOffset); - } else if (m_painting.pencil.rasterTrack && - (m_hardness.getValue() == 100 || m_pencil.getValue())) { + } else + if (m_painting.pencil.brush) { /*-- Pencilモードでなく、Hardness=100 の場合のブラシサイズを1段階下げる * --*/ - if (!m_pencil.getValue()) thickness -= 1.0; + if (!m_painting.pencil.realPencil) thickness -= 1.0; TThickPoint thickPoint(centeredPos + rasCenter, thickness); std::vector pts; - if (m_smooth.getValue() == 0) { + if (m_painting.smooth) { pts.push_back(thickPoint); } else { m_painting.smoothStroke.addPoint(thickPoint); @@ -1523,10 +1527,10 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos, } for (size_t i = 0; i < pts.size(); ++i) { const TThickPoint &thickPoint = pts[i]; - m_painting.pencil.rasterTrack->add( thickPoint); - m_painting.tileSaver->save( m_painting.pencil.rasterTrack->getLastRect() ); - m_painting.pencil.rasterTrack->generateLastPieceOfStroke( m_pencil.getValue() ); - std::vector brushPoints = m_painting.pencil.rasterTrack->getPointsSequence(); + m_painting.pencil.brush->add( thickPoint); + m_painting.tileSaver->save( m_painting.pencil.brush->getLastRect() ); + m_painting.pencil.brush->generateLastPieceOfStroke( m_painting.pencil.realPencil ); + std::vector brushPoints = m_painting.pencil.brush->getPointsSequence(); int m = (int)brushPoints.size(); std::vector points; if (m == 3) { @@ -1541,10 +1545,11 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos, } } else { // antialiased brush + assert(m_painting.blured.brush); assert(m_workRas.getPointer() && m_backupRas.getPointer()); TThickPoint thickPoint(centeredPos + rasCenter, thickness); std::vector pts; - if (m_smooth.getValue() == 0) { + if (m_painting.smooth) { pts.push_back(thickPoint); } else { m_painting.smoothStroke.addPoint(thickPoint); @@ -1566,31 +1571,31 @@ void ToonzRasterBrushTool::leftButtonDrag(const TPointD &pos, TThickPoint pa = m_painting.blured.points.front(); points.push_back(pa); points.push_back(mid); - bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points); + bbox = m_painting.blured.brush->getBoundFromPoints(points); updateWorkAndBackupRasters(bbox + m_painting.lastRect); m_painting.tileSaver->save(bbox); - m_painting.blured.bluredBrush->addArc(pa, (mid + pa) * 0.5, mid, 1, 1); + m_painting.blured.brush->addArc(pa, (mid + pa) * 0.5, mid, 1, 1); m_painting.lastRect += bbox; } else { points.push_back(m_painting.blured.points[m - 4]); points.push_back(old); points.push_back(mid); - bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points); + bbox = m_painting.blured.brush->getBoundFromPoints(points); updateWorkAndBackupRasters(bbox + m_painting.lastRect); m_painting.tileSaver->save(bbox); - m_painting.blured.bluredBrush->addArc( m_painting.blured.points[m - 4], old, mid, 1, 1 ); + m_painting.blured.brush->addArc( m_painting.blured.points[m - 4], old, mid, 1, 1 ); m_painting.lastRect += bbox; } invalidateRect += ToolUtils::getBounds(points, maxThickness) - rasCenter; - m_painting.blured.bluredBrush->updateDrawing( ti->getRaster(), m_backupRas, bbox, + m_painting.blured.brush->updateDrawing( ti->getRaster(), m_backupRas, bbox, m_painting.styleId, m_drawOrder.getIndex(), m_modifierLockAlpha.getValue() ); } } // clear & draw brush tip when drawing smooth stroke - if (m_smooth.getValue() != 0) { + if (m_painting.smooth) { TPointD halfThick(m_maxThick * 0.5, m_maxThick * 0.5); invalidateRect += TRectD(m_brushPos - halfThick, m_brushPos + halfThick); invalidateRect += TRectD(centeredPos - halfThick, centeredPos + halfThick); @@ -1655,7 +1660,7 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, * --*/ TFrameId frameId = m_workingFrameId.isEmptyFrame() ? getCurrentFid() : m_workingFrameId; - if (m_isMyPaintStyleSelected) { + if (m_painting.myPaint.brush) { TRasterCM32P ras = ti->getRaster(); TPointD point(pos + rasCenter); double pressure = m_pressure.getValue() ? pressureVal : 0.5; @@ -1687,8 +1692,8 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, m_isLevelCreated, subras, m_painting.myPaint.strokeRect.getP00())); } - } else if (m_painting.pencil.rasterTrack && - (m_hardness.getValue() == 100 || m_pencil.getValue())) { + } else + if (m_painting.pencil.brush) { double thickness = m_pressure.getValue() ? computeThickness(pressureVal, m_rasThickness) * 2 : m_rasThickness.getValue().second; @@ -1699,13 +1704,13 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, thickness = m_rasThickness.getValue().first; // Pencilモードでなく、Hardness=100 の場合のブラシサイズを1段階下げる - if (!m_pencil.getValue()) thickness -= 1.0; + if (!m_painting.pencil.realPencil) thickness -= 1.0; } TRectD invalidateRect; TThickPoint thickPoint(pos + rasCenter, thickness); std::vector pts; - if (m_smooth.getValue() == 0 || m_painting.straight.isStraight) { + if (m_painting.smooth || m_painting.straight.isStraight) { pts.push_back(thickPoint); } else { m_painting.smoothStroke.addPoint(thickPoint); @@ -1714,12 +1719,12 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, } for (size_t i = 0; i < pts.size(); ++i) { const TThickPoint &thickPoint = pts[i]; - m_painting.pencil.rasterTrack->add( thickPoint ); - m_painting.tileSaver->save( m_painting.pencil.rasterTrack->getLastRect( m_painting.straight.isStraight) ); - m_painting.pencil.rasterTrack->generateLastPieceOfStroke(m_pencil.getValue(), true, - m_painting.straight.isStraight); + m_painting.pencil.brush->add( thickPoint ); + m_painting.tileSaver->save( m_painting.pencil.brush->getLastRect( m_painting.straight.isStraight) ); + m_painting.pencil.brush->generateLastPieceOfStroke( + m_painting.pencil.realPencil, true, m_painting.straight.isStraight); - std::vector brushPoints = m_painting.pencil.rasterTrack->getPointsSequence(); + std::vector brushPoints = m_painting.pencil.brush->getPointsSequence(); int m = (int)brushPoints.size(); std::vector points; if (m_painting.straight.isStraight) { @@ -1740,15 +1745,16 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, if (m_painting.tileSet->getTileCount() > 0) { TUndoManager::manager()->add(new RasterBrushUndo( - m_painting.tileSet, m_painting.pencil.rasterTrack->getPointsSequence(), - m_painting.pencil.rasterTrack->getStyleId(), m_painting.pencil.rasterTrack->isSelective(), - simLevel.getPointer(), frameId, m_pencil.getValue(), m_isFrameCreated, - m_isLevelCreated, m_painting.pencil.rasterTrack->isPaletteOrder(), - m_painting.pencil.rasterTrack->isAlphaLocked(), m_painting.straight.isStraight)); + m_painting.tileSet, m_painting.pencil.brush->getPointsSequence(), + m_painting.pencil.brush->getStyleId(), m_painting.pencil.brush->isSelective(), + simLevel.getPointer(), frameId, m_painting.pencil.realPencil, m_isFrameCreated, + m_isLevelCreated, m_painting.pencil.brush->isPaletteOrder(), + m_painting.pencil.brush->isAlphaLocked(), m_painting.straight.isStraight)); } - delete m_painting.pencil.rasterTrack; - m_painting.pencil.rasterTrack = nullptr; + delete m_painting.pencil.brush; + m_painting.pencil.brush = nullptr; } else { + assert(m_painting.blured.brush); double maxThickness = m_rasThickness.getValue().second; double thickness = (m_pressure.getValue()) ? computeThickness(pressureVal, m_rasThickness) * 2 @@ -1757,7 +1763,7 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, TRectD invalidateRect; TThickPoint thickPoint(pos + rasCenter, thickness); std::vector pts; - if (m_smooth.getValue() == 0 || m_painting.straight.isStraight) { + if (m_painting.smooth || m_painting.straight.isStraight) { pts.push_back(thickPoint); } else { m_painting.smoothStroke.addPoint(thickPoint); @@ -1784,26 +1790,26 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, TThickPoint pa = m_painting.blured.points.front(); points.push_back(pa); points.push_back(mid); - bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points); + bbox = m_painting.blured.brush->getBoundFromPoints(points); updateWorkAndBackupRasters(bbox + m_painting.lastRect); m_painting.tileSaver->save(bbox); - m_painting.blured.bluredBrush->addArc(pa, (mid + pa) * 0.5, mid, 1, 1); + m_painting.blured.brush->addArc(pa, (mid + pa) * 0.5, mid, 1, 1); m_painting.lastRect += bbox; } else { points.push_back(m_painting.blured.points[m - 4]); points.push_back(old); points.push_back(mid); - bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points); + bbox = m_painting.blured.brush->getBoundFromPoints(points); updateWorkAndBackupRasters(bbox + m_painting.lastRect); m_painting.tileSaver->save(bbox); - m_painting.blured.bluredBrush->addArc(m_painting.blured.points[m - 4], old, mid, 1, 1); + m_painting.blured.brush->addArc(m_painting.blured.points[m - 4], old, mid, 1, 1); m_painting.lastRect += bbox; } invalidateRect += ToolUtils::getBounds(points, maxThickness) - rasCenter; - m_painting.blured.bluredBrush->updateDrawing( ti->getRaster(), m_backupRas, bbox, + m_painting.blured.brush->updateDrawing( ti->getRaster(), m_backupRas, bbox, m_painting.styleId, m_drawOrder.getIndex(), m_modifierLockAlpha.getValue() ); } @@ -1827,11 +1833,11 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, points.push_back( m_painting.blured.points[1] ); points.push_back( m_painting.blured.points[2] ); } - TRect bbox = m_painting.blured.bluredBrush->getBoundFromPoints(points); + TRect bbox = m_painting.blured.brush->getBoundFromPoints(points); updateWorkAndBackupRasters(bbox); m_painting.tileSaver->save(bbox); - m_painting.blured.bluredBrush->addArc( points[0], points[1], points[2], 1, 1 ); - m_painting.blured.bluredBrush->updateDrawing( ti->getRaster(), m_backupRas, bbox, + m_painting.blured.brush->addArc( points[0], points[1], points[2], 1, 1 ); + m_painting.blured.brush->updateDrawing( ti->getRaster(), m_backupRas, bbox, m_painting.styleId, m_drawOrder.getIndex(), m_modifierLockAlpha.getValue() ); @@ -1842,8 +1848,8 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, if (!invalidateRect.isEmpty()) invalidate(invalidateRect.enlarge(2)); m_painting.lastRect.empty(); - delete m_painting.blured.bluredBrush; - m_painting.blured.bluredBrush = nullptr; + delete m_painting.blured.brush; + m_painting.blured.brush = nullptr; if (m_painting.tileSet->getTileCount() > 0) { TUndoManager::manager()->add(new RasterBluredBrushUndo( @@ -1854,7 +1860,7 @@ void ToonzRasterBrushTool::finishRasterBrush(const TPointD &pos, } } delete m_painting.tileSaver; - m_painting.tileSaver = 0; + m_painting.tileSaver = nullptr; /*-- FIdを指定して、描画中にフレームが動いても、   描画開始時のFidのサムネイルが更新されるようにする。--*/ diff --git a/toonz/sources/tnztools/toonzrasterbrushtool.h b/toonz/sources/tnztools/toonzrasterbrushtool.h index 7d688e5..2b9875c 100644 --- a/toonz/sources/tnztools/toonzrasterbrushtool.h +++ b/toonz/sources/tnztools/toonzrasterbrushtool.h @@ -180,6 +180,7 @@ protected: // initial painting input bool active = false; int styleId = 0; + bool smooth; // common variables TTileSetCM32 *tileSet = nullptr; @@ -188,12 +189,13 @@ protected: SmoothStroke smoothStroke; struct Pencil { - RasterStrokeGenerator *rasterTrack = nullptr; + RasterStrokeGenerator *brush = nullptr; + bool realPencil = false; } pencil; struct Blured { + BluredBrush *brush = nullptr; std::vector points; - BluredBrush *bluredBrush; } blured; struct MyPaint {