Merge pull request #39 from xDarkice/develop
merge xDarkice/Vocaluxe/develop into develop
This commit is contained in:
commit
802965377c
2 files changed
+81
-19
No files matched your search
@@ -217,7 +217,12 @@ namespace Vocaluxe.Base
|
||||
{
|
||||
if (_AllFileNames.Count > 0 && _CurrentMusicStream != -1)
|
||||
{
|
||||
float timeToPlay = CSound.GetLength(_CurrentMusicStream) - CSound.GetPosition(_CurrentMusicStream);
|
||||
float timeToPlay;
|
||||
if(_CurrentPlaylistElement.Finish == 0f) //No End-Tag defined
|
||||
timeToPlay = CSound.GetLength(_CurrentMusicStream) - CSound.GetPosition(_CurrentMusicStream);
|
||||
else //End-Tag found
|
||||
timeToPlay = _CurrentPlaylistElement.Finish - CSound.GetPosition(_CurrentMusicStream);
|
||||
|
||||
bool finished = CSound.IsFinished(_CurrentMusicStream);
|
||||
if (_Playing && (timeToPlay <= CSettings.BackgroundMusicFadeTime || finished))
|
||||
Next();
|
||||
@@ -248,6 +253,11 @@ namespace Vocaluxe.Base
|
||||
_CurrentPlaylistElement = _PreviousFileNames[_PreviousMusicIndex];
|
||||
}
|
||||
_CurrentMusicStream = CSound.Load(_CurrentPlaylistElement.MusicFilePath);
|
||||
|
||||
//Seek to #Start-Tag, if found
|
||||
if (_CurrentPlaylistElement.Start != 0f)
|
||||
CSound.SetPosition(_CurrentMusicStream, _CurrentPlaylistElement.Start);
|
||||
|
||||
if (_VideoEnabled)
|
||||
LoadVideo();
|
||||
CSound.SetStreamVolume(_CurrentMusicStream, 0f);
|
||||
@@ -524,6 +534,28 @@ class PlaylistElement
|
||||
}
|
||||
}
|
||||
|
||||
public float Start
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_Song != null)
|
||||
return _Song.Start;
|
||||
|
||||
return 0f;
|
||||
}
|
||||
}
|
||||
|
||||
public float Finish
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_Song != null)
|
||||
return _Song.Finish;
|
||||
|
||||
return 0f;
|
||||
}
|
||||
}
|
||||
|
||||
public STexture Cover
|
||||
{
|
||||
get
|
||||
|
||||
@@ -55,6 +55,8 @@ namespace Vocaluxe.Lib.Draw
|
||||
private Queue<Texture> _VerticesTextures;
|
||||
private Queue<Matrix> _VerticesRotationMatrices;
|
||||
|
||||
private bool _NonPowerOf2TextureSupported;
|
||||
|
||||
#endregion private vars
|
||||
|
||||
/// <summary>
|
||||
@@ -182,6 +184,13 @@ namespace Vocaluxe.Lib.Draw
|
||||
flags = CreateFlags.HardwareVertexProcessing;
|
||||
else
|
||||
flags = CreateFlags.SoftwareVertexProcessing;
|
||||
|
||||
//Check if Pow2 textures are needed
|
||||
_NonPowerOf2TextureSupported = true;
|
||||
_NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.Pow2) == 0;
|
||||
_NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.NonPow2Conditional) == 0;
|
||||
_NonPowerOf2TextureSupported &= (caps.TextureCaps & TextureCaps.SquareOnly) == 0;
|
||||
|
||||
try
|
||||
{
|
||||
_Device = new Device(_D3D, _D3D.Adapters.DefaultAdapter.Adapter, DeviceType.Hardware, Handle, flags, _PresentParameters);
|
||||
@@ -477,7 +486,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
_IndexBuffer = new IndexBuffer(_Device, 6 * sizeof(Int16), Usage.WriteOnly, Pool.Managed, true);
|
||||
|
||||
DataStream stream = _IndexBuffer.Lock(0, 0, LockFlags.None);
|
||||
DataStream stream = _IndexBuffer.Lock(0, 0, LockFlags.Discard);
|
||||
stream.WriteRange(indices);
|
||||
_IndexBuffer.Unlock();
|
||||
_Device.Indices = _IndexBuffer;
|
||||
@@ -731,8 +740,8 @@ namespace Vocaluxe.Lib.Draw
|
||||
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.w2 = CheckForNextPowerOf2(texture.width);
|
||||
texture.h2 = CheckForNextPowerOf2(texture.height);
|
||||
texture.index = _IDs.Dequeue();
|
||||
|
||||
lock (MutexTexture)
|
||||
@@ -932,8 +941,8 @@ namespace Vocaluxe.Lib.Draw
|
||||
texture.height = h;
|
||||
|
||||
//Older graphics card can only handle textures with sizes being powers of two
|
||||
texture.w2 = (float)NextPowerOfTwo(w);
|
||||
texture.h2 = (float)NextPowerOfTwo(h);
|
||||
texture.w2 = (float)CheckForNextPowerOf2(w);
|
||||
texture.h2 = (float)CheckForNextPowerOf2(h);
|
||||
|
||||
//Create a new Bitmap with the new sizes
|
||||
Bitmap bmp2 = new Bitmap((int)texture.w2, (int)texture.h2);
|
||||
@@ -957,7 +966,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
//because a copy of the texture is hold in the Ram
|
||||
Texture t = new Texture(_Device, (int)texture.w2, (int)texture.h2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed);
|
||||
//Lock the texture and fill it with the data
|
||||
DataRectangle rect = t.LockRectangle(0, LockFlags.None);
|
||||
DataRectangle rect = t.LockRectangle(0, LockFlags.Discard);
|
||||
for (int i = 0; i < Data.Length; )
|
||||
{
|
||||
rect.Data.Write(Data, i, 4 * bmp2.Width);
|
||||
@@ -1027,13 +1036,13 @@ namespace Vocaluxe.Lib.Draw
|
||||
STexture texture = new STexture(-1);
|
||||
texture.width = W;
|
||||
texture.height = H;
|
||||
texture.w2 = NextPowerOfTwo(texture.width);
|
||||
texture.h2 = NextPowerOfTwo(texture.height);
|
||||
texture.w2 = CheckForNextPowerOf2(texture.width);
|
||||
texture.h2 = CheckForNextPowerOf2(texture.height);
|
||||
texture.width_ratio = texture.width / texture.w2;
|
||||
texture.height_ratio = texture.height / texture.h2;
|
||||
|
||||
Texture t = new Texture(_Device, (int)texture.w2, (int)texture.h2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed);
|
||||
DataRectangle rect = t.LockRectangle(0, LockFlags.None);
|
||||
DataRectangle rect = t.LockRectangle(0, LockFlags.Discard);
|
||||
for (int i = 0; i < Data.Length; )
|
||||
{
|
||||
rect.Data.Write(Data, i, 4 * W);
|
||||
@@ -1082,7 +1091,7 @@ namespace Vocaluxe.Lib.Draw
|
||||
{
|
||||
if ((Texture.index >= 0) && (_Textures.Count > 0) && _TextureExists(ref Texture))
|
||||
{
|
||||
DataRectangle rect = _D3DTextures[Texture.index].LockRectangle(0, LockFlags.None);
|
||||
DataRectangle rect = _D3DTextures[Texture.index].LockRectangle(0, LockFlags.Discard);
|
||||
for (int i = 0; i < Data.Length; )
|
||||
{
|
||||
rect.Data.Write(Data, i, 4 * (int)Texture.width);
|
||||
@@ -1092,9 +1101,26 @@ namespace Vocaluxe.Lib.Draw
|
||||
}
|
||||
_D3DTextures[Texture.index].UnlockRectangle(0);
|
||||
|
||||
Texture.height_ratio = Texture.height / CheckForNextPowerOf2(Texture.height);
|
||||
Texture.width_ratio = Texture.width / CheckForNextPowerOf2(Texture.width);
|
||||
return true;
|
||||
|
||||
/*Surface s = _D3DTextures[Texture.index].GetSurfaceLevel(0);
|
||||
DataRectangle d = s.LockRectangle(LockFlags.Discard);
|
||||
|
||||
for (int i = 0; i < Data.Length; )
|
||||
{
|
||||
d.Data.Write(Data, i, 4 * (int)Texture.width);
|
||||
i += 4 * (int)Texture.width;
|
||||
d.Data.Position = d.Data.Position - 4 * (int)Texture.width;
|
||||
d.Data.Position += d.Pitch;
|
||||
}
|
||||
|
||||
Texture.height_ratio = Texture.height / NextPowerOfTwo(Texture.height);
|
||||
Texture.width_ratio = Texture.width / NextPowerOfTwo(Texture.width);
|
||||
return true;
|
||||
|
||||
s.UnlockRectangle();
|
||||
return true; */
|
||||
}
|
||||
else
|
||||
return false;
|
||||
@@ -1430,14 +1456,14 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
texture.width = q.width;
|
||||
texture.height = q.height;
|
||||
texture.w2 = NextPowerOfTwo(texture.width);
|
||||
texture.h2 = NextPowerOfTwo(texture.height);
|
||||
texture.w2 = CheckForNextPowerOf2(texture.width);
|
||||
texture.h2 = CheckForNextPowerOf2(texture.height);
|
||||
|
||||
texture.width_ratio = texture.width / texture.w2;
|
||||
texture.height_ratio = texture.height / texture.h2;
|
||||
|
||||
Texture t = new Texture(_Device, (int)texture.w2, (int)texture.h2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed);
|
||||
DataRectangle rect = t.LockRectangle(0, LockFlags.None);
|
||||
DataRectangle rect = t.LockRectangle(0, LockFlags.Discard);
|
||||
for (int i = 0; i < q.data.Length; )
|
||||
{
|
||||
rect.Data.Write(q.data, i, 4 * q.width);
|
||||
@@ -1471,14 +1497,18 @@ namespace Vocaluxe.Lib.Draw
|
||||
|
||||
#region utility
|
||||
/// <summary>
|
||||
/// Calculates the next power of two
|
||||
/// Calculates the next power of two if the device has the POW2 flag set
|
||||
/// </summary>
|
||||
/// <param name="n">The value of which the next power of two will be calculated</param>
|
||||
/// <returns>The next power of two</returns>
|
||||
private static float NextPowerOfTwo(float n)
|
||||
private float CheckForNextPowerOf2(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)));
|
||||
if (!_NonPowerOf2TextureSupported)
|
||||
{
|
||||
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)));
|
||||
}
|
||||
else return n;
|
||||
}
|
||||
|
||||
private Matrix CalculateRotationMatrix(float rot, float rx1, float rx2, float ry1, float ry2)
|
||||
|
||||
Reference in new issue
Block a user