ResourceManager.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // ResourceManager.cs
  4. //
  5. // Microsoft XNA Community Game Platform
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using Statements
  10. using System;
  11. using System.Collections.Generic;
  12. using System.IO;
  13. using System.Text;
  14. using Microsoft.Xna.Framework;
  15. using Microsoft.Xna.Framework.Content;
  16. using Microsoft.Xna.Framework.Graphics;
  17. using RobotGameData.GameObject;
  18. #endregion
  19. namespace RobotGameData.Resource
  20. {
  21. /// <summary>
  22. /// It converts the loaded resource files (texture, model) so that
  23. /// they are manageable from the inside and searchable from the outside.
  24. /// The base class that has the loaded resource is GameResourceBase.
  25. /// </summary>
  26. public class ResourceManager : DrawableGameComponent
  27. {
  28. #region Fields
  29. protected bool debugTrace = false;
  30. protected ContentManager contentManager = null;
  31. protected long totalResourceMemory = 0;
  32. protected Dictionary<string, GameResourceBase> ResourceStorage =
  33. new Dictionary<string, GameResourceBase>();
  34. #endregion
  35. #region Properties
  36. public ContentManager ContentManager
  37. {
  38. get { return contentManager; }
  39. }
  40. #endregion
  41. /// <summary>
  42. /// Constructor.
  43. /// </summary>
  44. /// <param name="game">game</param>
  45. /// <param name="contentRootDirectory">root directory path of the content</param>
  46. public ResourceManager(Game game, string contentRootDirectory) : base(game)
  47. {
  48. contentManager = new ContentManager(game.Services, contentRootDirectory);
  49. }
  50. /// <summary>
  51. /// Remove all resource elements.
  52. /// </summary>
  53. protected override void Dispose(bool disposing)
  54. {
  55. // Delete all resources in the storage
  56. RemoveResourceAll(disposing);
  57. contentManager.Unload();
  58. contentManager.Dispose();
  59. contentManager = null;
  60. base.Dispose(true);
  61. }
  62. /// <summary>
  63. /// loads a resource file in the content folder.
  64. /// </summary>
  65. /// <typeparam name="T">resource type (i.e. Model or Texture2D)</typeparam>
  66. /// <param name="key">resource key name</param>
  67. /// <param name="filePath">resource file name</param>
  68. /// <returns>resource element</returns>
  69. public GameResourceBase LoadContent<T>(string key, string filePath)
  70. {
  71. if (FrameworkCore.Game.GraphicsDevice == null)
  72. throw new InvalidOperationException("No graphics device.");
  73. GameResourceBase resource = FindResourceByKey(key);
  74. if (resource != null)
  75. return resource;
  76. // loads a resource by content manager
  77. T obj = contentManager.Load<T>(filePath);
  78. if (obj == null)
  79. throw new ArgumentException("Fail to load content (" + key +
  80. " : " + filePath + ")");
  81. if (obj is Texture2D)
  82. {
  83. resource = new GameResourceTexture2D(key, filePath,
  84. obj as Texture2D);
  85. }
  86. else if (obj is Model)
  87. {
  88. resource = new GameResourceModel(key, filePath, obj as Model);
  89. }
  90. else if (obj is AnimationSequence)
  91. {
  92. resource = new GameResourceAnimation(key, filePath,
  93. obj as AnimationSequence);
  94. }
  95. else if (obj is SpriteFont)
  96. {
  97. resource = new GameResourceFont(key, filePath, obj as SpriteFont);
  98. }
  99. else if (obj is Effect)
  100. {
  101. resource = new GameResourceEffect(key, filePath, obj as Effect);
  102. }
  103. else
  104. {
  105. throw new NotSupportedException("Not supported the resource");
  106. }
  107. if( debugTrace)
  108. {
  109. System.Diagnostics.Debug.WriteLine(
  110. string.Format("Load Resource : {0} ({1})",
  111. filePath, resource.ToString()));
  112. }
  113. if (AddResource(resource))
  114. return resource;
  115. return null;
  116. }
  117. /// <summary>
  118. /// adds a resource element.
  119. /// </summary>
  120. /// <param name="resource">resource element</param>
  121. public bool AddResource(GameResourceBase resource)
  122. {
  123. if (resource == null)
  124. throw new ArgumentNullException("resource");
  125. if (string.IsNullOrEmpty(resource.Key))
  126. {
  127. throw new ArgumentException("The resource contains an invalid key.");
  128. }
  129. else if (ResourceStorage.ContainsKey(resource.Key))
  130. {
  131. throw new ArgumentException(
  132. "The resource is already in the manager.");
  133. }
  134. ResourceStorage.Add(resource.Key, resource);
  135. return true;
  136. }
  137. /// <summary>
  138. /// removes a resource element by key name.
  139. /// </summary>
  140. /// <param name="key">resource key name</param>
  141. public bool RemoveResource(string key, bool disposing)
  142. {
  143. if (ResourceStorage.ContainsKey(key))
  144. {
  145. if (debugTrace)
  146. {
  147. System.Diagnostics.Debug.WriteLine(
  148. string.Format("Dispose Resource : {0} ({1})",
  149. ResourceStorage[key].AssetName,
  150. ResourceStorage[key].ToString()));
  151. }
  152. if( disposing)
  153. ResourceStorage[key].Dispose();
  154. }
  155. return ResourceStorage.Remove(key);
  156. }
  157. /// <summary>
  158. /// removes a resource element by object.
  159. /// </summary>
  160. /// <param name="resource">a resource element</param>
  161. public bool RemoveResource(GameResourceBase resource, bool disposing)
  162. {
  163. return RemoveResource(resource.Key, disposing);
  164. }
  165. /// <summary>
  166. /// remove all resource elements.
  167. /// </summary>
  168. public void RemoveResourceAll(bool disposing)
  169. {
  170. foreach (string key in ResourceStorage.Keys)
  171. {
  172. if (debugTrace)
  173. {
  174. System.Diagnostics.Debug.WriteLine(
  175. string.Format("Dispose Resource : {0} ({1})",
  176. ResourceStorage[key].AssetName,
  177. ResourceStorage[key].ToString()));
  178. }
  179. if( disposing)
  180. ResourceStorage[key].Dispose();
  181. }
  182. ResourceStorage.Clear();
  183. // Clean up some garbage
  184. GC.Collect();
  185. }
  186. /// <summary>
  187. /// removes a resource element by object.
  188. /// </summary>
  189. /// <param name="resource">resource element object</param>
  190. public bool RemoveResourceByObject(object resource, bool disposing)
  191. {
  192. // Finding the resource in storage by object
  193. GameResourceBase res = FindResource(resource);
  194. if( res != null)
  195. {
  196. return RemoveResource(res, disposing);
  197. }
  198. return false;
  199. }
  200. /// <summary>
  201. /// finds a resource element by key name.
  202. /// </summary>
  203. /// <param name="key">resource key name</param>
  204. public GameResourceBase FindResourceByKey(string key)
  205. {
  206. // Finding the resource in storage by key
  207. if (ResourceStorage.ContainsKey(key))
  208. {
  209. return ResourceStorage[key];
  210. }
  211. return null;
  212. }
  213. /// <summary>
  214. /// finds a resource element by id.
  215. /// </summary>
  216. /// <param name="id">resource id number</param>
  217. public GameResourceBase FindResourceById(int id)
  218. {
  219. // Finding the resource in storage by ID
  220. foreach (GameResourceBase resource in ResourceStorage.Values)
  221. {
  222. if (resource.Id == id)
  223. return resource;
  224. }
  225. return null;
  226. }
  227. /// <summary>
  228. /// finds a resource element by asset name.
  229. /// </summary>
  230. /// <param name="assetName">resource asset name</param>
  231. public GameResourceBase FindResourceByAssetName(string assetName)
  232. {
  233. // Finding the resource in storage by name
  234. foreach (GameResourceBase resource in ResourceStorage.Values)
  235. {
  236. if (resource.AssetName == assetName)
  237. return resource;
  238. }
  239. return null;
  240. }
  241. /// <summary>
  242. /// finds a resource element by object.
  243. /// </summary>
  244. /// <param name="resource">resource element object</param>
  245. public GameResourceBase FindResource(object resource)
  246. {
  247. // Finding the resource in storage
  248. foreach (GameResourceBase res in ResourceStorage.Values)
  249. {
  250. if (res.Resource.Equals(resource))
  251. return res;
  252. }
  253. return null;
  254. }
  255. /// <summary>
  256. /// gets a texture by key name.
  257. /// </summary>
  258. /// <param name="key">resource key name</param>
  259. public GameResourceTexture2D GetTexture2D(string key)
  260. {
  261. return (GameResourceTexture2D)FindResourceByKey(key);
  262. }
  263. /// <summary>
  264. /// gets a model resource by key name.
  265. /// </summary>
  266. /// <param name="key">resource key name</param>
  267. public GameResourceModel GetModel(string key)
  268. {
  269. return (GameResourceModel)FindResourceByKey(key);
  270. }
  271. /// <summary>
  272. /// gets a animation resource by key name.
  273. /// </summary>
  274. /// <param name="key">resource key name</param>
  275. public GameResourceAnimation GetAnimation(string key)
  276. {
  277. return (GameResourceAnimation)FindResourceByKey(key);
  278. }
  279. /// <summary>
  280. /// gets a font resource by key name.
  281. /// </summary>
  282. /// <param name="key">resource key name</param>
  283. public GameResourceFont GetFont(string key)
  284. {
  285. return (GameResourceFont)FindResourceByKey(key);
  286. }
  287. /// <summary>
  288. /// gets a effect resource by key name.
  289. /// </summary>
  290. /// <param name="key">resource key name</param>
  291. public GameResourceEffect GetEffect(string key)
  292. {
  293. return (GameResourceEffect)FindResourceByKey(key);
  294. }
  295. /// <summary>
  296. /// loads a effect file(.fx).
  297. /// </summary>
  298. /// <param name="fileName">effect file name in the content folder</param>
  299. /// <returns>resource element</returns>
  300. public GameResourceEffect LoadEffect(string fileName)
  301. {
  302. string keyName = Path.GetFileName(fileName);
  303. // Find the texture resource from ResourceManager by file name
  304. GameResourceEffect resource = GetEffect(keyName);
  305. // If can't find stored resource
  306. if (resource == null)
  307. {
  308. LoadContent<Effect>(keyName, fileName);
  309. resource = GetEffect(keyName);
  310. }
  311. // Can't get resource If loading failed!
  312. if (resource == null)
  313. {
  314. throw new ArgumentException("Fail to effect : " + fileName);
  315. }
  316. else if (resource.Effect.IsDisposed)
  317. {
  318. throw new InvalidOperationException(
  319. "Already disposed texture : " + fileName);
  320. }
  321. return resource;
  322. }
  323. /// <summary>
  324. /// loads a texture file (i.e. tga or bmp).
  325. /// </summary>
  326. /// <param name="fileName">image file name in the content folder</param>
  327. /// <returns>resource element</returns>
  328. public GameResourceTexture2D LoadTexture(string fileName)
  329. {
  330. string keyName = Path.GetFileName(fileName);
  331. // Find the texture resource from ResourceManager by file name
  332. GameResourceTexture2D resource = GetTexture2D(keyName);
  333. // If can't find stored resource
  334. if (resource == null)
  335. {
  336. LoadContent<Texture2D>(keyName, fileName);
  337. resource = GetTexture2D(keyName);
  338. }
  339. // Can't get resource If loading failed!
  340. if (resource == null)
  341. {
  342. throw new ArgumentException("Fail to loaded texture : " + fileName);
  343. }
  344. else if (resource.Texture2D.IsDisposed)
  345. {
  346. throw new InvalidOperationException(
  347. "Already disposed texture : " + fileName);
  348. }
  349. return resource;
  350. }
  351. /// <summary>
  352. /// loads an animation file (.Animation)
  353. /// </summary>
  354. /// <param name="fileName">animation file name in the content folder</param>
  355. /// <returns>resource element</returns>
  356. public GameResourceAnimation LoadAnimation(string fileName)
  357. {
  358. // Find the texture resource from ResourceManager by file name
  359. GameResourceAnimation resource = GetAnimation(fileName);
  360. // If can't find stored resource
  361. if (resource == null)
  362. {
  363. LoadContent<AnimationSequence>(fileName, fileName);
  364. resource = GetAnimation(fileName);
  365. }
  366. // Can't get resource If loading failed!
  367. if (resource == null)
  368. {
  369. throw new ArgumentException("Fail to loaded animation : " +
  370. fileName);
  371. }
  372. return resource;
  373. }
  374. }
  375. }