Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
            }
        }