mirror of
https://github.com/storytold/LiveScan3D.git
synced 2026-10-09 00:09:58 +00:00
238 lines
7.2 KiB
C#
238 lines
7.2 KiB
C#
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<IFrameFileReader> lFrameFiles = new BindingList<IFrameFileReader>();
|
|
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 FrameFileReaderBin(dialog.FileNames[i]));
|
|
|
|
var item = new ListViewItem(new [] { "0", dialog.FileNames[i]});
|
|
lFrameFilesListView.Items.Add(item);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnSelectPly_Click(object sender, EventArgs e)
|
|
{
|
|
OpenFileDialog dialog = new OpenFileDialog();
|
|
dialog.Multiselect = true;
|
|
dialog.ShowDialog();
|
|
|
|
if (dialog.FileNames.Length == 0)
|
|
return;
|
|
|
|
lock (lFrameFiles)
|
|
{
|
|
lFrameFiles.Add(new FrameFileReaderPly(dialog.FileNames));
|
|
|
|
|
|
var item = new ListViewItem(new[] { "0", Path.GetDirectoryName(dialog.FileNames[0]) });
|
|
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.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);
|
|
}
|
|
}
|
|
}
|