예제 #1
0
		public T LoadFromFile<T>(string assetName)
		{
			string extension = FileManager.GetExtension(assetName);

			if (FileManager.IsRelative(assetName))
			{
				// get the absolute path using the current relative directory
				assetName = FileManager.RelativeDirectory + assetName;
			}



			string fullNameWithType = assetName + typeof(T).Name;


			// get the dictionary by the contentManagerName.  If it doesn't exist, GetDisposableDictionaryByName
			// will create it.

			if (mDisposableDictionary.ContainsKey(fullNameWithType))
			{

#if PROFILE
				mHistory.Add(new ContentLoadHistory(
					TimeManager.CurrentTime, typeof(T).Name, fullNameWithType, ContentLoadDetail.Cached));
#endif

				return ((T)mDisposableDictionary[fullNameWithType]);
			}
			else if (mNonDisposableDictionary.ContainsKey(fullNameWithType))
			{
				return ((T)mNonDisposableDictionary[fullNameWithType]);
			}
			else
			{
#if PROFILE
				mHistory.Add(new ContentLoadHistory(
					TimeManager.CurrentTime, 
					typeof(T).Name, 
					fullNameWithType, 
					ContentLoadDetail.HddFromFile));
#endif
#if DEBUG
				// The ThrowExceptionIfFileDoesntExist
				// call used to be done before the checks
				// in the dictionaries.  But whatever is held
				// in there may not really be a file so let's check
				// if the file exists after we check the dictionaries.
				FileManager.ThrowExceptionIfFileDoesntExist(assetName);
#endif

				IDisposable loadedAsset = null;

				if (typeof(T) == typeof(Texture2D) || typeof(T) == typeof(Microsoft.Xna.Framework.Graphics.Texture2D))
				{
                    // for now we'll create it here, eventually have it in a dictionary:
					loadedAsset = textureContentLoader.Load(assetName);
				}

#region Scene

				else if (typeof(T) == typeof(FlatRedBall.Scene))
				{
					FlatRedBall.Scene scene = FlatRedBall.Content.Scene.SceneSave.FromFile(assetName).ToScene(mName);

					object sceneAsObject = scene;

					lock (mNonDisposableDictionary)
					{
						if (!mNonDisposableDictionary.ContainsKey(fullNameWithType))
						{
							mNonDisposableDictionary.Add(fullNameWithType, scene);
						}
					}
					return (T)sceneAsObject;
				}

#endregion

#region EmitterList

				else if (typeof(T) == typeof(EmitterList))
				{
					EmitterList emitterList = EmitterSaveList.FromFile(assetName).ToEmitterList(mName);


					mNonDisposableDictionary.Add(fullNameWithType, emitterList);


					return (T)((object)emitterList);

				}

#endregion

#region Image
#if !MONOGAME
				else if (typeof(T) == typeof(Image))
				{

                    switch (extension.ToLowerInvariant())
					{
						case "gif":
							Image image = Image.FromFile(assetName);
							loadedAsset = image;
							break;
					}

				}
#endif
#endregion

#region BitmapList
#if !XBOX360 && !SILVERLIGHT && !WINDOWS_PHONE && !MONOGAME

				else if (typeof(T) == typeof(BitmapList))
				{
					loadedAsset = BitmapList.FromFile(assetName);

				}
#endif

#endregion

#region NodeNetwork
				else if (typeof(T) == typeof(NodeNetwork))
				{
					NodeNetwork nodeNetwork = NodeNetworkSave.FromFile(assetName).ToNodeNetwork();

					mNonDisposableDictionary.Add(fullNameWithType, nodeNetwork);

					return (T)((object)nodeNetwork);
				}
#endregion

#region ShapeCollection

				else if (typeof(T) == typeof(ShapeCollection))
				{
					ShapeCollection shapeCollection =
						ShapeCollectionSave.FromFile(assetName).ToShapeCollection();

					mNonDisposableDictionary.Add(fullNameWithType, shapeCollection);

					return (T)((object)shapeCollection);
				}
#endregion

#region PositionedObjectList<Polygon>

				else if (typeof(T) == typeof(PositionedObjectList<FlatRedBall.Math.Geometry.Polygon>))
				{
					PositionedObjectList<FlatRedBall.Math.Geometry.Polygon> polygons =
						PolygonSaveList.FromFile(assetName).ToPolygonList();
					mNonDisposableDictionary.Add(fullNameWithType, polygons);
					return (T)((object)polygons);
				}

#endregion

#region AnimationChainList

				else if (typeof(T) == typeof(AnimationChainList))
				{

					if (assetName.EndsWith("gif"))
					{
#if WINDOWS_8 || UWP || DESKTOP_GL || STANDARD
                        throw new NotImplementedException();
#else
						AnimationChainList acl = new AnimationChainList();
						acl.Add(FlatRedBall.Graphics.Animation.AnimationChain.FromGif(assetName, this.mName));
						acl[0].ParentGifFileName = assetName;
						loadedAsset = acl;
#endif
					}
					else
					{
						loadedAsset =
							AnimationChainListSave.FromFile(assetName).ToAnimationChainList(mName);


					}

					mNonDisposableDictionary.Add(fullNameWithType, loadedAsset);
				}

#endregion

				else if(typeof(T) == typeof(Song))
				{
                    var loader = new SongLoader();
                    return (T)(object) loader.Load(assetName);
				}
#if MONOGAME

                else if (typeof(T) == typeof(SoundEffect))
                {
                    T soundEffect;

                    if (assetName.StartsWith(@".\") || assetName.StartsWith(@"./"))
                    {
                        soundEffect = base.Load<T>(assetName.Substring(2));
                    }
                    else
                    {
                        soundEffect = base.Load<T>(assetName);

                    }

                    return soundEffect;
                }
#endif

#region RuntimeCsvRepresentation

#if !SILVERLIGHT
                else if (typeof(T) == typeof(RuntimeCsvRepresentation))
                {
#if XBOX360
					throw new NotImplementedException("Can't load CSV from file.  Try instead to use the content pipeline.");
#else

                    return (T)((object)CsvFileManager.CsvDeserializeToRuntime(assetName));
#endif
                }
#endif


#endregion

#region SplineList

                else if (typeof(T) == typeof(List<Spline>))
                {
                    List<Spline> splineList = SplineSaveList.FromFile(assetName).ToSplineList();
                    mNonDisposableDictionary.Add(fullNameWithType, splineList);
                    object asObject = splineList;

                    return (T)asObject;

                }

                else if (typeof(T) == typeof(SplineList))
                {
                    SplineList splineList = SplineSaveList.FromFile(assetName).ToSplineList();
                    mNonDisposableDictionary.Add(fullNameWithType, splineList);
                    object asObject = splineList;

                    return (T)asObject;
                }

#endregion

#region BitmapFont

                else if (typeof(T) == typeof(BitmapFont))
                {
                    // We used to assume the texture is named the same as the font file
                    // But now FRB understands the .fnt file and gets the PNG from the font file
                    //string pngFile = FileManager.RemoveExtension(assetName) + ".png";
                    string fntFile = FileManager.RemoveExtension(assetName) + ".fnt";

                    BitmapFont bitmapFont = new BitmapFont(fntFile, this.mName);

                    object bitmapFontAsObject = bitmapFont;

                    return (T)bitmapFontAsObject;
                }

#endregion


#region Text

                else if (typeof(T) == typeof(string))
                {
                    return (T)((object)FileManager.FromFileText(assetName));
                }

#endregion

#region Catch mistakes

#if DEBUG
                else if (typeof(T) == typeof(Spline))
                {
                    throw new Exception("Cannot load Splines.  Try using the List<Spline> type instead.");

                }
                else if (typeof(T) == typeof(Emitter))
                {
                    throw new Exception("Cannot load Emitters.  Try using the EmitterList type instead.");

                }
#endif

#endregion

#region else, exception!

                else
                {
                    throw new NotImplementedException("Cannot load content of type " +
                        typeof(T).AssemblyQualifiedName + " from file.  If you are loading " +
                        "through the content pipeline be sure to remove the extension of the file " +
                        "name.");
                }

#endregion

				if (loadedAsset != null)
				{
					lock (mDisposableDictionary)
					{
						// Multiple threads could try to load this content simultaneously
						if (!mDisposableDictionary.ContainsKey(fullNameWithType))
						{
							mDisposableDictionary.Add(fullNameWithType, loadedAsset);
						}
					}
				}

				return ((T)loadedAsset);
			}
		}
예제 #2
0
        public static bool GetNamedObjectsIn(string fileName, List <string> listToAddTo)
        {
            bool toReturn = true;

            string extension = FileManager.GetExtension(fileName);

            switch (extension)
            {
                #region case Scene (scnx)
            case "scnx":

                SpriteEditorScene ses = SpriteEditorScene.FromFile(fileName);

                for (int i = 0; i < ses.SpriteFrameSaveList.Count; i++)
                {
                    listToAddTo.Add(ses.SpriteFrameSaveList[i].ParentSprite.Name + " (SpriteFrame)");
                }

                for (int i = 0; i < ses.SpriteGridList.Count; i++)
                {
                    listToAddTo.Add(ses.SpriteGridList[i].Name + " (SpriteGrid)");
                }

                for (int i = 0; i < ses.SpriteList.Count; i++)
                {
                    listToAddTo.Add(ses.SpriteList[i].Name + " (Sprite)");
                }

                for (int i = 0; i < ses.TextSaveList.Count; i++)
                {
                    listToAddTo.Add(ses.TextSaveList[i].Name + " (Text)");
                }
                break;
                #endregion

                #region case ShapeCollection (shcx)

            case "shcx":
                ShapeCollectionSave scs = ShapeCollectionSave.FromFile(fileName);

                for (int i = 0; i < scs.AxisAlignedCubeSaves.Count; i++)
                {
                    listToAddTo.Add(scs.AxisAlignedCubeSaves[i].Name + " (AxisAlignedCube)");
                }
                for (int i = 0; i < scs.AxisAlignedRectangleSaves.Count; i++)
                {
                    listToAddTo.Add(scs.AxisAlignedRectangleSaves[i].Name + " (AxisAlignedRectangle)");
                }
                for (int i = 0; i < scs.CircleSaves.Count; i++)
                {
                    listToAddTo.Add(scs.CircleSaves[i].Name + " (Circle)");
                }
                for (int i = 0; i < scs.PolygonSaves.Count; i++)
                {
                    listToAddTo.Add(scs.PolygonSaves[i].Name + " (Polygon)");
                }
                for (int i = 0; i < scs.SphereSaves.Count; i++)
                {
                    listToAddTo.Add(scs.SphereSaves[i].Name + " (Sphere)");
                }
                break;

                #endregion

                #region NodeNetwork (nntx)
            case "nntx":
                NodeNetworkSave nns = NodeNetworkSave.FromFile(fileName);

                for (int i = 0; i < nns.PositionedNodes.Count; i++)
                {
                    listToAddTo.Add(nns.PositionedNodes[i].Name + " (PositionedNode)");
                }

                break;
                #endregion

                #region EmitterList (emix)
            case "emix":
                EmitterSaveList esl = EmitterSaveList.FromFile(fileName);

                for (int i = 0; i < esl.emitters.Count; i++)
                {
                    listToAddTo.Add(esl.emitters[i].Name + " (Emitter)");
                }

                break;

                #endregion

                #region Case AnimationChainList (achx)

            case "achx":
                AnimationChainListSave acls = AnimationChainListSave.FromFile(fileName);

                for (int i = 0; i < acls.AnimationChains.Count; i++)
                {
                    listToAddTo.Add(acls.AnimationChains[i].Name + " (AnimationChain)");
                }
                break;
                #endregion

                #region Case SplineList (splx)
            case "splx":
                SplineSaveList ssl = SplineSaveList.FromFile(fileName);

                for (int i = 0; i < ssl.Splines.Count; i++)
                {
                    listToAddTo.Add(ssl.Splines[i].Name + " (Spline)");
                }

                break;

                #endregion

            default:
                toReturn = false;
                break;
            }

            return(toReturn);
        }