public void SubmitLine(GameObject gameObject, bool preview, int priority, Vector3 position, Vector3 endPosition, Quaternion rotation, float pressure, object owner) { if (owner != null) { var link = default(Link); if (TryGetLink(owner, ref link) == true) { if (link.Preview == preview) { if (hitSpacing > 0.0f) { var currentPositionA = link.Position; var currentPositionB = link.EndPosition; var distanceA = Vector3.Distance(link.Position, position); var distanceB = Vector3.Distance(link.EndPosition, endPosition); var stepsA = Mathf.FloorToInt(distanceA / hitSpacing); var stepsB = Mathf.FloorToInt(distanceB / hitSpacing); if (stepsA > 0 || stepsB > 0) { var steps = Mathf.Max(stepsA, stepsB); var hitSpacingA = hitSpacing; var hitSpacingB = hitSpacing; if (steps > hitLimit) { steps = hitLimit; } if (stepsA > stepsB) { hitSpacingB = (distanceB * (distanceA / (stepsA * hitSpacingA))) / stepsA; } else { hitSpacingA = (distanceA * (distanceB / (stepsB * hitSpacingB))) / stepsB; } for (var i = 0; i < steps; i++) { currentPositionA = Vector3.MoveTowards(currentPositionA, position, hitSpacingA); currentPositionB = Vector3.MoveTowards(currentPositionB, endPosition, hitSpacingB); if (connectHits == true) { hitCache.InvokeQuad(gameObject, preview, priority, pressure, link.Position, link.EndPosition, currentPositionA, currentPositionB, rotation); } else { hitCache.InvokeLine(gameObject, preview, priority, pressure, currentPositionA, currentPositionB, rotation); } link.Position = currentPositionA; link.EndPosition = currentPositionB; } } return; } else if (connectHits == true) { hitCache.InvokeQuad(gameObject, preview, priority, pressure, link.Position, link.EndPosition, position, endPosition, rotation); } else { hitCache.InvokeLine(gameObject, preview, priority, pressure, position, endPosition, rotation); } } else { hitCache.InvokeLine(gameObject, preview, priority, pressure, position, endPosition, rotation); } } else { link = linkPool.Count > 0 ? linkPool.Pop() : new Link(); link.Owner = owner; links.Add(link); hitCache.InvokeLine(gameObject, preview, priority, pressure, position, endPosition, rotation); } link.Position = position; link.EndPosition = endPosition; link.Preview = preview; } else { hitCache.InvokeLine(gameObject, preview, priority, pressure, position, endPosition, rotation); } }