Beispiel #1
0
        public void Save(ProjectItem parent, byte[] previewData, object obj, ProjectEventHandler <ProjectItem> callback)
        {
            if (obj == null)
            {
                throw new ArgumentNullException("obj");
            }

            Type persistentType = m_typeMap.ToPersistentType(obj.GetType());

            if (persistentType == null)
            {
                throw new ArgumentException(string.Format("PersistentClass for {0} does not exist", obj.GetType()), "obj");
            }

            if (parent == null)
            {
                parent = Root;
            }

            if (!parent.IsFolder)
            {
                throw new ArgumentException("parent is not folder", "parent");
            }

            int ordinal, id;

            if (!GetOrdinalAndId(m_projectInfo.AssetIdentifier, out ordinal, out id))
            {
                return;
            }

            PersistentObject persistentObject = (PersistentObject)Activator.CreateInstance(persistentType);

            persistentObject.ReadFrom(obj);

            AssetItem assetItem = new AssetItem();

            assetItem.ItemID   = m_assetDB.ToRuntimeResourceID(ordinal, id);
            assetItem.Name     = persistentObject.name;
            assetItem.Ext      = GetExt(obj);
            assetItem.TypeGuid = m_typeMap.ToGuid(obj.GetType());
            assetItem.Preview  = new Preview
            {
                ItemID      = assetItem.ItemID,
                PreviewData = previewData
            };

            if (persistentObject is PersistentPrefab)
            {
                PersistentPrefab persistentPrefab = (PersistentPrefab)persistentObject;
                if (persistentPrefab.Descriptors != null)
                {
                    List <PrefabPart> prefabParts = new List <PrefabPart>();
                    PersistentDescriptorsToPrefabPartItems(persistentPrefab.Descriptors, prefabParts);
                    assetItem.Parts = prefabParts.ToArray();
                }
            }

            GetDepsContext getDepsCtx = new GetDepsContext();

            persistentObject.GetDeps(getDepsCtx);
            assetItem.Dependencies = getDepsCtx.Dependencies.ToArray();

            m_storage.Save(m_projectPath, parent.ToString(), assetItem, persistentObject, m_projectInfo, error =>
            {
                if (!error.HasError)
                {
                    m_idToAssetItem.Add(assetItem.ItemID, assetItem);
                    if (assetItem.Parts != null)
                    {
                        for (int i = 0; i < assetItem.Parts.Length; ++i)
                        {
                            m_idToAssetItem.Add(assetItem.Parts[i].PartID, assetItem);
                        }
                    }

                    parent.AddChild(assetItem);
                }

                callback(error, assetItem);
            });
        }