tahoma2d/toonz/sources/tnztools/vectorbrush.cpp
2023-02-03 21:05:42 -05:00

135 lines
3.9 KiB
C++

#include "vectorbrush.h"
#include "tstroke.h"
#include "tgeometry.h"
//------------------------------------------------------------------
void VectorBrush::addSymmetryBrushes(double lines, double rotation,
TPointD centerPoint, bool useLineSymmetry,
TPointD dpiScale) {
if (lines < 2) return;
SymmetryTool *symmetryTool = dynamic_cast<SymmetryTool *>(
TTool::getTool("T_Symmetry", TTool::RasterImage));
if (!symmetryTool) return;
m_brushCount = lines;
m_rotation = rotation;
m_centerPoint = centerPoint;
m_useLineSymmetry = useLineSymmetry;
m_dpiScale = dpiScale;
}
//------------------------------------------------------------------
StrokeGenerator VectorBrush::getMainBrush() { return m_tracks[0]; }
//------------------------------------------------------------------
void VectorBrush::reset() {
clear();
m_brushCount = 1;
m_rotation = 0.0;
m_centerPoint = TPointD();
m_useLineSymmetry = false;
m_rasCenter = TPointD();
m_dpiScale = TPointD();
}
//------------------------------------------------------------------
void VectorBrush::clear() {
for (int i = 0; i < m_brushCount; i++) m_tracks[i].clear();
}
//------------------------------------------------------------------
void VectorBrush::add(const TThickPoint &point, double pixelSize2) {
if (!hasSymmetryBrushes()) {
m_tracks[0].add(point, pixelSize2);
return;
}
SymmetryTool *symmetryTool = dynamic_cast<SymmetryTool *>(
TTool::getTool("T_Symmetry", TTool::RasterImage));
if (!symmetryTool) return;
SymmetryObject symmObj = symmetryTool->getSymmetryObject();
std::vector<TPointD> points = symmetryTool->getSymmetryPoints(
point, m_rasCenter, m_dpiScale, m_brushCount, m_rotation, m_centerPoint,
m_useLineSymmetry);
for (int i = 0; i < points.size(); i++)
m_tracks[i].add(TThickPoint(points[i], point.thick), pixelSize2);
}
//------------------------------------------------------------------
TRectD VectorBrush::getLastModifiedRegion() {
TRectD rect;
for (int i = 0; i < m_brushCount; i++)
rect += m_tracks[i].getLastModifiedRegion();
return rect;
}
//------------------------------------------------------------------
void VectorBrush::removeMiddlePoints() {
for (int i = 0; i < m_brushCount; i++) m_tracks[i].removeMiddlePoints();
}
//------------------------------------------------------------------
TRectD VectorBrush::getModifiedRegion() {
TRectD rect;
for (int i = 0; i < m_brushCount; i++)
rect += m_tracks[i].getModifiedRegion();
return rect;
}
//------------------------------------------------------------------
bool VectorBrush::isEmpty() { return m_tracks[0].isEmpty(); }
//------------------------------------------------------------------
TStroke *VectorBrush::makeStroke(double error, int brushIndex,
UINT onlyLastPoints) {
return m_tracks[brushIndex].makeStroke(error, onlyLastPoints);
}
//------------------------------------------------------------------
std::vector<TStroke *> VectorBrush::makeSymmetryStrokes(double error,
UINT onlyLastPoints) {
std::vector<TStroke *> strokes;
for (int i = 1; i < m_brushCount; i++)
strokes.push_back(makeStroke(error, i, onlyLastPoints));
return strokes;
}
//------------------------------------------------------------------
void VectorBrush::filterPoints() {
for (int i = 0; i < m_brushCount; i++) m_tracks[i].filterPoints();
}
//------------------------------------------------------------------
TPointD VectorBrush::getFirstPoint(int brushIndex) {
return m_tracks[brushIndex].getFirstPoint();
}
//------------------------------------------------------------------
void VectorBrush::drawAllFragments() {
for (int i = 0; i < m_brushCount; i++) m_tracks[i].drawAllFragments();
}