Added initial webcam support with OpenCV.
Due to OpenCV's size I am not distributing OpenCV binaries in my repository. Download OpenCV and put it in x64 and x86 folder. Emgu CV relies on .Net 3.5, so I had to switch to that framework as well. OpenCV has the big advantage that it will work on Linux too, unlike solutions based on DirectShow. Currently the default device is used for capturing which will be changed in later revisions. We could also use some video filters provided by OpenCV e.g grayscale or canny edges.
This commit is contained in:
1 parent
fefd81c506
commit
b93dd532b4
10 files changed
+254
-44
No files matched your search
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -87,6 +87,11 @@ namespace Vocaluxe.Base
|
|||||||
OpenAL
|
OpenAL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum EWebcamLib
|
||||||
|
{
|
||||||
|
OpenCV
|
||||||
|
}
|
||||||
|
|
||||||
public enum ERecordLib
|
public enum ERecordLib
|
||||||
{
|
{
|
||||||
#if WIN
|
#if WIN
|
||||||
@@ -255,6 +260,7 @@ namespace Vocaluxe.Base
|
|||||||
// Record
|
// Record
|
||||||
public static SMicConfig[] MicConfig;
|
public static SMicConfig[] MicConfig;
|
||||||
public static int MicDelay = 300; //[ms]
|
public static int MicDelay = 300; //[ms]
|
||||||
|
public static EWebcamLib WebcamLib = EWebcamLib.OpenCV;
|
||||||
|
|
||||||
//Lists to save parameters and values
|
//Lists to save parameters and values
|
||||||
private static List<string> _Params = new List<string>();
|
private static List<string> _Params = new List<string>();
|
||||||
@@ -448,6 +454,8 @@ namespace Vocaluxe.Base
|
|||||||
if (MicDelay > 500)
|
if (MicDelay > 500)
|
||||||
MicDelay = 500;
|
MicDelay = 500;
|
||||||
|
|
||||||
|
CHelper.TryGetEnumValueFromXML<EWebcamLib>("//root/Record/WebcamLib", navigator, ref WebcamLib);
|
||||||
|
|
||||||
#endregion Record
|
#endregion Record
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -692,6 +700,9 @@ namespace Vocaluxe.Base
|
|||||||
writer.WriteComment("Mic delay in ms. 0, 20, 40, 60 ... 500");
|
writer.WriteComment("Mic delay in ms. 0, 20, 40, 60 ... 500");
|
||||||
writer.WriteElementString("MicDelay", MicDelay.ToString());
|
writer.WriteElementString("MicDelay", MicDelay.ToString());
|
||||||
|
|
||||||
|
writer.WriteComment("WebcamLib: " + ListStrings(Enum.GetNames(typeof(EWebcamLib))));
|
||||||
|
writer.WriteElementString("WebcamLib", Enum.GetName(typeof(EWebcamLib), WebcamLib));
|
||||||
|
|
||||||
writer.WriteEndElement();
|
writer.WriteEndElement();
|
||||||
#endregion Record
|
#endregion Record
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
using Vocaluxe.Lib.Webcam;
|
||||||
|
using Vocaluxe.Lib.Draw;
|
||||||
|
|
||||||
|
namespace Vocaluxe.Base
|
||||||
|
{
|
||||||
|
static class CWebcam
|
||||||
|
{
|
||||||
|
private static IWebcam _Webcam;
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
switch (CConfig.WebcamLib)
|
||||||
|
{
|
||||||
|
case EWebcamLib.OpenCV:
|
||||||
|
_Webcam = new COpenCV();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
_Webcam = new COpenCV();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_Webcam.Init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool GetFrame(ref STexture tex)
|
||||||
|
{
|
||||||
|
_Webcam.GetFrame(ref tex);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Close()
|
||||||
|
{
|
||||||
|
_Webcam.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Pause()
|
||||||
|
{
|
||||||
|
_Webcam.Pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Start()
|
||||||
|
{
|
||||||
|
_Webcam.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using Emgu.CV;
|
||||||
|
using Emgu.CV.Structure;
|
||||||
|
using Emgu.Util;
|
||||||
|
using Vocaluxe.Base;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Vocaluxe.Lib.Webcam
|
||||||
|
{
|
||||||
|
class COpenCV : IWebcam
|
||||||
|
{
|
||||||
|
Image<Bgr, Byte> _CurrentFrame;
|
||||||
|
Capture _CaptureDevice;
|
||||||
|
|
||||||
|
Object Mutex = new Object();
|
||||||
|
|
||||||
|
public bool Init()
|
||||||
|
{
|
||||||
|
//Create a new default Capture
|
||||||
|
_CaptureDevice = new Capture();
|
||||||
|
if (_CaptureDevice != null)
|
||||||
|
_CaptureDevice.ImageGrabbed += OnImageGrabbed;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Start()
|
||||||
|
{
|
||||||
|
if (_CaptureDevice != null)
|
||||||
|
_CaptureDevice.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Pause()
|
||||||
|
{
|
||||||
|
if (_CaptureDevice != null)
|
||||||
|
_CaptureDevice.Pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
if(_CaptureDevice != null)
|
||||||
|
_CaptureDevice.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool GetFrame(ref Draw.STexture Frame)
|
||||||
|
{
|
||||||
|
if (_CurrentFrame != null)
|
||||||
|
{
|
||||||
|
Bitmap b = _CurrentFrame.ToBitmap();
|
||||||
|
BitmapData bd = b.LockBits(new Rectangle(0, 0, _CurrentFrame.Width, _CurrentFrame.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
||||||
|
byte[] data = new byte[4 * _CurrentFrame.Width * _CurrentFrame.Height];
|
||||||
|
Marshal.Copy(bd.Scan0, data, 0, data.Length);
|
||||||
|
|
||||||
|
if (Frame.index == -1 || _CurrentFrame.Width != Frame.width || _CurrentFrame.Height != Frame.height)
|
||||||
|
{
|
||||||
|
CDraw.RemoveTexture(ref Frame);
|
||||||
|
Frame = CDraw.AddTexture(_CurrentFrame.Width, _CurrentFrame.Height, ref data);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CDraw.UpdateTexture(ref Frame, ref data);
|
||||||
|
}
|
||||||
|
|
||||||
|
b.UnlockBits(bd);
|
||||||
|
b.Dispose();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnImageGrabbed(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
_CurrentFrame = _CaptureDevice.RetrieveBgrFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using Vocaluxe.Lib.Draw;
|
||||||
|
|
||||||
|
namespace Vocaluxe.Lib.Webcam
|
||||||
|
{
|
||||||
|
interface IWebcam
|
||||||
|
{
|
||||||
|
bool Init();
|
||||||
|
|
||||||
|
void Start();
|
||||||
|
void Pause();
|
||||||
|
void Close();
|
||||||
|
|
||||||
|
bool GetFrame(ref STexture Frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -89,6 +89,13 @@ namespace Vocaluxe
|
|||||||
|
|
||||||
Application.DoEvents();
|
Application.DoEvents();
|
||||||
|
|
||||||
|
//Init Webcam
|
||||||
|
CLog.StartBenchmark(0, "Init Webcam");
|
||||||
|
CWebcam.Init();
|
||||||
|
CLog.StopBenchmark(0, "Init Webcam");
|
||||||
|
|
||||||
|
Application.DoEvents();
|
||||||
|
|
||||||
// Init Background Music
|
// Init Background Music
|
||||||
CLog.StartBenchmark(0, "Init Background Music");
|
CLog.StartBenchmark(0, "Init Background Music");
|
||||||
CBackgroundMusic.Init();
|
CBackgroundMusic.Init();
|
||||||
@@ -179,6 +186,7 @@ namespace Vocaluxe
|
|||||||
CDraw.Unload();
|
CDraw.Unload();
|
||||||
CLog.CloseAll();
|
CLog.CloseAll();
|
||||||
CDataBase.CloseConnections();
|
CDataBase.CloseConnections();
|
||||||
|
CWebcam.Close();
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ namespace Vocaluxe.Screens
|
|||||||
private int _CurrentVideo = -1;
|
private int _CurrentVideo = -1;
|
||||||
private EAspect _VideoAspect = EAspect.Crop;
|
private EAspect _VideoAspect = EAspect.Crop;
|
||||||
private STexture _CurrentVideoTexture = new STexture(-1);
|
private STexture _CurrentVideoTexture = new STexture(-1);
|
||||||
|
private STexture _CurrentWebcamFrameTexture = new STexture(-1);
|
||||||
private STexture _Background = new STexture(-1);
|
private STexture _Background = new STexture(-1);
|
||||||
|
|
||||||
private float _CurrentTime = 0f;
|
private float _CurrentTime = 0f;
|
||||||
@@ -87,6 +88,7 @@ namespace Vocaluxe.Screens
|
|||||||
private Stopwatch _TimerSongText;
|
private Stopwatch _TimerSongText;
|
||||||
|
|
||||||
private bool _Pause;
|
private bool _Pause;
|
||||||
|
private bool _Webcam;
|
||||||
|
|
||||||
public CScreenSing()
|
public CScreenSing()
|
||||||
{
|
{
|
||||||
@@ -174,13 +176,13 @@ namespace Vocaluxe.Screens
|
|||||||
TogglePause();
|
TogglePause();
|
||||||
if (_Pause)
|
if (_Pause)
|
||||||
SetInteractionToButton(Buttons[htButtons(ButtonContinue)]);
|
SetInteractionToButton(Buttons[htButtons(ButtonContinue)]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Keys.T:
|
case Keys.T:
|
||||||
int mode = (int)CConfig.TimerMode;
|
int mode = (int)CConfig.TimerMode;
|
||||||
|
|
||||||
mode++;
|
mode++;
|
||||||
if (mode > Enum.GetNames(typeof(ETimerMode)).Length-1)
|
if (mode > Enum.GetNames(typeof(ETimerMode)).Length - 1)
|
||||||
{
|
{
|
||||||
mode = 0;
|
mode = 0;
|
||||||
}
|
}
|
||||||
@@ -200,12 +202,20 @@ namespace Vocaluxe.Screens
|
|||||||
SetVisuability();
|
SetVisuability();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Keys.W:
|
||||||
|
_Webcam = !_Webcam;
|
||||||
|
if (_Webcam)
|
||||||
|
CWebcam.Start();
|
||||||
|
else
|
||||||
|
CWebcam.Pause();
|
||||||
|
break;
|
||||||
|
|
||||||
case Keys.Enter:
|
case Keys.Enter:
|
||||||
if (Buttons[htButtons(ButtonContinue)].Selected && _Pause)
|
if (Buttons[htButtons(ButtonContinue)].Selected && _Pause)
|
||||||
TogglePause();
|
TogglePause();
|
||||||
|
|
||||||
if (Buttons[htButtons(ButtonCancel)].Selected && _Pause)
|
if (Buttons[htButtons(ButtonCancel)].Selected && _Pause)
|
||||||
Stop();
|
Stop();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -250,14 +260,14 @@ namespace Vocaluxe.Screens
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
Finish = true;
|
Finish = true;
|
||||||
|
|
||||||
if (Finish)
|
if (Finish)
|
||||||
{
|
{
|
||||||
LoadNextSong();
|
LoadNextSong();
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateSongText();
|
UpdateSongText();
|
||||||
|
|
||||||
if (_FadeOut)
|
if (_FadeOut)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -286,8 +296,8 @@ namespace Vocaluxe.Screens
|
|||||||
SingNotes[htSingNotes(SingBars)].SetAlpha(NoteLines[p], Alpha[CGame.Player[p].LineNr * 2]);
|
SingNotes[htSingNotes(SingBars)].SetAlpha(NoteLines[p], Alpha[CGame.Player[p].LineNr * 2]);
|
||||||
if (CConfig.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_INFO || CConfig.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_ALL)
|
if (CConfig.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_INFO || CConfig.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_ALL)
|
||||||
{
|
{
|
||||||
Statics[htStatics(StaticAvatars[p,CGame.NumPlayer-1])].Alpha = Alpha[0];
|
Statics[htStatics(StaticAvatars[p, CGame.NumPlayer - 1])].Alpha = Alpha[0];
|
||||||
Texts[htTexts(TextNames[p,CGame.NumPlayer-1])].Alpha = Alpha[0];
|
Texts[htTexts(TextNames[p, CGame.NumPlayer - 1])].Alpha = Alpha[0];
|
||||||
}
|
}
|
||||||
if (CConfig.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_ALL)
|
if (CConfig.FadePlayerInfo == EFadePlayerInfo.TR_CONFIG_FADEPLAYERINFO_ALL)
|
||||||
{
|
{
|
||||||
@@ -296,7 +306,7 @@ namespace Vocaluxe.Screens
|
|||||||
Texts[htTexts(TextNames[p, CGame.NumPlayer - 1])].Alpha = Alpha[0];
|
Texts[htTexts(TextNames[p, CGame.NumPlayer - 1])].Alpha = Alpha[0];
|
||||||
Texts[htTexts(TextScores[p, CGame.NumPlayer - 1])].Alpha = Alpha[0];
|
Texts[htTexts(TextScores[p, CGame.NumPlayer - 1])].Alpha = Alpha[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Alpha.Length > 2)
|
if (Alpha.Length > 2)
|
||||||
{
|
{
|
||||||
@@ -313,7 +323,7 @@ namespace Vocaluxe.Screens
|
|||||||
Statics[htStatics(StaticLyricHelper)].Alpha = Alpha[2];
|
Statics[htStatics(StaticLyricHelper)].Alpha = Alpha[2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int p = 0; p < CGame.NumPlayer; p++)
|
for (int p = 0; p < CGame.NumPlayer; p++)
|
||||||
{
|
{
|
||||||
@@ -332,18 +342,22 @@ namespace Vocaluxe.Screens
|
|||||||
float vtime = 0f;
|
float vtime = 0f;
|
||||||
CVideo.VdGetFrame(_CurrentVideo, ref _CurrentVideoTexture, _CurrentTime, ref vtime);
|
CVideo.VdGetFrame(_CurrentVideo, ref _CurrentVideoTexture, _CurrentTime, ref vtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_Webcam)
|
||||||
|
CWebcam.GetFrame(ref _CurrentWebcamFrameTexture);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnShow()
|
public override void OnShow()
|
||||||
{
|
{
|
||||||
base.OnShow();
|
base.OnShow();
|
||||||
|
|
||||||
_FadeOut = false;
|
_FadeOut = false;
|
||||||
|
|
||||||
_CurrentVideo = -1;
|
_CurrentVideo = -1;
|
||||||
_CurrentVideoTexture = new STexture(-1);
|
_CurrentVideoTexture = new STexture(-1);
|
||||||
|
_CurrentWebcamFrameTexture = new STexture(-1);
|
||||||
_CurrentBeat = -100;
|
_CurrentBeat = -100;
|
||||||
_CurrentTime = 0f;
|
_CurrentTime = 0f;
|
||||||
_FinishTime = 0f;
|
_FinishTime = 0f;
|
||||||
@@ -353,7 +367,7 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
_TimeRects.Clear();
|
_TimeRects.Clear();
|
||||||
|
|
||||||
SingNotes[htSingNotes(SingBars)].Reset();
|
SingNotes[htSingNotes(SingBars)].Reset();
|
||||||
for (int i = 0; i < CSettings.MaxNumPlayer; i++)
|
for (int i = 0; i < CSettings.MaxNumPlayer; i++)
|
||||||
{
|
{
|
||||||
NoteLines[i] = -1;
|
NoteLines[i] = -1;
|
||||||
@@ -385,7 +399,7 @@ namespace Vocaluxe.Screens
|
|||||||
{
|
{
|
||||||
if (_Active)
|
if (_Active)
|
||||||
{
|
{
|
||||||
if (_CurrentVideo != -1 && CConfig.VideosInSongs == EOffOn.TR_CONFIG_ON)
|
if (_CurrentVideo != -1 && CConfig.VideosInSongs == EOffOn.TR_CONFIG_ON && !_Webcam)
|
||||||
{
|
{
|
||||||
RectangleF bounds = new RectangleF(0, 0, CSettings.iRenderW, CSettings.iRenderH);
|
RectangleF bounds = new RectangleF(0, 0, CSettings.iRenderW, CSettings.iRenderH);
|
||||||
RectangleF rect = new RectangleF(0f, 0f, _CurrentVideoTexture.width, _CurrentVideoTexture.height);
|
RectangleF rect = new RectangleF(0f, 0f, _CurrentVideoTexture.width, _CurrentVideoTexture.height);
|
||||||
@@ -394,6 +408,15 @@ namespace Vocaluxe.Screens
|
|||||||
CDraw.DrawTexture(_CurrentVideoTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, 0f),
|
CDraw.DrawTexture(_CurrentVideoTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, 0f),
|
||||||
_CurrentVideoTexture.color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f), false);
|
_CurrentVideoTexture.color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f), false);
|
||||||
}
|
}
|
||||||
|
else if (_Webcam)
|
||||||
|
{
|
||||||
|
RectangleF bounds = new RectangleF(0, 0, CSettings.iRenderW, CSettings.iRenderH);
|
||||||
|
RectangleF rect = new RectangleF(0f, 0f, _CurrentWebcamFrameTexture.width, _CurrentWebcamFrameTexture.height);
|
||||||
|
CHelper.SetRect(bounds, ref rect, rect.Width / rect.Height, _VideoAspect);
|
||||||
|
|
||||||
|
CDraw.DrawTexture(_CurrentWebcamFrameTexture, new SRectF(rect.X, rect.Y, rect.Width, rect.Height, 0f),
|
||||||
|
_CurrentVideoTexture.color, new SRectF(bounds.X, bounds.Y, bounds.Width, bounds.Height, 0f), false);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{ // Draw Background
|
{ // Draw Background
|
||||||
RectangleF bounds = new RectangleF(0, 0, CSettings.iRenderW, CSettings.iRenderH);
|
RectangleF bounds = new RectangleF(0, 0, CSettings.iRenderW, CSettings.iRenderH);
|
||||||
@@ -434,7 +457,7 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
Lyrics[htLyrics(LyricSubTop)].Draw(-100);
|
Lyrics[htLyrics(LyricSubTop)].Draw(-100);
|
||||||
Lyrics[htLyrics(LyricMainTop)].Draw(CGame.Beat);
|
Lyrics[htLyrics(LyricMainTop)].Draw(CGame.Beat);
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < CGame.NumPlayer; i++)
|
for (int i = 0; i < CGame.NumPlayer; i++)
|
||||||
{
|
{
|
||||||
@@ -454,7 +477,7 @@ namespace Vocaluxe.Screens
|
|||||||
foreach (CSelectSlide slide in SelectSlides)
|
foreach (CSelectSlide slide in SelectSlides)
|
||||||
slide.Draw();
|
slide.Draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -526,7 +549,7 @@ namespace Vocaluxe.Screens
|
|||||||
CGame.ResetPlayer();
|
CGame.ResetPlayer();
|
||||||
|
|
||||||
CDraw.RemoveTexture(ref _CurrentVideoTexture);
|
CDraw.RemoveTexture(ref _CurrentVideoTexture);
|
||||||
|
|
||||||
if (song.VideoFileName != String.Empty)
|
if (song.VideoFileName != String.Empty)
|
||||||
{
|
{
|
||||||
_CurrentVideo = CVideo.VdLoad(Path.Combine(song.Folder, song.VideoFileName));
|
_CurrentVideo = CVideo.VdLoad(Path.Combine(song.Folder, song.VideoFileName));
|
||||||
@@ -542,7 +565,7 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
bool LyricsOnTop = (CGame.NumPlayer != 1) && CConfig.LyricsOnTop == EOffOn.TR_CONFIG_ON;
|
bool LyricsOnTop = (CGame.NumPlayer != 1) && CConfig.LyricsOnTop == EOffOn.TR_CONFIG_ON;
|
||||||
if (song.IsDuet)
|
if (song.IsDuet)
|
||||||
{
|
{
|
||||||
for (int i = 1; i <= CGame.NumPlayer; i = i + 2)
|
for (int i = 1; i <= CGame.NumPlayer; i = i + 2)
|
||||||
{
|
{
|
||||||
CGame.Player[i].LineNr = 1;
|
CGame.Player[i].LineNr = 1;
|
||||||
@@ -573,7 +596,7 @@ namespace Vocaluxe.Screens
|
|||||||
CTheme.GetPlayerColor(p + 1),
|
CTheme.GetPlayerColor(p + 1),
|
||||||
p);
|
p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
case 4:
|
case 4:
|
||||||
NoteLines[0] = SingNotes[htSingNotes(SingBars)].AddPlayer(new SRectF(35f, 100f, 590f, 200f, -0.5f), CTheme.ThemeColors.Player[0]);
|
NoteLines[0] = SingNotes[htSingNotes(SingBars)].AddPlayer(new SRectF(35f, 100f, 590f, 200f, -0.5f), CTheme.ThemeColors.Player[0]);
|
||||||
@@ -582,7 +605,7 @@ namespace Vocaluxe.Screens
|
|||||||
NoteLines[3] = SingNotes[htSingNotes(SingBars)].AddPlayer(new SRectF(640f, 350f, 590f, 200f, -0.5f), CTheme.ThemeColors.Player[3]);
|
NoteLines[3] = SingNotes[htSingNotes(SingBars)].AddPlayer(new SRectF(640f, 350f, 590f, 200f, -0.5f), CTheme.ThemeColors.Player[3]);
|
||||||
break;
|
break;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
_TimerSongText.Stop();
|
_TimerSongText.Stop();
|
||||||
_TimerSongText.Reset();
|
_TimerSongText.Reset();
|
||||||
@@ -708,12 +731,15 @@ namespace Vocaluxe.Screens
|
|||||||
{
|
{
|
||||||
Buttons[htButtons(ButtonCancel)].Visible = true;
|
Buttons[htButtons(ButtonCancel)].Visible = true;
|
||||||
Buttons[htButtons(ButtonContinue)].Visible = true;
|
Buttons[htButtons(ButtonContinue)].Visible = true;
|
||||||
CSound.Pause(_CurrentStream);
|
CSound.Pause(_CurrentStream);
|
||||||
}else
|
CWebcam.Pause();
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
Buttons[htButtons(ButtonCancel)].Visible = false;
|
Buttons[htButtons(ButtonCancel)].Visible = false;
|
||||||
Buttons[htButtons(ButtonContinue)].Visible = false;
|
Buttons[htButtons(ButtonContinue)].Visible = false;
|
||||||
CSound.Play(_CurrentStream);
|
CSound.Play(_CurrentStream);
|
||||||
|
CWebcam.Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -743,7 +769,7 @@ namespace Vocaluxe.Screens
|
|||||||
{
|
{
|
||||||
StaticScores = new string[CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
|
StaticScores = new string[CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
|
||||||
StaticAvatars = new string[CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
|
StaticAvatars = new string[CSettings.MaxNumPlayer, CSettings.MaxNumPlayer];
|
||||||
|
|
||||||
for (int numplayer = 0; numplayer < CSettings.MaxNumPlayer; numplayer++)
|
for (int numplayer = 0; numplayer < CSettings.MaxNumPlayer; numplayer++)
|
||||||
{
|
{
|
||||||
for (int player = 0; player < CSettings.MaxNumPlayer; player++)
|
for (int player = 0; player < CSettings.MaxNumPlayer; player++)
|
||||||
@@ -769,7 +795,7 @@ namespace Vocaluxe.Screens
|
|||||||
Statics[htStatics(StaticLyricHelperTop)].Visible = false;
|
Statics[htStatics(StaticLyricHelperTop)].Visible = false;
|
||||||
Lyrics[htLyrics(LyricMainDuet)].Visible = false;
|
Lyrics[htLyrics(LyricMainDuet)].Visible = false;
|
||||||
Lyrics[htLyrics(LyricSubDuet)].Visible = false;
|
Lyrics[htLyrics(LyricSubDuet)].Visible = false;
|
||||||
|
|
||||||
Statics[htStatics(StaticSongText)].Visible = false;
|
Statics[htStatics(StaticSongText)].Visible = false;
|
||||||
Texts[htTexts(TextSongName)].Visible = false;
|
Texts[htTexts(TextSongName)].Visible = false;
|
||||||
|
|
||||||
@@ -783,7 +809,7 @@ namespace Vocaluxe.Screens
|
|||||||
Texts[htTexts(TextNames[player, numplayer])].Visible = ((numplayer + 1 == CGame.NumPlayer)
|
Texts[htTexts(TextNames[player, numplayer])].Visible = ((numplayer + 1 == CGame.NumPlayer)
|
||||||
&& (CConfig.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH || CConfig.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_NAME));
|
&& (CConfig.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH || CConfig.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_NAME));
|
||||||
Statics[htStatics(StaticScores[player, numplayer])].Visible = (numplayer + 1 == CGame.NumPlayer);
|
Statics[htStatics(StaticScores[player, numplayer])].Visible = (numplayer + 1 == CGame.NumPlayer);
|
||||||
Statics[htStatics(StaticAvatars[player, numplayer])].Visible = ((numplayer + 1 == CGame.NumPlayer)
|
Statics[htStatics(StaticAvatars[player, numplayer])].Visible = ((numplayer + 1 == CGame.NumPlayer)
|
||||||
&& (CConfig.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH || CConfig.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_AVATAR));
|
&& (CConfig.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_BOTH || CConfig.PlayerInfo == EPlayerInfo.TR_CONFIG_PLAYERINFO_AVATAR));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -875,7 +901,7 @@ namespace Vocaluxe.Screens
|
|||||||
time = totaltime;
|
time = totaltime;
|
||||||
|
|
||||||
SRectF Rect = Statics[htStatics(StaticLyricHelperDuet)].Rect;
|
SRectF Rect = Statics[htStatics(StaticLyricHelperDuet)].Rect;
|
||||||
|
|
||||||
SColorF Color = new SColorF(
|
SColorF Color = new SColorF(
|
||||||
Statics[htStatics(StaticLyricHelperDuet)].Color.R,
|
Statics[htStatics(StaticLyricHelperDuet)].Color.R,
|
||||||
Statics[htStatics(StaticLyricHelperDuet)].Color.G,
|
Statics[htStatics(StaticLyricHelperDuet)].Color.G,
|
||||||
@@ -895,7 +921,7 @@ namespace Vocaluxe.Screens
|
|||||||
float dt = 4f;
|
float dt = 4f;
|
||||||
float rt = dt * 0.8f;
|
float rt = dt * 0.8f;
|
||||||
|
|
||||||
CSong Song = CGame.GetSong();
|
CSong Song = CGame.GetSong();
|
||||||
if (Song == null)
|
if (Song == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
@@ -933,7 +959,7 @@ namespace Vocaluxe.Screens
|
|||||||
|
|
||||||
// default values
|
// default values
|
||||||
Alpha[i * 2] = 1f;
|
Alpha[i * 2] = 1f;
|
||||||
Alpha[i * 2 + 1] = 1f;
|
Alpha[i * 2 + 1] = 1f;
|
||||||
|
|
||||||
// main line alpha
|
// main line alpha
|
||||||
if (CurrentLine == 0 && CurrentTime < CGame.GetTimeFromBeats(line[CurrentLine].FirstBeat, Song.BPM))
|
if (CurrentLine == 0 && CurrentTime < CGame.GetTimeFromBeats(line[CurrentLine].FirstBeat, Song.BPM))
|
||||||
@@ -965,15 +991,15 @@ namespace Vocaluxe.Screens
|
|||||||
float next = CGame.GetTimeFromBeats(line[CurrentLine + 1].FirstBeat, Song.BPM) - CurrentTime;
|
float next = CGame.GetTimeFromBeats(line[CurrentLine + 1].FirstBeat, Song.BPM) - CurrentTime;
|
||||||
|
|
||||||
if (last < next)
|
if (last < next)
|
||||||
{
|
{
|
||||||
// fade out
|
// fade out
|
||||||
Alpha[i * 2] = 1f - last / rt;
|
Alpha[i * 2] = 1f - last / rt;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// fade in if it is time for
|
// fade in if it is time for
|
||||||
if (next > dt)
|
if (next > dt)
|
||||||
Alpha[i * 2] = 1f - (next - dt) / rt;
|
Alpha[i * 2] = 1f - (next - dt) / rt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -988,9 +1014,9 @@ namespace Vocaluxe.Screens
|
|||||||
// sub
|
// sub
|
||||||
if (CurrentLineSub < line.Length - 2)
|
if (CurrentLineSub < line.Length - 2)
|
||||||
{
|
{
|
||||||
float diff = 0f;
|
float diff = 0f;
|
||||||
diff = CGame.GetTimeFromBeats(line[CurrentLineSub + 1].FirstBeat, Song.BPM) - CurrentTime;
|
diff = CGame.GetTimeFromBeats(line[CurrentLineSub + 1].FirstBeat, Song.BPM) - CurrentTime;
|
||||||
|
|
||||||
if (diff > dt)
|
if (diff > dt)
|
||||||
{
|
{
|
||||||
Alpha[i * 2 + 1] = 1f - (diff - dt) / rt;
|
Alpha[i * 2 + 1] = 1f - (diff - dt) / rt;
|
||||||
@@ -1058,7 +1084,7 @@ namespace Vocaluxe.Screens
|
|||||||
float CurrentTime = _CurrentTime - song.Start;
|
float CurrentTime = _CurrentTime - song.Start;
|
||||||
|
|
||||||
if (TotalTime <= 0f)
|
if (TotalTime <= 0f)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (CConfig.TimerMode)
|
switch (CConfig.TimerMode)
|
||||||
{
|
{
|
||||||
@@ -1141,13 +1167,14 @@ namespace Vocaluxe.Screens
|
|||||||
CLines[] Lines = new CLines[song.Notes.Lines.Length];
|
CLines[] Lines = new CLines[song.Notes.Lines.Length];
|
||||||
Lines = song.Notes.Lines;
|
Lines = song.Notes.Lines;
|
||||||
for (int i = 0; i < Lines.Length; i++)
|
for (int i = 0; i < Lines.Length; i++)
|
||||||
{
|
{
|
||||||
CLine[] Line = Lines[i].Line;
|
CLine[] Line = Lines[i].Line;
|
||||||
for(int j = 0; j<Line.Length; j++){
|
for (int j = 0; j < Line.Length; j++)
|
||||||
|
{
|
||||||
TimeRect trect = new TimeRect();
|
TimeRect trect = new TimeRect();
|
||||||
trect.startBeat = Line[j].FirstBeat;
|
trect.startBeat = Line[j].FirstBeat;
|
||||||
trect.endBeat = Line[j].EndBeat;
|
trect.endBeat = Line[j].EndBeat;
|
||||||
|
|
||||||
trect.rect = new CStatic(new STexture(-1),
|
trect.rect = new CStatic(new STexture(-1),
|
||||||
new SColorF(1f, 1f, 1f, 1f),
|
new SColorF(1f, 1f, 1f, 1f),
|
||||||
new SRectF(stat.Rect.X + stat.Rect.W * ((CGame.GetTimeFromBeats(trect.startBeat, song.BPM) + song.Gap - song.Start) / TotalTime),
|
new SRectF(stat.Rect.X + stat.Rect.W * ((CGame.GetTimeFromBeats(trect.startBeat, song.BPM) + song.Gap - song.Start) / TotalTime),
|
||||||
@@ -1194,4 +1221,4 @@ namespace Vocaluxe.Screens
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>Vocaluxe</RootNamespace>
|
<RootNamespace>Vocaluxe</RootNamespace>
|
||||||
<AssemblyName>Vocaluxe</AssemblyName>
|
<AssemblyName>Vocaluxe</AssemblyName>
|
||||||
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||||
<PublishUrl>publish\</PublishUrl>
|
<PublishUrl>publish\</PublishUrl>
|
||||||
@@ -29,6 +29,7 @@
|
|||||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||||
<StartupObject>Vocaluxe.MainProgram</StartupObject>
|
<StartupObject>Vocaluxe.MainProgram</StartupObject>
|
||||||
<ApplicationIcon>Vocaluxe.ico</ApplicationIcon>
|
<ApplicationIcon>Vocaluxe.ico</ApplicationIcon>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugWin|x86' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugWin|x86' ">
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
@@ -143,6 +144,18 @@
|
|||||||
<Reference Include="Community.CsharpSqlite">
|
<Reference Include="Community.CsharpSqlite">
|
||||||
<HintPath>..\Output\Community.CsharpSqlite.dll</HintPath>
|
<HintPath>..\Output\Community.CsharpSqlite.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Emgu.CV, Version=2.4.0.1717, Culture=neutral, PublicKeyToken=7281126722ab4438, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\Output\Emgu.CV.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Emgu.CV.UI, Version=2.4.0.1717, Culture=neutral, PublicKeyToken=7281126722ab4438, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\Output\Emgu.CV.UI.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Emgu.Util, Version=2.4.0.1717, Culture=neutral, PublicKeyToken=7281126722ab4438, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\Output\Emgu.Util.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="OpenTK">
|
<Reference Include="OpenTK">
|
||||||
<HintPath>..\Output\OpenTK.dll</HintPath>
|
<HintPath>..\Output\OpenTK.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
@@ -175,6 +188,7 @@
|
|||||||
<Compile Include="Base\CSongs.cs" />
|
<Compile Include="Base\CSongs.cs" />
|
||||||
<Compile Include="Base\CTheme.cs" />
|
<Compile Include="Base\CTheme.cs" />
|
||||||
<Compile Include="Base\CVideo.cs" />
|
<Compile Include="Base\CVideo.cs" />
|
||||||
|
<Compile Include="Base\CWebcam.cs" />
|
||||||
<Compile Include="GameModes\CGameMode.cs" />
|
<Compile Include="GameModes\CGameMode.cs" />
|
||||||
<Compile Include="GameModes\CGameModeNormal.cs" />
|
<Compile Include="GameModes\CGameModeNormal.cs" />
|
||||||
<Compile Include="GameModes\IGameMode.cs" />
|
<Compile Include="GameModes\IGameMode.cs" />
|
||||||
@@ -205,6 +219,8 @@
|
|||||||
<Compile Include="Lib\Video\CVideoDecoder.cs" />
|
<Compile Include="Lib\Video\CVideoDecoder.cs" />
|
||||||
<Compile Include="Lib\Video\CVideoDecoderFFmpeg.cs" />
|
<Compile Include="Lib\Video\CVideoDecoderFFmpeg.cs" />
|
||||||
<Compile Include="Lib\Video\IVideoDecoder.cs" />
|
<Compile Include="Lib\Video\IVideoDecoder.cs" />
|
||||||
|
<Compile Include="Lib\Webcam\COpenCV.cs" />
|
||||||
|
<Compile Include="Lib\Webcam\IWebcam.cs" />
|
||||||
<Compile Include="Menu\CBackground.cs" />
|
<Compile Include="Menu\CBackground.cs" />
|
||||||
<Compile Include="Menu\CButton.cs" />
|
<Compile Include="Menu\CButton.cs" />
|
||||||
<Compile Include="Menu\CGraphics.cs" />
|
<Compile Include="Menu\CGraphics.cs" />
|
||||||
|
|||||||
Reference in new issue
Block a user