public ModularPiece InitStoreItem(ModularPieceSaveData PieceSaveData)
        {
            ModularPieceData PieceData = GameManager.I.Modular.FindPiece(PieceSaveData.ID);             // find modular piece

            if (PieceData != null)
            {
                ModularPiece piece = InitStoreItem(PieceData, PieceSaveData.LocalScale, Vector3.zero, PieceSaveData.LocalEulerAngles, PieceSaveData.LocalPosition);
                piece.InitializeTextureData(PieceSaveData.TextureDataKeys);
                piece.InitializeColors(PieceSaveData.Colors);                  // initialize colors
                return(piece);
            }
            return(null);
        }
        public override ModularPlacableObject Duplicate()
        {
            ModularSetStoreData SetData = new ModularSetStoreData(this);
            ModularSet          NewSet  = Management.GameManager.I.Modular.ModularBuildingSystem.InitNewModularSet(this);

            NewSet.AsyncLoadModularSet(SetData, (object[] Data) => {
                ModularSet Set = (ModularSet)Data[0];                                                                                                 // get set data
                ModularPieceSaveData PieceData = (ModularPieceSaveData)Data[1];                                                                       // get piece data
                Set.AddModularPiece(Management.GameManager.I.Modular.ModularBuildingSystem.InitStoreItem(PieceData), (ModularPlacableData)PieceData); // add store item
            });
            NewSet.gameObject.layer = this.gameObject.layer;                                                                                          // set layer
            NewSet.RegisterUndoable();                                                                                                                // register as undoable
            return(NewSet);
        }
        private ModularSet InitModularSetCore(ModularSet NewSet, ModularSetData SetData, bool InitInEditMode = false)
        {
            if (InitInEditMode)
            {
                NewSet.InitializeEditable();
            }                                                                   // init in edit mode
            NewSet.AsyncLoadModularSet(SetData, (object[] Data) => {
                ModularSet Set = (ModularSet)Data[0];                           // get set data
                ModularPieceSaveData PieceData = (ModularPieceSaveData)Data[1]; // get piece data

                ModularPiece Piece = InitStoreItem(PieceData);                  // init store item to modular piece
                if (Piece != null)                                              // only add when piece is not null
                {
                    Set.AddModularPiece(Piece, (ModularPlacableData)PieceData); // add store item
                }
            });
            return(NewSet);
        }         // core function for init modular set
        private IEnumerator AsyncLoadPieces(ModularSetData SetData, Utils.Delegates.GenericDataCallbak InitModularPiece)
        {
            int FramesWait = Mathf.CeilToInt((float)(SetData.Pieces.Length / Management.GameManager.I.Modular.LoadingFrameDuration));
            int count      = FramesWait;

            for (int i = 0; i < SetData.Pieces.Length; i++)
            {
                ModularPieceSaveData Piece = SetData.Pieces [i];
                InitModularPiece.Invoke(new object[] { this, Piece });              // invoke callback with piece and current set
                count--;

                if (count <= 0)
                {
                    count = FramesWait;
                    yield return(null);
                }
            }
            // is done with loading
            AutoFillRenderSet();             // auto fill
        }