diff --git a/Vocaluxe/Base/CSettings.cs b/Vocaluxe/Base/CSettings.cs index d0367a7d..9aa5d8b1 100644 --- a/Vocaluxe/Base/CSettings.cs +++ b/Vocaluxe/Base/CSettings.cs @@ -61,7 +61,7 @@ namespace Vocaluxe.Base public static int zFar = 100; public static bool bFullScreen = false; - public static int iVertexBufferElements = 1000; + public static int iVertexBufferElements = 10000; public const string sIcon = "Vocaluxe.ico"; public const string sLogo = "Logo.png"; diff --git a/Vocaluxe/Lib/Draw/CDirect3D.cs b/Vocaluxe/Lib/Draw/CDirect3D.cs index 5bb3ece1..07fb2e5c 100644 --- a/Vocaluxe/Lib/Draw/CDirect3D.cs +++ b/Vocaluxe/Lib/Draw/CDirect3D.cs @@ -229,6 +229,8 @@ namespace Vocaluxe.Lib.Draw } } #endregion form events + + #region resize /// /// Resizes the viewport /// @@ -323,6 +325,7 @@ namespace Vocaluxe.Lib.Draw CConfig.SaveConfig(); } + #endregion resize #region mouse event handlers private void OnMouseMove(object sender, MouseEventArgs e) @@ -383,7 +386,7 @@ namespace Vocaluxe.Lib.Draw #endregion keyboard event handlers #region implementation - + #region main stuff /// /// Inits the Device /// @@ -626,6 +629,7 @@ namespace Vocaluxe.Lib.Draw _VerticesRotationMatrices.Clear(); } } +#endregion main stuff #region Basic Draw Methods @@ -638,24 +642,51 @@ namespace Vocaluxe.Lib.Draw } /// - /// Not implemented yet - /// - /// + /// Copies the current frame into a texture + /// A texture holding the current frame public STexture CopyScreen() { - //FIXME STexture texture = new STexture(-1); + + Surface backbufferSurface = _Device.GetBackBuffer(0, 0); + Texture tex = new Texture(_Device, _PresentParameters.BackBufferWidth, _PresentParameters.BackBufferHeight, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed); + Surface textureSurface = tex.GetSurfaceLevel(0); + Surface.FromSurface(textureSurface, backbufferSurface, Filter.Default, 0); + backbufferSurface.Dispose(); + _D3DTextures.Add(tex); + + texture.color = new SColorF(1f, 1f, 1f, 1f); + texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); + texture.width = w; + texture.height = h; + texture.w2 = NextPowerOfTwo(texture.width); + texture.h2 = NextPowerOfTwo(texture.height); + texture.index = _D3DTextures.Count - 1; + + lock (MutexTexture) + { + _Textures[texture.index] = texture; + } return texture; } /// - /// Not implemented yet + /// Copies the current frame into a texture /// - /// + /// The texture in which the frame is copied to public void CopyScreen(ref STexture Texture) { - //FIXME - return; + if (!_TextureExists(ref Texture) || (Texture.width != GetScreenWidth()) || (Texture.height != GetScreenHeight())) + { + RemoveTexture(ref Texture); + Texture = CopyScreen(); + } + else + { + Surface backbufferSurface = _Device.GetBackBuffer(0, 0); + Surface textureSurface = _D3DTextures[Texture.index].GetSurfaceLevel(0); + Surface.FromSurface(textureSurface, backbufferSurface, Filter.Default, 0); + } } /// @@ -731,18 +762,11 @@ namespace Vocaluxe.Lib.Draw /// The coordinates in a SRectF struct public void DrawColor(SColorF color, SRectF rect) { - //blankMap = new Bitmap(1, 1); - //Graphics g = Graphics.FromImage(blankMap); - //g.Clear(Color.White); - //g.Dispose(); - //blankTexture = AddTexture(blankMap); - //blankMap.Dispose(); - DrawTexture(blankTexture, rect, color); - //RemoveTexture(ref blankTexture); } #endregion Basic Draw Methods #region Textures + #region adding /// /// Adds a texture and stores it in the VRam @@ -769,17 +793,6 @@ namespace Vocaluxe.Lib.Draw return new STexture(-1); } - /// - /// Calculates the next power of two - /// - /// The value of which the next power of two will be calculated - /// The next power of two - private static float NextPowerOfTwo(float n) - { - if (n < 0) throw new ArgumentOutOfRangeException("n", "Must be positive."); - return (float)System.Math.Pow(2, System.Math.Ceiling(System.Math.Log((double)n, 2))); - } - /// /// Adds a texture and stores it in the Vram /// @@ -957,7 +970,9 @@ namespace Vocaluxe.Lib.Draw } return texture; } + #endregion adding + #region updating /// /// Updates the data of a texture /// @@ -999,6 +1014,7 @@ namespace Vocaluxe.Lib.Draw else return false; } + #endregion updating /// /// Checks if a texture exists @@ -1040,6 +1056,7 @@ namespace Vocaluxe.Lib.Draw } } + #region drawing /// /// Draws a texture /// @@ -1314,6 +1331,7 @@ namespace Vocaluxe.Lib.Draw } } } + #endregion drawing private void CheckQueque() { @@ -1367,6 +1385,20 @@ namespace Vocaluxe.Lib.Draw { return _Textures.Count; } + #endregion Textures + #endregion implementation + + #region utility + /// + /// Calculates the next power of two + /// + /// The value of which the next power of two will be calculated + /// The next power of two + private static float NextPowerOfTwo(float n) + { + if (n < 0) throw new ArgumentOutOfRangeException("n", "Must be positive."); + return (float)System.Math.Pow(2, System.Math.Ceiling(System.Math.Log((double)n, 2))); + } private Matrix CalculateRotationMatrix(float rot, float rx1, float rx2, float ry1, float ry2) { @@ -1390,8 +1422,7 @@ namespace Vocaluxe.Lib.Draw } return originTranslation; } - #endregion Textures - #endregion implementation + #endregion utility #region TexturedColoredVertex public struct TexturedColoredVertex