mirror of
https://github.com/storytold/LiveScan3D.git
synced 2026-10-09 00:09:58 +00:00
Added LiveScanPlayer, as well as some bug fixes and improvements.
This commit is contained in:
@@ -0,0 +1,219 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Threading;
|
||||
using System.IO;
|
||||
using KinectServer;
|
||||
|
||||
namespace LiveScanPlayer
|
||||
{
|
||||
public partial class PlayerWindowForm : Form
|
||||
{
|
||||
BindingList<FrameFileReader> lFrameFiles = new BindingList<FrameFileReader>();
|
||||
bool bPlayerRunning = false;
|
||||
|
||||
List<float> lAllVertices = new List<float>();
|
||||
List<byte> lAllColors = new List<byte>();
|
||||
|
||||
TransferServer oTransferServer = new TransferServer();
|
||||
|
||||
AutoResetEvent eUpdateWorkerFinished = new AutoResetEvent(false);
|
||||
|
||||
public PlayerWindowForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
oTransferServer.lVertices = lAllVertices;
|
||||
oTransferServer.lColors = lAllColors;
|
||||
|
||||
lFrameFilesListView.Columns.Add("Current frame", 75);
|
||||
lFrameFilesListView.Columns.Add("Filename", 300);
|
||||
}
|
||||
|
||||
private void PlayerWindowForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
bPlayerRunning = false;
|
||||
oTransferServer.StopServer();
|
||||
}
|
||||
|
||||
private void btSelect_Click(object sender, EventArgs e)
|
||||
{
|
||||
OpenFileDialog dialog = new OpenFileDialog();
|
||||
dialog.Multiselect = true;
|
||||
dialog.ShowDialog();
|
||||
|
||||
lock (lFrameFiles)
|
||||
{
|
||||
for (int i = 0; i < dialog.FileNames.Length; i++)
|
||||
{
|
||||
lFrameFiles.Add(new FrameFileReader(dialog.FileNames[i]));
|
||||
|
||||
var item = new ListViewItem(new [] { "0", dialog.FileNames[i]});
|
||||
lFrameFilesListView.Items.Add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btStart_Click(object sender, EventArgs e)
|
||||
{
|
||||
bPlayerRunning = !bPlayerRunning;
|
||||
|
||||
if (bPlayerRunning)
|
||||
{
|
||||
oTransferServer.StartServer();
|
||||
updateWorker.RunWorkerAsync();
|
||||
btStart.Text = "Stop player";
|
||||
}
|
||||
else
|
||||
{
|
||||
oTransferServer.StopServer();
|
||||
btStart.Text = "Start player";
|
||||
eUpdateWorkerFinished.WaitOne();
|
||||
}
|
||||
}
|
||||
|
||||
private void btRemove_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (lFrameFilesListView.SelectedIndices.Count == 0)
|
||||
return;
|
||||
|
||||
lock (lFrameFiles)
|
||||
{
|
||||
int idx = lFrameFilesListView.SelectedIndices[0];
|
||||
lFrameFilesListView.Items.RemoveAt(idx);
|
||||
lFrameFiles[idx].Dispose();
|
||||
lFrameFiles.RemoveAt(idx);
|
||||
}
|
||||
}
|
||||
|
||||
private void btRewind_Click(object sender, EventArgs e)
|
||||
{
|
||||
lock (lFrameFiles)
|
||||
{
|
||||
for (int i = 0; i < lFrameFiles.Count; i++)
|
||||
{
|
||||
lFrameFiles[i].Rewind();
|
||||
lFrameFilesListView.Items[i].Text = "0";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btShow_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (!OpenGLWorker.IsBusy)
|
||||
OpenGLWorker.RunWorkerAsync();
|
||||
}
|
||||
|
||||
private void updateWorker_DoWork(object sender, DoWorkEventArgs e)
|
||||
{
|
||||
int curFrameIdx = 0;
|
||||
string outDir = "outPlayer\\";
|
||||
DirectoryInfo di = Directory.CreateDirectory(outDir);
|
||||
|
||||
while (bPlayerRunning)
|
||||
{
|
||||
Thread.Sleep(50);
|
||||
|
||||
List<float> tempAllVertices = new List<float>();
|
||||
List<byte> tempAllColors = new List<byte>();
|
||||
|
||||
lock (lFrameFiles)
|
||||
{
|
||||
for (int i = 0; i < lFrameFiles.Count; i++)
|
||||
{
|
||||
List<float> vertices = new List<float>();
|
||||
List<byte> colors = new List<byte>();
|
||||
lFrameFiles[i].ReadFrame(vertices, colors);
|
||||
|
||||
tempAllVertices.AddRange(vertices);
|
||||
tempAllColors.AddRange(colors);
|
||||
}
|
||||
}
|
||||
|
||||
Thread frameIdxUpdate = new Thread(() => this.Invoke((MethodInvoker)delegate { this.UpdateDisplayedFrameIndices(); }));
|
||||
frameIdxUpdate.Start();
|
||||
|
||||
lock (lAllVertices)
|
||||
{
|
||||
lAllVertices.Clear();
|
||||
lAllColors.Clear();
|
||||
lAllVertices.AddRange(tempAllVertices);
|
||||
lAllColors.AddRange(tempAllColors);
|
||||
}
|
||||
|
||||
if (chSaveFrames.Checked)
|
||||
SaveCurrentFrameToFile(outDir, curFrameIdx);
|
||||
|
||||
|
||||
curFrameIdx++;
|
||||
}
|
||||
|
||||
eUpdateWorkerFinished.Set();
|
||||
}
|
||||
|
||||
private void OpenGLWorker_DoWork(object sender, DoWorkEventArgs e)
|
||||
{
|
||||
OpenGLWindow openGLWindow = new OpenGLWindow();
|
||||
|
||||
openGLWindow.vertices = lAllVertices;
|
||||
openGLWindow.colors = lAllColors;
|
||||
|
||||
openGLWindow.Run();
|
||||
}
|
||||
|
||||
private void lFrameFilesListView_DoubleClick(object sender, EventArgs e)
|
||||
{
|
||||
lFrameFilesListView.SelectedItems[0].BeginEdit();
|
||||
}
|
||||
|
||||
private void lFrameFilesListView_AfterLabelEdit(object sender, LabelEditEventArgs e)
|
||||
{
|
||||
int fileIdx = lFrameFilesListView.SelectedIndices[0];
|
||||
int frameIdx;
|
||||
bool res = Int32.TryParse(e.Label, out frameIdx);
|
||||
|
||||
if (!res)
|
||||
{
|
||||
e.CancelEdit = true;
|
||||
return;
|
||||
}
|
||||
|
||||
lock (lFrameFiles)
|
||||
{
|
||||
lFrameFiles[fileIdx].JumpToFrame(frameIdx);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void UpdateDisplayedFrameIndices()
|
||||
{
|
||||
lock (lFrameFiles)
|
||||
{
|
||||
for (int i = 0; i < lFrameFiles.Count; i++)
|
||||
{
|
||||
lFrameFilesListView.Items[i].SubItems[0].Text = lFrameFiles[i].frameIdx.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveCurrentFrameToFile(string outDir, int frameIdx)
|
||||
{
|
||||
List<float> lVertices = new List<float>();
|
||||
List<byte> lColors = new List<byte>();
|
||||
|
||||
lock (lAllVertices)
|
||||
{
|
||||
lVertices.AddRange(lAllVertices);
|
||||
lColors.AddRange(lAllColors);
|
||||
}
|
||||
string outputFilename = outDir + frameIdx.ToString().PadLeft(5, '0') + ".ply";
|
||||
Utils.saveToPly(outputFilename, lVertices, lColors, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user