Пример #1
0
        protected void SubmitLastPoint(bool preview, object owner)
        {
            if (owner != null)
            {
                var link = default(Link);

                if (TryGetLink(owner, ref link) == true)
                {
                    if (link.Preview == preview && preview == false)
                    {
                        if (hitSpacing > 0.0f)
                        {
                            var currentPosition = link.Position;
                            var distance        = Vector3.Distance(link.Position, link.LastPosition);
                            var steps           = Mathf.FloorToInt(distance / hitSpacing);

                            if (steps > hitLimit)
                            {
                                steps = hitLimit;
                            }

                            for (var i = 0; i < steps; i++)
                            {
                                currentPosition = Vector3.MoveTowards(currentPosition, link.LastPosition, hitSpacing);

                                if (connectHits == true)
                                {
                                    hitCache.InvokeLine(gameObject, preview, link.LastPriority, link.LastPressure, link.Position, currentPosition, link.LastRotation);
                                }
                                else
                                {
                                    hitCache.InvokePoint(gameObject, preview, link.LastPriority, link.LastPressure, currentPosition, link.LastRotation);
                                }

                                link.Position = currentPosition;
                            }
                        }
                    }
                }
            }
        }
        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);
            }
        }