예제 #1
0
    public override void InsertBetween(DynShelterModule prev, DynShelterModule next)
    {
        int nxtSize = next!=null? next.GetSize() : -1;
        int prvSize = prev!=null? prev.GetSize() : -1;

        float newPos = 0.0f;
        float off7 = 0.0f;
        if(next != null && prev != null) //Cas d'ajout entre deux modules
        {
            //--vv--configuration des modules--vv--
            if(next.GetModuleType() != FunctionConf_Dynshelter.ModuleType.bloc)
            {
                _last = this;
            }
            next.SetPrevModule(this);

            if(prev.GetModuleType() != FunctionConf_Dynshelter.ModuleType.bloc)
            {
                _first = this;
            }
            prev.SetNextModule(this);

        //			SetNextPrevModule(prev,next);
            SetPrevModule(prev);
            SetNextModule(next);

            WhoIs(true);
            WhoIs(false);

            //--vv--Placement--vv--
            if(_size == nxtSize && (_size != prvSize || prev.GetModuleType() != FunctionConf_Dynshelter.ModuleType.bloc)) //Le suivant est de la mm taille mais pas le précedent
            {
                //Add collé au next
                newPos = next.GetPos().z;
                off7 = -_length;
                if(next.GetType() == GetType())
                    off7 += _AvArSize;//TAILLE DU MONTANT

                DynShelterModule nxt = next;
                while(nxt != null)
                {
                    nxt.SetPos(true,off7);
                    nxt = nxt.GetNextModule();
                }
            }
            else if(_size == prvSize && (_size != nxtSize || next.GetModuleType() != FunctionConf_Dynshelter.ModuleType.bloc)) //le précedent est de la meme taille mais pas le suivant
            {
                //Add collé au prev
                newPos = prev.GetPos().z;
                off7 = _length;
                if(prev.GetType() == GetType())
                    off7 -= ((DynShelterMultiBloc)prev).GetAvArSize();//TAILLE DU MONTANT

                DynShelterModule prv = prev;
                while(prv != null)
                {
                    prv.SetPos(true,off7);
                    prv = prv.GetPrevModule();
                }
            }
            else //if(_size == nxtSize && _size == prvSize) // le precedent et le suivant ont la meme taille que le courant
            {
                DynShelterModule nxt = next;
                off7 = -_length;
                if(next.GetType() == GetType())
                    off7 += _AvArSize;//TAILLE DU MONTANT
                while(nxt != null)
                {
                    nxt.SetPos(true,off7/2);
                    nxt = nxt.GetNextModule();
                }

                off7 = _length;
                if(prev.GetType() == GetType())
                    off7 -= ((DynShelterMultiBloc)prev).GetAvArSize();//TAILLE DU MONTANT
                DynShelterModule prv = prev;
                while(prv != null)
                {
                    prv.SetPos(true,off7/2);
                    prv = prv.GetPrevModule();
                }

                newPos = (next.GetPos()+prev.GetPos()).z/2;
            }
        //			else // le precedent et le suivant ont une taille différente du courant
        //			{
        //				DynShelterModule nxt = next;
        //				while(nxt != null)
        //				{
        //					nxt.SetPos(true,-_length/2);
        //					nxt = nxt.GetNextModule();
        //				}
        //
        //				DynShelterModule prv = prev;
        //				while(prv != null)
        //				{
        //					prv.SetPos(true,_length/2);
        //					prv = prv.GetPrevModule();
        //				}
        //
        //				newPos = (next.GetPos()+prev.GetPos()).z/2;
        //			}

        }
        else //(next == null || prev == null) // Cas d'ajout aux extremites (1er ou dernier)
        {
            if(next !=null) // this est le 1er module
            {
                next.SetPrevModule(this);
                SetNextModule(next);

                WhoIs(true);
                WhoIs(false);

                if(_size == nxtSize)
                {
                    //Add collé au next
                    newPos = next.GetPos().z + (_length/2 + next.GetIntOffSet()/*next.GetLength()/2*/);
                }
                else
                {
                    //Add collé au next ou a cheval si pas la place
                    newPos = next.GetExtPos(AV).z;
                }
            }
            else//(prev != null) // this est le dernier module
            {
                prev.SetNextModule(this);
                SetPrevModule(prev);

                WhoIs(true);
                WhoIs(false);

                if(_size == prvSize)
                {
                    //Add collé au prev
                    newPos = prev.GetPos().z - (_length/2 + prev.GetIntOffSet() /*prev.GetLength()/2*/);
                }
                else
                {
                    //Add collé au prev ou a cheval si pas la place
                    newPos = prev.GetExtPos(AR).z;
                }
            }
        }

        //Applying Position
        SetPos(false,newPos);
    }