12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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;
- }
- }
- }
|