| #pragma once |
| |
| #ifndef BRUSHTOOL_H |
| #define BRUSHTOOL_H |
| |
| #include "tgeometry.h" |
| #include "tproperty.h" |
| #include "trasterimage.h" |
| #include "ttoonzimage.h" |
| |
| #include "toonz/strokegenerator.h" |
| |
| #include "tools/tool.h" |
| #include "tools/cursors.h" |
| |
| #include <QCoreApplication> |
| #include <QRadialGradient> |
| |
| |
| |
| |
| |
| class TTileSetCM32; |
| class TTileSaverCM32; |
| class RasterStrokeGenerator; |
| class BluredBrush; |
| |
| |
| |
| |
| |
| |
| |
| struct BrushData final : public TPersist { |
| PERSIST_DECLARATION(BrushData) |
| |
| std::wstring m_name; |
| double m_min, m_max, m_acc, m_smooth, m_hardness, m_opacityMin, m_opacityMax; |
| bool m_selective, m_pencil, m_breakAngles, m_pressure; |
| int m_cap, m_join, m_miter; |
| |
| BrushData(); |
| BrushData(const std::wstring &name); |
| |
| bool operator<(const BrushData &other) const { return m_name < other.m_name; } |
| |
| void saveData(TOStream &os) override; |
| void loadData(TIStream &is) override; |
| }; |
| |
| |
| |
| |
| |
| class BrushPresetManager { |
| TFilePath m_fp; |
| std::set<BrushData> m_presets; |
| |
| public: |
| BrushPresetManager() {} |
| |
| void load(const TFilePath &fp); |
| void save(); |
| |
| const TFilePath &path() { return m_fp; }; |
| const std::set<BrushData> &presets() const { return m_presets; } |
| |
| void addPreset(const BrushData &data); |
| void removePreset(const std::wstring &name); |
| }; |
| |
| |
| |
| |
| |
| class SmoothStroke { |
| public: |
| SmoothStroke() {} |
| ~SmoothStroke() {} |
| |
| |
| |
| void beginStroke(int smooth); |
| |
| void addPoint(const TThickPoint &point); |
| |
| void endStroke(); |
| |
| |
| |
| void getSmoothPoints(std::vector<TThickPoint> &smoothPoints); |
| |
| private: |
| void generatePoints(); |
| |
| private: |
| int m_smooth; |
| int m_outputIndex; |
| int m_readIndex; |
| std::vector<TThickPoint> m_rawPoints; |
| std::vector<TThickPoint> m_outputPoints; |
| }; |
| |
| |
| |
| |
| class BrushTool final : public TTool { |
| Q_DECLARE_TR_FUNCTIONS(BrushTool) |
| |
| public: |
| BrushTool(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; |
| |
| void draw() override; |
| |
| void onEnter() override; |
| void onLeave() override; |
| |
| int getCursorId() const override { return ToolCursor::PenCursor; } |
| |
| TPropertyGroup *getProperties(int targetType) override; |
| bool onPropertyChanged(std::string propertyName) override; |
| |
| void onImageChanged() override; |
| void setWorkAndBackupImages(); |
| void updateWorkAndBackupRasters(const TRect &rect); |
| |
| void initPresets(); |
| void loadPreset(); |
| void addPreset(QString name); |
| void removePreset(); |
| |
| void finishRasterBrush(const TPointD &pos, int pressureVal); |
| |
| |
| bool isPencilModeActive() override; |
| |
| void addTrackPoint(const TThickPoint &point, double pixelSize2); |
| void flushTrackPoint(); |
| |
| protected: |
| TPropertyGroup m_prop[2]; |
| |
| TDoublePairProperty m_thickness; |
| TDoublePairProperty m_rasThickness; |
| TDoubleProperty m_accuracy; |
| TDoubleProperty m_smooth; |
| TDoubleProperty m_hardness; |
| TEnumProperty m_preset; |
| TBoolProperty m_selective; |
| TBoolProperty m_breakAngles; |
| TBoolProperty m_pencil; |
| TBoolProperty m_pressure; |
| TEnumProperty m_capStyle; |
| TEnumProperty m_joinStyle; |
| TIntProperty m_miterJoinLimit; |
| |
| StrokeGenerator m_track; |
| RasterStrokeGenerator *m_rasterTrack; |
| |
| TTileSetCM32 *m_tileSet; |
| TTileSaverCM32 *m_tileSaver; |
| |
| TPixel32 m_currentColor; |
| int m_styleId; |
| double m_minThick, m_maxThick; |
| |
| TRectD m_modifiedRegion; |
| TPointD m_dpiScale, |
| m_mousePos, |
| m_brushPos; |
| |
| 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; |
| |
| BrushPresetManager |
| m_presetsManager; |
| |
| bool m_active, m_enabled, |
| m_isPrompting, |
| |
| m_firstTime, m_isPath, m_presetsLoaded; |
| |
| |
| |
| |
| TFrameId m_workingFrameId; |
| |
| protected: |
| static void drawLine(const TPointD &point, const TPointD ¢re, |
| bool horizontal, bool isDecimal); |
| static void drawEmptyCircle(TPointD point, int thick, bool isLxEven, |
| bool isLyEven, bool isPencil); |
| }; |
| |
| #endif |