215 lines
6.6 KiB
C++
215 lines
6.6 KiB
C++
#pragma once
|
||
|
||
#ifndef TOONZVECTORBRUSHTOOL_H
|
||
#define TOONZVECTORBRUSHTOOL_H
|
||
|
||
#include "tgeometry.h"
|
||
#include "tproperty.h"
|
||
#include "trasterimage.h"
|
||
#include "ttoonzimage.h"
|
||
#include "tstroke.h"
|
||
#include "toonz/strokegenerator.h"
|
||
|
||
#include "tools/tool.h"
|
||
#include "tools/cursors.h"
|
||
|
||
#include "toonzrasterbrushtool.h"
|
||
|
||
#include <QCoreApplication>
|
||
#include <QRadialGradient>
|
||
|
||
//--------------------------------------------------------------
|
||
|
||
// Forward declarations
|
||
|
||
class TTileSetCM32;
|
||
class TTileSaverCM32;
|
||
class RasterStrokeGenerator;
|
||
class BluredBrush;
|
||
|
||
//--------------------------------------------------------------
|
||
|
||
//************************************************************************
|
||
// Brush Data declaration
|
||
//************************************************************************
|
||
|
||
struct VectorBrushData final : public TPersist {
|
||
PERSIST_DECLARATION(VectorBrushData)
|
||
// frameRange, snapSensitivity and snap are not included
|
||
// Those options are not really a part of the brush settings,
|
||
// just the overall tool.
|
||
|
||
std::wstring m_name;
|
||
double m_min, m_max, m_acc, m_smooth;
|
||
bool m_breakAngles, m_pressure;
|
||
int m_cap, m_join, m_miter;
|
||
|
||
VectorBrushData();
|
||
VectorBrushData(const std::wstring &name);
|
||
|
||
bool operator<(const VectorBrushData &other) const {
|
||
return m_name < other.m_name;
|
||
}
|
||
|
||
void saveData(TOStream &os) override;
|
||
void loadData(TIStream &is) override;
|
||
};
|
||
|
||
//************************************************************************
|
||
// Brush Preset Manager declaration
|
||
//************************************************************************
|
||
|
||
class VectorBrushPresetManager {
|
||
TFilePath m_fp; //!< Presets file path
|
||
std::set<VectorBrushData> m_presets; //!< Current presets container
|
||
|
||
public:
|
||
VectorBrushPresetManager() {}
|
||
|
||
void load(const TFilePath &fp);
|
||
void save();
|
||
|
||
const TFilePath &path() { return m_fp; };
|
||
const std::set<VectorBrushData> &presets() const { return m_presets; }
|
||
|
||
void addPreset(const VectorBrushData &data);
|
||
void removePreset(const std::wstring &name);
|
||
};
|
||
|
||
//************************************************************************
|
||
// Brush Tool declaration
|
||
//************************************************************************
|
||
|
||
class ToonzVectorBrushTool final : public TTool {
|
||
Q_DECLARE_TR_FUNCTIONS(ToonzVectorBrushTool)
|
||
|
||
public:
|
||
ToonzVectorBrushTool(std::string name, int targetType);
|
||
|
||
ToolType getToolType() const override { return TTool::LevelWriteTool; }
|
||
|
||
ToolOptionsBox *createOptionsBox() override;
|
||
|
||
void updateTranslation() override;
|
||
|
||
void onActivate() override;
|
||
void onDeactivate() override;
|
||
|
||
bool preLeftButtonDown() override;
|
||
void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override;
|
||
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override;
|
||
void leftButtonUp(const TPointD &pos, const TMouseEvent &e) override;
|
||
void mouseMove(const TPointD &pos, const TMouseEvent &e) override;
|
||
bool keyDown(QKeyEvent *event) override;
|
||
|
||
void draw() override;
|
||
|
||
void onEnter() override;
|
||
void onLeave() override;
|
||
|
||
int getCursorId() const override {
|
||
if (m_viewer && m_viewer->getGuidedStrokePickerMode())
|
||
return m_viewer->getGuidedStrokePickerCursor();
|
||
return ToolCursor::PenCursor;
|
||
}
|
||
|
||
TPropertyGroup *getProperties(int targetType) override;
|
||
bool onPropertyChanged(std::string propertyName) override;
|
||
void resetFrameRange();
|
||
|
||
void initPresets();
|
||
void loadPreset();
|
||
void addPreset(QString name);
|
||
void removePreset();
|
||
|
||
void loadLastBrush();
|
||
|
||
// return true if the pencil mode is active in the Brush / PaintBrush / Eraser
|
||
// Tools.
|
||
bool isPencilModeActive() override;
|
||
|
||
void addTrackPoint(const TThickPoint &point, double pixelSize2);
|
||
void flushTrackPoint();
|
||
bool doFrameRangeStrokes(TFrameId firstFrameId, TStroke *firstStroke,
|
||
TFrameId lastFrameId, TStroke *lastStroke,
|
||
int interpolationType, bool breakAngles,
|
||
bool autoGroup = false, bool autoFill = false,
|
||
bool drawFirstStroke = true,
|
||
bool drawLastStroke = true, bool withUndo = true);
|
||
void checkGuideSnapping(bool beforeMousePress, bool invertCheck);
|
||
void checkStrokeSnapping(bool beforeMousePress, bool invertCheck);
|
||
bool doGuidedAutoInbetween(TFrameId cFid, const TVectorImageP &cvi,
|
||
TStroke *cStroke, bool breakAngles,
|
||
bool autoGroup = false, bool autoFill = false,
|
||
bool drawStroke = true);
|
||
|
||
protected:
|
||
TPropertyGroup m_prop[2];
|
||
|
||
TDoublePairProperty m_thickness;
|
||
TDoubleProperty m_accuracy;
|
||
TDoubleProperty m_smooth;
|
||
TEnumProperty m_preset;
|
||
TBoolProperty m_breakAngles;
|
||
TBoolProperty m_pressure;
|
||
TBoolProperty m_snap;
|
||
TEnumProperty m_frameRange;
|
||
TEnumProperty m_snapSensitivity;
|
||
TEnumProperty m_capStyle;
|
||
TEnumProperty m_joinStyle;
|
||
TIntProperty m_miterJoinLimit;
|
||
|
||
StrokeGenerator m_track;
|
||
StrokeGenerator m_rangeTrack;
|
||
RasterStrokeGenerator *m_rasterTrack;
|
||
TStroke *m_firstStroke;
|
||
TTileSetCM32 *m_tileSet;
|
||
TTileSaverCM32 *m_tileSaver;
|
||
TFrameId m_firstFrameId, m_veryFirstFrameId;
|
||
TPixel32 m_currentColor;
|
||
int m_styleId;
|
||
double m_minThick, m_maxThick;
|
||
|
||
// for snapping and framerange
|
||
int m_strokeIndex1, m_strokeIndex2, m_col, m_firstFrame, m_veryFirstFrame,
|
||
m_veryFirstCol, m_targetType;
|
||
double m_w1, m_w2, m_pixelSize, m_currThickness, m_minDistance2;
|
||
bool m_foundFirstSnap = false, m_foundLastSnap = false, m_dragDraw = true,
|
||
m_altPressed = false, m_snapSelf = false;
|
||
TRectD m_modifiedRegion;
|
||
TPointD m_dpiScale,
|
||
m_mousePos, //!< Current mouse position, in world coordinates.
|
||
m_brushPos, //!< World position the brush will be painted at.
|
||
m_firstSnapPoint, m_lastSnapPoint;
|
||
|
||
BluredBrush *m_bluredBrush;
|
||
QRadialGradient m_brushPad;
|
||
|
||
TRasterCM32P m_backupRas;
|
||
TRaster32P m_workRas;
|
||
|
||
std::vector<TThickPoint> m_points;
|
||
TRect m_strokeRect, m_lastRect;
|
||
|
||
SmoothStroke m_smoothStroke;
|
||
|
||
VectorBrushPresetManager
|
||
m_presetsManager; //!< Manager for presets of this tool instance
|
||
|
||
bool m_active, m_enabled,
|
||
m_isPrompting, //!< Whether the tool is prompting for spline
|
||
//! substitution.
|
||
m_firstTime, m_isPath, m_presetsLoaded, m_firstFrameRange;
|
||
|
||
/*---
|
||
<20><><EFBFBD>ƒ<EFBFBD><C692><EFBFBD>FrameId<49><64><EFBFBD>N<EFBFBD><4E><EFBFBD>b<EFBFBD>N<EFBFBD><4E><EFBFBD>ɕۑ<C995><DB91><EFBFBD><EFBFBD>A<EFBFBD>}<7D>E<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>[<5B>X<EFBFBD><58><EFBFBD>iUndo<64>̓o<CC93>^<5E><><EFBFBD>j<EFBFBD>ɕʂ̃t<CC83><74><EFBFBD>[<5B><><EFBFBD><EFBFBD>
|
||
<20>ړ<EFBFBD><DA93><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̕s<CC95><EFBFBD><EF8D87><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B---*/
|
||
TFrameId m_workingFrameId;
|
||
|
||
TPointD m_lastDragPos; //!< Position where mouse was last dragged.
|
||
TMouseEvent m_lastDragEvent; //!< Previous mouse-drag event.
|
||
|
||
bool m_propertyUpdating = false;
|
||
};
|
||
|
||
#endif // TOONZVECTORBRUSHTOOL_H
|