85 lines
2.2 KiB
C#
85 lines
2.2 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
using Windows.Kinect;
|
|
|
|
public class InfraredSourceManager : MonoBehaviour
|
|
{
|
|
private KinectSensor _Sensor;
|
|
private InfraredFrameReader _Reader;
|
|
private ushort[] _Data;
|
|
private byte[] _RawData;
|
|
|
|
// I'm not sure this makes sense for the Kinect APIs
|
|
// Instead, this logic should be in the VIEW
|
|
private Texture2D _Texture;
|
|
|
|
public Texture2D GetInfraredTexture()
|
|
{
|
|
return _Texture;
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
_Sensor = KinectSensor.GetDefault();
|
|
if (_Sensor != null)
|
|
{
|
|
_Reader = _Sensor.InfraredFrameSource.OpenReader();
|
|
var frameDesc = _Sensor.InfraredFrameSource.FrameDescription;
|
|
_Data = new ushort[frameDesc.LengthInPixels];
|
|
_RawData = new byte[frameDesc.LengthInPixels * 4];
|
|
_Texture = new Texture2D(frameDesc.Width, frameDesc.Height, TextureFormat.BGRA32, false);
|
|
|
|
if (!_Sensor.IsOpen)
|
|
{
|
|
_Sensor.Open();
|
|
}
|
|
}
|
|
}
|
|
|
|
void Update ()
|
|
{
|
|
if (_Reader != null)
|
|
{
|
|
var frame = _Reader.AcquireLatestFrame();
|
|
if (frame != null)
|
|
{
|
|
frame.CopyFrameDataToArray(_Data);
|
|
|
|
int index = 0;
|
|
foreach(var ir in _Data)
|
|
{
|
|
byte intensity = (byte)(ir >> 8);
|
|
_RawData[index++] = intensity;
|
|
_RawData[index++] = intensity;
|
|
_RawData[index++] = intensity;
|
|
_RawData[index++] = 255; // Alpha
|
|
}
|
|
|
|
_Texture.LoadRawTextureData(_RawData);
|
|
_Texture.Apply();
|
|
|
|
frame.Dispose();
|
|
frame = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
void OnApplicationQuit()
|
|
{
|
|
if (_Reader != null)
|
|
{
|
|
_Reader.Dispose();
|
|
_Reader = null;
|
|
}
|
|
|
|
if (_Sensor != null)
|
|
{
|
|
if (_Sensor.IsOpen)
|
|
{
|
|
_Sensor.Close();
|
|
}
|
|
|
|
_Sensor = null;
|
|
}
|
|
}
|
|
}
|