protected void DispatchHits(bool preview, Collider collider, Vector3 worldPosition, Quaternion worldRotation, float pressure, object owner) { if (connectHits == true && owner != null) { var link = default(Link); if (TryGetLink(owner, ref link) == true) { if (link.Preview == preview) { hitCache.InvokeLines(gameObject, null, null, preview, link.WorldPosition, worldPosition, link.Pressure, pressure); } else { hitCache.InvokePoints(gameObject, null, null, preview, collider, worldPosition, worldRotation, pressure); } } else { link = linkPool.Count > 0 ? linkPool.Pop() : new Link(); link.Owner = owner; links.Add(link); hitCache.InvokePoints(gameObject, null, null, preview, collider, worldPosition, worldRotation, pressure); } link.WorldPosition = worldPosition; link.Pressure = pressure; link.Preview = preview; } else { hitCache.InvokePoints(gameObject, null, null, preview, collider, worldPosition, worldRotation, pressure); } }
protected void DispatchHits(bool preview, Collider collider, Vector3 worldPosition, Quaternion worldRotation, float pressure, object owner) { if (connectHits == true && owner != null) { var link = default(Link); var newWorldPosition = worldPosition; if (TryGetLink(owner, ref link) == true) { if (link.Preview == preview) { if (hitSpacing > 0.0f) { newWorldPosition = link.WorldPosition; var distance = Vector3.Distance(link.WorldPosition, worldPosition); var steps = Mathf.FloorToInt(distance / hitSpacing); if (steps > hitLimit) { steps = hitLimit; } for (var i = 0; i < steps; i++) { newWorldPosition = Vector3.MoveTowards(newWorldPosition, worldPosition, hitSpacing); hitCache.InvokeLines(gameObject, null, null, preview, link.WorldPosition, newWorldPosition, link.Pressure, pressure); link.WorldPosition = newWorldPosition; } } else { hitCache.InvokeLines(gameObject, null, null, preview, link.WorldPosition, worldPosition, link.Pressure, pressure); } } else { hitCache.InvokePoints(gameObject, null, null, preview, collider, worldPosition, worldRotation, pressure); } } else { link = linkPool.Count > 0 ? linkPool.Pop() : new Link(); link.Owner = owner; links.Add(link); hitCache.InvokePoints(gameObject, null, null, preview, collider, worldPosition, worldRotation, pressure); } link.WorldPosition = newWorldPosition; link.Pressure = pressure; link.Preview = preview; } else { hitCache.InvokePoints(gameObject, null, null, preview, collider, worldPosition, worldRotation, pressure); } }
protected void SubmitLine(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.InvokeQuads(gameObject, preview, priority, link.Position, link.EndPosition, currentPositionA, currentPositionB, rotation, pressure); } else { hitCache.InvokeLines(gameObject, preview, priority, currentPositionA, currentPositionB, rotation, pressure); } link.Position = currentPositionA; link.EndPosition = currentPositionB; } } return; } else if (connectHits == true) { hitCache.InvokeQuads(gameObject, preview, priority, link.Position, link.EndPosition, position, endPosition, rotation, pressure); } else { hitCache.InvokeLines(gameObject, preview, priority, position, endPosition, rotation, pressure); } } else { hitCache.InvokeLines(gameObject, preview, priority, position, endPosition, rotation, pressure); } } else { link = linkPool.Count > 0 ? linkPool.Pop() : new Link(); link.Owner = owner; links.Add(link); hitCache.InvokeLines(gameObject, preview, priority, position, endPosition, rotation, pressure); } link.Position = position; link.EndPosition = endPosition; link.Preview = preview; } else { hitCache.InvokeLines(gameObject, preview, priority, position, endPosition, rotation, pressure); } }