From a1e8ba5345e84f0b9bbe96ec9c2735335be9ed60 Mon Sep 17 00:00:00 2001 From: MarekKowalski Date: Fri, 3 Feb 2017 16:31:06 +0100 Subject: [PATCH] Added LiveScanPlayer, as well as some bug fixes and improvements. --- LiveScan.sln | 46 +--- LiveScanPlayer/App.config | 6 + LiveScanPlayer/FrameFileReader.cs | 122 ++++++++++ LiveScanPlayer/LiveScanPlayer.csproj | 99 ++++++++ LiveScanPlayer/PlayerWindowForm.Designer.cs | 156 +++++++++++++ LiveScanPlayer/PlayerWindowForm.cs | 219 ++++++++++++++++++ LiveScanPlayer/PlayerWindowForm.resx | 126 ++++++++++ LiveScanPlayer/Program.cs | 22 ++ LiveScanPlayer/Properties/AssemblyInfo.cs | 36 +++ .../Properties/Resources.Designer.cs | 71 ++++++ LiveScanPlayer/Properties/Resources.resx | 117 ++++++++++ .../Properties/Settings.Designer.cs | 30 +++ LiveScanPlayer/Properties/Settings.settings | 7 + LiveScanServer/KinectSettings.cs | 2 +- LiveScanServer/MainWindowForm.Designer.cs | 1 + LiveScanServer/MainWindowForm.cs | 67 +----- LiveScanServer/OpenGLWindow.cs | 2 +- LiveScanServer/TransferServer.cs | 7 +- LiveScanServer/TransferSocket.cs | 2 +- LiveScanServer/Utils.cs | 54 +++++ include/LiveScanClient/liveScanClient.h | 3 - src/LiveScanClient/frameFileWriterReader.cpp | 2 +- src/LiveScanClient/liveScanClient.cpp | 58 ++--- 23 files changed, 1107 insertions(+), 148 deletions(-) create mode 100644 LiveScanPlayer/App.config create mode 100644 LiveScanPlayer/FrameFileReader.cs create mode 100644 LiveScanPlayer/LiveScanPlayer.csproj create mode 100644 LiveScanPlayer/PlayerWindowForm.Designer.cs create mode 100644 LiveScanPlayer/PlayerWindowForm.cs create mode 100644 LiveScanPlayer/PlayerWindowForm.resx create mode 100644 LiveScanPlayer/Program.cs create mode 100644 LiveScanPlayer/Properties/AssemblyInfo.cs create mode 100644 LiveScanPlayer/Properties/Resources.Designer.cs create mode 100644 LiveScanPlayer/Properties/Resources.resx create mode 100644 LiveScanPlayer/Properties/Settings.Designer.cs create mode 100644 LiveScanPlayer/Properties/Settings.settings diff --git a/LiveScan.sln b/LiveScan.sln index 58a4671..08a6f62 100644 --- a/LiveScan.sln +++ b/LiveScan.sln @@ -12,64 +12,36 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiveScanServer", "LiveScanS EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ICP", "ICP\ICP.vcxproj", "{973EE923-B423-4BCD-AA08-B03DA40CB51F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LiveScanPlayer", "LiveScanPlayer\LiveScanPlayer.csproj", "{E52AB19C-F67D-4932-90BD-CC549C1FEC8B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms Debug|Win32 = Debug|Win32 - Release ICP as exe|Any CPU = Release ICP as exe|Any CPU - Release ICP as exe|Mixed Platforms = Release ICP as exe|Mixed Platforms Release ICP as exe|Win32 = Release ICP as exe|Win32 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Debug|Win32.ActiveCfg = Debug|Win32 {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Debug|Win32.Build.0 = Debug|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release ICP as exe|Any CPU.ActiveCfg = Release|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release ICP as exe|Mixed Platforms.ActiveCfg = Release|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release ICP as exe|Mixed Platforms.Build.0 = Release|Win32 {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release ICP as exe|Win32.ActiveCfg = Release|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release ICP as exe|Win32.Build.0 = Release|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release|Any CPU.ActiveCfg = Release|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release|Mixed Platforms.Build.0 = Release|Win32 {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release|Win32.ActiveCfg = Release|Win32 {9B550BBA-EAFB-4D12-8B1C-8FDA39361F52}.Release|Win32.Build.0 = Release|Win32 - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Debug|Win32.ActiveCfg = Debug|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release ICP as exe|Any CPU.ActiveCfg = Release|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release ICP as exe|Any CPU.Build.0 = Release|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release ICP as exe|Mixed Platforms.ActiveCfg = Release|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release ICP as exe|Mixed Platforms.Build.0 = Release|Any CPU + {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Debug|Win32.Build.0 = Debug|Any CPU {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release ICP as exe|Win32.ActiveCfg = Release|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release|Any CPU.Build.0 = Release|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release|Win32.ActiveCfg = Release|Any CPU - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {78422B2C-0EF1-4A28-A40E-2A7C4A9204B1}.Release|Win32.Build.0 = Release|Any CPU {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Debug|Win32.ActiveCfg = Debug|Win32 {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Debug|Win32.Build.0 = Debug|Win32 - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release ICP as exe|Any CPU.ActiveCfg = Release|Win32 - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release ICP as exe|Mixed Platforms.ActiveCfg = Release|Win32 - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release ICP as exe|Mixed Platforms.Build.0 = Release|Win32 {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release ICP as exe|Win32.ActiveCfg = Release|Win32 {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release ICP as exe|Win32.Build.0 = Release|Win32 - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release|Any CPU.ActiveCfg = Release DLL|Win32 - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release|Mixed Platforms.ActiveCfg = Release DLL|Win32 - {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release|Mixed Platforms.Build.0 = Release DLL|Win32 {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release|Win32.ActiveCfg = Release DLL|Win32 {973EE923-B423-4BCD-AA08-B03DA40CB51F}.Release|Win32.Build.0 = Release DLL|Win32 + {E52AB19C-F67D-4932-90BD-CC549C1FEC8B}.Debug|Win32.ActiveCfg = Debug|Any CPU + {E52AB19C-F67D-4932-90BD-CC549C1FEC8B}.Debug|Win32.Build.0 = Debug|Any CPU + {E52AB19C-F67D-4932-90BD-CC549C1FEC8B}.Release ICP as exe|Win32.ActiveCfg = Release|Any CPU + {E52AB19C-F67D-4932-90BD-CC549C1FEC8B}.Release|Win32.ActiveCfg = Release|Any CPU + {E52AB19C-F67D-4932-90BD-CC549C1FEC8B}.Release|Win32.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/LiveScanPlayer/App.config b/LiveScanPlayer/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/LiveScanPlayer/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LiveScanPlayer/FrameFileReader.cs b/LiveScanPlayer/FrameFileReader.cs new file mode 100644 index 0000000..c972864 --- /dev/null +++ b/LiveScanPlayer/FrameFileReader.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.IO; + +namespace LiveScanPlayer +{ + class FrameFileReader + { + BinaryReader binaryReader; + int currentFrameIdx = 0; + string filename; + + public FrameFileReader(string filename) + { + this.filename = filename; + binaryReader = new BinaryReader(File.Open(this.filename, FileMode.Open)); + } + + ~FrameFileReader() + { + Dispose(); + } + + public int frameIdx + { + get + { + return currentFrameIdx; + } + set + { + JumpToFrame(value); + } + } + + public void Dispose() + { + binaryReader.Dispose(); + } + + public void ReadFrame(List vertices, List colors) + { + if (binaryReader.BaseStream.Position == binaryReader.BaseStream.Length) + Rewind(); + + string[] lineParts = ReadLine().Split(' '); + int nPoints = Int32.Parse(lineParts[1]); + lineParts = ReadLine().Split(' '); + int frameTimestamp = Int32.Parse(lineParts[1]); + + Console.WriteLine((frameTimestamp / 1000).ToString()); + + short[] tempVertices = new short[3 * nPoints]; + byte[] tempColors = new byte[4 * nPoints]; + + int bytesPerVertexPoint = 3 * sizeof(short); + int bytesPerColorPoint = 4 * sizeof(byte); + int bytesPerPoint = bytesPerVertexPoint + bytesPerColorPoint; + + byte[] frameData = binaryReader.ReadBytes(bytesPerPoint * nPoints); + + if (frameData.Length < bytesPerPoint * nPoints) + { + Rewind(); + ReadFrame(vertices, colors); + return; + } + + int vertexDataSize = nPoints * bytesPerVertexPoint; + int colorDataSize = nPoints * bytesPerColorPoint; + Buffer.BlockCopy(frameData, 0, tempVertices, 0, vertexDataSize); + Buffer.BlockCopy(frameData, vertexDataSize, tempColors, 0, colorDataSize); + + for (int i = 0; i < nPoints; i++) + { + for (int j = 0; j < 3; j++) + { + vertices.Add(tempVertices[3 * i + j] / 1000.0f); + colors.Add(tempColors[4 * i + j]); + } + } + + binaryReader.ReadByte(); + + currentFrameIdx++; + } + + public void JumpToFrame(int frameIdx) + { + Rewind(); + for (int i = 0; i < frameIdx; i++) + { + List vertices = new List(); + List colors = new List(); + ReadFrame(vertices, colors); + } + } + + public string ReadLine() + { + StringBuilder builder = new StringBuilder(); + byte buffer = binaryReader.ReadByte(); + + while (buffer != '\n') + { + builder.Append((char)buffer); + buffer = binaryReader.ReadByte(); + } + + return builder.ToString(); + } + + public void Rewind() + { + currentFrameIdx = 0; + binaryReader.BaseStream.Seek(0, SeekOrigin.Begin); + } + } +} diff --git a/LiveScanPlayer/LiveScanPlayer.csproj b/LiveScanPlayer/LiveScanPlayer.csproj new file mode 100644 index 0000000..189145c --- /dev/null +++ b/LiveScanPlayer/LiveScanPlayer.csproj @@ -0,0 +1,99 @@ + + + + + Debug + AnyCPU + {E52AB19C-F67D-4932-90BD-CC549C1FEC8B} + WinExe + Properties + LiveScanPlayer + LiveScanPlayer + v4.5 + 512 + + + AnyCPU + true + full + false + ..\bin\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + ..\bin\ + TRACE + prompt + 4 + + + + False + ..\bin\OpenTK.dll + + + + + + + + + + + + + + + Form + + + PlayerWindowForm.cs + + + + + + PlayerWindowForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {78422b2c-0ef1-4a28-a40e-2a7c4a9204b1} + LiveScanServer + + + + + \ No newline at end of file diff --git a/LiveScanPlayer/PlayerWindowForm.Designer.cs b/LiveScanPlayer/PlayerWindowForm.Designer.cs new file mode 100644 index 0000000..ba27998 --- /dev/null +++ b/LiveScanPlayer/PlayerWindowForm.Designer.cs @@ -0,0 +1,156 @@ +namespace LiveScanPlayer +{ + partial class PlayerWindowForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.btSelect = new System.Windows.Forms.Button(); + this.btStart = new System.Windows.Forms.Button(); + this.btShow = new System.Windows.Forms.Button(); + this.updateWorker = new System.ComponentModel.BackgroundWorker(); + this.OpenGLWorker = new System.ComponentModel.BackgroundWorker(); + this.btRewind = new System.Windows.Forms.Button(); + this.btRemove = new System.Windows.Forms.Button(); + this.lFrameFilesListView = new System.Windows.Forms.ListView(); + this.chSaveFrames = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // btSelect + // + this.btSelect.Location = new System.Drawing.Point(12, 41); + this.btSelect.Name = "btSelect"; + this.btSelect.Size = new System.Drawing.Size(75, 23); + this.btSelect.TabIndex = 0; + this.btSelect.Text = "Select files"; + this.btSelect.UseVisualStyleBackColor = true; + this.btSelect.Click += new System.EventHandler(this.btSelect_Click); + // + // btStart + // + this.btStart.Location = new System.Drawing.Point(12, 12); + this.btStart.Name = "btStart"; + this.btStart.Size = new System.Drawing.Size(75, 23); + this.btStart.TabIndex = 1; + this.btStart.Text = "Start player"; + this.btStart.UseVisualStyleBackColor = true; + this.btStart.Click += new System.EventHandler(this.btStart_Click); + // + // btShow + // + this.btShow.Location = new System.Drawing.Point(12, 128); + this.btShow.Name = "btShow"; + this.btShow.Size = new System.Drawing.Size(75, 23); + this.btShow.TabIndex = 2; + this.btShow.Text = "Show live"; + this.btShow.UseVisualStyleBackColor = true; + this.btShow.Click += new System.EventHandler(this.btShow_Click); + // + // updateWorker + // + this.updateWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.updateWorker_DoWork); + // + // OpenGLWorker + // + this.OpenGLWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.OpenGLWorker_DoWork); + // + // btRewind + // + this.btRewind.Location = new System.Drawing.Point(12, 99); + this.btRewind.Name = "btRewind"; + this.btRewind.Size = new System.Drawing.Size(75, 23); + this.btRewind.TabIndex = 5; + this.btRewind.Text = "Rewind"; + this.btRewind.UseVisualStyleBackColor = true; + this.btRewind.Click += new System.EventHandler(this.btRewind_Click); + // + // btRemove + // + this.btRemove.Location = new System.Drawing.Point(12, 70); + this.btRemove.Name = "btRemove"; + this.btRemove.Size = new System.Drawing.Size(75, 23); + this.btRemove.TabIndex = 6; + this.btRemove.Text = "Remove file"; + this.btRemove.UseVisualStyleBackColor = true; + this.btRemove.Click += new System.EventHandler(this.btRemove_Click); + // + // lFrameFilesListView + // + this.lFrameFilesListView.LabelEdit = true; + this.lFrameFilesListView.Location = new System.Drawing.Point(93, 12); + this.lFrameFilesListView.MultiSelect = false; + this.lFrameFilesListView.Name = "lFrameFilesListView"; + this.lFrameFilesListView.Size = new System.Drawing.Size(422, 97); + this.lFrameFilesListView.TabIndex = 7; + this.lFrameFilesListView.UseCompatibleStateImageBehavior = false; + this.lFrameFilesListView.View = System.Windows.Forms.View.Details; + this.lFrameFilesListView.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.lFrameFilesListView_AfterLabelEdit); + this.lFrameFilesListView.DoubleClick += new System.EventHandler(this.lFrameFilesListView_DoubleClick); + // + // chSaveFrames + // + this.chSaveFrames.AutoSize = true; + this.chSaveFrames.Location = new System.Drawing.Point(435, 128); + this.chSaveFrames.Name = "chSaveFrames"; + this.chSaveFrames.Size = new System.Drawing.Size(83, 17); + this.chSaveFrames.TabIndex = 8; + this.chSaveFrames.Text = "save frames"; + this.chSaveFrames.UseVisualStyleBackColor = true; + // + // PlayerWindowForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(527, 166); + this.Controls.Add(this.chSaveFrames); + this.Controls.Add(this.lFrameFilesListView); + this.Controls.Add(this.btRemove); + this.Controls.Add(this.btRewind); + this.Controls.Add(this.btShow); + this.Controls.Add(this.btStart); + this.Controls.Add(this.btSelect); + this.Name = "PlayerWindowForm"; + this.Text = "LiveScanPlayer"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.PlayerWindowForm_FormClosing); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btSelect; + private System.Windows.Forms.Button btStart; + private System.Windows.Forms.Button btShow; + private System.ComponentModel.BackgroundWorker updateWorker; + private System.ComponentModel.BackgroundWorker OpenGLWorker; + private System.Windows.Forms.Button btRewind; + private System.Windows.Forms.Button btRemove; + private System.Windows.Forms.ListView lFrameFilesListView; + private System.Windows.Forms.CheckBox chSaveFrames; + } +} + diff --git a/LiveScanPlayer/PlayerWindowForm.cs b/LiveScanPlayer/PlayerWindowForm.cs new file mode 100644 index 0000000..e9fdfae --- /dev/null +++ b/LiveScanPlayer/PlayerWindowForm.cs @@ -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 lFrameFiles = new BindingList(); + bool bPlayerRunning = false; + + List lAllVertices = new List(); + List lAllColors = new List(); + + 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 tempAllVertices = new List(); + List tempAllColors = new List(); + + lock (lFrameFiles) + { + for (int i = 0; i < lFrameFiles.Count; i++) + { + List vertices = new List(); + List colors = new List(); + 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 lVertices = new List(); + List lColors = new List(); + + lock (lAllVertices) + { + lVertices.AddRange(lAllVertices); + lColors.AddRange(lAllColors); + } + string outputFilename = outDir + frameIdx.ToString().PadLeft(5, '0') + ".ply"; + Utils.saveToPly(outputFilename, lVertices, lColors, true); + } + } +} diff --git a/LiveScanPlayer/PlayerWindowForm.resx b/LiveScanPlayer/PlayerWindowForm.resx new file mode 100644 index 0000000..ba43598 --- /dev/null +++ b/LiveScanPlayer/PlayerWindowForm.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 133, 17 + + + 263, 17 + + \ No newline at end of file diff --git a/LiveScanPlayer/Program.cs b/LiveScanPlayer/Program.cs new file mode 100644 index 0000000..f21fc5d --- /dev/null +++ b/LiveScanPlayer/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace LiveScanPlayer +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new PlayerWindowForm()); + } + } +} diff --git a/LiveScanPlayer/Properties/AssemblyInfo.cs b/LiveScanPlayer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e6c3a18 --- /dev/null +++ b/LiveScanPlayer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LiveScanPlayer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LiveScanPlayer")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b435173f-8157-41c6-b94f-3cc1feb6153e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/LiveScanPlayer/Properties/Resources.Designer.cs b/LiveScanPlayer/Properties/Resources.Designer.cs new file mode 100644 index 0000000..5c92f51 --- /dev/null +++ b/LiveScanPlayer/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace LiveScanPlayer.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LiveScanPlayer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/LiveScanPlayer/Properties/Resources.resx b/LiveScanPlayer/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/LiveScanPlayer/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LiveScanPlayer/Properties/Settings.Designer.cs b/LiveScanPlayer/Properties/Settings.Designer.cs new file mode 100644 index 0000000..04b12e7 --- /dev/null +++ b/LiveScanPlayer/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace LiveScanPlayer.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/LiveScanPlayer/Properties/Settings.settings b/LiveScanPlayer/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/LiveScanPlayer/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/LiveScanServer/KinectSettings.cs b/LiveScanServer/KinectSettings.cs index f5ed1d8..3627eb3 100644 --- a/LiveScanServer/KinectSettings.cs +++ b/LiveScanServer/KinectSettings.cs @@ -39,7 +39,7 @@ namespace KinectServer public int nNumICPIterations = 10; public int nNumRefineIters = 2; - public bool bMergeScansForSave = false; + public bool bMergeScansForSave = true; public bool bSaveAsBinaryPLY = true; public KinectSettings() diff --git a/LiveScanServer/MainWindowForm.Designer.cs b/LiveScanServer/MainWindowForm.Designer.cs index d8d7fbf..927f778 100644 --- a/LiveScanServer/MainWindowForm.Designer.cs +++ b/LiveScanServer/MainWindowForm.Designer.cs @@ -80,6 +80,7 @@ // lClientListBox // this.lClientListBox.FormattingEnabled = true; + this.lClientListBox.HorizontalScrollbar = true; this.lClientListBox.Location = new System.Drawing.Point(113, 12); this.lClientListBox.Name = "lClientListBox"; this.lClientListBox.Size = new System.Drawing.Size(219, 108); diff --git a/LiveScanServer/MainWindowForm.cs b/LiveScanServer/MainWindowForm.cs index f4632a0..93eaff0 100644 --- a/LiveScanServer/MainWindowForm.cs +++ b/LiveScanServer/MainWindowForm.cs @@ -42,7 +42,7 @@ namespace KinectServer static extern float ICP(IntPtr verts1, IntPtr verts2, int nVerts1, int nVerts2, float[] R, float[] t, int maxIter = 200); KinectServer oServer; - TransferServer oTranfserServer; + TransferServer oTransferServer; //Those three variables are shared with the OpenGLWindow class and are used to exchange data with it. //Vertices from all of the sensors @@ -83,9 +83,9 @@ namespace KinectServer oServer = new KinectServer(oSettings); oServer.eSocketListChanged += new SocketListChangedHandler(UpdateListView); - oTranfserServer = new TransferServer(); - oTranfserServer.lVertices = lAllVertices; - oTranfserServer.lColors = lAllColors; + oTransferServer = new TransferServer(); + oTransferServer.lVertices = lAllVertices; + oTransferServer.lColors = lAllColors; InitializeComponent(); } @@ -100,7 +100,7 @@ namespace KinectServer stream.Close(); oServer.StopServer(); - oTranfserServer.StopServer(); + oTransferServer.StopServer(); } //Starts the server @@ -111,13 +111,13 @@ namespace KinectServer if (bServerRunning) { oServer.StartServer(); - oTranfserServer.StartServer(); + oTransferServer.StartServer(); btStart.Text = "Stop server"; } else { oServer.StopServer(); - oTranfserServer.StopServer(); + oTransferServer.StopServer(); btStart.Text = "Start server"; } } @@ -224,7 +224,7 @@ namespace KinectServer if (!oSettings.bMergeScansForSave) { string outputFilename = outDir + "\\" + nFrames.ToString().PadLeft(5, '0') + i.ToString() + ".ply"; - saveToPly(outputFilename, lFrameVertsAllDevices[i], lFrameRGBAllDevices[i], oSettings.bSaveAsBinaryPLY); + Utils.saveToPly(outputFilename, lFrameVertsAllDevices[i], lFrameRGBAllDevices[i], oSettings.bSaveAsBinaryPLY); } } @@ -232,7 +232,7 @@ namespace KinectServer if (oSettings.bMergeScansForSave) { string outputFilename = outDir + "\\" + nFrames.ToString().PadLeft(5, '0') + ".ply"; - saveToPly(outputFilename, lFrameVerts, lFrameRGB, oSettings.bSaveAsBinaryPLY); + Utils.saveToPly(outputFilename, lFrameVerts, lFrameRGB, oSettings.bSaveAsBinaryPLY); } } } @@ -457,55 +457,6 @@ namespace KinectServer refineWorker.RunWorkerAsync(); } - private void saveToPly(string filename, List vertices, List colors, bool binary) - { - int nVertices = vertices.Count / 3; - - FileStream fileStream = File.Open(filename, FileMode.Create); - - System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(fileStream); - System.IO.BinaryWriter binaryWriter = new System.IO.BinaryWriter(fileStream); - - //PLY file header is written here. - if (binary) - streamWriter.WriteLine("ply\nformat binary_little_endian 1.0"); - else - streamWriter.WriteLine("ply\nformat ascii 1.0\n"); - streamWriter.Write("element vertex " + nVertices.ToString() + "\n"); - streamWriter.Write("property float x\nproperty float y\nproperty float z\nproperty uchar red\nproperty uchar green\nproperty uchar blue\nend_header\n"); - streamWriter.Flush(); - - //Vertex and color data are written here. - if (binary) - { - for (int j = 0; j < vertices.Count / 3; j++) - { - for (int k = 0; k < 3; k++) - binaryWriter.Write(vertices[j * 3 + k]); - for (int k = 0; k < 3; k++) - { - byte temp = colors[j * 3 + k]; - binaryWriter.Write(temp); - } - } - } - else - { - for (int j = 0; j < vertices.Count / 3; j++) - { - string s = ""; - for (int k = 0; k < 3; k++) - s += vertices[j * 3 + k].ToString(CultureInfo.InvariantCulture) + " "; - for (int k = 0; k < 3; k++) - s += colors[j * 3 + k].ToString(CultureInfo.InvariantCulture) + " "; - streamWriter.WriteLine(s); - } - } - streamWriter.Flush(); - binaryWriter.Flush(); - fileStream.Close(); - } - void RestartUpdateWorker() { if (!updateWorker.IsBusy) diff --git a/LiveScanServer/OpenGLWindow.cs b/LiveScanServer/OpenGLWindow.cs index f8969e7..5a5c570 100644 --- a/LiveScanServer/OpenGLWindow.cs +++ b/LiveScanServer/OpenGLWindow.cs @@ -33,7 +33,7 @@ enum ECameraMode namespace KinectServer { - class OpenGLWindow : GameWindow + public class OpenGLWindow : GameWindow { int PointCount; int LineCount; diff --git a/LiveScanServer/TransferServer.cs b/LiveScanServer/TransferServer.cs index 70ccd06..ebedd5f 100644 --- a/LiveScanServer/TransferServer.cs +++ b/LiveScanServer/TransferServer.cs @@ -11,7 +11,7 @@ using System.Net; namespace KinectServer { - class TransferServer + public class TransferServer { public List lVertices = new List(); public List lColors = new List(); @@ -22,6 +22,11 @@ namespace KinectServer object oClientSocketLock = new object(); bool bServerRunning = false; + ~TransferServer() + { + StopServer(); + } + public void StartServer() { if (!bServerRunning) diff --git a/LiveScanServer/TransferSocket.cs b/LiveScanServer/TransferSocket.cs index 9d2c141..489b18d 100644 --- a/LiveScanServer/TransferSocket.cs +++ b/LiveScanServer/TransferSocket.cs @@ -9,7 +9,7 @@ using System.Runtime.Serialization.Formatters.Binary; namespace KinectServer { - class TransferSocket + public class TransferSocket { TcpClient oSocket; diff --git a/LiveScanServer/Utils.cs b/LiveScanServer/Utils.cs index f3e600e..4ab3753 100644 --- a/LiveScanServer/Utils.cs +++ b/LiveScanServer/Utils.cs @@ -14,6 +14,8 @@ // } using System; using System.Collections.Generic; +using System.IO; +using System.Globalization; namespace KinectServer { @@ -157,4 +159,56 @@ namespace KinectServer public List lJoints; public List lJointsInColorSpace; } + + public class Utils + { + public static void saveToPly(string filename, List vertices, List colors, bool binary) + { + int nVertices = vertices.Count / 3; + + FileStream fileStream = File.Open(filename, FileMode.Create); + + System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(fileStream); + System.IO.BinaryWriter binaryWriter = new System.IO.BinaryWriter(fileStream); + + //PLY file header is written here. + if (binary) + streamWriter.WriteLine("ply\nformat binary_little_endian 1.0"); + else + streamWriter.WriteLine("ply\nformat ascii 1.0\n"); + streamWriter.Write("element vertex " + nVertices.ToString() + "\n"); + streamWriter.Write("property float x\nproperty float y\nproperty float z\nproperty uchar red\nproperty uchar green\nproperty uchar blue\nend_header\n"); + streamWriter.Flush(); + + //Vertex and color data are written here. + if (binary) + { + for (int j = 0; j < vertices.Count / 3; j++) + { + for (int k = 0; k < 3; k++) + binaryWriter.Write(vertices[j * 3 + k]); + for (int k = 0; k < 3; k++) + { + byte temp = colors[j * 3 + k]; + binaryWriter.Write(temp); + } + } + } + else + { + for (int j = 0; j < vertices.Count / 3; j++) + { + string s = ""; + for (int k = 0; k < 3; k++) + s += vertices[j * 3 + k].ToString(CultureInfo.InvariantCulture) + " "; + for (int k = 0; k < 3; k++) + s += colors[j * 3 + k].ToString(CultureInfo.InvariantCulture) + " "; + streamWriter.WriteLine(s); + } + } + streamWriter.Flush(); + binaryWriter.Flush(); + fileStream.Close(); + } + } } \ No newline at end of file diff --git a/include/LiveScanClient/liveScanClient.h b/include/LiveScanClient/liveScanClient.h index 51684b5..cec4563 100644 --- a/include/LiveScanClient/liveScanClient.h +++ b/include/LiveScanClient/liveScanClient.h @@ -55,7 +55,6 @@ private: bool m_bShowDepth; bool m_bFrameCompression; int m_iCompressionLevel; - bool m_bCaptureToFile; // false if capture frames to memory FrameFileWriterReader m_framesFileWriterReader; @@ -66,8 +65,6 @@ private: std::vector m_vLastFrameVertices; std::vector m_vLastFrameRGB; std::vector m_vLastFrameBody; - std::vector> m_vGatheredVertices; - std::vector> m_vGatheredRGBPoints; HWND m_hWnd; INT64 m_nLastCounter; diff --git a/src/LiveScanClient/frameFileWriterReader.cpp b/src/LiveScanClient/frameFileWriterReader.cpp index d13b9ef..fe33503 100644 --- a/src/LiveScanClient/frameFileWriterReader.cpp +++ b/src/LiveScanClient/frameFileWriterReader.cpp @@ -46,7 +46,7 @@ void FrameFileWriterReader::openNewFileForWriting() char filename[1024]; time_t t = time(0); struct tm * now = localtime(&t); - sprintf(filename, "recording_%04d_%02d_%02d_%02d_%02d.bin", now->tm_year, now->tm_mon, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); + sprintf(filename, "recording_%04d_%02d_%02d_%02d_%02d.bin", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); m_sFilename = filename; m_pFileHandle = fopen(filename, "wb"); diff --git a/src/LiveScanClient/liveScanClient.cpp b/src/LiveScanClient/liveScanClient.cpp index 28f2721..c852c27 100644 --- a/src/LiveScanClient/liveScanClient.cpp +++ b/src/LiveScanClient/liveScanClient.cpp @@ -53,7 +53,6 @@ LiveScanClient::LiveScanClient() : m_bFilter(false), m_bStreamOnlyBodies(false), m_bCaptureFrame(false), - m_bCaptureToFile(true), m_bConnected(false), m_bConfirmCaptured(false), m_bConfirmCalibrated(false), @@ -208,19 +207,9 @@ void LiveScanClient::UpdateFrame() if (m_bCaptureFrame) { - if (m_bCaptureToFile) - { - m_framesFileWriterReader.writeFrame(m_vLastFrameVertices, m_vLastFrameRGB); - m_bConfirmCaptured = true; - m_bCaptureFrame = false; - } - else - { - m_vGatheredVertices.push_back(m_vLastFrameVertices); - m_vGatheredRGBPoints.push_back(m_vLastFrameRGB); - m_bConfirmCaptured = true; - m_bCaptureFrame = false; - } + m_framesFileWriterReader.writeFrame(m_vLastFrameVertices, m_vLastFrameRGB); + m_bConfirmCaptured = true; + m_bCaptureFrame = false; } } @@ -340,8 +329,6 @@ LRESULT CALLBACK LiveScanClient::DlgProc(HWND hWnd, UINT message, WPARAM wParam, } else { - m_vGatheredVertices.clear(); - m_vGatheredRGBPoints.clear(); try { char address[20]; @@ -532,33 +519,16 @@ void LiveScanClient::HandleSocket() { byteToSend = MSG_STORED_FRAME; m_pClientSocket->SendBytes(&byteToSend, 1); - if (m_bCaptureToFile) - { - vector points; - vector colors; - bool res = m_framesFileWriterReader.readFrame(points, colors); - if (res == false) - { - int size = -1; - m_pClientSocket->SendBytes((char*)&size, 4); - } else - SendFrame(points, colors, m_vLastFrameBody); - } - else - { - if (m_vGatheredRGBPoints.size() > 0) - { - SendFrame(m_vGatheredVertices[0], m_vGatheredRGBPoints[0], m_vLastFrameBody); - m_vGatheredRGBPoints.erase(m_vGatheredRGBPoints.begin(), m_vGatheredRGBPoints.begin() + 1); - m_vGatheredVertices.erase(m_vGatheredVertices.begin(), m_vGatheredVertices.begin() + 1); - } - else - { - int size = -1; - m_pClientSocket->SendBytes((char*)&size, 4); - } - } + vector points; + vector colors; + bool res = m_framesFileWriterReader.readFrame(points, colors); + if (res == false) + { + int size = -1; + m_pClientSocket->SendBytes((char*)&size, 4); + } else + SendFrame(points, colors, m_vLastFrameBody); } //send last frame else if (received[i] == MSG_REQUEST_LAST_FRAME) @@ -591,8 +561,7 @@ void LiveScanClient::HandleSocket() } else if (received[i] == MSG_CLEAR_STORED_FRAMES) { - m_vGatheredVertices.clear(); - m_vGatheredRGBPoints.clear(); + m_framesFileWriterReader.closeFileIfOpened(); } } @@ -644,7 +613,6 @@ void LiveScanClient::SendFrame(vector vertices, vector RGB, vector buffer[pos++] = RGB[i].rgbGreen; buffer[pos++] = RGB[i].rgbBlue; - memcpy(buffer.data() + pos, ptr2, sizeof(short)* 3); ptr2 += sizeof(short) * 3; pos += sizeof(short) * 3;