프로젝트

일반

사용자정보

통계
| 개정판:

t1 / TFDContents / Assets / Standard Assets / KinectFaceSpecialCases.cs @ 10

이력 | 보기 | 이력해설 | 다운로드 (19.1 KB)

1
#if !(UNITY_WSA_10_0 && NETFX_CORE)
2
using RootSystem = System;
3
using System;
4
using System.Collections.Generic;
5
using System.Runtime.InteropServices;
6

    
7
namespace Microsoft.Kinect.Face
8
{
9
    //
10
    // Microsoft.Kinect.Face.Point
11
    //
12
    [RootSystem.Runtime.InteropServices.StructLayout(RootSystem.Runtime.InteropServices.LayoutKind.Sequential)]
13
    public struct Point
14
    {
15
        public float X { get; set; }
16
        public float Y { get; set; }
17

    
18
        public override int GetHashCode()
19
        {
20
            return X.GetHashCode() ^ Y.GetHashCode();
21
        }
22

    
23
        public override bool Equals(object obj)
24
        {
25
            if (!(obj is Point))
26
            {
27
                return false;
28
            }
29

    
30
            return this.Equals((Point)obj);
31
        }
32

    
33
        public bool Equals(Point obj)
34
        {
35
            return X.Equals(obj.X) && Y.Equals(obj.Y);
36
        }
37

    
38
        public static bool operator ==(Point a, Point b)
39
        {
40
            return a.Equals(b);
41
        }
42

    
43
        public static bool operator !=(Point a, Point b)
44
        {
45
            return !(a.Equals(b));
46
        }
47
    }
48

    
49
    //
50
    // Microsoft.Kinect.Face.Color
51
    //
52
    [RootSystem.Runtime.InteropServices.StructLayout(RootSystem.Runtime.InteropServices.LayoutKind.Sequential)]
53
    public struct Color
54
    {
55
        public byte A { get; set; }
56
        public byte R { get; set; }
57
        public byte G { get; set; }
58
        public byte B { get; set; }
59

    
60
        public override int GetHashCode()
61
        {
62
            return A.GetHashCode() ^ R.GetHashCode() ^ G.GetHashCode() ^ B.GetHashCode();
63
        }
64

    
65
        public override bool Equals(object obj)
66
        {
67
            if (!(obj is Color))
68
            {
69
                return false;
70
            }
71

    
72
            return this.Equals((Color)obj);
73
        }
74

    
75
        public bool Equals(Color obj)
76
        {
77
            return A.Equals(obj.A) && R.Equals(obj.R) && G.Equals(obj.G) && B.Equals(obj.B);
78
        }
79

    
80
        public static bool operator ==(Color a, Color b)
81
        {
82
            return a.Equals(b);
83
        }
84

    
85
        public static bool operator !=(Color a, Color b)
86
        {
87
            return !(a.Equals(b));
88
        }
89
    }
90

    
91
    //
92
    // Microsoft.Kinect.Face.FaceModel
93
    //
94
    public sealed partial class FaceModel
95
    {   
96
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
97
        private static extern RootSystem.IntPtr Microsoft_Kinect_Face_FaceModel_ctor(float scale, Microsoft.Kinect.Face.FaceShapeDeformations[] faceShapeDeformationsKeys, float[] faceShapeDeformationsValues, int faceShapeDeformationsSize);
98
        public static FaceModel Create(float scale, RootSystem.Collections.Generic.Dictionary<Microsoft.Kinect.Face.FaceShapeDeformations, float> faceShapeDeformations)
99
        {
100
            int _faceShapeDeformationsKeys_idx=0;
101
            var _faceShapeDeformationsKeys = new Microsoft.Kinect.Face.FaceShapeDeformations[faceShapeDeformations.Keys.Count];
102
            foreach(var key in faceShapeDeformations.Keys)
103
            {
104
                _faceShapeDeformationsKeys[_faceShapeDeformationsKeys_idx] = (Microsoft.Kinect.Face.FaceShapeDeformations)key;
105
                _faceShapeDeformationsKeys_idx++;
106
            }
107
            int _faceShapeDeformationsValues_idx=0;
108
            var _faceShapeDeformationsValues = new float[faceShapeDeformations.Values.Count];
109
            foreach(var value in faceShapeDeformations.Values)
110
            {
111
                _faceShapeDeformationsValues[_faceShapeDeformationsValues_idx] = (float)value;
112
                _faceShapeDeformationsValues_idx++;
113
            }
114

    
115
            RootSystem.IntPtr objectPointer = Microsoft_Kinect_Face_FaceModel_ctor(scale, _faceShapeDeformationsKeys, _faceShapeDeformationsValues, faceShapeDeformations.Count);
116
            Helper.ExceptionHelper.CheckLastError();
117
            if (objectPointer == RootSystem.IntPtr.Zero)
118
            {
119
                return null;
120
            }
121

    
122
            return Helper.NativeObjectCache.CreateOrGetObject<Microsoft.Kinect.Face.FaceModel>(
123
                objectPointer, n => new Microsoft.Kinect.Face.FaceModel(n));
124
        }
125

    
126
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
127
        private static extern RootSystem.IntPtr Microsoft_Kinect_Face_FaceModel_ctor1();
128
        public static FaceModel Create()
129
        {
130
            RootSystem.IntPtr objectPointer = Microsoft_Kinect_Face_FaceModel_ctor1();
131
            Helper.ExceptionHelper.CheckLastError();
132
            if (objectPointer == RootSystem.IntPtr.Zero)
133
            {
134
                return null;
135
            }
136

    
137
            return Helper.NativeObjectCache.CreateOrGetObject<Microsoft.Kinect.Face.FaceModel>(
138
                objectPointer, n => new Microsoft.Kinect.Face.FaceModel(n));
139
        }
140

    
141
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
142
        private static extern RootSystem.IntPtr Microsoft_Kinect_Face_FaceModel_get_HairColor(RootSystem.IntPtr pNative);
143
        public  Microsoft.Kinect.Face.Color HairColor
144
        {
145
            get
146
            {
147
                if (_pNative == RootSystem.IntPtr.Zero)
148
                {
149
                    throw new RootSystem.ObjectDisposedException("FaceModel");
150
                }
151

    
152
                var objectPointer = Microsoft_Kinect_Face_FaceModel_get_HairColor(_pNative);
153
                Helper.ExceptionHelper.CheckLastError();
154
                var obj = (Microsoft.Kinect.Face.Color)RootSystem.Runtime.InteropServices.Marshal.PtrToStructure(objectPointer, typeof(Microsoft.Kinect.Face.Color));
155
                Microsoft.Kinect.Face.KinectFaceUnityAddinUtils.FreeMemory(objectPointer);
156
                return obj;
157
            }
158
        }
159

    
160
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
161
        private static extern RootSystem.IntPtr Microsoft_Kinect_Face_FaceModel_get_SkinColor(RootSystem.IntPtr pNative);
162
        public  Microsoft.Kinect.Face.Color SkinColor
163
        {
164
            get
165
            {
166
                if (_pNative == RootSystem.IntPtr.Zero)
167
                {
168
                    throw new RootSystem.ObjectDisposedException("FaceModel");
169
                }
170

    
171
                var objectPointer = Microsoft_Kinect_Face_FaceModel_get_SkinColor(_pNative);
172
                Helper.ExceptionHelper.CheckLastError();
173
                var obj = (Microsoft.Kinect.Face.Color)RootSystem.Runtime.InteropServices.Marshal.PtrToStructure(objectPointer, typeof(Microsoft.Kinect.Face.Color));
174
                Microsoft.Kinect.Face.KinectFaceUnityAddinUtils.FreeMemory(objectPointer);
175
                return obj;
176
            }
177
        }
178
    }
179

    
180
    //
181
    // Microsoft.Kinect.Face.FaceFrameResult
182
    //
183
    public sealed partial class FaceFrameResult
184
    {
185
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
186
        private static extern int Microsoft_Kinect_Face_FaceFrameResult_get_FacePointsInColorSpace(RootSystem.IntPtr pNative, [RootSystem.Runtime.InteropServices.Out] Microsoft.Kinect.Face.FacePointType[] outKeys, [RootSystem.Runtime.InteropServices.Out] Microsoft.Kinect.Face.Point[] outValues, int outCollectionSize);
187
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
188
        private static extern int Microsoft_Kinect_Face_FaceFrameResult_get_FacePointsInColorSpace_Length(RootSystem.IntPtr pNative);
189
        public  RootSystem.Collections.Generic.Dictionary<Microsoft.Kinect.Face.FacePointType, Microsoft.Kinect.Face.Point> FacePointsInColorSpace
190
        {
191
            get
192
            {
193
                if (_pNative == RootSystem.IntPtr.Zero)
194
                {
195
                    throw new RootSystem.ObjectDisposedException("FaceFrameResult");
196
                }
197

    
198
                int outCollectionSize = Microsoft_Kinect_Face_FaceFrameResult_get_FacePointsInColorSpace_Length(_pNative);
199
                var outKeys = new Microsoft.Kinect.Face.FacePointType[outCollectionSize];
200
                var outValues = new Microsoft.Kinect.Face.Point[outCollectionSize];
201
                var managedDictionary = new RootSystem.Collections.Generic.Dictionary<Microsoft.Kinect.Face.FacePointType, Microsoft.Kinect.Face.Point>();
202

    
203
                outCollectionSize = Microsoft_Kinect_Face_FaceFrameResult_get_FacePointsInColorSpace(_pNative, outKeys, outValues, outCollectionSize);
204
                Helper.ExceptionHelper.CheckLastError();
205
                for(int i=0;i<outCollectionSize;i++)
206
                {
207
                    managedDictionary.Add(outKeys[i], outValues[i]);
208
                }
209
                return managedDictionary;
210
            }
211
        }
212

    
213
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
214
        private static extern int Microsoft_Kinect_Face_FaceFrameResult_get_FacePointsInInfraredSpace(RootSystem.IntPtr pNative, [RootSystem.Runtime.InteropServices.Out] Microsoft.Kinect.Face.FacePointType[] outKeys, [RootSystem.Runtime.InteropServices.Out] Microsoft.Kinect.Face.Point[] outValues, int outCollectionSize);
215
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
216
        private static extern int Microsoft_Kinect_Face_FaceFrameResult_get_FacePointsInInfraredSpace_Length(RootSystem.IntPtr pNative);
217
        public  RootSystem.Collections.Generic.Dictionary<Microsoft.Kinect.Face.FacePointType, Microsoft.Kinect.Face.Point> FacePointsInInfraredSpace
218
        {
219
            get
220
            {
221
                if (_pNative == RootSystem.IntPtr.Zero)
222
                {
223
                    throw new RootSystem.ObjectDisposedException("FaceFrameResult");
224
                }
225

    
226
                int outCollectionSize = Microsoft_Kinect_Face_FaceFrameResult_get_FacePointsInInfraredSpace_Length(_pNative);
227
                var outKeys = new Microsoft.Kinect.Face.FacePointType[outCollectionSize];
228
                var outValues = new Microsoft.Kinect.Face.Point[outCollectionSize];
229
                var managedDictionary = new RootSystem.Collections.Generic.Dictionary<Microsoft.Kinect.Face.FacePointType, Microsoft.Kinect.Face.Point>();
230

    
231
                outCollectionSize = Microsoft_Kinect_Face_FaceFrameResult_get_FacePointsInInfraredSpace(_pNative, outKeys, outValues, outCollectionSize);
232
                Helper.ExceptionHelper.CheckLastError();
233
                for(int i=0;i<outCollectionSize;i++)
234
                {
235
                    managedDictionary.Add(outKeys[i], outValues[i]);
236
                }
237
                return managedDictionary;
238
            }
239
        }
240
    }
241

    
242
    //
243
    // Microsoft.Kinect.Face.FaceAlignment
244
    //
245
    public sealed partial class FaceAlignment
246
    {
247
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention = RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
248
        private static extern RootSystem.IntPtr Microsoft_Kinect_Face_FaceAlignment_ctor();
249
        public static FaceAlignment Create()
250
        {
251
            RootSystem.IntPtr objectPointer = Microsoft_Kinect_Face_FaceAlignment_ctor();
252
            Helper.ExceptionHelper.CheckLastError();
253
            if (objectPointer == RootSystem.IntPtr.Zero)
254
            {
255
                return null;
256
            }
257

    
258
            return Helper.NativeObjectCache.CreateOrGetObject<Microsoft.Kinect.Face.FaceAlignment>(
259
                objectPointer, n => new Microsoft.Kinect.Face.FaceAlignment(n));
260
        }
261
    }
262

    
263
    //
264
    // Microsoft.Kinect.Face.FaceFrameSource
265
    //
266
    public sealed partial class FaceFrameSource
267
    {
268
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention = RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
269
        private static extern RootSystem.IntPtr Microsoft_Kinect_Face_FaceFrameSource_ctor(RootSystem.IntPtr sensor, ulong initialTrackingId, Microsoft.Kinect.Face.FaceFrameFeatures initialFaceFrameFeatures);
270
        public static FaceFrameSource Create(Windows.Kinect.KinectSensor sensor, ulong initialTrackingId, Microsoft.Kinect.Face.FaceFrameFeatures initialFaceFrameFeatures)
271
        {
272
            RootSystem.IntPtr objectPointer = Microsoft_Kinect_Face_FaceFrameSource_ctor(Helper.NativeWrapper.GetNativePtr(sensor), initialTrackingId, initialFaceFrameFeatures);
273
            Helper.ExceptionHelper.CheckLastError();
274
            if (objectPointer == RootSystem.IntPtr.Zero)
275
            {
276
                return null;
277
            }
278

    
279
            return Helper.NativeObjectCache.CreateOrGetObject<Microsoft.Kinect.Face.FaceFrameSource>(
280
                objectPointer, n => new Microsoft.Kinect.Face.FaceFrameSource(n));
281
        }
282
    }
283

    
284
    //
285
    // Microsoft.Kinect.Face.HighDefinitionFaceFrameSource
286
    //
287
    public sealed partial class HighDefinitionFaceFrameSource
288
    {
289
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention = RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
290
        private static extern RootSystem.IntPtr Microsoft_Kinect_Face_HighDefinitionFaceFrameSource_ctor(RootSystem.IntPtr sensor);
291
        public static HighDefinitionFaceFrameSource Create(Windows.Kinect.KinectSensor sensor)
292
        {
293
            RootSystem.IntPtr objectPointer = Microsoft_Kinect_Face_HighDefinitionFaceFrameSource_ctor(Helper.NativeWrapper.GetNativePtr(sensor));
294
            Helper.ExceptionHelper.CheckLastError();
295
            if (objectPointer == RootSystem.IntPtr.Zero)
296
            {
297
                return null;
298
            }
299

    
300
            return Helper.NativeObjectCache.CreateOrGetObject<Microsoft.Kinect.Face.HighDefinitionFaceFrameSource>(
301
                objectPointer, n => new Microsoft.Kinect.Face.HighDefinitionFaceFrameSource(n));
302
        }
303
    }
304

    
305
    //
306
    // Microsoft.Kinect.Face.FaceModelBuilder
307
    //
308
    public sealed partial class FaceModelBuilder
309
    {
310
        [RootSystem.Runtime.InteropServices.UnmanagedFunctionPointer(RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
311
        private delegate void Microsoft_Kinect_Face_FaceModelData_Delegate_Indexed(RootSystem.IntPtr result, [RootSystem.Runtime.InteropServices.MarshalAs(RootSystem.Runtime.InteropServices.UnmanagedType.LPWStr)] string guid);
312
        private static Helper.ThreadSafeDictionary<string, RootSystem.Action<Microsoft.Kinect.Face.FaceModelData>> Microsoft_Kinect_Face_FaceModelData_Delegate_SuccessCallbacks = new Helper.ThreadSafeDictionary<string, RootSystem.Action<Microsoft.Kinect.Face.FaceModelData>>();
313
        [AOT.MonoPInvokeCallback(typeof(Microsoft_Kinect_Face_FaceModelData_Delegate_Indexed))]
314
        private static void Microsoft_Kinect_Face_FaceModelData_Delegate_Success(RootSystem.IntPtr result, string guid)
315
        {
316
            List<Helper.SmartGCHandle> pins;
317
            if(PinnedObjects.TryGetValue(guid, out pins))
318
            {
319
                foreach(var pin in pins)
320
                {
321
                    pin.Dispose();
322
                }
323
                PinnedObjects.Remove(guid);
324
            }
325
            RootSystem.Action<Microsoft.Kinect.Face.FaceModelData> callback = null;
326
            if(Microsoft_Kinect_Face_FaceModelData_Delegate_SuccessCallbacks.TryGetValue(guid, out callback))
327
            {
328
                var faceModelData = Helper.NativeObjectCache.CreateOrGetObject<Microsoft.Kinect.Face.FaceModelData>(result, n => new Microsoft.Kinect.Face.FaceModelData(n));
329
                Helper.EventPump.Instance.Enqueue(() => callback(faceModelData));
330
            }
331
            ErrorCallbacks.Remove(guid);
332
            Microsoft_Kinect_Face_FaceModelData_Delegate_SuccessCallbacks.Remove(guid);
333
        }
334
        [RootSystem.Runtime.InteropServices.UnmanagedFunctionPointer(RootSystem.Runtime.InteropServices.CallingConvention.Cdecl)]
335
        private delegate void Error_Delegate_Indexed(int err, [RootSystem.Runtime.InteropServices.MarshalAs(RootSystem.Runtime.InteropServices.UnmanagedType.LPWStr)] string guid);
336
        private static Helper.ThreadSafeDictionary<string, RootSystem.Action<int>> ErrorCallbacks = new Helper.ThreadSafeDictionary<string, RootSystem.Action<int>>();
337
        private static Helper.CollectionMap<string, RootSystem.Collections.Generic.List<Helper.SmartGCHandle>> PinnedObjects = new Helper.CollectionMap<string, RootSystem.Collections.Generic.List<Helper.SmartGCHandle>>();
338
        [AOT.MonoPInvokeCallback(typeof(Error_Delegate_Indexed))]
339
        private static void Error_Delegate_Failure(int err, [RootSystem.Runtime.InteropServices.MarshalAs(RootSystem.Runtime.InteropServices.UnmanagedType.LPWStr)] string guid)
340
        {
341
            RootSystem.Action<int> callback = null;
342
            if(ErrorCallbacks.TryGetValue(guid, out callback))
343
            {
344
                Helper.EventPump.Instance.Enqueue(() => callback(err));
345
            }
346
            ErrorCallbacks.Remove(guid);
347
            Microsoft_Kinect_Face_FaceModelData_Delegate_SuccessCallbacks.Remove(guid);
348
        }
349

    
350
        private static Microsoft_Kinect_Face_FaceModelData_Delegate_Indexed CollectAsyncSuccessDelegate = Microsoft_Kinect_Face_FaceModelData_Delegate_Success;
351
        private static Error_Delegate_Indexed CollectAsyncFailureDelegate = Error_Delegate_Failure;
352

    
353
        [RootSystem.Runtime.InteropServices.DllImport("KinectFaceUnityAddin", CallingConvention=RootSystem.Runtime.InteropServices.CallingConvention.Cdecl, SetLastError=true)]
354
        private static extern void Microsoft_Kinect_Face_FaceModelBuilder_CollectFaceDataAsync_Indexed(RootSystem.IntPtr pNative, Microsoft_Kinect_Face_FaceModelData_Delegate_Indexed success, Error_Delegate_Indexed failure, [RootSystem.Runtime.InteropServices.MarshalAs(RootSystem.Runtime.InteropServices.UnmanagedType.LPWStr)] string guid);
355
        public void CollectFaceDataAsync(RootSystem.Action<Microsoft.Kinect.Face.FaceModelData> success, RootSystem.Action<int> failure)
356
        {
357
            if (_pNative == RootSystem.IntPtr.Zero)
358
            {
359
                throw new RootSystem.ObjectDisposedException("FaceModelBuilder");
360
            }
361

    
362
            RootSystem.Guid g = RootSystem.Guid.NewGuid();
363
            if(success != null)
364
            {
365
                Microsoft_Kinect_Face_FaceModelData_Delegate_SuccessCallbacks.Add(g.ToString(), success);
366
            }
367
            if(failure != null)
368
            {
369
                ErrorCallbacks.Add(g.ToString(), failure);
370
            }
371
            Microsoft_Kinect_Face_FaceModelBuilder_CollectFaceDataAsync_Indexed(_pNative, CollectAsyncSuccessDelegate, CollectAsyncFailureDelegate, g.ToString());
372
            Helper.ExceptionHelper.CheckLastError();
373
        }
374
    }
375
}
376
#endif