1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * This file is part of openfx-supportext <https://github.com/devernay/openfx-supportext>,
4 * Copyright (C) 2013-2018 INRIA
5 *
6 * openfx-supportext is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * openfx-supportext is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with openfx-supportext. If not, see <http://www.gnu.org/licenses/gpl-2.0.html>
18 * ***** END LICENSE BLOCK ***** */
19
20 /*
21 * OFX TransformInteract.
22 */
23
24 #ifndef openfx_supportext_ofxsTransformInteract_h
25 #define openfx_supportext_ofxsTransformInteract_h
26
27 #include <cmath>
28
29 #include "ofxsImageEffect.h"
30 #include "ofxsMacros.h"
31
32 #define kParamTransformTranslate "transformTranslate"
33 #define kParamTransformTranslateLabel "Translate"
34 #define kParamTransformTranslateHint "Translation along the x and y axes in pixels. Can also be adjusted by clicking and dragging the center handle in the Viewer."
35 #define kParamTransformRotate "transformRotate"
36 #define kParamTransformRotateLabel "Rotate"
37 #define kParamTransformRotateHint "Rotation angle in degrees around the Center. Can also be adjusted by clicking and dragging the rotation bar in the Viewer."
38 #define kParamTransformScale "transformScale"
39 #define kParamTransformScaleLabel "Scale"
40 #define kParamTransformScaleHint "Scale factor along the x and y axes. Can also be adjusted by clicking and dragging the outer circle or the diameter handles in the Viewer."
41 #define kParamTransformScaleUniform "transformScaleUniform"
42 #define kParamTransformScaleUniformLabel "Uniform"
43 #define kParamTransformScaleUniformHint "Use the X scale for both directions"
44 #define kParamTransformSkewX "transformSkewX"
45 #define kParamTransformSkewXLabel "Skew X"
46 #define kParamTransformSkewXHint "Skew along the x axis. Can also be adjusted by clicking and dragging the skew bar in the Viewer."
47 #define kParamTransformSkewY "transformSkewY"
48 #define kParamTransformSkewYLabel "Skew Y"
49 #define kParamTransformSkewYHint "Skew along the y axis."
50 #define kParamTransformSkewOrder "transformSkewOrder"
51 #define kParamTransformSkewOrderLabel "Skew Order"
52 #define kParamTransformSkewOrderHint "The order in which skew transforms are applied: X then Y, or Y then X."
53 #define kParamTransformAmount "transformAmount"
54 #define kParamTransformAmountLabel "Amount"
55 #define kParamTransformAmountHint "Amount of transform to apply. 0 means the transform is identity, 1 means to apply the full transform."
56 #define kParamTransformCenter "transformCenter"
57 #define kParamTransformCenterLabel "Center"
58 #define kParamTransformCenterHint "Center of rotation and scale."
59 #define kParamTransformCenterChanged "transformCenterChanged"
60 #define kParamTransformResetCenter "transformResetCenter"
61 #define kParamTransformResetCenterLabel "Reset Center"
62 #define kParamTransformResetCenterHint "Reset the position of the center to the center of the input region of definition"
63 #define kParamTransformInteractOpen "transformInteractOpen"
64 #define kParamTransformInteractOpenLabel "Show Interact"
65 #define kParamTransformInteractOpenHint "If checked, the transform interact is displayed over the image."
66 #define kParamTransformInteractive "transformInteractive"
67 #define kParamTransformInteractiveLabel "Interactive Update"
68 #define kParamTransformInteractiveHint "If checked, update the parameter values during interaction with the image viewer, else update the values when pen is released."
69
70 // old parameter names (Transform DirBlur and GodRays only)
71 #define kParamTransformTranslateOld "translate"
72 #define kParamTransformRotateOld "rotate"
73 #define kParamTransformScaleOld "scale"
74 #define kParamTransformScaleUniformOld "uniform"
75 #define kParamTransformSkewXOld "skewX"
76 #define kParamTransformSkewYOld "skewY"
77 #define kParamTransformSkewOrderOld "skewOrder"
78 #define kParamTransformCenterOld "center"
79 #define kParamTransformResetCenterOld "resetCenter"
80 #define kParamTransformInteractiveOld "interactive"
81
82 namespace OFX {
83 inline void
ofxsTransformGetScale(const OfxPointD & scaleParam,bool scaleUniform,OfxPointD * scale)84 ofxsTransformGetScale(const OfxPointD &scaleParam,
85 bool scaleUniform,
86 OfxPointD* scale)
87 {
88 const double SCALE_MIN = 0.0001;
89
90 scale->x = scaleParam.x;
91 if (std::fabs(scale->x) < SCALE_MIN) {
92 scale->x = (scale->x >= 0) ? SCALE_MIN : -SCALE_MIN;
93 }
94 if (scaleUniform) {
95 scale->y = scaleParam.x;
96 } else {
97 scale->y = scaleParam.y;
98 }
99 if (std::fabs(scale->y) < SCALE_MIN) {
100 scale->y = (scale->y >= 0) ? SCALE_MIN : -SCALE_MIN;
101 }
102 }
103
104 /// add Transform params. page and group are optional
105 void ofxsTransformDescribeParams(OFX::ImageEffectDescriptor &desc, OFX::PageParamDescriptor *page, OFX::GroupParamDescriptor *group, bool isOpen, bool oldParams, bool hasAmount, bool noTranslate);
106
107 class TransformInteractHelper
108 : private OFX::InteractAbstract
109 {
110 protected:
111 enum DrawStateEnum
112 {
113 eInActive = 0, //< nothing happening
114 eCircleHovered, //< the scale circle is hovered
115 eLeftPointHovered, //< the left point of the circle is hovered
116 eRightPointHovered, //< the right point of the circle is hovered
117 eBottomPointHovered, //< the bottom point of the circle is hovered
118 eTopPointHovered, //< the top point of the circle is hovered
119 eCenterPointHovered, //< the center point of the circle is hovered
120 eRotationBarHovered, //< the rotation bar is hovered
121 eSkewXBarHoverered, //< the skew bar is hovered
122 eSkewYBarHoverered //< the skew bar is hovered
123 };
124
125 enum MouseStateEnum
126 {
127 eReleased = 0,
128 eDraggingCircle,
129 eDraggingLeftPoint,
130 eDraggingRightPoint,
131 eDraggingTopPoint,
132 eDraggingBottomPoint,
133 eDraggingTranslation,
134 eDraggingCenter,
135 eDraggingRotationBar,
136 eDraggingSkewXBar,
137 eDraggingSkewYBar
138 };
139
140 enum OrientationEnum
141 {
142 eOrientationAllDirections = 0,
143 eOrientationNotSet,
144 eOrientationHorizontal,
145 eOrientationVertical
146 };
147
148 DrawStateEnum _drawState;
149 MouseStateEnum _mouseState;
150 int _modifierStateCtrl;
151 int _modifierStateShift;
152 OrientationEnum _orientation;
153 ImageEffect* _effect;
154 Interact* _interact;
155 OfxPointD _lastMousePos;
156 OfxPointD _centerDrag;
157 OfxPointD _translateDrag;
158 OfxPointD _scaleParamDrag;
159 bool _scaleUniformDrag;
160 double _rotateDrag;
161 double _skewXDrag;
162 double _skewYDrag;
163 int _skewOrderDrag;
164 bool _invertedDrag;
165 bool _interactiveDrag;
166
167 public:
168 TransformInteractHelper(OFX::ImageEffect* effect, OFX::Interact* interact, bool oldParams = false);
169
170 /** @brief virtual destructor */
~TransformInteractHelper()171 virtual ~TransformInteractHelper()
172 {
173 // fetched clips and params are owned and deleted by the ImageEffect and its ParamSet
174 }
175
176 // overridden functions from OFX::Interact to do things
177 virtual bool draw(const OFX::DrawArgs &args) OVERRIDE;
178 virtual bool penMotion(const OFX::PenArgs &args) OVERRIDE;
179 virtual bool penDown(const OFX::PenArgs &args) OVERRIDE;
180 virtual bool penUp(const OFX::PenArgs &args) OVERRIDE;
181 virtual bool keyDown(const OFX::KeyArgs &args) OVERRIDE;
182 virtual bool keyUp(const OFX::KeyArgs &args) OVERRIDE;
keyRepeat(const KeyArgs &)183 virtual bool keyRepeat(const KeyArgs & /*args*/) OVERRIDE { return false; }
184
gainFocus(const FocusArgs &)185 virtual void gainFocus(const FocusArgs & /*args*/) OVERRIDE {}
186
187 virtual void loseFocus(const FocusArgs &args) OVERRIDE;
188
189 private:
190 // NON-GENERIC
191 OFX::Double2DParam* _translate;
192 OFX::DoubleParam* _rotate;
193 OFX::Double2DParam* _scale;
194 OFX::BooleanParam* _scaleUniform;
195 OFX::DoubleParam* _skewX;
196 OFX::DoubleParam* _skewY;
197 OFX::ChoiceParam* _skewOrder;
198 OFX::Double2DParam* _center;
199 OFX::BooleanParam* _invert;
200 OFX::BooleanParam* _interactOpen;
201 OFX::BooleanParam* _interactive;
202 };
203
204 typedef OverlayInteractFromHelper<TransformInteractHelper> TransformInteract;
205
206 class TransformOverlayDescriptor
207 : public DefaultEffectOverlayDescriptor<TransformOverlayDescriptor, TransformInteract>
208 {
209 };
210
211 class TransformInteractHelperOldParams
212 : public TransformInteractHelper
213 {
214 public:
TransformInteractHelperOldParams(OFX::ImageEffect * effect,OFX::Interact * interact)215 TransformInteractHelperOldParams(OFX::ImageEffect* effect,
216 OFX::Interact* interact)
217 : TransformInteractHelper(effect, interact, true) {}
218 };
219
220 typedef OverlayInteractFromHelper<TransformInteractHelperOldParams> TransformInteractOldParams;
221
222 class TransformOverlayDescriptorOldParams
223 : public DefaultEffectOverlayDescriptor<TransformOverlayDescriptorOldParams, TransformInteractOldParams>
224 {
225 };
226 } // namespace OFX
227 #endif /* defined(openfx_supportext_ofxsTransformInteract_h) */
228