public List <Slice2D> Update(Vector2D position, float timer) { List <Slice2D> result = new List <Slice2D>(); foreach (Slicer2D slicer in Slicer2D.GetList()) { SlicerTrailObject trail = GetSlicerTrail(slicer); if (trail == null) { trail = new SlicerTrailObject(); trail.slicer = slicer; trailList.Add(trail); } if (trail.lastPosition != null) { if (Vector2D.Distance(trail.lastPosition, position) > 0.05f) { trail.pointsList.Add(new TrailPoint(position, timer)); } } else { trail.pointsList.Add(new TrailPoint(position, timer)); } if (trail.pointsList.Count > 1) { foreach (TrailPoint trailPoint in new List <TrailPoint>(trail.pointsList)) { if (trailPoint.Update() == false) { trail.pointsList.Remove(trailPoint); } } List <Vector2D> points = new List <Vector2D>(); foreach (TrailPoint trailPoint in trail.pointsList) { points.Add(trailPoint.position); } Slicer2D.complexSliceType = Slicer2D.SliceType.Regular; Slice2D slice = slicer.ComplexSlice(points); if (slice.gameObjects.Count > 0) { trailList.Remove(trail); result.Add(slice); } ; } trail.lastPosition = position; } return(result); }
public List <Slice2D> Update(Vector2D position, float timer, Slice2DLayer layer) { List <Slice2D> result = new List <Slice2D>(); foreach (Slicer2D slicer in Slicer2D.GetListCopy()) { if (slicer.MatchLayers(layer) == false) { continue; } SlicerTrailObject trail = null; trailList.TryGetValue(slicer, out trail); if (trail == null) { trail = new SlicerTrailObject(); trailList.Add(slicer, trail); } if (trail.lastPosition != null) { if (Vector2D.Distance(trail.lastPosition, position) > 0.05f) { trail.pointsList.Insert(0, new TrailPoint(position, timer)); } } else { trail.pointsList.Insert(0, new TrailPoint(position, timer)); } foreach (TrailPoint trailPoint in new List <TrailPoint>(trail.pointsList)) { if (trailPoint.Update() == false) { trail.pointsList.Remove(trailPoint); } } if (trail.pointsList.Count > 1) { Vector2D firstPoint = null; Vector2D lastPoint = null; bool insideState = false; foreach (TrailPoint trailPoint in trail.pointsList) { bool inside = false; if (slicer.shape.GetLocal().PointInPoly(trailPoint.position.InverseTransformPoint(slicer.transform))) { inside = true; } switch (insideState) { case true: // Slice! if (inside == false) { lastPoint = trailPoint.position; insideState = false; break; } break; case false: if (inside == false) { // Searching For Start of Slice firstPoint = trailPoint.position; insideState = true; } break; } if (lastPoint != null) { break; } } if (firstPoint != null && lastPoint != null) { Slicer2D.complexSliceType = Slicer2D.SliceType.Regular; Slice2D slice = slicer.LinearSlice(new Pair2D(firstPoint, lastPoint)); if (slice.GetGameObjects().Count > 0) { trailList.Remove(slicer); result.Add(slice); } ; } } trail.lastPosition = position; } return(result); }