public List <Slice2D> Update(Vector2D position, float timer, Layer layer) { List <Slice2D> result = new List <Slice2D>(); foreach (Sliceable2D slicer in Sliceable2D.GetListCopy()) { if (slicer.MatchLayers(layer) == false) { continue; } Trail.Object trail = null; trailList.TryGetValue(slicer, out trail); if (trail == null) { trail = new Trail.Object(); trailList.Add(slicer, trail); } if (trail.lastPosition != null) { if (Vector2D.Distance(trail.lastPosition, position) > 0.05f) { trail.pointsList.Insert(0, new Trail.Point(position, timer)); } } else { trail.pointsList.Insert(0, new Trail.Point(position, timer)); } foreach (Trail.Point trailPoint in new List <Trail.Point>(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 (Trail.Point 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) { Sliceable2D.complexSliceType = Sliceable2D.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); }
public List <Slice2D> Update(Vector2D position, float timer, Layer layer) { List <Slice2D> result = new List <Slice2D>(); foreach (Sliceable2D slicer in Sliceable2D.GetListCopy()) { if (slicer.MatchLayers(layer) == false) { continue; } Trail.Object trail = null; trailList.TryGetValue(slicer, out trail); if (trail == null) { trail = new Trail.Object(); trailList.Add(slicer, trail); } if (trail.lastPosition != null) { if (Vector2D.Distance(trail.lastPosition, position) > 0.05f) { trail.pointsList.Add(new Trail.Point(position, timer)); } } else { trail.pointsList.Add(new Trail.Point(position, timer)); } if (trail.pointsList.Count > 1) { foreach (Trail.Point trailPoint in new List <Trail.Point>(trail.pointsList)) { if (trailPoint.Update() == false) { trail.pointsList.Remove(trailPoint); } } List <Vector2D> points = new List <Vector2D>(); foreach (Trail.Point trailPoint in trail.pointsList) { points.Add(trailPoint.position); } Sliceable2D.complexSliceType = Sliceable2D.SliceType.Regular; Slice2D slice = slicer.ComplexSlice(points); if (slice.GetGameObjects().Count > 0) { trailList.Remove(slicer); result.Add(slice); } ; } trail.lastPosition = position; } return(result); }