using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
using System.ComponentModel;
using JD.Core;
namespace ResourceViewer
{
// do not change these enum names cause it corresponds to const string in engine
public enum CompressionMode
{
DXT1 = 1,
DXT3 = 2,
DXT5 = 0,
ARGB8 = 3,
L8,
LA8
};
// do not change these enum names cause it corresponds to const string in engine
public enum MipmapFilter
{
MipmapFilter_Box = 0, ///< Box filter is quite good and very fast.
MipmapFilter_Triangle, ///< Triangle filter blurs the results too much, but that might be what you want.
MipmapFilter_Kaiser, ///< Kaiser-windowed Sinc filter is the best downsampling filter.
};
// do not change these enum names cause it corresponds to const string in engine
public enum WrapMode
{
WrapMode_Repeat = 0,
WrapMode_Clamp,
WrapMode_Mirror,
};
// do not change these enum names cause it corresponds to const string in engine
public enum OneColorMode
{
Auto = 0,
No,
Yes,
};
// do not change these enum names cause it corresponds to const string in engine
public enum Anisotropy
{
Max = 0,
Low,
};
public enum From
{
File = 0,
Memory,
};
public enum SaveState
{
Unchanged = 0,
Modified,
};
public enum CookState
{
Unchanged = 0,
Modified,
};
///
/// Class dedicated to texture configuration, loading, modifying, and saving
/// Properties are used in the property grid control
///
public class TextureConfiguration : IEquatable
{
#region const
private const string groupFileName = "File";
private const string groupMipmapName = "Mipmap";
private const string groupWrapName = "Wrap";
private const string groupMiscName = "Misc";
private const string groupDebugName = "Debug";
private const bool DEBUG = true;
#endregion
private static readonly Dictionary _defaultList = new Dictionary()
{
{PlatformId.ORBIS, new TextureConfiguration(PlatformId.ORBIS, CompressionMode.DXT5, "0", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.Auto, Anisotropy.Max )},
{PlatformId.DURANGO, new TextureConfiguration(PlatformId.DURANGO, CompressionMode.DXT5, "0", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.Auto, Anisotropy.Max )},
{PlatformId.X360, new TextureConfiguration(PlatformId.X360, CompressionMode.DXT5, "1", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.Auto, Anisotropy.Max )},
{PlatformId.PS3, new TextureConfiguration(PlatformId.PS3, CompressionMode.DXT5, "1", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.Auto, Anisotropy.Max )},
{PlatformId.WIIU, new TextureConfiguration(PlatformId.WIIU, CompressionMode.DXT5, "1", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.Auto, Anisotropy.Max )},
{PlatformId.WII, new TextureConfiguration(PlatformId.WII, CompressionMode.DXT5, "2", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.No, Anisotropy.Low )},
{PlatformId.PC, new TextureConfiguration(PlatformId.PC, CompressionMode.DXT5, "1", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.Auto, Anisotropy.Max )},
{PlatformId.VITA, new TextureConfiguration(PlatformId.VITA, CompressionMode.DXT5, "2", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.Auto, Anisotropy.Max )},
{PlatformId.IPAD, new TextureConfiguration(PlatformId.IPAD, CompressionMode.DXT5, "1", false, MipmapFilter.MipmapFilter_Box,
WrapMode.WrapMode_Clamp, WrapMode.WrapMode_Clamp, false, 0.0F, false, OneColorMode.Auto, Anisotropy.Max )},
};
#region properties
[Browsable(false)]
public float Epsilon
{
get { return 0.0000001f; }
}
[CategoryAttribute(groupFileName)]
[Description("Different compression modes allowed on every console")]
public CompressionMode CompressionMode
{
get; set;
}
[CategoryAttribute(groupMipmapName)]
[Description("Filter applied at mipmap creation.Box is fastest. Triangle is blur. Kaiser-windowed Sinc filter is the best downsampling filter.")]
public MipmapFilter Filter
{
get;
set;
}
[CategoryAttribute(groupWrapName), DisplayNameAttribute("x")]
[Description("Addressing method for UV. Horizontal parameter")]
public WrapMode WrapModeX
{
get;
set;
}
[CategoryAttribute(groupWrapName), DisplayNameAttribute("y")]
[Description("Addressing method for UV. Vertical parameter")]
public WrapMode WrapModeY
{
get;
set;
}
[CategoryAttribute(groupMipmapName), DisplayNameAttribute("Start level")]
[Description("Mipmap index for first MipMap level")]
public string MipmapLevelStart
{
get;
set;
}
[CategoryAttribute(groupMipmapName), DisplayNameAttribute("Enabled")]
[Description("Set to true to enable MipMap use on this texture")]
public bool UseMipmap
{
get;
set;
}
[CategoryAttribute(groupMiscName), DisplayNameAttribute("Auto Degrade")]
[Description("Authorize engine to degrade texture dynamically. GPU Optimization.")]
public bool AllowAutoDegrade
{
get;
set;
}
[CategoryAttribute(groupMiscName), DisplayNameAttribute("Lod Bias")]
[Description("Texture level of detail. GPU Optimization.")]
public float LodBias
{
get;
set;
}
[CategoryAttribute(groupMiscName), DisplayNameAttribute("Auto Degrade Alpha")]
[Description("Authorize engine to degrade alpha dynamically. GPU Optimization.")]
public bool AllowAutoDegradeAlpha
{
get;
set;
}
[CategoryAttribute(groupMiscName), DisplayNameAttribute("One Color Mode")]
[Description("Allow engine to create a one channel texture from RGB texture if only channel is used (this includes Alpha channel).")]
public OneColorMode OneColorMode
{
get;
set;
}
[CategoryAttribute(groupMiscName)]
[Description("Anisotropic filtering is a method of enhancing the image quality of textures on surfaces of computer graphics that are at oblique viewing angles with respect to the camera where the projection of the texture")]
public Anisotropy Anisotropy
{
get;
set;
}
[Browsable(DEBUG), ReadOnly(true), CategoryAttribute(groupDebugName)]
[Description("The console which you want the configuration to apply on")]
public PlatformId Target
{
get;
set;
}
private string TargetName
{
get { return Target.ToString(); }
}
[Browsable(DEBUG), ReadOnly(true), CategoryAttribute(groupDebugName)]
public From From { get; set; }
[Browsable(DEBUG), ReadOnly(true), CategoryAttribute(groupDebugName)]
public SaveState SaveState { get; private set; }
[Browsable(DEBUG), ReadOnly(true), CategoryAttribute(groupDebugName)]
public CookState CookState { get; private set; }
[Browsable(false)]
public bool ModifyStateChanged
{
get { return SaveState == SaveState.Modified; }
}
[Browsable(false)]
public bool CookStateChanged
{
get { return CookState == CookState.Modified; }
}
#endregion
#region functions
private TextureConfiguration(PlatformId target, From from)
{
Target = target;
From = from;
SaveState = SaveState.Unchanged;
CompressionMode = default(CompressionMode);
MipmapLevelStart = "0";//there is no loss
UseMipmap = true;
Filter = default(MipmapFilter);
WrapModeX = default(WrapMode);
WrapModeY = default(WrapMode);
AllowAutoDegrade = false;
LodBias = 0.0F;
AllowAutoDegradeAlpha = false;
OneColorMode = default(OneColorMode);
Anisotropy = default(Anisotropy);
}
private TextureConfiguration(PlatformId target, CompressionMode compressionMode, string MipMapLevelStart,
bool useMipMap, MipmapFilter filter, WrapMode X, WrapMode Y, bool autoDegrade, float lodBias, bool autoDegradeAlpha,
OneColorMode onecColorMode, Anisotropy anisotropy)
{
From = From.Memory;
SaveState = SaveState.Unchanged;
Target = target;
CompressionMode = compressionMode;
MipmapLevelStart = MipMapLevelStart;
UseMipmap = useMipMap;
Filter = filter;
WrapModeX = X;
WrapModeY = Y;
AllowAutoDegrade = autoDegrade;
LodBias = lodBias;
AllowAutoDegradeAlpha = autoDegradeAlpha;
OneColorMode = onecColorMode;
Anisotropy = anisotropy;
}
public static TextureConfiguration Create(PlatformId target, From from)
{
// if the target is not a known default or if it is created from file load, do not use default value
// cause every member will be updated on load file
var newTextureConfig = DefaultList.ContainsKey(target) && from == From.Memory
? (TextureConfiguration) DefaultList[target].MemberwiseClone()
: new TextureConfiguration(target, from);
newTextureConfig.From = from;
return newTextureConfig;
}
public void Modify()
{
SaveState = SaveState.Modified;
CookState = CookState.Modified;
}
public void MarkAsCooked()
{
CookState = CookState.Unchanged;
}
public static Dictionary DefaultList
{
get { return _defaultList; }
}
///
/// Generic function to retrieve an enum value according to a string parameter
/// Return the default value if string param do not corresponds to an enum name,
/// the enum value else
///
/// The type of enum to parse
/// the string to compare to value names
///
private TEnumType GetEnumValueString(string toCompareValue)
{
if (string.IsNullOrEmpty(toCompareValue) == false)
{
const bool compareNoCase = true;
foreach (TEnumType val in Enum.GetValues(typeof(TEnumType)))
{
if (string.Compare(val.ToString(), toCompareValue, compareNoCase) == 0 ||
val.ToString().EndsWith(toCompareValue))
{
return val;
}
}
}
return default(TEnumType);
}
///
/// Save the texture configuration file element, in the filexml
///
/// the xml file object, the file should be open to write
public void Save(XmlTextWriter filexml, TextureConfigFileWriter.ModifyUpdate update)
{
filexml.WriteStartElement("TextureConfiguration");
filexml.WriteAttributeString("TargetName", TargetName);
filexml.WriteAttributeString("CompressionMode", CompressionMode.ToString());
filexml.WriteAttributeString("MipmapLevelStart", MipmapLevelStart);
filexml.WriteAttributeString("UseMipmap", UseMipmap.ToString());
filexml.WriteAttributeString("WrapModeX", WrapModeX.ToString());
filexml.WriteAttributeString("WrapModeY", WrapModeY.ToString());
filexml.WriteAttributeString("Filter", Filter.ToString());
filexml.WriteAttributeString("AllowDegradation", AllowAutoDegrade.ToString());
filexml.WriteAttributeString("LodBias", LodBias.ToString(CultureInfo.InvariantCulture));
filexml.WriteAttributeString("AllowDegradationAlpha", AllowAutoDegradeAlpha.ToString());
filexml.WriteAttributeString("OneColMode", OneColorMode.ToString());
filexml.WriteAttributeString("Anisotropy", Anisotropy.ToString());
filexml.WriteEndElement();
if (update == TextureConfigFileWriter.ModifyUpdate.SetUnchanged)
SaveState = SaveState.Unchanged;
}
///
/// Load a xml file element
///
/// the xml file object, the file should be open to read
public void Load(XmlTextReader filexml)
{
string compressionModeString = filexml.GetAttribute("CompressionMode");
string wrapModeXString = filexml.GetAttribute("WrapModeX");
string wrapModeYString = filexml.GetAttribute("WrapModeY");
string deprecatedWrapModeString = filexml.GetAttribute("WrapMode");
string filterString = filexml.GetAttribute("Filter");
string allowDegradationString = filexml.GetAttribute("AllowDegradation");
string lodBiasString = filexml.GetAttribute("LodBias");
string allowDegradationAlphaString = filexml.GetAttribute("AllowDegradationAlpha");
string oneColModeString = filexml.GetAttribute("OneColMode");
string anisotropyString = filexml.GetAttribute("Anisotropy");
MipmapLevelStart = filexml.GetAttribute("MipmapLevelStart");
UseMipmap = bool.Parse(filexml.GetAttribute("UseMipmap"));
if(allowDegradationString != null)
AllowAutoDegrade = bool.Parse(allowDegradationString);
if (lodBiasString != null)
LodBias = float.Parse(lodBiasString);
if (allowDegradationAlphaString != null)
AllowAutoDegradeAlpha = bool.Parse(allowDegradationAlphaString);
CompressionMode = GetEnumValueString(compressionModeString);
Filter = GetEnumValueString(filterString);
WrapModeX = WrapModeY = GetEnumValueString(deprecatedWrapModeString);
WrapModeX = GetEnumValueString(wrapModeXString);
WrapModeY = GetEnumValueString(wrapModeYString);
OneColorMode = GetEnumValueString(oneColModeString);
Anisotropy = GetEnumValueString(anisotropyString);
}
#endregion
public bool Equals(TextureConfiguration other)
{
if (other.AllowAutoDegrade != AllowAutoDegrade ||
other.AllowAutoDegradeAlpha != AllowAutoDegradeAlpha ||
other.Anisotropy != Anisotropy ||
other.CompressionMode != CompressionMode ||
other.Filter != Filter ||
other.WrapModeX != WrapModeX ||
other.WrapModeY != WrapModeY ||
other.MipmapLevelStart != MipmapLevelStart ||
other.OneColorMode != OneColorMode ||
other.UseMipmap != UseMipmap)
return false;
if (Math.Abs(other.LodBias - LodBias) > Epsilon)
return false;
return true;
}
}
}