spin blur fx gadget: lock AR / angle with modifier keys
This commit is contained in:
parent
c580b5c484
commit
8a94219dfd
1 changed files with 54 additions and 62 deletions
|
@ -53,27 +53,21 @@ void drawSpinField(const TRectD geom, const TPointD center,
|
|||
}
|
||||
// obtain the nearest and the furthest pos inside the geom
|
||||
TPointD nearestPos;
|
||||
nearestPos.x = (center.x <= geom.x0)
|
||||
? geom.x0
|
||||
: (center.x >= geom.x1) ? geom.x1 : center.x;
|
||||
nearestPos.y = (center.y <= geom.y0)
|
||||
? geom.y0
|
||||
: (center.y >= geom.y1) ? geom.y1 : center.y;
|
||||
nearestPos.x = (center.x <= geom.x0) ? geom.x0
|
||||
: (center.x >= geom.x1) ? geom.x1
|
||||
: center.x;
|
||||
nearestPos.y = (center.y <= geom.y0) ? geom.y0
|
||||
: (center.y >= geom.y1) ? geom.y1
|
||||
: center.y;
|
||||
double minDist = norm(nearestPos - center);
|
||||
TPointD farthestPos;
|
||||
farthestPos.x = (center.x <= geom.x0)
|
||||
? geom.x1
|
||||
: (center.x >= geom.x1)
|
||||
? geom.x0
|
||||
: ((center.x - geom.x0) >= (geom.x1 - center.x))
|
||||
? geom.x0
|
||||
farthestPos.x = (center.x <= geom.x0) ? geom.x1
|
||||
: (center.x >= geom.x1) ? geom.x0
|
||||
: ((center.x - geom.x0) >= (geom.x1 - center.x)) ? geom.x0
|
||||
: geom.x1;
|
||||
farthestPos.y = (center.y <= geom.y0)
|
||||
? geom.y1
|
||||
: (center.y >= geom.y1)
|
||||
? geom.y0
|
||||
: ((center.y - geom.y0) >= (geom.y1 - center.y))
|
||||
? geom.y0
|
||||
farthestPos.y = (center.y <= geom.y0) ? geom.y1
|
||||
: (center.y >= geom.y1) ? geom.y0
|
||||
: ((center.y - geom.y0) >= (geom.y1 - center.y)) ? geom.y0
|
||||
: geom.y1;
|
||||
double maxDist = norm(farthestPos - center);
|
||||
double scale[2] = {1.0, 1.0};
|
||||
|
@ -124,27 +118,21 @@ void drawRadialField(const TRectD geom, const TPointD center,
|
|||
const double pivot) {
|
||||
// obtain the nearest and the furthest pos inside the geom
|
||||
TPointD nearestPos;
|
||||
nearestPos.x = (center.x <= geom.x0)
|
||||
? geom.x0
|
||||
: (center.x >= geom.x1) ? geom.x1 : center.x;
|
||||
nearestPos.y = (center.y <= geom.y0)
|
||||
? geom.y0
|
||||
: (center.y >= geom.y1) ? geom.y1 : center.y;
|
||||
nearestPos.x = (center.x <= geom.x0) ? geom.x0
|
||||
: (center.x >= geom.x1) ? geom.x1
|
||||
: center.x;
|
||||
nearestPos.y = (center.y <= geom.y0) ? geom.y0
|
||||
: (center.y >= geom.y1) ? geom.y1
|
||||
: center.y;
|
||||
double minDist = norm(nearestPos - center);
|
||||
TPointD farthestPos;
|
||||
farthestPos.x = (center.x <= geom.x0)
|
||||
? geom.x1
|
||||
: (center.x >= geom.x1)
|
||||
? geom.x0
|
||||
: ((center.x - geom.x0) >= (geom.x1 - center.x))
|
||||
? geom.x0
|
||||
farthestPos.x = (center.x <= geom.x0) ? geom.x1
|
||||
: (center.x >= geom.x1) ? geom.x0
|
||||
: ((center.x - geom.x0) >= (geom.x1 - center.x)) ? geom.x0
|
||||
: geom.x1;
|
||||
farthestPos.y = (center.y <= geom.y0)
|
||||
? geom.y1
|
||||
: (center.y >= geom.y1)
|
||||
? geom.y0
|
||||
: ((center.y - geom.y0) >= (geom.y1 - center.y))
|
||||
? geom.y0
|
||||
farthestPos.y = (center.y <= geom.y0) ? geom.y1
|
||||
: (center.y >= geom.y1) ? geom.y0
|
||||
: ((center.y - geom.y0) >= (geom.y1 - center.y)) ? geom.y0
|
||||
: geom.y1;
|
||||
double maxDist = norm(farthestPos - center);
|
||||
double scale[2] = {1.0, 1.0};
|
||||
|
@ -2318,7 +2306,9 @@ void EllipseFxGadget::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) {
|
|||
TPointD old_v = m_pos - center;
|
||||
TPointD new_v = pos - center;
|
||||
if (old_v == TPointD() || new_v == TPointD()) return;
|
||||
|
||||
// AR
|
||||
if (!e.isShiftPressed()) { // lock AR when shift is pressed
|
||||
double aspect_ratio = getValue(m_aspect_ratio);
|
||||
double pre_axisLength = 2.0 * aspect_ratio / (aspect_ratio + 1.0);
|
||||
double ratio = norm(new_v) / norm(old_v);
|
||||
|
@ -2330,8 +2320,10 @@ void EllipseFxGadget::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) {
|
|||
else if (new_ar > 10.0)
|
||||
new_ar = 10.0;
|
||||
setValue(m_aspect_ratio, new_ar);
|
||||
}
|
||||
|
||||
// angle
|
||||
if (!e.isCtrlPressed()) { // lock angle when ctrl is pressed
|
||||
double angle = getValue(m_angle);
|
||||
double d_angle =
|
||||
std::atan2(new_v.y, new_v.x) - std::atan2(old_v.y, old_v.x);
|
||||
|
@ -2341,6 +2333,7 @@ void EllipseFxGadget::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) {
|
|||
else if (new_angle > 180.0)
|
||||
new_angle -= 360.0;
|
||||
setValue(m_angle, new_angle);
|
||||
}
|
||||
|
||||
m_pos = pos;
|
||||
} else if (m_handle == Twist) {
|
||||
|
@ -2709,4 +2702,3 @@ TRectD FxGadgetController::getCameraRect() {
|
|||
return (m_tool->getViewer()) ? m_tool->getViewer()->getCameraRect()
|
||||
: TRectD();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue