|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
98926d |
#ifndef TOONZRASTERBRUSHTOOL_H
|
|
shun-iwasawa |
98926d |
#define TOONZRASTERBRUSHTOOL_H
|
|
Toshihiro Shimizu |
890ddd |
|
|
 |
f278a5 |
#include <tgeometry.h></tgeometry.h>
|
|
 |
f278a5 |
#include <tproperty.h></tproperty.h>
|
|
 |
f278a5 |
#include <trasterimage.h></trasterimage.h>
|
|
 |
f278a5 |
#include <ttoonzimage.h></ttoonzimage.h>
|
|
 |
f278a5 |
#include <tstroke.h></tstroke.h>
|
|
 |
f278a5 |
#include <toonz strokegenerator.h=""></toonz>
|
|
 |
f278a5 |
#include <toonz rasterstrokegenerator.h=""></toonz>
|
|
 |
f278a5 |
|
|
 |
f278a5 |
#include <tools tool.h=""></tools>
|
|
 |
f278a5 |
#include <tools cursors.h=""></tools>
|
|
 |
f278a5 |
|
|
 |
f278a5 |
#include <tools inputmanager.h=""></tools>
|
|
 |
f278a5 |
#include <tools modifierline.h="" modifiers=""></tools>
|
|
 |
f278a5 |
#include <tools modifiers="" modifiertangents.h=""></tools>
|
|
 |
f278a5 |
#include <tools modifierassistants.h="" modifiers=""></tools>
|
|
 |
f278a5 |
#include <tools modifiers="" modifiersegmentation.h=""></tools>
|
|
 |
f278a5 |
#include <tools modifiers="" modifiersmooth.h=""></tools>
|
|
 |
f278a5 |
#ifndef NDEBUG
|
|
 |
f278a5 |
#include <tools modifiers="" modifiertest.h=""></tools>
|
|
 |
f278a5 |
#endif
|
|
 |
f278a5 |
|
|
 |
f278a5 |
#include "bluredbrush.h"
|
|
shun-iwasawa |
98926d |
#include "mypainttoonzbrush.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <qcoreapplication></qcoreapplication>
|
|
Toshihiro Shimizu |
890ddd |
#include <qradialgradient></qradialgradient>
|
|
shun-iwasawa |
98926d |
#include <qelapsedtimer></qelapsedtimer>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
class TTileSetCM32;
|
|
Toshihiro Shimizu |
890ddd |
class TTileSaverCM32;
|
|
Toshihiro Shimizu |
890ddd |
class RasterStrokeGenerator;
|
|
Toshihiro Shimizu |
890ddd |
class BluredBrush;
|
|
shun-iwasawa |
98926d |
class ToonzRasterBrushToolNotifier;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************
|
|
shun-iwasawa |
98926d |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
struct BrushData final : public TPersist {
|
|
Shinya Kitaoka |
120a6e |
PERSIST_DECLARATION(BrushData)
|
|
Jeremy Bullock |
e84aac |
|
|
shun-iwasawa |
7f1e30 |
|
|
shun-iwasawa |
7f1e30 |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::wstring m_name;
|
|
shun-iwasawa |
98926d |
double m_min, m_max, m_smooth, m_hardness, m_opacityMin, m_opacityMax;
|
|
shun-iwasawa |
98926d |
bool m_pencil, m_pressure;
|
|
shun-iwasawa |
98926d |
int m_drawOrder;
|
|
 |
bf1d82 |
double m_modifierSize, m_modifierOpacity;
|
|
 |
572ed1 |
bool m_modifierEraser, m_modifierLockAlpha;
|
|
 |
9380d5 |
bool m_assistants;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
BrushData();
|
|
Shinya Kitaoka |
120a6e |
BrushData(const std::wstring &name);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool operator<(const BrushData &other) const { return m_name < other.m_name; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
void saveData(TOStream &os) override;
|
|
Shinya Kitaoka |
473e70 |
void loadData(TIStream &is) override;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************
|
|
shun-iwasawa |
98926d |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class BrushPresetManager {
|
|
Shinya Kitaoka |
120a6e |
TFilePath m_fp;
|
|
Shinya Kitaoka |
120a6e |
std::set<brushdata> m_presets;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
BrushPresetManager() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void load(const TFilePath &fp);
|
|
Shinya Kitaoka |
120a6e |
void save();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
const TFilePath &path() { return m_fp; };
|
|
Shinya Kitaoka |
120a6e |
const std::set<brushdata> &presets() const { return m_presets; }</brushdata>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void addPreset(const BrushData &data);
|
|
Shinya Kitaoka |
120a6e |
void removePreset(const std::wstring &name);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************
|
|
shun-iwasawa |
98926d |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
 |
f278a5 |
class ToonzRasterBrushTool final : public TTool,
|
|
 |
f278a5 |
public RasterController,
|
|
 |
f278a5 |
public TInputHandler {
|
|
shun-iwasawa |
98926d |
Q_DECLARE_TR_FUNCTIONS(ToonzRasterBrushTool)
|
|
shun-iwasawa |
98926d |
|
|
shun-iwasawa |
98926d |
void updateCurrentStyle();
|
|
shun-iwasawa |
98926d |
double restartBrushTimer();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
shun-iwasawa |
98926d |
ToonzRasterBrushTool(std::string name, int targetType);
|
|
Toshihiro Shimizu |
890ddd |
|
|
 |
fa009d |
ToolType getToolType() const override
|
|
 |
fa009d |
{ return TTool::LevelWriteTool; }
|
|
 |
fa009d |
unsigned int getToolHints() const override
|
|
 |
a4df9b |
{ return (TTool::getToolHints() & ~HintAssistantsAll) | HintReplicatorsEnabled; }
|
|
 |
fa009d |
|
|
Shinya Kitaoka |
473e70 |
ToolOptionsBox *createOptionsBox() override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
void updateTranslation() override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
void onActivate() override;
|
|
Shinya Kitaoka |
473e70 |
void onDeactivate() override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
bool preLeftButtonDown() override;
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override;
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override;
|
|
Shinya Kitaoka |
473e70 |
void leftButtonUp(const TPointD &pos, const TMouseEvent &e) override;
|
|
Shinya Kitaoka |
473e70 |
void mouseMove(const TPointD &pos, const TMouseEvent &e) override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
 |
f278a5 |
void inputMouseMove(const TPointD &position,
|
|
 |
f278a5 |
const TInputState &state) override;
|
|
 |
f278a5 |
void inputSetBusy(bool busy) override;
|
|
 |
f278a5 |
void inputPaintTrackPoint(const TTrackPoint &point, const TTrack &track,
|
|
 |
f278a5 |
bool firstTrack, bool preview) override;
|
|
 |
f278a5 |
void inputInvalidateRect(const TRectD &bounds) override { invalidate(bounds); }
|
|
 |
f278a5 |
TTool *inputGetTool() override { return this; };
|
|
 |
f278a5 |
|
|
Shinya Kitaoka |
473e70 |
void draw() override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
void onEnter() override;
|
|
Shinya Kitaoka |
473e70 |
void onLeave() override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
int getCursorId() const override { return ToolCursor::PenCursor; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
473e70 |
TPropertyGroup *getProperties(int targetType) override;
|
|
Shinya Kitaoka |
473e70 |
bool onPropertyChanged(std::string propertyName) override;
|
|
Shinya Kitaoka |
473e70 |
void onImageChanged() override;
|
|
Shinya Kitaoka |
120a6e |
void setWorkAndBackupImages();
|
|
Shinya Kitaoka |
120a6e |
void updateWorkAndBackupRasters(const TRect &rect);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void initPresets();
|
|
Shinya Kitaoka |
120a6e |
void loadPreset();
|
|
Shinya Kitaoka |
120a6e |
void addPreset(QString name);
|
|
Shinya Kitaoka |
120a6e |
void removePreset();
|
|
Toshihiro Shimizu |
890ddd |
|
|
manongjohn |
df5842 |
void loadLastBrush();
|
|
manongjohn |
df5842 |
|
|
Shinya Kitaoka |
120a6e |
// return true if the pencil mode is active in the Brush / PaintBrush / Eraser
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
bool isPencilModeActive() override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
98926d |
void onColorStyleChanged();
|
|
shun-iwasawa |
98926d |
bool askRead(const TRect &rect) override;
|
|
shun-iwasawa |
98926d |
bool askWrite(const TRect &rect) override;
|
|
shun-iwasawa |
98926d |
bool isMyPaintStyleSelected() { return m_isMyPaintStyleSelected; }
|
|
walkerka |
57fb3c |
|
|
 |
f278a5 |
private:
|
|
 |
f278a5 |
enum MouseEventType { ME_DOWN, ME_DRAG, ME_UP, ME_MOVE };
|
|
 |
f278a5 |
void handleMouseEvent(MouseEventType type, const TPointD &pos,
|
|
 |
f278a5 |
const TMouseEvent &e);
|
|
 |
f278a5 |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
 |
f278a5 |
TInputManager m_inputmanager;
|
|
 |
f278a5 |
TSmartPointerT<tmodifierline> m_modifierLine;</tmodifierline>
|
|
 |
f278a5 |
TSmartPointerT<tmodifiertangents> m_modifierTangents;</tmodifiertangents>
|
|
 |
f278a5 |
TSmartPointerT<tmodifierassistants> m_modifierAssistants;</tmodifierassistants>
|
|
 |
f278a5 |
TSmartPointerT<tmodifiersegmentation> m_modifierSegmentation;</tmodifiersegmentation>
|
|
 |
f278a5 |
TSmartPointerT<tmodifiersegmentation> m_modifierSmoothSegmentation;</tmodifiersegmentation>
|
|
 |
f278a5 |
TSmartPointerT<tmodifiersmooth> m_modifierSmooth[3];</tmodifiersmooth>
|
|
 |
f278a5 |
#ifndef NDEBUG
|
|
 |
f278a5 |
TSmartPointerT<tmodifiertest> m_modifierTest;</tmodifiertest>
|
|
 |
f278a5 |
#endif
|
|
 |
f278a5 |
|
|
 |
fa009d |
class MyPaintStroke: public TTrackHandler {
|
|
 |
f278a5 |
public:
|
|
 |
f278a5 |
MyPaintToonzBrush brush;
|
|
 |
f278a5 |
|
|
 |
f278a5 |
inline MyPaintStroke(
|
|
 |
f278a5 |
const TRaster32P &ras,
|
|
 |
f278a5 |
RasterController &controller,
|
|
 |
f278a5 |
const mypaint::Brush &brush,
|
|
 |
f278a5 |
bool interpolation = false
|
|
 |
f278a5 |
):
|
|
 |
f278a5 |
brush(ras, controller, brush, interpolation)
|
|
 |
f278a5 |
{ }
|
|
 |
f278a5 |
};
|
|
 |
f278a5 |
|
|
 |
fa009d |
class PencilStroke: public TTrackHandler {
|
|
 |
f278a5 |
public:
|
|
 |
f278a5 |
RasterStrokeGenerator brush;
|
|
 |
f278a5 |
|
|
 |
f278a5 |
inline PencilStroke( const TRasterCM32P &raster, Tasks task,
|
|
 |
f278a5 |
ColorType colorType, int styleId, const TThickPoint &p,
|
|
 |
f278a5 |
bool selective, int selectedStyle, bool lockAlpha,
|
|
 |
f278a5 |
bool keepAntialias, bool isPaletteOrder = false
|
|
 |
f278a5 |
):
|
|
 |
f278a5 |
brush(raster, task, colorType, styleId, p, selective, selectedStyle, lockAlpha, keepAntialias, isPaletteOrder)
|
|
 |
f278a5 |
{ }
|
|
 |
f278a5 |
};
|
|
 |
f278a5 |
|
|
 |
fa009d |
class BluredStroke: public TTrackHandler {
|
|
 |
f278a5 |
public:
|
|
 |
f278a5 |
BluredBrush brush;
|
|
 |
f278a5 |
|
|
 |
f278a5 |
inline BluredStroke( const TRaster32P &ras, int size,
|
|
 |
f278a5 |
const QRadialGradient &gradient, bool doDynamicOpacity
|
|
 |
f278a5 |
):
|
|
 |
f278a5 |
brush(ras, size, gradient, doDynamicOpacity)
|
|
 |
f278a5 |
{ }
|
|
 |
f278a5 |
};
|
|
 |
f278a5 |
|
|
 |
f278a5 |
struct Painting {
|
|
 |
f278a5 |
|
|
 |
f278a5 |
bool active = false;
|
|
 |
f278a5 |
int styleId = 0;
|
|
 |
f278a5 |
bool smooth = false;
|
|
 |
f278a5 |
|
|
 |
f278a5 |
TFrameId frameId;
|
|
 |
f278a5 |
|
|
 |
f278a5 |
|
|
 |
f278a5 |
TTileSetCM32 *tileSet = nullptr;
|
|
 |
f278a5 |
TTileSaverCM32 *tileSaver = nullptr;
|
|
 |
f278a5 |
TRect affectedRect;
|
|
 |
f278a5 |
|
|
 |
f278a5 |
struct Pencil {
|
|
 |
f278a5 |
bool isActive = false;
|
|
 |
f278a5 |
bool realPencil = false;
|
|
 |
f278a5 |
} pencil;
|
|
 |
f278a5 |
|
|
 |
f278a5 |
struct Blured {
|
|
 |
f278a5 |
bool isActive = false;
|
|
 |
f278a5 |
} blured;
|
|
 |
f278a5 |
|
|
 |
f278a5 |
struct MyPaint {
|
|
 |
f278a5 |
bool isActive = false;
|
|
 |
f278a5 |
mypaint::Brush baseBrush;
|
|
 |
f278a5 |
TRect strokeSegmentRect;
|
|
 |
f278a5 |
} myPaint;
|
|
 |
f278a5 |
} m_painting;
|
|
 |
f278a5 |
|
|
Shinya Kitaoka |
120a6e |
TPropertyGroup m_prop[2];
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TDoublePairProperty m_rasThickness;
|
|
walkerka |
bb91cd |
TDoubleProperty m_smooth;
|
|
Shinya Kitaoka |
120a6e |
TDoubleProperty m_hardness;
|
|
Shinya Kitaoka |
120a6e |
TEnumProperty m_preset;
|
|
shun-iwasawa |
975eb1 |
TEnumProperty m_drawOrder;
|
|
Shinya Kitaoka |
120a6e |
TBoolProperty m_pencil;
|
|
Shinya Kitaoka |
120a6e |
TBoolProperty m_pressure;
|
|
shun-iwasawa |
98926d |
TDoubleProperty m_modifierSize;
|
|
manongjohn |
f936c0 |
TBoolProperty m_modifierLockAlpha;
|
|
 |
f278a5 |
TBoolProperty m_assistants;
|
|
shun-iwasawa |
98926d |
|
|
Shinya Kitaoka |
120a6e |
double m_minThick, m_maxThick;
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
98926d |
int m_targetType;
|
|
Shinya Kitaoka |
120a6e |
TPointD m_dpiScale,
|
|
Shinya Kitaoka |
120a6e |
m_mousePos, //!< Current mouse position, in world coordinates.
|
|
shun-iwasawa |
98926d |
m_brushPos;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QRadialGradient m_brushPad;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TRasterCM32P m_backupRas;
|
|
Shinya Kitaoka |
120a6e |
TRaster32P m_workRas;
|
|
 |
f278a5 |
TRect m_workBackupRect;
|
|
walkerka |
bb91cd |
|
|
Shinya Kitaoka |
120a6e |
BrushPresetManager
|
|
Shinya Kitaoka |
120a6e |
m_presetsManager; //!< Manager for presets of this tool instance
|
|
Shinya Kitaoka |
120a6e |
|
|
 |
f278a5 |
bool m_enabled,
|
|
Shinya Kitaoka |
120a6e |
m_isPrompting,
|
|
walkerka |
22f456 |
|
|
shun-iwasawa |
98926d |
m_firstTime, m_presetsLoaded;
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
98926d |
ToonzRasterBrushToolNotifier *m_notifier;
|
|
shun-iwasawa |
98926d |
bool m_isMyPaintStyleSelected = false;
|
|
shun-iwasawa |
98926d |
QElapsedTimer m_brushTimer;
|
|
shun-iwasawa |
98926d |
int m_minCursorThick, m_maxCursorThick;
|
|
shun-iwasawa |
98926d |
|
|
manongjohn |
5a2268 |
bool m_propertyUpdating = false;
|
|
manongjohn |
5a2268 |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
static void drawLine(const TPointD &point, const TPointD ¢re,
|
|
Shinya Kitaoka |
120a6e |
bool horizontal, bool isDecimal);
|
|
Shinya Kitaoka |
120a6e |
static void drawEmptyCircle(TPointD point, int thick, bool isLxEven,
|
|
Shinya Kitaoka |
120a6e |
bool isLyEven, bool isPencil);
|
|
Martin van Zijl |
e9b900 |
|
|
manongjohn |
fe8e5c |
TPointD getCenteredCursorPos(const TPointD &originalCursorPos);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
98926d |
|
|
shun-iwasawa |
98926d |
|
|
shun-iwasawa |
98926d |
class ToonzRasterBrushToolNotifier final : public QObject {
|
|
shun-iwasawa |
98926d |
Q_OBJECT
|
|
shun-iwasawa |
98926d |
|
|
shun-iwasawa |
98926d |
ToonzRasterBrushTool *m_tool;
|
|
shun-iwasawa |
98926d |
|
|
shun-iwasawa |
98926d |
public:
|
|
shun-iwasawa |
98926d |
ToonzRasterBrushToolNotifier(ToonzRasterBrushTool *tool);
|
|
shun-iwasawa |
98926d |
|
|
shun-iwasawa |
98926d |
protected slots:
|
|
shun-iwasawa |
98926d |
|
|
shun-iwasawa |
98926d |
void onColorStyleChanged() { m_tool->onColorStyleChanged(); }
|
|
shun-iwasawa |
98926d |
};
|
|
shun-iwasawa |
98926d |
|
|
shun-iwasawa |
98926d |
#endif
|