?? dxmutmisc.cs
字號:
if ( (string.Compare(ct.Source, filename, true) == 0) &&
ct.Width == w &&
ct.Height == h &&
ct.Depth == d &&
ct.MipLevels == mip &&
ct.Usage == usage &&
ct.Format == fmt &&
ct.Pool == pool &&
ct.Type == ResourceType.VolumeTexture)
{
// A match was found, return that
return textureCache[ct] as VolumeTexture;
}
}
// No matching entry, load the resource and add it to the cache
VolumeTexture t = TextureLoader.FromVolumeFile(device, filename, w, h, d, mip, usage, fmt, pool, filter, mipfilter, colorkey);
CachedTexture entry = new CachedTexture();
entry.Source = filename;
entry.Width = w;
entry.Height = h;
entry.Depth = d;
entry.MipLevels = mip;
entry.Usage = usage;
entry.Format = fmt;
entry.Pool = pool;
entry.Type = ResourceType.VolumeTexture;
textureCache.Add(entry, t);
return t;
}
/// <summary>Create an effect from a file</summary>
public Effect CreateEffectFromFile(Device device, string filename, Macro[] defines, Include includeFile, ShaderFlags flags, EffectPool effectPool, out string errors)
{
// No errors at first!
errors = string.Empty;
// Search the cache first
foreach(CachedEffect ce in effectCache.Keys)
{
if ( (string.Compare(ce.Source, filename, true) == 0) &&
ce.Flags == flags)
{
// A match was found, return that
return effectCache[ce] as Effect;
}
}
// Nothing found in the cache
Effect e = Effect.FromFile(device, filename, defines, includeFile, null, flags, effectPool, out errors);
// Add this to the cache
CachedEffect entry = new CachedEffect();
entry.Flags = flags;
entry.Source = filename;
effectCache.Add(entry, e);
// Return the new effect
return e;
}
/// <summary>Create an effect from a file</summary>
public Effect CreateEffectFromFile(Device device, string filename, Macro[] defines, Include includeFile, ShaderFlags flags, EffectPool effectPool)
{
string temp; return CreateEffectFromFile(device, filename, defines, includeFile, flags, effectPool, out temp);
}
/// <summary>Create a font object</summary>
public Font CreateFont(Device device, int height, int width, FontWeight weight, int mip, bool italic,
CharacterSet charSet, Precision outputPrecision, FontQuality quality, PitchAndFamily pandf, string fontName)
{
// Create the font description
FontDescription desc = new FontDescription();
desc.Height = height;
desc.Width = width;
desc.Weight = weight;
desc.MipLevels = mip;
desc.IsItalic = italic;
desc.CharSet = charSet;
desc.OutputPrecision = outputPrecision;
desc.Quality = quality;
desc.PitchAndFamily = pandf;
desc.FaceName = fontName;
// return the font
return CreateFont(device, desc);
}
/// <summary>Create a font object</summary>
public Font CreateFont(Device device, FontDescription desc)
{
// Search the cache first
foreach(FontDescription fd in fontCache.Keys)
{
if ( (string.Compare(fd.FaceName, desc.FaceName, true) == 0) &&
fd.CharSet == desc.CharSet &&
fd.Height == desc.Height &&
fd.IsItalic == desc.IsItalic &&
fd.MipLevels == desc.MipLevels &&
fd.OutputPrecision == desc.OutputPrecision &&
fd.PitchAndFamily == desc.PitchAndFamily &&
fd.Quality == desc.Quality &&
fd.Weight == desc.Weight &&
fd.Width == desc.Width)
{
// A match was found, return that
return fontCache[fd] as Font;
}
}
// Couldn't find anything in the cache, create one
Font f = new Font(device, desc);
// Create a new entry
fontCache.Add(desc, f);
// return the new font
return f;
}
#endregion
#region Device event callbacks
/// <summary>
/// Called when the device is created
/// </summary>
public void OnCreateDevice(Device device) {} // Nothing to do on device create
/// <summary>
/// Called when the device is reset
/// </summary>
public void OnResetDevice(Device device)
{
// Call OnResetDevice on all effect and font objects
foreach(Font f in fontCache.Values)
f.OnResetDevice();
foreach(Effect e in effectCache.Values)
e.OnResetDevice();
}
/// <summary>
/// Clear any resources that need to be lost
/// </summary>
public void OnLostDevice()
{
foreach(Font f in fontCache.Values)
f.OnLostDevice();
foreach(Effect e in effectCache.Values)
e.OnLostDevice();
// Search the texture cache
foreach(CachedTexture ct in textureCache.Keys)
{
if (ct.Pool == Pool.Default)
{
// A match was found, get rid of it
switch(ct.Type)
{
case ResourceType.Textures:
(textureCache[ct] as Texture).Dispose(); break;
case ResourceType.CubeTexture:
(textureCache[ct] as CubeTexture).Dispose();break;
case ResourceType.VolumeTexture:
(textureCache[ct] as VolumeTexture).Dispose();break;
}
}
}
}
/// <summary>
/// Destroy any resources and clear the caches
/// </summary>
public void OnDestroyDevice()
{
// Cleanup the fonts
foreach(Font f in fontCache.Values)
f.Dispose();
// Cleanup the effects
foreach(Effect e in effectCache.Values)
e.Dispose();
// Dispose of any items in the caches
foreach(BaseTexture texture in textureCache.Values)
{
if (texture != null)
texture.Dispose();
}
// Clear all of the caches
textureCache.Clear();
fontCache.Clear();
effectCache.Clear();
}
#endregion
}
#endregion
#region Arcball
/// <summary>
/// Class holds arcball data
/// </summary>
public class ArcBall
{
#region Instance Data
protected Matrix rotation; // Matrix for arc ball's orientation
protected Matrix translation; // Matrix for arc ball's position
protected Matrix translationDelta; // Matrix for arc ball's position
protected int width; // arc ball's window width
protected int height; // arc ball's window height
protected Vector2 center; // center of arc ball
protected float radius; // arc ball's radius in screen coords
protected float radiusTranslation; // arc ball's radius for translating the target
protected Quaternion downQuat; // Quaternion before button down
protected Quaternion nowQuat; // Composite quaternion for current drag
protected bool isDragging; // Whether user is dragging arc ball
protected System.Drawing.Point lastMousePosition; // position of last mouse point
protected Vector3 downPt; // starting point of rotation arc
protected Vector3 currentPt; // current point of rotation arc
#endregion
#region Simple Properties
/// <summary>Gets the rotation matrix</summary>
public Matrix RotationMatrix { get { return rotation = Matrix.RotationQuaternion(nowQuat); } }
/// <summary>Gets the translation matrix</summary>
public Matrix TranslationMatrix { get { return translation; } }
/// <summary>Gets the translation delta matrix</summary>
public Matrix TranslationDeltaMatrix { get { return translationDelta; } }
/// <summary>Gets the dragging state</summary>
public bool IsBeingDragged { get { return isDragging; } }
/// <summary>Gets or sets the current quaternion</summary>
public Quaternion CurrentQuaternion { get { return nowQuat; } set { nowQuat = value; } }
#endregion
// Class methods
/// <summary>
/// Create new instance of the arcball class
/// </summary>
public ArcBall()
{
Reset();
downPt = Vector3.Empty;
currentPt = Vector3.Empty;
System.Windows.Forms.Form active = System.Windows.Forms.Form.ActiveForm;
if (active != null)
{
System.Drawing.Rectangle rect = active.ClientRectangle;
SetWindow(rect.Width, rect.Height);
}
}
/// <summary>
/// Resets the arcball
/// </summary>
public void Reset()
{
downQuat = Quaternion.Identity;
nowQuat = Quaternion.Identity;
rotation = Matrix.Identity;
translation = Matrix.Identity;
translationDelta = Matrix.Identity;
isDragging = false;
radius = 1.0f;
radiusTranslation = 1.0f;
}
/// <summary>
/// Convert a screen point to a vector
/// </summary>
public Vector3 ScreenToVector(float screenPointX, float screenPointY)
{
float x = -(screenPointX - width / 2.0f) / (radius * width/2.0f);
float y = (screenPointY - height / 2.0f) / (radius * height/2.0f);
float z = 0.0f;
float mag = (x*x) + (y*y);
if (mag > 1.0f)
{
float scale = 1.0f / (float)Math.Sqrt(mag);
x *= scale;
y *= scale;
}
else
z = (float)Math.Sqrt(1.0f - mag);
return new Vector3(x,y,z);
}
/// <summary>
/// Set window paramters
/// </summary>
public void SetWindow(int w, int h, float r)
{
width = w; height = h; radius = r;
center = new Vector2(w / 2.0f, h / 2.0f);
}
public void SetWindow(int w, int h)
{
SetWindow(w,h,0.9f); // default radius
}
/// <summary>
/// Computes a quaternion from ball points
/// </summary>
public static Quaternion QuaternionFromBallPoints(Vector3 from, Vector3 to)
{
float dot = Vector3.Dot(from, to);
Vector3 part = Vector3.Cross(from, to);
return new Quaternion(part.X, part.Y, part.Z, dot);
}
/// <summary>
/// Begin the arcball 'dragging'
/// </summary>
public void OnBegin(int x, int y)
{
isDragging = true;
downQuat = nowQuat;
downPt = ScreenToVector((float)x, (float)y);
}
/// <summary>
/// The arcball is 'moving'
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -