?? dxmutmisc.cs
字號:
{
return (GetAsyncKeyState((int)System.Windows.Forms.Keys.ShiftKey) & 0x8000) != 0;
}
#endregion
}
#endregion
#region Timer
public class FrameworkTimer
{
#region Instance Data
private static bool isUsingQPF;
private static bool isTimerStopped;
private static long ticksPerSecond;
private static long stopTime;
private static long lastElapsedTime;
private static long baseTime;
#endregion
#region Creation
private FrameworkTimer() { } // No creation
/// <summary>
/// Static creation routine
/// </summary>
static FrameworkTimer()
{
isTimerStopped = true;
ticksPerSecond = 0;
stopTime = 0;
lastElapsedTime = 0;
baseTime = 0;
// Use QueryPerformanceFrequency to get frequency of the timer
isUsingQPF = NativeMethods.QueryPerformanceFrequency(ref ticksPerSecond);
}
#endregion
/// <summary>
/// Resets the timer
/// </summary>
public static void Reset()
{
if (!isUsingQPF)
return; // Nothing to do
// Get either the current time or the stop time
long time = 0;
if (stopTime != 0)
time = stopTime;
else
NativeMethods.QueryPerformanceCounter(ref time);
baseTime = time;
lastElapsedTime = time;
stopTime = 0;
isTimerStopped = false;
}
/// <summary>
/// Starts the timer
/// </summary>
public static void Start()
{
if (!isUsingQPF)
return; // Nothing to do
// Get either the current time or the stop time
long time = 0;
if (stopTime != 0)
time = stopTime;
else
NativeMethods.QueryPerformanceCounter(ref time);
if (isTimerStopped)
baseTime += (time - stopTime);
stopTime = 0;
lastElapsedTime = time;
isTimerStopped = false;
}
/// <summary>
/// Stop (or pause) the timer
/// </summary>
public static void Stop()
{
if (!isUsingQPF)
return; // Nothing to do
if (!isTimerStopped)
{
// Get either the current time or the stop time
long time = 0;
if (stopTime != 0)
time = stopTime;
else
NativeMethods.QueryPerformanceCounter(ref time);
stopTime = time;
lastElapsedTime = time;
isTimerStopped = true;
}
}
/// <summary>
/// Advance the timer a tenth of a second
/// </summary>
public static void Advance()
{
if (!isUsingQPF)
return; // Nothing to do
stopTime += ticksPerSecond / 10;
}
/// <summary>
/// Get the absolute system time
/// </summary>
public static double GetAbsoluteTime()
{
if (!isUsingQPF)
return -1.0; // Nothing to do
// Get either the current time or the stop time
long time = 0;
if (stopTime != 0)
time = stopTime;
else
NativeMethods.QueryPerformanceCounter(ref time);
double absolueTime = time / (double)ticksPerSecond;
return absolueTime;
}
/// <summary>
/// Get the current time
/// </summary>
public static double GetTime()
{
if (!isUsingQPF)
return -1.0; // Nothing to do
// Get either the current time or the stop time
long time = 0;
if (stopTime != 0)
time = stopTime;
else
NativeMethods.QueryPerformanceCounter(ref time);
double appTime = (double)(time - baseTime) / (double)ticksPerSecond;
return appTime;
}
/// <summary>
/// get the time that elapsed between GetElapsedTime() calls
/// </summary>
public static double GetElapsedTime()
{
if (!isUsingQPF)
return -1.0; // Nothing to do
// Get either the current time or the stop time
long time = 0;
if (stopTime != 0)
time = stopTime;
else
NativeMethods.QueryPerformanceCounter(ref time);
double elapsedTime = (double)(time - lastElapsedTime) / (double)ticksPerSecond;
lastElapsedTime = time;
return elapsedTime;
}
/// <summary>
/// Returns true if timer stopped
/// </summary>
public static bool IsStopped
{
get { return isTimerStopped; }
}
}
#endregion
#region Resource Cache
/// <summary>Information about a cached texture</summary>
struct CachedTexture
{
public string Source; // Data source
public int Width;
public int Height;
public int Depth;
public int MipLevels;
public Usage Usage;
public Format Format;
public Pool Pool;
public ResourceType Type;
}
/// <summary>Information about a cached effect</summary>
struct CachedEffect
{
public string Source; // Data source
public ShaderFlags Flags;
}
/// <summary>
/// Will be a resource cache for any resources that may be required by a sample
/// This class will be 'static'
/// </summary>
public class ResourceCache
{
#region Creation
private ResourceCache() { } // Don't allow creation
private static ResourceCache localObject = null;
public static ResourceCache GetGlobalInstance()
{
if (localObject == null)
localObject = new ResourceCache();
return localObject;
}
#endregion
protected Hashtable textureCache = new Hashtable(); // Cache of textures
protected Hashtable effectCache = new Hashtable(); // Cache of effects
protected Hashtable fontCache = new Hashtable(); // Cache of fonts
#region Cache Creation Methods
/// <summary>Create a texture from a file</summary>
public Texture CreateTextureFromFile(Device device, string filename)
{
return CreateTextureFromFileEx(device, filename, D3DX.Default, D3DX.Default, D3DX.Default, Usage.None,
Format.Unknown, Pool.Managed, (Filter)D3DX.Default, (Filter)D3DX.Default, 0);
}
/// <summary>Create a texture from a file</summary>
public Texture CreateTextureFromFileEx(Device device, string filename, int w, int h, int mip, Usage usage, Format fmt, Pool pool, Filter filter, Filter mipfilter, int colorkey)
{
// Search the cache first
foreach(CachedTexture ct in textureCache.Keys)
{
if ( (string.Compare(ct.Source, filename, true) == 0) &&
ct.Width == w &&
ct.Height == h &&
ct.MipLevels == mip &&
ct.Usage == usage &&
ct.Format == fmt &&
ct.Pool == pool &&
ct.Type == ResourceType.Textures)
{
// A match was found, return that
return textureCache[ct] as Texture;
}
}
// No matching entry, load the resource and add it to the cache
Texture t = TextureLoader.FromFile(device, filename, w, h, mip, usage, fmt, pool, filter, mipfilter, colorkey);
CachedTexture entry = new CachedTexture();
entry.Source = filename;
entry.Width = w;
entry.Height = h;
entry.MipLevels = mip;
entry.Usage = usage;
entry.Format = fmt;
entry.Pool = pool;
entry.Type = ResourceType.Textures;
textureCache.Add(entry, t);
return t;
}
/// <summary>Create a cube texture from a file</summary>
public CubeTexture CreateCubeTextureFromFile(Device device, string filename)
{
return CreateCubeTextureFromFileEx(device, filename, D3DX.Default, D3DX.Default, Usage.None,
Format.Unknown, Pool.Managed, (Filter)D3DX.Default, (Filter)D3DX.Default, 0);
}
/// <summary>Create a cube texture from a file</summary>
public CubeTexture CreateCubeTextureFromFileEx(Device device, string filename, int size, int mip, Usage usage, Format fmt, Pool pool, Filter filter, Filter mipfilter, int colorkey)
{
// Search the cache first
foreach(CachedTexture ct in textureCache.Keys)
{
if ( (string.Compare(ct.Source, filename, true) == 0) &&
ct.Width == size &&
ct.MipLevels == mip &&
ct.Usage == usage &&
ct.Format == fmt &&
ct.Pool == pool &&
ct.Type == ResourceType.CubeTexture)
{
// A match was found, return that
return textureCache[ct] as CubeTexture;
}
}
// No matching entry, load the resource and add it to the cache
CubeTexture t = TextureLoader.FromCubeFile(device, filename, size, mip, usage, fmt, pool, filter, mipfilter, colorkey);
CachedTexture entry = new CachedTexture();
entry.Source = filename;
entry.Width = size;
entry.MipLevels = mip;
entry.Usage = usage;
entry.Format = fmt;
entry.Pool = pool;
entry.Type = ResourceType.CubeTexture;
textureCache.Add(entry, t);
return t;
}
/// <summary>Create a volume texture from a file</summary>
public VolumeTexture CreateVolumeTextureFromFile(Device device, string filename)
{
return CreateVolumeTextureFromFileEx(device, filename, D3DX.Default, D3DX.Default, D3DX.Default, D3DX.Default, Usage.None,
Format.Unknown, Pool.Managed, (Filter)D3DX.Default, (Filter)D3DX.Default, 0);
}
/// <summary>Create a volume texture from a file</summary>
public VolumeTexture CreateVolumeTextureFromFileEx(Device device, string filename, int w, int h, int d, int mip, Usage usage, Format fmt, Pool pool, Filter filter, Filter mipfilter, int colorkey)
{
// Search the cache first
foreach(CachedTexture ct in textureCache.Keys)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -