예제 #1
0
 public FadeLabel()
 {
     _easing = Easing.FromType(EasingType.Sinusoidal, EasingDirection.Out);
     _timer = new Timer
     {
         Enabled = false,
         Interval = 50
     };
     _timer.Tick += (s, e) => Tick();
     _remaining = 0;
 }
 public Camera3DViewportListener(Viewport3D vp)
 {
     LastKnownX = 0;
     LastKnownY = 0;
     PositionKnown = false;
     FreeLook = false;
     FreeLookToggle = false;
     CursorVisible = true;
     Focus = false;
     Viewport = vp;
     Camera = vp.Camera;
     _downKeys = new List<Keys>();
     _downMillis = _lastMillis = 0;
     _easing = Easing.FromType(EasingType.Sinusoidal, EasingDirection.Out);
 }
예제 #3
0
 /// <summary>
 /// Sew this displacement to others.
 /// </summary>
 /// <param name="displacements">The displacements to sew</param>
 /// <param name="sewType"></param>
 /// <param name="numPointsFromEdgeToMove"></param>
 /// <param name="easingFunction"></param>
 public void SewTo(IEnumerable<Displacement> displacements, DisplacementSewType sewType,
     int numPointsFromEdgeToMove, Easing easingFunction)
 {
 }
예제 #4
0
        private void ApplyEffect(decimal distance, Coordinate normal,
            DisplacementPoint point, GeometryControl.Effect effect, GeometryControl.Brush brush,
            decimal spatialRadius, int pointSize, Easing softEdgeFunc)
        {
            var disps = new List<Displacement>();
            //CollectJoinedDisplacements(disps, point.Parent, Selection.GetSelectedFaces().OfType<Displacement>().ToList());
            disps.AddRange(Document.Selection.GetSelectedFaces().OfType<Displacement>());
            var list = new List<Tuple<DisplacementPoint, decimal>>();

            if (brush == GeometryControl.Brush.Point)
            {
                // If we're in point brush mode, select the points by location in the displacement grid
                list.Add(Tuple.Create(_currentPoint, 1m));
                var ratio = 1m / pointSize;
                var cx = _currentPoint.XIndex;
                var cy = _currentPoint.YIndex;
                for (var i = 1; i < pointSize; i++)
                {
                    var edge = 1 - softEdgeFunc.Evaluate(ratio * i);// softEdge ? 1 - (ratio * i) : 1;

                    var points = new List<DisplacementPoint>();
                    for (var j = -i; j <= i; j++)
                    {
                        // Get the points in a box around the point, distance i
                       // points.Add(disp.GetPoint(cx - i, cy + j));
                       // points.Add(disp.GetPoint(cx + i, cy + j));
                       // if (j == -i || j == i) continue;
                       // points.Add(disp.GetPoint(cx + j, cy - i));
                       // points.Add(disp.GetPoint(cx + j, cy + i));
                    }

                    list.AddRange(points.Where(x => x != null).Select(x => Tuple.Create(x, edge)));
                }
            }
            else if (brush == GeometryControl.Brush.Spatial)
            {
                // For spatial brush mode, select the points by distance from the current point
                var points = disps.SelectMany(x => x.GetPoints())
                    .Select(x => new
                                     {
                                         Point = x,
                                         Distance = (x.Location - _currentPoint.Location).VectorMagnitude()
                                     })
                    .Where(x => x.Distance <= spatialRadius);
                // list.AddRange(points.Select(x => Tuple.Create(x.Point, softEdge ? (spatialRadius - x.Distance) / spatialRadius : 1)));
                list.AddRange(points.Select(x => Tuple.Create(x.Point, 1 - softEdgeFunc.Evaluate(1 - (spatialRadius - x.Distance) / spatialRadius))));
            }

            if (!list.Any()) return;

            switch (effect)
            {
                case GeometryControl.Effect.RelativeDistance:
                    list.ForEach(
                        x => x.Item1.CurrentPosition.Location +=
                             normal * (distance * x.Item2));
                    break;
                case GeometryControl.Effect.AbsoluteDistance:
                    list.ForEach(
                        x => x.Item1.CurrentPosition.Location =
                             x.Item1.InitialPosition + (x.Item1.Parent.Plane.Normal * distance));
                    break;
                case GeometryControl.Effect.SmoothPoints:
                    var avg = list.Select(x => x.Item1.Location).Aggregate(Coordinate.Zero, (x, y) => x + y) / list.Count;
                    foreach (var pt in list)
                    {
                        var dist = (pt.Item1.Location - avg).Dot(normal);
                        var mult = -Math.Sign(dist) * Math.Min(Math.Abs(dist), Math.Abs(distance));
                        pt.Item1.CurrentPosition.Location += mult * pt.Item2 * normal;
                    }
                    break;
                default:
                    throw new ArgumentOutOfRangeException("effect");
            }
        }