Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9905f59

Browse files
committed
fix raster deformation slowness
1 parent b088e41 commit 9905f59

File tree

8 files changed

+123
-51
lines changed

8 files changed

+123
-51
lines changed

toonz/sources/include/tools/tool.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,16 @@ class DVAPI TMouseEvent {
9797
QPointF m_mousePos; // mouse position obtained with QMouseEvent::pos() or
9898
// QTabletEvent::pos()
9999
bool m_isTablet;
100+
bool m_isHighFrequent;
100101

101102
public:
102103
TMouseEvent()
103104
: m_pressure(1.0)
104105
, m_modifiersMask(NO_KEY)
105106
, m_buttons(Qt::NoButton)
106107
, m_button(Qt::NoButton)
107-
, m_isTablet(false) {}
108+
, m_isTablet(false)
109+
, m_isHighFrequent(false) {}
108110

109111
bool isShiftPressed() const { return (m_modifiersMask & SHIFT_KEY); }
110112
bool isAltPressed() const { return (m_modifiersMask & ALT_KEY); }
@@ -115,6 +117,7 @@ class DVAPI TMouseEvent {
115117
Qt::MouseButton button() const { return m_button; }
116118
QPointF mousePos() const { return m_mousePos; }
117119
bool isTablet() const { return m_isTablet; }
120+
bool isHighFrequent() const { return m_isHighFrequent; }
118121

119122
void setModifiers(bool shiftPressed, bool altPressed, bool ctrlPressed) {
120123
m_modifiersMask = ModifierMask((shiftPressed << SHIFT_BITSHIFT) |

toonz/sources/tnztools/rasterselectiontool.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,8 @@ DragSelectionTool::RasterDeformTool::RasterDeformTool(RasterSelectionTool *tool,
246246

247247
//-----------------------------------------------------------------------------
248248

249-
void DragSelectionTool::RasterDeformTool::applyTransform(FourPoints bbox) {
249+
void DragSelectionTool::RasterDeformTool::applyTransform(FourPoints bbox,
250+
bool onFastDragging) {
250251
RasterSelectionTool *tool = (RasterSelectionTool *)getTool();
251252
tool->setNewFreeDeformer();
252253
if (!m_deformUndo) m_deformUndo = new UndoRasterDeform(tool);
@@ -257,7 +258,8 @@ void DragSelectionTool::RasterDeformTool::applyTransform(FourPoints bbox) {
257258
RasterFreeDeformer *freeDeformer =
258259
(RasterFreeDeformer *)tool->getFreeDeformer();
259260
if (!freeDeformer) return;
260-
freeDeformer->setNoAntialiasing(tool->getNoAntialiasingValue());
261+
freeDeformer->setNoAntialiasing(tool->getNoAntialiasingValue() |
262+
onFastDragging);
261263
freeDeformer->setPoints(realBbox.getP00(), realBbox.getP10(),
262264
realBbox.getP11(), realBbox.getP01());
263265
freeDeformer->deformImage();
@@ -361,6 +363,14 @@ void DragSelectionTool::RasterFreeDeformTool::leftButtonDrag(
361363
m_freeDeform->leftButtonDrag(pos, e);
362364
}
363365

366+
//-----------------------------------------------------------------------------
367+
368+
void DragSelectionTool::RasterFreeDeformTool::leftButtonUp(
369+
const TPointD &pos, const TMouseEvent &e) {
370+
m_freeDeform->leftButtonUp();
371+
RasterDeformTool::leftButtonUp(pos, e);
372+
}
373+
364374
//=============================================================================
365375
// RasterMoveSelectionTool
366376
//-----------------------------------------------------------------------------
@@ -404,8 +414,8 @@ DragSelectionTool::RasterScaleTool::RasterScaleTool(RasterSelectionTool *tool,
404414

405415
//-----------------------------------------------------------------------------
406416

407-
TPointD DragSelectionTool::RasterScaleTool::transform(int index,
408-
TPointD newPos) {
417+
TPointD DragSelectionTool::RasterScaleTool::transform(int index, TPointD newPos,
418+
bool onFastDragging) {
409419
SelectionTool *tool = getTool();
410420
TPointD scaleValue = tool->m_deformValues.m_scaleValue;
411421

@@ -419,7 +429,7 @@ TPointD DragSelectionTool::RasterScaleTool::transform(int index,
419429
if (!m_scale->scaleInCenter())
420430
tool->setCenter(m_scale->getNewCenter(index, startBboxs[0], scaleValue));
421431

422-
applyTransform(bbox);
432+
applyTransform(bbox, onFastDragging);
423433

424434
tool->setBBox(bbox);
425435

@@ -441,6 +451,14 @@ void DragSelectionTool::RasterScaleTool::leftButtonDrag(const TPointD &pos,
441451
m_scale->leftButtonDrag(pos, e);
442452
}
443453

454+
//-----------------------------------------------------------------------------
455+
456+
void DragSelectionTool::RasterScaleTool::leftButtonUp(const TPointD &pos,
457+
const TMouseEvent &e) {
458+
m_scale->leftButtonUp();
459+
RasterDeformTool::leftButtonUp(pos, e);
460+
}
461+
444462
TEnv::IntVar ModifySavebox("ModifySavebox", 0);
445463
TEnv::IntVar NoAntialiasing("NoAntialiasing", 0);
446464

@@ -605,9 +623,13 @@ void RasterSelectionTool::leftButtonDrag(const TPointD &pos,
605623
invalidate();
606624
return;
607625
}
626+
627+
double pixelSize = getPixelSize();
608628
if (m_dragTool) {
629+
// Even in Windows version deformation is processed at interval of 20msec.
630+
// (See SceneViewer::tabletEvent)
631+
if (e.isHighFrequent()) return;
609632
if (!m_rasterSelection.isEditable()) return;
610-
611633
m_dragTool->leftButtonDrag(pos, e);
612634
invalidate();
613635
return;
@@ -646,7 +668,6 @@ void RasterSelectionTool::leftButtonDrag(const TPointD &pos,
646668
return;
647669
}
648670

649-
double pixelSize = getPixelSize();
650671
TTool::Application *app = TTool::getApplication();
651672
if (!app || m_justSelected || !m_selecting ||
652673
tdistance2(pos, m_curPos) < 9.0 * pixelSize * pixelSize)

toonz/sources/tnztools/rasterselectiontool.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class RasterDeformTool : public DeformTool {
108108
//! It's true when use RasterFreeDeformer
109109
bool m_isFreeDeformer;
110110

111-
void applyTransform(FourPoints bbox) override;
111+
void applyTransform(FourPoints bbox, bool onFastDragging = false) override;
112112
void applyTransform(TAffine aff, bool modifyCenter);
113113
void addTransformUndo() override;
114114

@@ -143,6 +143,7 @@ class RasterFreeDeformTool final : public RasterDeformTool {
143143
public:
144144
RasterFreeDeformTool(RasterSelectionTool *tool);
145145
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override;
146+
void leftButtonUp(const TPointD &pos, const TMouseEvent &e) override;
146147
};
147148

148149
//=============================================================================
@@ -169,9 +170,11 @@ class RasterScaleTool final : public RasterDeformTool {
169170
public:
170171
RasterScaleTool(RasterSelectionTool *tool, ScaleType type);
171172
/*! Return scale value. */
172-
TPointD transform(int index, TPointD newPos) override;
173+
TPointD transform(int index, TPointD newPos,
174+
bool onFastDragging = false) override;
173175
void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override;
174176
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override;
177+
void leftButtonUp(const TPointD &pos, const TMouseEvent &e) override;
175178
};
176179

177180
} // namespace DragSelectionTool

toonz/sources/tnztools/selectiontool.cpp

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ TEnv::StringVar SelectionType("SelectionType", "Rectangular");
2222

2323
//-----------------------------------------------------------------------------
2424

25-
template <typename Tv, typename Tr, typename... Args> DragSelectionTool::DragTool* createNewDragTool(SelectionTool* st, Args... args) {
25+
template <typename Tv, typename Tr, typename... Args>
26+
DragSelectionTool::DragTool *createNewDragTool(SelectionTool *st,
27+
Args... args) {
2628
VectorSelectionTool *vst = dynamic_cast<VectorSelectionTool *>(st);
2729
RasterSelectionTool *rst = dynamic_cast<RasterSelectionTool *>(st);
2830
if (vst)
@@ -33,7 +35,8 @@ template <typename Tv, typename Tr, typename... Args> DragSelectionTool::DragToo
3335
}
3436

3537
DragSelectionTool::DragTool *createNewMoveSelectionTool(SelectionTool *st) {
36-
return createNewDragTool<VectorMoveSelectionTool, RasterMoveSelectionTool>(st);
38+
return createNewDragTool<VectorMoveSelectionTool, RasterMoveSelectionTool>(
39+
st);
3740
}
3841

3942
DragSelectionTool::DragTool *createNewRotationTool(SelectionTool *st) {
@@ -44,7 +47,8 @@ DragSelectionTool::DragTool *createNewFreeDeformTool(SelectionTool *st) {
4447
return createNewDragTool<VectorFreeDeformTool, RasterFreeDeformTool>(st);
4548
}
4649

47-
DragSelectionTool::DragTool *createNewScaleTool(SelectionTool *st, ScaleType type) {
50+
DragSelectionTool::DragTool *createNewScaleTool(SelectionTool *st,
51+
ScaleType type) {
4852
return createNewDragTool<VectorScaleTool, RasterScaleTool>(st, type);
4953
}
5054

@@ -476,10 +480,13 @@ void DragSelectionTool::FreeDeform::leftButtonDrag(const TPointD &pos,
476480
const TMouseEvent &e) {
477481
SelectionTool *tool = m_deformTool->getTool();
478482
TPointD delta = pos - m_deformTool->getCurPos();
479-
TPointD center = tool->getCenter();
480-
int index = tool->getSelectedPoint();
481-
FourPoints bbox = tool->getBBox();
482-
FourPoints newBbox = bbox;
483+
double pixelSize = tool->getPixelSize();
484+
bool isFastDragging = norm2(delta) > 9.0 * pixelSize * pixelSize;
485+
486+
TPointD center = tool->getCenter();
487+
int index = tool->getSelectedPoint();
488+
FourPoints bbox = tool->getBBox();
489+
FourPoints newBbox = bbox;
483490
if (index < 4)
484491
bbox.setPoint(index, bbox.getPoint(index) + delta);
485492
else {
@@ -491,7 +498,13 @@ void DragSelectionTool::FreeDeform::leftButtonDrag(const TPointD &pos,
491498
}
492499
tool->setBBox(bbox);
493500
m_deformTool->setCurPos(pos);
494-
m_deformTool->applyTransform(bbox);
501+
m_deformTool->applyTransform(bbox, isFastDragging);
502+
}
503+
504+
//-----------------------------------------------------------------------------
505+
506+
void DragSelectionTool::FreeDeform::leftButtonUp() {
507+
m_deformTool->applyTransform(m_deformTool->getTool()->getBBox());
495508
}
496509

497510
//=============================================================================
@@ -528,7 +541,7 @@ void DragSelectionTool::MoveSelection::leftButtonDrag(const TPointD &pos,
528541
m_lastDelta = TPointD(0, (curPos - m_firstPos).y);
529542
aff *= TTranslation(m_lastDelta);
530543
} else
531-
aff = TTranslation(delta);
544+
aff = TTranslation(delta);
532545
double factor = 1.0 / Stage::inch;
533546
m_deformTool->getTool()->m_deformValues.m_moveValue =
534547
m_deformTool->getTool()->m_deformValues.m_moveValue + factor * delta;
@@ -738,7 +751,7 @@ FourPoints DragSelectionTool::Scale::bboxScaleInCenter(
738751
if (areAlmostEqual(oldp.x, newPos.x, 1e-2) &&
739752
areAlmostEqual(oldp.y, newPos.y, 1e-2))
740753
return oldBbox;
741-
FourPoints bbox = bboxScale(index, oldBbox, newPos);
754+
FourPoints bbox = bboxScale(index, oldBbox, newPos);
742755
if (recomputeScaleValue) scaleValue = computeScaleValue(index, bbox);
743756
if (!m_scaleInCenter) return bbox;
744757
int symmetricIndex = m_deformTool->getSymmetricPointIndex(index);
@@ -788,20 +801,39 @@ void DragSelectionTool::Scale::leftButtonDrag(const TPointD &pos,
788801
if (!isBboxReset)
789802
delta = pos - m_deformTool->getCurPos();
790803
else
791-
delta = pos - m_deformTool->getStartPos();
804+
delta = pos - m_deformTool->getStartPos();
792805
int symmetricIndex = m_deformTool->getSymmetricPointIndex(selectedIndex);
793806
TPointD symmetricPoint = tool->getBBox().getPoint(symmetricIndex);
794807
TPointD v = normalize(point - symmetricPoint);
795808
delta = v * (v * delta);
796809
newPos = point + delta;
797810
}
798811
m_scaleInCenter = m_isAltPressed;
812+
813+
double pixelSize = tool->getPixelSize();
814+
bool isFastDragging =
815+
tdistance2(pos, m_deformTool->getCurPos()) > 9.0 * pixelSize * pixelSize;
816+
799817
m_deformTool->setCurPos(pos);
800-
TPointD scaleValue = m_deformTool->transform(selectedIndex, newPos);
818+
TPointD scaleValue =
819+
m_deformTool->transform(selectedIndex, newPos, isFastDragging);
801820
tool->m_deformValues.m_scaleValue = scaleValue;
802821
TTool::getApplication()->getCurrentTool()->notifyToolChanged();
803822
}
804823

824+
//-----------------------------------------------------------------------------
825+
826+
void DragSelectionTool::Scale::leftButtonUp() {
827+
SelectionTool *tool = m_deformTool->getTool();
828+
TPointD newPos = m_deformTool->getCurPos();
829+
int selectedIndex = tool->getSelectedPoint();
830+
if (m_isShiftPressed && m_type == ScaleType::GLOBAL) {
831+
newPos = tool->getBBox().getPoint(selectedIndex);
832+
}
833+
m_deformTool->transform(selectedIndex, newPos);
834+
TTool::getApplication()->getCurrentTool()->notifyToolChanged();
835+
}
836+
805837
//=============================================================================
806838
// SelectionTool
807839
//-----------------------------------------------------------------------------
@@ -1023,7 +1055,7 @@ void SelectionTool::updateAction(TPointD pos, const TMouseEvent &e) {
10231055
}
10241056
m_selectedPoint = NONE;
10251057
if ((isLevelType() || isSelectedFramesType()) && !isSameStyleType()) {
1026-
m_what = Inside;
1058+
m_what = Inside;
10271059
m_cursorId = ToolCursor::LevelSelectCursor;
10281060
}
10291061

@@ -1133,7 +1165,7 @@ bool SelectionTool::keyDown(QKeyEvent *event) {
11331165
if (!ti && !vi && !ri) return false;
11341166

11351167
std::unique_ptr<DragTool> dragTool(createNewMoveSelectionTool(this));
1136-
TAffine aff = TTranslation(delta);
1168+
TAffine aff = TTranslation(delta);
11371169
dragTool->transform(aff);
11381170
double factor = 1.0 / Stage::inch;
11391171
m_deformValues.m_moveValue += factor * delta;

toonz/sources/tnztools/selectiontool.h

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class FreeDeformer {
4848
/*! Helper function. */
4949
virtual void setPoints(const TPointD &p0, const TPointD &p1,
5050
const TPointD &p2, const TPointD &p3) = 0;
51-
virtual void deformImage() = 0;
51+
virtual void deformImage() = 0;
5252
};
5353

5454
//=============================================================================
@@ -152,15 +152,18 @@ class DragTool {
152152

153153
SelectionTool *getTool() const { return m_tool; }
154154

155-
virtual void transform(TAffine aff, double angle){}
156-
virtual void transform(TAffine aff){}
157-
virtual TPointD transform(int index, TPointD newPos) { return TPointD(); }
158-
virtual void addTransformUndo(){}
155+
virtual void transform(TAffine aff, double angle) {}
156+
virtual void transform(TAffine aff) {}
157+
virtual TPointD transform(int index, TPointD newPos,
158+
bool onFastDragging = false) {
159+
return TPointD();
160+
}
161+
virtual void addTransformUndo() {}
159162

160163
virtual void leftButtonDown(const TPointD &pos, const TMouseEvent &) = 0;
161164
virtual void leftButtonDrag(const TPointD &pos, const TMouseEvent &) = 0;
162165
virtual void leftButtonUp(const TPointD &pos, const TMouseEvent &) = 0;
163-
virtual void draw() = 0;
166+
virtual void draw() = 0;
164167
};
165168

166169
//=============================================================================
@@ -177,7 +180,7 @@ class DeformTool : public DragTool {
177180
public:
178181
DeformTool(SelectionTool *tool);
179182

180-
virtual void applyTransform(FourPoints bbox) = 0;
183+
virtual void applyTransform(FourPoints bbox, bool onFastDragging = false) = 0;
181184
virtual void applyTransform(TAffine aff){};
182185

183186
void addTransformUndo() override = 0;
@@ -234,6 +237,7 @@ class FreeDeform {
234237
public:
235238
FreeDeform(DeformTool *deformTool);
236239
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e);
240+
void leftButtonUp();
237241
};
238242

239243
//=============================================================================
@@ -254,11 +258,7 @@ class MoveSelection {
254258
// Scale
255259
//-----------------------------------------------------------------------------
256260

257-
enum class ScaleType {
258-
GLOBAL = 0,
259-
HORIZONTAL,
260-
VERTICAL
261-
};
261+
enum class ScaleType { GLOBAL = 0, HORIZONTAL, VERTICAL };
262262

263263
class Scale {
264264
TPointD m_startCenter;
@@ -270,7 +270,6 @@ class Scale {
270270
DeformTool *m_deformTool;
271271

272272
public:
273-
274273
ScaleType m_type;
275274
Scale(DeformTool *deformTool, ScaleType type);
276275

@@ -301,12 +300,13 @@ compute scaleValue. */
301300

302301
void leftButtonDown(const TPointD &pos, const TMouseEvent &e);
303302
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e);
303+
void leftButtonUp();
304304

305305
std::vector<FourPoints> getStartBboxs() const { return m_startBboxs; }
306306
TPointD getStartCenter() const { return m_startCenter; }
307307
bool scaleInCenter() const { return m_scaleInCenter; }
308308
};
309-
};
309+
}; // namespace DragSelectionTool
310310

311311
//=============================================================================
312312
// Utility
@@ -315,7 +315,8 @@ compute scaleValue. */
315315
DragSelectionTool::DragTool *createNewMoveSelectionTool(SelectionTool *st);
316316
DragSelectionTool::DragTool *createNewRotationTool(SelectionTool *st);
317317
DragSelectionTool::DragTool *createNewFreeDeformTool(SelectionTool *st);
318-
DragSelectionTool::DragTool *createNewScaleTool(SelectionTool *st, DragSelectionTool::ScaleType type);
318+
DragSelectionTool::DragTool *createNewScaleTool(
319+
SelectionTool *st, DragSelectionTool::ScaleType type);
319320

320321
//=============================================================================
321322
// SelectionTool
@@ -420,7 +421,7 @@ class SelectionTool : public TTool, public TSelection::View {
420421
int index = 0);
421422

422423
FreeDeformer *getFreeDeformer(int index = 0) const;
423-
virtual void setNewFreeDeformer() = 0;
424+
virtual void setNewFreeDeformer() = 0;
424425
void clearDeformers();
425426

426427
int getSelectedPoint() const { return m_selectedPoint; }

0 commit comments

Comments
 (0)