spin blur fx gadget: lock AR / angle with modifier keys

This commit is contained in:
shun-iwasawa 2022-04-19 17:53:31 +09:00 committed by manongjohn
parent c580b5c484
commit 8a94219dfd

View file

@ -53,27 +53,21 @@ void drawSpinField(const TRectD geom, const TPointD center,
} }
// obtain the nearest and the furthest pos inside the geom // obtain the nearest and the furthest pos inside the geom
TPointD nearestPos; TPointD nearestPos;
nearestPos.x = (center.x <= geom.x0) nearestPos.x = (center.x <= geom.x0) ? geom.x0
? geom.x0 : (center.x >= geom.x1) ? geom.x1
: (center.x >= geom.x1) ? geom.x1 : center.x; : center.x;
nearestPos.y = (center.y <= geom.y0) nearestPos.y = (center.y <= geom.y0) ? geom.y0
? geom.y0 : (center.y >= geom.y1) ? geom.y1
: (center.y >= geom.y1) ? geom.y1 : center.y; : center.y;
double minDist = norm(nearestPos - center); double minDist = norm(nearestPos - center);
TPointD farthestPos; TPointD farthestPos;
farthestPos.x = (center.x <= geom.x0) farthestPos.x = (center.x <= geom.x0) ? geom.x1
? geom.x1 : (center.x >= geom.x1) ? geom.x0
: (center.x >= geom.x1) : ((center.x - geom.x0) >= (geom.x1 - center.x)) ? geom.x0
? geom.x0
: ((center.x - geom.x0) >= (geom.x1 - center.x))
? geom.x0
: geom.x1; : geom.x1;
farthestPos.y = (center.y <= geom.y0) farthestPos.y = (center.y <= geom.y0) ? geom.y1
? geom.y1 : (center.y >= geom.y1) ? geom.y0
: (center.y >= geom.y1) : ((center.y - geom.y0) >= (geom.y1 - center.y)) ? geom.y0
? geom.y0
: ((center.y - geom.y0) >= (geom.y1 - center.y))
? geom.y0
: geom.y1; : geom.y1;
double maxDist = norm(farthestPos - center); double maxDist = norm(farthestPos - center);
double scale[2] = {1.0, 1.0}; double scale[2] = {1.0, 1.0};
@ -124,27 +118,21 @@ void drawRadialField(const TRectD geom, const TPointD center,
const double pivot) { const double pivot) {
// obtain the nearest and the furthest pos inside the geom // obtain the nearest and the furthest pos inside the geom
TPointD nearestPos; TPointD nearestPos;
nearestPos.x = (center.x <= geom.x0) nearestPos.x = (center.x <= geom.x0) ? geom.x0
? geom.x0 : (center.x >= geom.x1) ? geom.x1
: (center.x >= geom.x1) ? geom.x1 : center.x; : center.x;
nearestPos.y = (center.y <= geom.y0) nearestPos.y = (center.y <= geom.y0) ? geom.y0
? geom.y0 : (center.y >= geom.y1) ? geom.y1
: (center.y >= geom.y1) ? geom.y1 : center.y; : center.y;
double minDist = norm(nearestPos - center); double minDist = norm(nearestPos - center);
TPointD farthestPos; TPointD farthestPos;
farthestPos.x = (center.x <= geom.x0) farthestPos.x = (center.x <= geom.x0) ? geom.x1
? geom.x1 : (center.x >= geom.x1) ? geom.x0
: (center.x >= geom.x1) : ((center.x - geom.x0) >= (geom.x1 - center.x)) ? geom.x0
? geom.x0
: ((center.x - geom.x0) >= (geom.x1 - center.x))
? geom.x0
: geom.x1; : geom.x1;
farthestPos.y = (center.y <= geom.y0) farthestPos.y = (center.y <= geom.y0) ? geom.y1
? geom.y1 : (center.y >= geom.y1) ? geom.y0
: (center.y >= geom.y1) : ((center.y - geom.y0) >= (geom.y1 - center.y)) ? geom.y0
? geom.y0
: ((center.y - geom.y0) >= (geom.y1 - center.y))
? geom.y0
: geom.y1; : geom.y1;
double maxDist = norm(farthestPos - center); double maxDist = norm(farthestPos - center);
double scale[2] = {1.0, 1.0}; 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 old_v = m_pos - center;
TPointD new_v = pos - center; TPointD new_v = pos - center;
if (old_v == TPointD() || new_v == TPointD()) return; if (old_v == TPointD() || new_v == TPointD()) return;
// AR // AR
if (!e.isShiftPressed()) { // lock AR when shift is pressed
double aspect_ratio = getValue(m_aspect_ratio); double aspect_ratio = getValue(m_aspect_ratio);
double pre_axisLength = 2.0 * aspect_ratio / (aspect_ratio + 1.0); double pre_axisLength = 2.0 * aspect_ratio / (aspect_ratio + 1.0);
double ratio = norm(new_v) / norm(old_v); 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) else if (new_ar > 10.0)
new_ar = 10.0; new_ar = 10.0;
setValue(m_aspect_ratio, new_ar); setValue(m_aspect_ratio, new_ar);
}
// angle // angle
if (!e.isCtrlPressed()) { // lock angle when ctrl is pressed
double angle = getValue(m_angle); double angle = getValue(m_angle);
double d_angle = double d_angle =
std::atan2(new_v.y, new_v.x) - std::atan2(old_v.y, old_v.x); 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) else if (new_angle > 180.0)
new_angle -= 360.0; new_angle -= 360.0;
setValue(m_angle, new_angle); setValue(m_angle, new_angle);
}
m_pos = pos; m_pos = pos;
} else if (m_handle == Twist) { } else if (m_handle == Twist) {
@ -2709,4 +2702,3 @@ TRectD FxGadgetController::getCameraRect() {
return (m_tool->getViewer()) ? m_tool->getViewer()->getCameraRect() return (m_tool->getViewer()) ? m_tool->getViewer()->getCameraRect()
: TRectD(); : TRectD();
} }