public override void AddItem(Item item)
        {
            SplineReplicator replicator = gameObject.AddComponent <SplineReplicator>();

            replicator.Item = item;
            SplineReplicatorList.Add(replicator);
        }
 public override void RemoveItem(Item item)
 {
                 #if LOG
     Debug.Log("RemoveItem " + this.name);
                 #endif
     SplineReplicator replicator = SplineReplicatorList.Find(r => r.Item == item);
     SplineReplicatorList.Remove(replicator);
     Destroy(replicator);
     SetStartEndPoint();
     SetColliderSize();
 }
        private void InsertReplicator(SplineReplicator replicator, Vector3 inserPoint)
        {
            Vector3 from           = _pointArray[0].transform.position;
            Vector3 to             = _pointArray[1].transform.position;
            float   fromToDistance = Vector3.Distance(from, to);

            float inserPointDistance = Vector3.Distance(from, inserPoint);
            float insertRatio        = inserPointDistance / fromToDistance;

            float midRatio    = 0f;
            float priorRatio  = 0f;
            int   insertIndex = -1;

            for (int i = 0; i < SplineReplicatorList.Count; ++i)
            {
                midRatio = (Vector3.Distance(from, SplineReplicatorList[i].DuplicateRangeMidPoint()) / fromToDistance);
                if (insertRatio > priorRatio && insertRatio < midRatio)
                {
                    insertIndex = i;
                    break;
                }

                priorRatio = midRatio;
            }

            if (insertIndex == -1)
            {
                //check if it is in last segement between final item and end
                if (insertRatio > priorRatio && insertRatio < 1f)
                {
                    insertIndex = SplineReplicatorList.Count;
                }

                //if beyond 0 to 1, just force it to beginning or end
                if (insertRatio > 1f)
                {
                    insertIndex = SplineReplicatorList.Count;
                }
                if (insertRatio < 0f)
                {
                    insertIndex = 0;
                }
            }

            //if this is in the very last spot or there is none added, then add instead of insert
            if (insertIndex != -1 && SplineReplicatorList.Count == 0)
            {
                SplineReplicatorList.Add(replicator);
            }
            else if (insertIndex != -1)
            {
                SplineReplicatorList.Insert(insertIndex, replicator);
            }
        }
 private void SetColliderSize()
 {
     for (int d = 0; d < SplineReplicatorList.Count; ++d)
     {
         SplineReplicator replicator = SplineReplicatorList[d];
         Item             item       = replicator.Item;
         for (int i = 0; i < item.ColliderArray.Length; ++i)
         {
             item.ColliderArray[i].size = new Vector3(item.ColliderArray[i].size.x, item.ColliderArray[i].size.y, replicator.DisctanceBetweenStartEnd());
         }
     }
 }
        public override bool ContainsItem(Item item)
        {
            SplineReplicator replicator = SplineReplicatorList.Find(r => r.Item == item);

            if (replicator == null)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
        /// <summary>
        /// Adds the item raycast or updates it if already in list.
        /// </summary>
        /// <returns> Returns the midpoint of where Item was Added. </returns>
        /// <param name="itemRaycast">Item raycast.</param>
        /// <param name="hitPoint">Hit point.</param>
        public Vector3 UpdateItem(Item item, Vector3 hitPoint)
        {
            //Retieve or Create a new duplicate data
            SplineReplicator replicator = SplineReplicatorList.Find(r => r.Item == item);

            SplineReplicatorList.Remove(replicator);

            SetStartEndPoint();

            Ray lineRay = AttachPointRay();

            Vector3 linePoint = Math3D.ProjectPointOnLine(lineRay.origin, lineRay.direction, hitPoint);

            InsertReplicator(replicator, linePoint);

            SetStartEndPoint();
            SetColliderSize();

            return(replicator.DuplicateRangeMidPoint());
        }
        private void InsertReplicator(SplineReplicator replicator, Vector3 inserPoint)
        {
            Vector3 from = _pointArray[0].transform.position;
            Vector3 to = _pointArray[1].transform.position;
            float fromToDistance = Vector3.Distance(from, to);

            float inserPointDistance = Vector3.Distance(from, inserPoint);
            float insertRatio = inserPointDistance / fromToDistance;

            float midRatio = 0f;
            float priorRatio = 0f;
            int insertIndex = -1;
            for (int i = 0; i < SplineReplicatorList.Count; ++i)
            {
                midRatio = (Vector3.Distance(from, SplineReplicatorList[i].DuplicateRangeMidPoint()) / fromToDistance);
                if (insertRatio > priorRatio && insertRatio < midRatio)
                {
                    insertIndex = i;
                    break;
                }

                priorRatio = midRatio;
            }

            if (insertIndex == -1)
            {
                //check if it is in last segement between final item and end
                if (insertRatio > priorRatio && insertRatio < 1f)
                {
                    insertIndex = SplineReplicatorList.Count;
                }

                //if beyond 0 to 1, just force it to beginning or end
                if (insertRatio > 1f)
                {
                    insertIndex = SplineReplicatorList.Count;
                }
                if (insertRatio < 0f)
                {
                    insertIndex = 0;
                }
            }

            //if this is in the very last spot or there is none added, then add instead of insert
            if (insertIndex != -1 && SplineReplicatorList.Count == 0)
            {
                SplineReplicatorList.Add(replicator);
            }
            else if (insertIndex != -1)
            {
                SplineReplicatorList.Insert(insertIndex, replicator);
            }
        }