Commit f21dfc57 authored by 16이상민's avatar 16이상민

Extract class because class 'CoordinateMapperManager' has more than 2 features.

Create module because class 'SourceBuffer' and class 'KinectAccessManager' access
Since I have extracted the class, correct the test code for class 'SourceBuffer'
Create the test code for class 'KinectAccessManager'
parent 36e20b59
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
using KinectModule;
public class KinectAccessManagerTests
{
KinectAccessManager _KinectAccessManager = new KinectAccessManager();
[Test]
public void KinectAccessManagerTestsSimplePasses()
{
// Use the Assert class to test conditions.
_KinectAccessManager.Access();
Assert.IsTrue(_KinectAccessManager.IsAccess, "Kinect Access Error.");
_KinectAccessManager.Dispose();
Assert.IsFalse(_KinectAccessManager.IsAccess, "Kinect Dispose Error.");
}
// A UnityTest behaves like a coroutine in PlayMode
// and allows you to yield null to skip a frame in EditMode
[UnityTest]
public IEnumerator KinectAccessManagerTestsWithEnumeratorPasses()
{
// Use the Assert class to test conditions.
// yield to skip a frame
yield return null;
}
}
fileFormatVersion: 2
guid: 815a622fd2160ac4c9f35d4d3954c0a0
timeCreated: 1515328105
licenseType: Free
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
......@@ -3,39 +3,30 @@ using NUnit.Framework;
using System.Collections;
using Windows.Kinect;
using System.Runtime.InteropServices;
using KinectModule;
public class SourceBufferTests
{
KinectAccessManager _KinectAccessManager = new KinectAccessManager();
SourceBuffer _SourceBuffer = new SourceBuffer();
[Test]
public void SourceBufferTestsSimplePasses()
{
// Use the Assert class to test conditions.
var sensor = KinectSensor.GetDefault();
Assert.IsNotNull(sensor, "No ready kinect found.");
sensor.Open();
Assert.IsTrue(sensor.IsOpen, "Kinect sensor has problem.");
var coordinateMapper = sensor.CoordinateMapper;
using (var sourceFrameReader = sensor.OpenMultiSourceFrameReader(
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body))
{
while (sourceFrameReader == null) ;
_KinectAccessManager.Access();
Assert.IsTrue(_KinectAccessManager.IsAccess, "Kinect Access Error.");
var sourceFrame = sourceFrameReader.AcquireLatestFrame();
var sourceFrame = _KinectAccessManager.SourceFrame;
_SourceBuffer.UpdateBuffers(sourceFrame);
_SourceBuffer.UpdateBuffers(sourceFrame);
ColorBufferTest(sourceFrame);
BodyIndexBufferTest(sourceFrame);
DepthBufferTest(sourceFrame);
BodyBufferTest(sourceFrame);
ColorBufferTest(sourceFrame);
BodyIndexBufferTest(sourceFrame);
}
sensor.Close();
_KinectAccessManager.Dispose();
}
private void ColorBufferTest(MultiSourceFrame sourceFrame)
......@@ -66,7 +57,7 @@ public class SourceBufferTests
Assert.AreEqual(bodyIndexBuffer, _SourceBuffer.BodyIndexBuffer, "BodyIndexBufferTest failed.");
}
private void UpdateDepthBuffer(MultiSourceFrame sourceFrame)
private void DepthBufferTest(MultiSourceFrame sourceFrame)
{
var depthBuffer = new ushort[SourceBuffer.DepthWidth * SourceBuffer.DepthHeight];
using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame())
......@@ -80,7 +71,7 @@ public class SourceBufferTests
Assert.AreEqual(depthBuffer, _SourceBuffer.DepthBuffer, "DepthBufferTest failed.");
}
private void UpdateBodyBuffer(MultiSourceFrame sourceFrame)
private void BodyBufferTest(MultiSourceFrame sourceFrame)
{
var bodyBuffer = new Body[SourceBuffer.BodyCount];
using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame())
......
using UnityEngine;
using Windows.Kinect;
using System.Runtime.InteropServices;
using System;
public class CoordinateMapperManager : MonoBehaviour
{
private KinectSensor _Sensor;
private CoordinateMapper _CoordinateMapper;
private MultiSourceFrameReader _SourceFrameReader;
private DepthSpacePoint[] _DepthCoordinates;
private SourceBuffer _SourceBuffer;
private KinectModule.SourceBuffer _SourceBuffer;
private KinectModule.KinectAccessManager _KinectAccessManager;
long frameCount = 0;
......@@ -31,12 +30,12 @@ public class CoordinateMapperManager : MonoBehaviour
void Awake()
{
_ColorRGBX = new Texture2D (SourceBuffer.ColorWidth, SourceBuffer.ColorHeight, TextureFormat.RGBA32, false);
_ColorRGBX = new Texture2D (KinectModule.SourceBuffer.ColorWidth, KinectModule.SourceBuffer.ColorHeight, TextureFormat.RGBA32, false);
_DepthCoordinates = new DepthSpacePoint[SourceBuffer.ColorWidth * SourceBuffer.ColorHeight];
_DepthCoordinates = new DepthSpacePoint[KinectModule.SourceBuffer.ColorWidth * KinectModule.SourceBuffer.ColorHeight];
InitializeDefaultSensor ();
}
_KinectAccessManager.Access();
}
void OnGUI ()
{
......@@ -46,39 +45,12 @@ public class CoordinateMapperManager : MonoBehaviour
GUI.Box (new Rect(10, 50, 200, 30), "NULL MSFR Frame");
}
void InitializeDefaultSensor()
{
_Sensor = KinectSensor.GetDefault();
if (_Sensor == null)
{
//TODO: Popup Modal Window
Debug.LogError("No ready Kinect found!");
Application.Quit();
}
_CoordinateMapper = _Sensor.CoordinateMapper;
_Sensor.Open();
if (!_Sensor.IsOpen)
{
//TODO: Popup Modal Window
Debug.LogError("Kinect sensor has problem!");
Application.Quit();
}
_SourceFrameReader = _Sensor.OpenMultiSourceFrameReader(
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body);
}
void ProcessFrame()
{
var DepthData = GCHandle.Alloc(_SourceBuffer.DepthBuffer, GCHandleType.Pinned);
var pDepthCoordinatesData = GCHandle.Alloc(_DepthCoordinates, GCHandleType.Pinned);
_CoordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr(
_KinectAccessManager.CoordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr(
DepthData.AddrOfPinnedObject(),
(uint)_SourceBuffer.DepthBuffer.Length * sizeof(ushort),
pDepthCoordinatesData.AddrOfPinnedObject(),
......@@ -107,10 +79,7 @@ public class CoordinateMapperManager : MonoBehaviour
{
GetFPS();
if (_SourceFrameReader == null)
return;
var sourceFrame = _SourceFrameReader.AcquireLatestFrame();
var sourceFrame = _KinectAccessManager.SourceFrame;
if ((nullFrame = sourceFrame == null))
return;
......@@ -123,87 +92,168 @@ public class CoordinateMapperManager : MonoBehaviour
{
_DepthCoordinates = null;
if (_SourceFrameReader != null)
{
_SourceFrameReader.Dispose();
_SourceFrameReader = null;
}
if (_Sensor != null)
{
_Sensor.Close();
_Sensor = null;
}
_KinectAccessManager.Dispose();
}
}
public class SourceBuffer
namespace KinectModule
{
public const int DepthWidth = 512;
public const int DepthHeight = 424;
public const int ColorWidth = 1920;
public const int ColorHeight = 1080;
public const int BodyCount = 6;
private byte[] _ColorBuffer = new byte[ColorWidth * ColorHeight * 4],
_BodyIndexBuffer = new byte[DepthWidth * DepthHeight];
private ushort[] _DepthBuffer = new ushort[DepthWidth * DepthHeight];
private Body[] _BodyBuffer = new Body[BodyCount];
public byte[] ColorBuffer
{ get { return _ColorBuffer; } }
public byte[] BodyIndexBuffer
{ get { return _BodyIndexBuffer; } }
public ushort[] DepthBuffer
{ get { return _DepthBuffer; } }
public Body[] BodyBuffer
{ get { return _BodyBuffer; } }
public void UpdateBuffers(MultiSourceFrame sourceFrame)
public class SourceBuffer
{
UpdateColorBuffer (sourceFrame);
UpdateBodyIndexBuffer(sourceFrame);
UpdateDepthBuffer (sourceFrame);
UpdateBodyBuffer (sourceFrame);
public const int DepthWidth = 512;
public const int DepthHeight = 424;
public const int ColorWidth = 1920;
public const int ColorHeight = 1080;
public const int BodyCount = 6;
private byte[] _ColorBuffer = new byte[ColorWidth * ColorHeight * 4],
_BodyIndexBuffer = new byte[DepthWidth * DepthHeight];
private ushort[] _DepthBuffer = new ushort[DepthWidth * DepthHeight];
private Body[] _BodyBuffer = new Body[BodyCount];
public byte[] ColorBuffer
{ get { return _ColorBuffer; } }
public byte[] BodyIndexBuffer
{ get { return _BodyIndexBuffer; } }
public ushort[] DepthBuffer
{ get { return _DepthBuffer; } }
public Body[] BodyBuffer
{ get { return _BodyBuffer; } }
public void UpdateBuffers(MultiSourceFrame sourceFrame)
{
UpdateColorBuffer(sourceFrame);
UpdateBodyIndexBuffer(sourceFrame);
UpdateDepthBuffer(sourceFrame);
UpdateBodyBuffer(sourceFrame);
}
private void UpdateColorBuffer(MultiSourceFrame sourceFrame)
{
using (var colorFrame = sourceFrame.ColorFrameReference.AcquireFrame())
if (colorFrame != null)
{
var ColorData = GCHandle.Alloc(_ColorBuffer, GCHandleType.Pinned);
colorFrame.CopyConvertedFrameDataToIntPtr(ColorData.AddrOfPinnedObject(), (uint)_ColorBuffer.Length, ColorImageFormat.Rgba);
ColorData.Free();
}
}
private void UpdateBodyIndexBuffer(MultiSourceFrame sourceFrame)
{
using (var bodyIndexFrame = sourceFrame.BodyIndexFrameReference.AcquireFrame())
if (bodyIndexFrame != null)
{
var BodyIndexData = GCHandle.Alloc(_BodyIndexBuffer, GCHandleType.Pinned);
bodyIndexFrame.CopyFrameDataToIntPtr(BodyIndexData.AddrOfPinnedObject(), (uint)_BodyIndexBuffer.Length);
BodyIndexData.Free();
}
}
private void UpdateDepthBuffer(MultiSourceFrame sourceFrame)
{
using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame())
if (depthFrame != null)
{
var DepthData = GCHandle.Alloc(_DepthBuffer, GCHandleType.Pinned);
depthFrame.CopyFrameDataToIntPtr(DepthData.AddrOfPinnedObject(), (uint)_DepthBuffer.Length * sizeof(ushort));
DepthData.Free();
}
}
private void UpdateBodyBuffer(MultiSourceFrame sourceFrame)
{
using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame())
if (bodyFrame != null)
bodyFrame.GetAndRefreshBodyData(_BodyBuffer);
}
}
private void UpdateColorBuffer(MultiSourceFrame sourceFrame)
public class KinectAccessManager : IDisposable
{
using (var colorFrame = sourceFrame.ColorFrameReference.AcquireFrame())
if (colorFrame != null)
private KinectSensor _Sensor;
private CoordinateMapper _CoordinateMapper;
private MultiSourceFrameReader _SourceFrameReader;
private bool _IsSensorOpen = false;
private bool _IsFrameReaderOpen = false;
public bool IsAccess
{ get { return _IsSensorOpen && _IsFrameReaderOpen; } }
public CoordinateMapper CoordinateMapper
{ get { return IsAccess ? _CoordinateMapper : null; } }
public MultiSourceFrame SourceFrame
{ get { return IsAccess ? _SourceFrameReader.AcquireLatestFrame() : null; } }
public void Access()
{
OpenSensor();
OpenFrameReader();
_CoordinateMapper = _Sensor.CoordinateMapper;
}
private void OpenSensor()
{
if (_IsSensorOpen)
return;
_Sensor = KinectSensor.GetDefault();
if (_Sensor == null)
{
var ColorData = GCHandle.Alloc(_ColorBuffer, GCHandleType.Pinned);
colorFrame.CopyConvertedFrameDataToIntPtr(ColorData.AddrOfPinnedObject(), (uint)_ColorBuffer.Length, ColorImageFormat.Rgba);
ColorData.Free();
//TODO: Popup Modal Window
Debug.LogError("No ready Kinect found!");
return;
}
}
private void UpdateBodyIndexBuffer(MultiSourceFrame sourceFrame)
{
using (var bodyIndexFrame = sourceFrame.BodyIndexFrameReference.AcquireFrame())
if (bodyIndexFrame != null)
_Sensor.Open();
if (!_Sensor.IsOpen)
{
var BodyIndexData = GCHandle.Alloc(_BodyIndexBuffer, GCHandleType.Pinned);
bodyIndexFrame.CopyFrameDataToIntPtr(BodyIndexData.AddrOfPinnedObject(), (uint)_BodyIndexBuffer.Length);
BodyIndexData.Free();
//TODO: Popup Modal Window
Debug.LogError("Kinect sensor has problem!");
CloseSensor();
return;
}
}
private void UpdateDepthBuffer(MultiSourceFrame sourceFrame)
{
using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame())
if (depthFrame != null)
_IsSensorOpen = true;
}
private void OpenFrameReader()
{
if (_IsFrameReaderOpen)
return;
_SourceFrameReader = _Sensor.OpenMultiSourceFrameReader(
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body);
_IsSensorOpen = (_SourceFrameReader != null);
}
public void Dispose()
{
CloseFrameReader();
CloseSensor();
}
private void CloseSensor()
{
if (_IsSensorOpen)
{
var DepthData = GCHandle.Alloc(_DepthBuffer, GCHandleType.Pinned);
depthFrame.CopyFrameDataToIntPtr(DepthData.AddrOfPinnedObject(), (uint)_DepthBuffer.Length * sizeof(ushort));
DepthData.Free();
_Sensor.Close();
_IsSensorOpen = false;
}
}
}
private void UpdateBodyBuffer(MultiSourceFrame sourceFrame)
{
using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame())
if (bodyFrame != null)
bodyFrame.GetAndRefreshBodyData(_BodyBuffer);
private void CloseFrameReader()
{
if (_IsFrameReaderOpen)
{
_SourceFrameReader.Dispose();
_IsFrameReaderOpen = false;
}
}
}
}
\ No newline at end of file
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment