using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
namespace FaceOff
{
///
/// Loads and maintains emotion category information
/// and face textures for each emotion category.
///
class FaceLoader
{
private const string FACES_DIR = @"Texture\Faces\";
private List categoryNames;
///
/// The list of emotion category names
///
public static List CategoryNames
{
get { return _i.categoryNames; }
}
private List numCategoryFaces;
///
/// The list containing the number of faces per emotion category
///
public static List NumCategoryFaces
{
get { return _i.numCategoryFaces; }
}
private int numCategories;
///
/// The total number of emotion categories
///
public static int NumCategories
{
get { return _i.numCategories; }
}
private ContentManager content;
///
/// Singleton instance
///
private static FaceLoader _i;
///
/// Static constructor
///
static FaceLoader() { _i = new FaceLoader(); }
///
/// Hidden constructor - prevents outside instantiation
///
private FaceLoader() { }
///
/// Determines NumCategories and populates CategoryNames and NumCategoryFaces.
///
public static void Initialize(ContentManager content)
{
_i.content = content;
string[] categoryDirs = Directory.GetDirectories(content.RootDirectory + FACES_DIR, "*", SearchOption.TopDirectoryOnly);
_i.numCategories = categoryDirs.Length;
_i.categoryNames = new List();
_i.numCategoryFaces = new List();
foreach (string categoryDir in categoryDirs)
{
_i.categoryNames.Add(categoryDir.Substring(categoryDir.LastIndexOf(@"\") + 1));
string[] faces = Directory.GetFiles(categoryDir);
_i.numCategoryFaces.Add(faces.Length);
}
}
///
/// Loads all face textures into the ContentManager.
///
public static void LoadTextures(ContentManager content)
{
for(int i = 0; i < _i.categoryNames.Count; ++i)
{
string category = _i.categoryNames[i];
for (int k = 0; k < _i.numCategoryFaces[i]; ++k)
content.Load(FACES_DIR + category + @"\" + category + "_" + k);
}
}
///
/// Gets a random Texture2D of the given Categories
///
///
///
public static Texture2D GetRandomTexture(int categoryIndex)
{
int picNum = 1 + Util.Random.Next(_i.numCategoryFaces[categoryIndex]);
string categoryName = _i.categoryNames[categoryIndex];
return _i.content.Load(FACES_DIR + categoryName + @"\" + categoryName + "_" + picNum);
}
}
}