public Operation OnMouseMove(MouseButtons button, PointF point, OperationType op, CompositionCanvasControl canvas) { if (button == MouseButtons.Right) { if (!prevPoint.IsEmpty) { Pan(point.X - prevPoint.X, point.Y - prevPoint.Y); } prevPoint = point; // return null; } nearestJoint = null; SegmentMeshInfo transform; switch (op) { case OperationType.Skeleton: if (editingJoint != null) { if (button == MouseButtons.Left) { editingJoint.position = canvas.PointToWorld(new Point((int)point.X, (int)point.Y)); } } else { nearestJoint = GetNearestJoint(an, point, 20, canvas); } if (editingJoint == null && nearestJoint == null) { if (button == MouseButtons.Left) { // 全体を動かす var src = canvas.PointToWorld(new Point((int)prevPoint.X, (int)prevPoint.Y)); var dst = canvas.PointToWorld(new Point((int)point.X, (int)point.Y)); foreach (var j in an.joints) { j.position = new PointF(j.position.X + dst.X - src.X, j.position.Y + dst.Y - src.Y); } prevPoint = point; } } // ボーンを動かしたらセグメントも調整 if (button == MouseButtons.Left) { if (editingUnit != null) { foreach (var seg in editingUnit.segments) { Fitting(seg); UpdateSkeletalControlPoints(seg); FlushDeformation(seg); // ConectSegments(seg); } } } break; case OperationType.Segment: if (button == MouseButtons.Left) { transform = GetMeshInfo(editingSegment); if (transform == null) { break; } var src = canvas.PointToWorld(prevPoint); var dst = canvas.PointToWorld(point); transform.Translate(dst.X - src.X, dst.Y - src.Y); prevPoint = point; } break; case OperationType.ControlPoint: transform = GetMeshInfo(editingSegment); if (transform == null || transform.arap == null) { break; } if (button != MouseButtons.Left) { nearestControlPoint = GetNearestControlPoint(transform.arap.controlPoints, point, 20, canvas); break; } nearestControlPoint = null; if (editingControlPoint != null) { var pt = canvas.PointToWorld(point); transform.arap.TranslateControlPoint(editingControlPoint.Value, pt, true); editingControlPoint = pt; } break; } return(null); }
public Operation OnMouseUp(MouseButtons button, Point point, OperationType op, CompositionCanvasControl canvas) { if (button == MouseButtons.Right) { if (!prevPoint.IsEmpty) { Pan(point.X - prevPoint.X, point.Y - prevPoint.Y); } prevPoint = point; // return null; } SegmentMeshInfo transform; switch (op) { case OperationType.Skeleton: if (editingJoint != null) { editingJoint.position = canvas.PointToWorld(new Point((int)point.X, (int)point.Y)); } editingJoint = null; if (editingJoint == null && nearestJoint == null) { if (button == MouseButtons.Left) { prevPoint = point; } } break; case OperationType.Segment: if (button == MouseButtons.Left) { prevPoint = point; } break; case OperationType.ControlPoint: if (button != MouseButtons.Left) { break; } if (FMath.SqDistance(prevPoint, point) <= 1) { transform = GetMeshInfo(editingSegment); if (transform == null || transform.arap == null) { break; } // 既存の制御点をクリックしたら消す if (editingControlPoint == null || !editingControlPoint.HasValue) { break; } transform.arap.RemoveControlPoint(editingControlPoint.Value); transform.arap.EndDeformation(); transform.arap.BeginDeformation(); } editingControlPoint = null; break; } return(null); }
// CompositionCanvasControlを引数に持つのはMVCに反する・・・ // でも、画面上のオブジェクトとの当たり判定に必要 public Operation OnMouseDown(MouseButtons button, PointF point, OperationType op, CompositionCanvasControl canvas) { if (button == MouseButtons.Right) { prevPoint = point; // return null; } editingJoint = null; // editingSegment = null; // editingControlPoint = null; switch (op) { case OperationType.Skeleton: if (canvas == null || canvas.IsDisposed) { break; } editingJoint = GetNearestJoint(an, point, 20, canvas); if (editingJoint == null && nearestJoint == null) { if (button == MouseButtons.Left) { prevPoint = point; } } break; case OperationType.Segment: if (editingUnit == null) { break; } editingSegment = GetSegment(editingUnit.segments, editingUnit.transformDict, canvas.PointToWorld(point)); if (button == MouseButtons.Left) { prevPoint = point; } break; case OperationType.ControlPoint: if (button != MouseButtons.Left) { break; } editingControlPoint = null; var transform = GetMeshInfo(editingSegment); if (transform == null || transform.arap == null) { break; } var nearest = GetNearestControlPoint(transform.arap.controlPoints, point, 20, canvas); if (nearest == null) { var pt = canvas.PointToWorld(point); transform.arap.AddControlPoint(pt, transform.Invert(pt)); transform.arap.EndDeformation(); transform.arap.BeginDeformation(); } else { editingControlPoint = nearest; prevPoint = point; } break; } return(null); }