libkinect10.pp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2013 by the Free Pascal development team
  4. Microsoft Kinect SDK import.
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {
  12. Original C++ Microsoft headers are (c) Microsoft:
  13. NuiSensor.h, NuiApi.h, NuiSkeleton.h and NuiImageCamera.h
  14. }
  15. {$MODE objfpc}
  16. {$H+}
  17. {$PACKRECORDS C}
  18. unit libkinect10;
  19. interface
  20. uses sysutils, windows;
  21. const
  22. LibKinect = 'kinect10.dll';
  23. Const
  24. NUI_INITIALIZE_FLAG_USES_AUDIO = $10000000;
  25. NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX = $00000001;
  26. NUI_INITIALIZE_FLAG_USES_COLOR = $00000002;
  27. NUI_INITIALIZE_FLAG_USES_SKELETON = $00000008;
  28. NUI_INITIALIZE_FLAG_USES_DEPTH = $00000020;
  29. NUI_INITIALIZE_FLAG_USES_HIGH_QUALITY_COLOR = $00000040;
  30. NUI_INITIALIZE_DEFAULT_HARDWARE_THREAD = $FFFFFFFF;
  31. ERROR_DEVICE_NOT_CONNECTED = 1167;
  32. E_NUI_DEVICE_NOT_CONNECTED = ERROR_DEVICE_NOT_CONNECTED;
  33. E_NUI_DEVICE_NOT_READY = ERROR_NOT_READY;
  34. E_NUI_ALREADY_INITIALIZED = ERROR_ALREADY_INITIALIZED;
  35. E_NUI_NO_MORE_ITEMS = ERROR_NO_MORE_ITEMS;
  36. FACILITY_NUI = $301;
  37. S_NUI_INITIALIZING = $03010001;
  38. E_NUI_FRAME_NO_DATA = $83010001;
  39. E_NUI_STREAM_NOT_ENABLED = $83010002;
  40. E_NUI_IMAGE_STREAM_IN_USE = $83010003;
  41. E_NUI_FRAME_LIMIT_EXCEEDED = $83010004;
  42. E_NUI_FEATURE_NOT_INITIALIZED = $83010005;
  43. E_NUI_NOTGENUINE = $83010006;
  44. E_NUI_INSUFFICIENTBANDWIDTH = $83010007;
  45. E_NUI_NOTSUPPORTED = $83010008;
  46. E_NUI_DEVICE_IN_USE = $83010009;
  47. E_NUI_DATABASE_NOT_FOUND = $8301000D;
  48. E_NUI_DATABASE_VERSION_MISMATCH = $8301000E;
  49. E_NUI_HARDWARE_FEATURE_UNAVAILABLE = $8301000F;
  50. E_NUI_NOTCONNECTED = $83010014;
  51. E_NUI_NOTREADY = $83010015;
  52. E_NUI_SKELETAL_ENGINE_BUSY = $830100AA;
  53. E_NUI_NOTPOWERED = $8301027F;
  54. E_NUI_BADINDEX = $83010585;
  55. E_NUI_BADIINDEX = E_NUI_BADINDEX;
  56. MICARRAY_ADAPTIVE_BEAM = $1100;
  57. MAX_DEV_STR_LEN = 512;
  58. NUI_SKELETON_COUNT = 6;
  59. NUI_SKELETON_POSITION_HIP_CENTER = 0;
  60. NUI_SKELETON_POSITION_SPINE = NUI_SKELETON_POSITION_HIP_CENTER+1;
  61. NUI_SKELETON_POSITION_SHOULDER_CENTER = NUI_SKELETON_POSITION_SPINE+1;
  62. NUI_SKELETON_POSITION_HEAD = NUI_SKELETON_POSITION_SHOULDER_CENTER+1;
  63. NUI_SKELETON_POSITION_SHOULDER_LEFT = NUI_SKELETON_POSITION_HEAD+1;
  64. NUI_SKELETON_POSITION_ELBOW_LEFT = NUI_SKELETON_POSITION_SHOULDER_LEFT+1;
  65. NUI_SKELETON_POSITION_WRIST_LEFT = NUI_SKELETON_POSITION_ELBOW_LEFT+1;
  66. NUI_SKELETON_POSITION_HAND_LEFT = NUI_SKELETON_POSITION_WRIST_LEFT+1;
  67. NUI_SKELETON_POSITION_SHOULDER_RIGHT = NUI_SKELETON_POSITION_HAND_LEFT+1;
  68. NUI_SKELETON_POSITION_ELBOW_RIGHT = NUI_SKELETON_POSITION_SHOULDER_RIGHT+1;
  69. NUI_SKELETON_POSITION_WRIST_RIGHT = NUI_SKELETON_POSITION_ELBOW_RIGHT+1;
  70. NUI_SKELETON_POSITION_HAND_RIGHT = NUI_SKELETON_POSITION_WRIST_RIGHT+1;
  71. NUI_SKELETON_POSITION_HIP_LEFT = NUI_SKELETON_POSITION_HAND_RIGHT+1;
  72. NUI_SKELETON_POSITION_KNEE_LEFT = NUI_SKELETON_POSITION_HIP_LEFT+1;
  73. NUI_SKELETON_POSITION_ANKLE_LEFT = NUI_SKELETON_POSITION_KNEE_LEFT+1;
  74. NUI_SKELETON_POSITION_FOOT_LEFT = NUI_SKELETON_POSITION_ANKLE_LEFT+1;
  75. NUI_SKELETON_POSITION_HIP_RIGHT = NUI_SKELETON_POSITION_FOOT_LEFT+1;
  76. NUI_SKELETON_POSITION_KNEE_RIGHT = NUI_SKELETON_POSITION_HIP_RIGHT+1;
  77. NUI_SKELETON_POSITION_ANKLE_RIGHT = NUI_SKELETON_POSITION_KNEE_RIGHT+1;
  78. NUI_SKELETON_POSITION_FOOT_RIGHT = NUI_SKELETON_POSITION_ANKLE_RIGHT+1;
  79. NUI_SKELETON_POSITION_COUNT = NUI_SKELETON_POSITION_FOOT_RIGHT+1;
  80. NUI_IMAGE_RESOLUTION_INVALID = -1;
  81. NUI_IMAGE_RESOLUTION_80x60 = 0;
  82. NUI_IMAGE_RESOLUTION_320x240 = NUI_IMAGE_RESOLUTION_80x60+1;
  83. NUI_IMAGE_RESOLUTION_640x480 = NUI_IMAGE_RESOLUTION_320x240+1;
  84. NUI_IMAGE_RESOLUTION_1280x960 = NUI_IMAGE_RESOLUTION_640x480+1;
  85. NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX = 0;
  86. NUI_IMAGE_TYPE_COLOR = NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX+1;
  87. NUI_IMAGE_TYPE_COLOR_YUV = NUI_IMAGE_TYPE_COLOR+1;
  88. NUI_IMAGE_TYPE_COLOR_RAW_YUV = NUI_IMAGE_TYPE_COLOR_YUV+1;
  89. NUI_IMAGE_TYPE_DEPTH = NUI_IMAGE_TYPE_COLOR_RAW_YUV+1;
  90. NUI_SKELETON_POSITION_NOT_TRACKED = 0;
  91. NUI_SKELETON_POSITION_INFERRED = NUI_SKELETON_POSITION_NOT_TRACKED+1;
  92. NUI_SKELETON_POSITION_TRACKED = NUI_SKELETON_POSITION_INFERRED+1;
  93. NUI_SKELETON_NOT_TRACKED = 0;
  94. NUI_SKELETON_POSITION_ONLY = NUI_SKELETON_NOT_TRACKED+1;
  95. NUI_SKELETON_TRACKED = NUI_SKELETON_POSITION_ONLY+1;
  96. NUI_IMAGE_PLAYER_INDEX_SHIFT = 3;
  97. NUI_IMAGE_PLAYER_INDEX_MASK = (1 shl NUI_IMAGE_PLAYER_INDEX_SHIFT)-1;
  98. NUI_IMAGE_DEPTH_MAXIMUM = (4000 shl NUI_IMAGE_PLAYER_INDEX_SHIFT) or NUI_IMAGE_PLAYER_INDEX_MASK;
  99. NUI_IMAGE_DEPTH_MINIMUM = 800 shl NUI_IMAGE_PLAYER_INDEX_SHIFT;
  100. NUI_IMAGE_DEPTH_MAXIMUM_NEAR_MODE = (3000 shl NUI_IMAGE_PLAYER_INDEX_SHIFT) or NUI_IMAGE_PLAYER_INDEX_MASK;
  101. NUI_IMAGE_DEPTH_MINIMUM_NEAR_MODE = 400 shl NUI_IMAGE_PLAYER_INDEX_SHIFT;
  102. NUI_IMAGE_DEPTH_NO_VALUE = 0;
  103. NUI_IMAGE_DEPTH_TOO_FAR_VALUE = $0fff shl NUI_IMAGE_PLAYER_INDEX_SHIFT;
  104. NUI_DEPTH_DEPTH_UNKNOWN_VALUE = $1fff shl NUI_IMAGE_PLAYER_INDEX_SHIFT;
  105. NUI_CAMERA_DEPTH_NOMINAL_FOCAL_LENGTH_IN_PIXELS = 285.63;
  106. NUI_CAMERA_DEPTH_NOMINAL_INVERSE_FOCAL_LENGTH_IN_PIXELS = 3.501e-3;
  107. NUI_CAMERA_DEPTH_NOMINAL_DIAGONAL_FOV = 70.0;
  108. NUI_CAMERA_DEPTH_NOMINAL_HORIZONTAL_FOV = 58.5;
  109. NUI_CAMERA_DEPTH_NOMINAL_VERTICAL_FOV = 45.6;
  110. NUI_CAMERA_COLOR_NOMINAL_FOCAL_LENGTH_IN_PIXELS = 531.15;
  111. NUI_CAMERA_COLOR_NOMINAL_INVERSE_FOCAL_LENGTH_IN_PIXELS = 1.83e-3;
  112. NUI_CAMERA_COLOR_NOMINAL_DIAGONAL_FOV = 73.9;
  113. NUI_CAMERA_COLOR_NOMINAL_HORIZONTAL_FOV = 62.0;
  114. NUI_CAMERA_COLOR_NOMINAL_VERTICAL_FOV = 48.6;
  115. NUI_IMAGE_FRAME_FLAG_NONE = $00000000;
  116. NUI_IMAGE_FRAME_FLAG_VIEW_AREA_UNKNOWN = $00000001;
  117. NUI_IMAGE_STREAM_FLAG_SUPPRESS_NO_FRAME_DATA = $00010000;
  118. NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE = $00020000;
  119. NUI_IMAGE_STREAM_FLAG_DISTINCT_OVERFLOW_DEPTH_VALUES = $00040000;
  120. NUI_IMAGE_STREAM_FRAME_LIMIT_MAXIMUM = 4;
  121. NUI_CAMERA_ELEVATION_MAXIMUM = 27;
  122. NUI_CAMERA_ELEVATION_MINIMUM = -27;
  123. FLT_EPSILON = 1.192092896e-07;
  124. NUI_SKELETON_MAX_TRACKED_COUNT = 2;
  125. NUI_SKELETON_INVALID_TRACKING_ID = 0;
  126. NUI_SKELETON_QUALITY_CLIPPED_RIGHT = $00000001;
  127. NUI_SKELETON_QUALITY_CLIPPED_LEFT = $00000002;
  128. NUI_SKELETON_QUALITY_CLIPPED_TOP = $00000004;
  129. NUI_SKELETON_QUALITY_CLIPPED_BOTTOM = $00000008;
  130. NUI_SKELETON_FRAME_FLAG_SEATED_SUPPORT_ENABLED = $00000008;
  131. NUI_SKELETON_TRACKING_FLAG_SUPPRESS_NO_FRAME_DATA = $00000001;
  132. NUI_SKELETON_TRACKING_FLAG_TITLE_SETS_TRACKED_SKELETONS = $00000002;
  133. NUI_SKELETON_TRACKING_FLAG_ENABLE_SEATED_SUPPORT = $00000004;
  134. NUI_SKELETON_TRACKING_FLAG_ENABLE_IN_NEAR_RANGE = $00000008;
  135. NUI_CAMERA_DEPTH_IMAGE_TO_SKELETON_MULTIPLIER_320x240 = NUI_CAMERA_DEPTH_NOMINAL_INVERSE_FOCAL_LENGTH_IN_PIXELS;
  136. NUI_CAMERA_SKELETON_TO_DEPTH_IMAGE_MULTIPLIER_320x240 = NUI_CAMERA_DEPTH_NOMINAL_FOCAL_LENGTH_IN_PIXELS;
  137. type
  138. Vector4 = record
  139. x,y,z,w : Single;
  140. end;
  141. PVector4 = ^Vector4;
  142. TVector4 = Vector4;
  143. Matrix4 = record
  144. M11, M12, M13, M14,
  145. M21, M22, M23, M24,
  146. M31, M32, M33, M34,
  147. M41, M42, M43, M44 : Single;
  148. end;
  149. PMatrix4 = ^Matrix4;
  150. TMatrix4 = Matrix4;
  151. NUI_SKELETON_POSITION_INDEX = Type Integer;
  152. PNUI_SKELETON_POSITION_INDEX = ^NUI_SKELETON_POSITION_INDEX;
  153. TNUI_SKELETON_POSITION_INDEX = NUI_SKELETON_POSITION_INDEX;
  154. NUI_IMAGE_TYPE = Type Integer;
  155. PNUI_IMAGE_TYPE = ^NUI_IMAGE_TYPE;
  156. TNUI_IMAGE_TYPE = NUI_IMAGE_TYPE;
  157. NUI_IMAGE_RESOLUTION = Type integer;
  158. PNUI_IMAGE_RESOLUTION = ^NUI_IMAGE_RESOLUTION;
  159. TNUI_IMAGE_RESOLUTION = NUI_IMAGE_RESOLUTION;
  160. NUI_IMAGE_VIEW_AREA = record
  161. eDigitalZoom : integer;
  162. lCenterX : Longint;
  163. lCenterY : Longint;
  164. end;
  165. PNUI_IMAGE_VIEW_AREA = ^NUI_IMAGE_VIEW_AREA;
  166. TNUI_IMAGE_VIEW_AREA = NUI_IMAGE_VIEW_AREA;
  167. NUI_TRANSFORM_SMOOTH_PARAMETERS = record
  168. fSmoothing,
  169. fCorrection,
  170. fPrediction,
  171. fJitterRadius,
  172. fMaxDeviationRadius : single;
  173. end;
  174. PNUI_TRANSFORM_SMOOTH_PARAMETERS = ^NUI_TRANSFORM_SMOOTH_PARAMETERS;
  175. TNUI_TRANSFORM_SMOOTH_PARAMETERS = NUI_TRANSFORM_SMOOTH_PARAMETERS;
  176. NUI_SURFACE_DESC = record
  177. Width : cardinal;
  178. Height : cardinal;
  179. end;
  180. PNUI_SURFACE_DESC = ^NUI_SURFACE_DESC;
  181. TNUI_SURFACE_DESC = NUI_SURFACE_DESC;
  182. NUI_SKELETON_POSITION_TRACKING_STATE = Type integer;
  183. PNUI_SKELETON_POSITION_TRACKING_STATE = ^NUI_SKELETON_POSITION_TRACKING_STATE;
  184. TNUI_SKELETON_POSITION_TRACKING_STATE = NUI_SKELETON_POSITION_TRACKING_STATE;
  185. NUI_SKELETON_TRACKING_STATE = Type integer;
  186. PNUI_SKELETON_TRACKING_STATE = ^NUI_SKELETON_TRACKING_STATE;
  187. TNUI_SKELETON_TRACKING_STATE = NUI_SKELETON_TRACKING_STATE;
  188. NUI_SKELETON_DATA = record
  189. eTrackingState : NUI_SKELETON_TRACKING_STATE;
  190. dwTrackingID,
  191. dwEnrollmentIndex,
  192. dwUserIndex : DWORD;
  193. Position : Vector4;
  194. SkeletonPositions : array[0..19] of Vector4;
  195. eSkeletonPositionTrackingState : array[0..19] of NUI_SKELETON_POSITION_TRACKING_STATE;
  196. dwQualityFlags : DWORD;
  197. end;
  198. PNUI_SKELETON_DATA = ^NUI_SKELETON_DATA;
  199. TNUI_SKELETON_DATA = NUI_SKELETON_DATA;
  200. NUI_SKELETON_FRAME = record
  201. liTimeStamp : int64;
  202. dwFrameNumber,
  203. dwFlags : DWORD;
  204. vFloorClipPlane,
  205. vNormalToGravity : Vector4;
  206. SkeletonData : array[0..NUI_SKELETON_COUNT-1] of NUI_SKELETON_DATA;
  207. end;
  208. PNUI_SKELETON_FRAME = ^NUI_SKELETON_FRAME;
  209. TNUI_SKELETON_FRAME = NUI_SKELETON_FRAME;
  210. NUI_SKELETON_BONE_ROTATION = record
  211. rotationMatrix : Matrix4;
  212. rotationQuaternion : Vector4;
  213. end;
  214. PNUI_SKELETON_BONE_ROTATION = ^NUI_SKELETON_BONE_ROTATION;
  215. TNUI_SKELETON_BONE_ROTATION = NUI_SKELETON_BONE_ROTATION;
  216. NUI_SKELETON_BONE_ORIENTATION = record
  217. endJoint : NUI_SKELETON_POSITION_INDEX;
  218. startJoint : NUI_SKELETON_POSITION_INDEX;
  219. hierarchicalRotation : NUI_SKELETON_BONE_ROTATION;
  220. absoluteRotation : NUI_SKELETON_BONE_ROTATION;
  221. end;
  222. PNUI_SKELETON_BONE_ORIENTATION = ^NUI_SKELETON_BONE_ORIENTATION;
  223. TNUI_SKELETON_BONE_ORIENTATION = NUI_SKELETON_BONE_ORIENTATION;
  224. NUI_LOCKED_RECT = record
  225. Pitch : integer;
  226. size : integer;
  227. pBits : pointer;
  228. end;
  229. PNUI_LOCKED_RECT = ^NUI_LOCKED_RECT;
  230. TNUI_LOCKED_RECT = NUI_LOCKED_RECT;
  231. INuiAudioBeam = interface(IUnknown)['{8c3cebfa-a35d-497e-bc9a-e9752a8155e0}']
  232. Function GetBeam(out angle : double) : HRESULT; stdcall;
  233. Function SetBeam(angle : double) : HRESULT; stdcall;
  234. Function GetPosition(out angle, confidence : double) : HRESULT; stdcall;
  235. end;
  236. INuiFrameTexture = interface(IUnknown)['{13ea17f5-ff2e-4670-9ee5-1297a6e880d1}']
  237. Function BufferLen : integer; stdcall;
  238. Function Pitch : integer; stdcall;
  239. Function LockRect(Level : UINT; pLockedRect : PNUI_LOCKED_RECT; pRect : PRECT; Flags : DWORD ) : HRESULT; stdcall;
  240. Function GetLevelDesc(Level : UINT; out desc : NUI_SURFACE_DESC) : HRESULT; stdcall;
  241. Function UnlockRect(Level: UINT) : HRESULT; stdcall;
  242. end;
  243. NUI_IMAGE_FRAME = record
  244. liTimeStamp : int64;
  245. dwFrameNumber : DWORD;
  246. eImageType : NUI_IMAGE_TYPE;
  247. eResolution : NUI_IMAGE_RESOLUTION;
  248. pFrameTexture : INuiFrameTexture;
  249. dwFrameFlags : DWORD;
  250. ViewArea : NUI_IMAGE_VIEW_AREA;
  251. end;
  252. PNUI_IMAGE_FRAME = ^NUI_IMAGE_FRAME;
  253. TNUI_IMAGE_FRAME = NUI_IMAGE_FRAME;
  254. NUI_MICROPHONE_ARRAY_DEVICE = record
  255. szDeviceName : array[0..MAX_DEV_STR_LEN - 1] of WideChar;
  256. szDeviceID : array[0..MAX_DEV_STR_LEN - 1] of WideChar;
  257. iDeviceIndex : integer;
  258. end;
  259. PNUI_MICROPHONE_ARRAY_DEVICE = ^NUI_MICROPHONE_ARRAY_DEVICE;
  260. TNUI_MICROPHONE_ARRAY_DEVICE = NUI_MICROPHONE_ARRAY_DEVICE;
  261. TNuiGetMicrophoneArrayDevices = Function(param1: PNUI_MICROPHONE_ARRAY_DEVICE; param2 : integer; out param3: integer) : HRESULT; stdcall;
  262. NUI_SPEAKER_DEVICE = record
  263. szDeviceName : array[0..MAX_DEV_STR_LEN - 1] of widechar;
  264. iDeviceIndex : integer;
  265. fDefault : boolean;
  266. end;
  267. PNUI_SPEAKER_DEVICE = ^NUI_SPEAKER_DEVICE;
  268. TNUI_SPEAKER_DEVICE = NUI_SPEAKER_DEVICE;
  269. INuiSensor = interface(IUnknown)['{1f5e088c-a8c7-41d3-9957-209677a13e85}']
  270. Function NuiInitialize(dwFlags : DWORD) : HRESULT; stdcall;
  271. Procedure NuiShutdown; stdcall;
  272. Function NuiSetFrameEndEvent(hEvent : THandle; dwFrameEventFlag : DWORD) : HRESULT; stdcall;
  273. Function NuiImageStreamOpen(eImageType : NUI_IMAGE_TYPE; eResolution : NUI_IMAGE_RESOLUTION; dwImageFrameFlags : DWORD; dwFrameLimit : DWORD; hNextFrameEvent : THandle; out phStreamHandle : THandle) : HRESULT; stdcall;
  274. Function NuiImageStreamSetImageFrameFlags(hStream : THandle; dwImageFrameFlags : DWORD) : HRESULT; stdcall;
  275. Function NuiImageStreamGetImageFrameFlags(hStream : THandle; pdwImageFrameFlags : PDWORD) : HRESULT; stdcall;
  276. Function NuiImageStreamGetNextFrame(hStream : THandle; dwMillisecondsToWait : DWORD; pImageFrame : PNUI_IMAGE_FRAME) : HRESULT; stdcall;
  277. Function NuiImageStreamReleaseFrame(hStream : THandle; pImageFrame : PNUI_IMAGE_FRAME) : HRESULT; stdcall;
  278. Function NuiImageGetColorPixelCoordinatesFromDepthPixel(eColorResolution : NUI_IMAGE_RESOLUTION; const pcViewArea : PNUI_IMAGE_VIEW_AREA; lDepthX : longint;lDepthY : longint; usDepthValue : word; plColorX : PLongint; plColorY : PLongint) : HRESULT; stdcall;
  279. Function NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution(eColorResolution : NUI_IMAGE_RESOLUTION;eDepthResolution : NUI_IMAGE_RESOLUTION; const pcViewArea : PNUI_IMAGE_VIEW_AREA; lDepthX : longint; lDepthY : longint; usDepthValue : word; plColorX : PLongint; plColorY : PLongint) : HRESULT; stdcall;
  280. Function NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution(eColorResolution : NUI_IMAGE_RESOLUTION; eDepthResolution : NUI_IMAGE_RESOLUTION; cDepthValues : DWORD; pDepthValues : PWORD; cColorCoordinates : DWORD; pColorCoordinates : PLongint) : HRESULT; stdcall;
  281. Function NuiCameraElevationSetAngle(lAngleDegrees : longint) : HRESULT; stdcall;
  282. Function NuiCameraElevationGetAngle(plAngleDegrees : PLongint) : HRESULT; stdcall;
  283. Function NuiSkeletonTrackingEnable(hNextFrameEvent : THandle; dwFlags : DWORD ) : HRESULT; stdcall;
  284. Function NuiSkeletonTrackingDisable : HRESULT; stdcall;
  285. Function NuiSkeletonSetTrackedSkeletons(TrackingIDs : PDWORD) : HRESULT; stdcall;
  286. Function NuiSkeletonGetNextFrame(dwMillisecondsToWait : DWORD;pSkeletonFrame : PNUI_SKELETON_FRAME) : HRESULT; stdcall;
  287. Function NuiTransformSmooth(pSkeletonFrame : PNUI_SKELETON_FRAME; const pSmoothingParams : PNUI_TRANSFORM_SMOOTH_PARAMETERS) : HRESULT; stdcall;
  288. Function NuiGetAudioSource(out ppDmo : INuiAudioBeam) : HRESULT; stdcall;
  289. Function NuiInstanceIndex : integer; stdcall;
  290. Function NuiDeviceConnectionId : PWideString; stdcall;
  291. Function NuiUniqueId : PWideString; stdcall;
  292. Function NuiAudioArrayId : PWideString; stdcall;
  293. Function NuiStatus : HRESULT; stdcall;
  294. Function NuiInitializationFlags : DWORD; stdcall;
  295. end;
  296. IID_INuiSensor = INuiSensor;
  297. IID_INuiFrameTexture = INuiFrameTexture;
  298. IID_INuiAudioBeam = INuiAudioBeam;
  299. TNuiGetSensorCount = Function (out count : integer) : HRESULT; stdcall;
  300. TNuiCreateSensorByIndex = Function (index : integer; out ppNuiSensor : INuiSensor) : HRESULT; stdcall;
  301. TNuiCreateSensorById = Function (const strInstanceId : PWideString; out ppNuiSensor : INuiSensor) : HRESULT; stdcall;
  302. TNuiGetAudioSource = Function (out ppDmo : INuiAudioBeam) : HRESULT; stdcall;
  303. TNuiStatusProc = Procedure (hrStatus : HRESULT; const instanceName : PWideString; const uniqueDeviceName : PWideString; pUserData : pointer); stdcall;
  304. TNuiSetDeviceStatusCallback = Procedure (callback : TNuiStatusProc; pUserData : pointer); stdcall;
  305. TNuiGetSpeakerDevices = Function (pDeviceInfo : PNUI_SPEAKER_DEVICE; size : integer; out piDeviceCount : integer) : HRESULT; stdcall;
  306. Procedure NuiImageResolutionToSize(res : NUI_IMAGE_RESOLUTION;out refWidth, refHeight : DWORD);
  307. Function NuiDepthPixelToDepth(packedPixel: WORD) : WORD;
  308. Function NuiDepthPixelToPlayerIndex(packedPixel : WORD) : WORD;
  309. Type
  310. NUI_IMAGE_DIGITALZOOM = (NUI_IMAGE_DIGITAL_ZOOM_1X = 0);
  311. TNUI_IMAGE_DIGITALZOOM = NUI_IMAGE_DIGITALZOOM;
  312. TNuiImageStreamSetImageFrameFlags = Function (hStream : THANDLE; dwImageFrameFlags : DWORD) : HRESULT; stdcall;
  313. TNuiImageStreamGetImageFrameFlags = Function (hStream : THANDLE; pdwImageFrameFlags : PDWORD) : HRESULT; stdcall;
  314. TNuiSetFrameEndEvent = Function (hEvent : THANDLE; dwFrameEventFlag : DWORD) : HRESULT; stdcall;
  315. TNuiImageStreamOpen = Function (eImageType : NUI_IMAGE_TYPE; eResolution : NUI_IMAGE_RESOLUTION; dwImageFrameFlags : DWORD; dwFrameLimit : DWORD; hNextFrameEvent : THANDLE; out phStreamHandle : THANDLE) : HRESULT; stdcall;
  316. TNuiImageStreamGetNextFrame = Function (hStream : THANDLE; dwMillisecondsToWait : DWORD;out ppcImageFrame : PNUI_IMAGE_FRAME) : HRESULT; stdcall;
  317. TNuiImageStreamReleaseFrame = Function (hStream : THANDLE; CONST pImageFrame : PNUI_IMAGE_FRAME) : HRESULT; stdcall;
  318. TNuiImageGetColorPixelCoordinatesFromDepthPixel = Function (eColorResolution : NUI_IMAGE_RESOLUTION;CONST pcViewArea : PNUI_IMAGE_VIEW_AREA;lDepthX : LONGINT;lDepthY : LONGINT; usDepthValue : WORD; out plColorX : LONGINT; out plColorY : LONGINT) : HRESULT; stdcall;
  319. TNuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution = Function (eColorResolution : NUI_IMAGE_RESOLUTION;eDepthResolution : NUI_IMAGE_RESOLUTION;CONST pcViewArea : PNUI_IMAGE_VIEW_AREA;lDepthX : LONGINT; lDepthY : LONGINT; usDepthValue : WORD; out plColorX : LONGINT; out plColorY : LONGINT) : HRESULT; stdcall;
  320. TNuiCameraElevationGetAngle = Function (out plAngleDegrees : LONGINT) : HRESULT; stdcall;
  321. TNuiCameraElevationSetAngle = Function (lAngleDegrees : LONGINT) : HRESULT; stdcall;
  322. TTrackingIDsArray = array[0..NUI_SKELETON_MAX_TRACKED_COUNT-1] of DWORD;
  323. TNuiSkeletonTrackingEnable = Function (hNextFrameEvent : THandle;dwFlags : DWORD) : HRESULT; stdcall;
  324. TNuiSkeletonTrackingDisable = Function : HRESULT; stdcall;
  325. TNuiSkeletonGetNextFrame = Function (dwMillisecondsToWait : DWORD; pSkeletonFrame : PNUI_SKELETON_FRAME) : HRESULT; stdcall;
  326. TNuiSkeletonSetTrackedSkeletons = Function (TrackingIDs : TTrackingIDsArray) : HRESULT; stdcall;
  327. TNuiTransformSmooth = Function (pSkeletonFrame : PNUI_SKELETON_FRAME;CONST pSmoothingParams : PNUI_TRANSFORM_SMOOTH_PARAMETERS) : HRESULT; stdcall;
  328. TNuiSkeletonCalculateBoneOrientations = Function (const pSkeletonData : PNUI_SKELETON_DATA; pBoneOrientations : PNUI_SKELETON_BONE_ORIENTATION) : Integer; stdcall;
  329. // Converted macros
  330. Procedure NuiTransformSkeletonToDepthImage(vPoint : TVector4;out lDepthX : Integer;out lDepthY : Integer; out usDepthValue : word; eResolution : NUI_IMAGE_RESOLUTION); inline;overload;
  331. Procedure NuiTransformSkeletonToDepthImage(vPoint : TVector4;out lDepthX : Integer;out lDepthY : Integer; out usDepthValue : word); inline;overload;
  332. Procedure NuiTransformSkeletonToDepthImage(vPoint : TVector4;out fDepthX : single;out fDepthY : single; eResolution : NUI_IMAGE_RESOLUTION); inline;overload;
  333. Procedure NuiTransformSkeletonToDepthImage(vPoint : TVector4;out fDepthX : single;out fDepthY : single); inline;overload;
  334. Function NuiTransformDepthImageToSkeleton(lDepthX : Integer;lDepthY : Integer; usDepthValue : word; eResolution : NUI_IMAGE_RESOLUTION) : TVector4; inline;overload;
  335. Function NuiTransformDepthImageToSkeleton(lDepthX, lDepthY : Integer; usDepthValue : word) : TVector4; inline;overload;
  336. Function HasSkeletalEngine(pNuiSensor : INuiSensor) : boolean;
  337. type
  338. TNuiInitialize = Function (dwFlags : DWORD) : HRESULT; stdcall;
  339. TNuiShutdown = Procedure; stdcall;
  340. var
  341. NuiInitialize : TNuiInitialize = nil;
  342. NuiShutdown : TNuiShutdown = nil;
  343. NuiGetSensorCount : TNuiGetSensorCount = nil;
  344. NuiCreateSensorByIndex : TNuiCreateSensorByIndex = nil;
  345. NuiCreateSensorById : TNuiCreateSensorById = nil;
  346. NuiGetAudioSource : TNuiGetAudioSource = nil;
  347. NuiSetDeviceStatusCallback : TNuiSetDeviceStatusCallback = nil;
  348. NuiSkeletonTrackingEnable : TNuiSkeletonTrackingEnable = nil;
  349. NuiSkeletonTrackingDisable : TNuiSkeletonTrackingDisable = nil;
  350. NuiSkeletonGetNextFrame : TNuiSkeletonGetNextFrame = nil;
  351. NuiSkeletonSetTrackedSkeletons : TNuiSkeletonSetTrackedSkeletons = nil;
  352. NuiTransformSmooth : TNuiTransformSmooth = nil;
  353. NuiSkeletonCalculateBoneOrientations : TNuiSkeletonCalculateBoneOrientations = nil;
  354. NuiImageStreamSetImageFrameFlags : TNuiImageStreamSetImageFrameFlags = nil;
  355. NuiImageStreamGetImageFrameFlags : TNuiImageStreamGetImageFrameFlags = nil;
  356. NuiSetFrameEndEvent : TNuiSetFrameEndEvent = nil;
  357. NuiImageStreamOpen : TNuiImageStreamOpen = nil;
  358. NuiImageStreamGetNextFrame : TNuiImageStreamGetNextFrame = nil;
  359. NuiImageStreamReleaseFrame : TNuiImageStreamReleaseFrame = nil;
  360. NuiImageGetColorPixelCoordinatesFromDepthPixel : TNuiImageGetColorPixelCoordinatesFromDepthPixel = nil;
  361. NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution : TNuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution = nil;
  362. NuiCameraElevationGetAngle : TNuiCameraElevationGetAngle = nil;
  363. NuiCameraElevationSetAngle : TNuiCameraElevationSetAngle = nil;
  364. Function LoadNuiLibrary(Const Filename : string = LibKinect) : Integer;
  365. Procedure UnloadNuiLibrary;
  366. implementation
  367. uses dynlibs;
  368. var
  369. LoadedLib : String;
  370. HLib : TLibHandle = NilHandle;
  371. ARefCount : Integer = 0;
  372. Function LoadNuiLibrary(Const Filename : string = LibKinect) : Integer;
  373. begin
  374. If (ARefCount>0) then
  375. begin
  376. If (LoadedLib<>FileName) then
  377. Raise Exception.CreateFmt('NUI Library "%s" is already loaded as "%s"',[FileName,LoadedLib]);
  378. Inc(ArefCount);
  379. Exit;
  380. end;
  381. HLib:=LoadLibrary(Filename);
  382. if HLib=NilHandle then
  383. Raise Exception.CreateFmt('Failed to load NUI Library "%s"',[FileName]);
  384. Pointer(NuiCameraElevationGetAngle):=GetProcAddress(HLib, 'NuiCameraElevationGetAngle');
  385. Pointer(NuiCameraElevationSetAngle):=GetProcAddress(HLib, 'NuiCameraElevationSetAngle');
  386. Pointer(NuiCreateSensorById):=GetProcAddress(HLib, 'NuiCreateSensorById');
  387. Pointer(NuiCreateSensorByIndex):=GetProcAddress(HLib,'NuiCreateSensorByIndex');
  388. Pointer(NuiGetAudioSource):=GetProcAddress(HLib, 'NuiGetAudioSource');
  389. Pointer(NuiGetSensorCount):=GetProcAddress(HLib,'NuiGetSensorCount');
  390. Pointer(NuiImageGetColorPixelCoordinatesFromDepthPixel):=GetProcAddress(HLib, 'NuiImageGetColorPixelCoordinatesFromDepthPixel');
  391. Pointer(NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution):=GetProcAddress(HLib, 'NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution');
  392. Pointer(NuiImageStreamGetImageFrameFlags):=GetProcAddress(HLib, 'NuiImageStreamGetImageFrameFlags');
  393. Pointer(NuiImageStreamGetNextFrame):=GetProcAddress(HLib, 'NuiImageStreamGetNextFrame');
  394. Pointer(NuiImageStreamOpen):=GetProcAddress(HLib, 'NuiImageStreamOpen');
  395. Pointer(NuiImageStreamReleaseFrame):=GetProcAddress(HLib, 'NuiImageStreamReleaseFrame');
  396. Pointer(NuiImageStreamSetImageFrameFlags):=GetProcAddress(HLib, 'NuiImageStreamSetImageFrameFlags');
  397. Pointer(NuiInitialize):=GetProcAddress(HLib,'NuiInitialize');
  398. Pointer(NuiSetDeviceStatusCallback):=GetProcAddress(HLib, 'NuiSetDeviceStatusCallback');
  399. Pointer(NuiSetFrameEndEvent):=GetProcAddress(HLib, 'NuiSetFrameEndEvent');
  400. Pointer(NuiShutdown):=GetProcAddress(HLib,'NuiShutdown');
  401. Pointer(NuiSkeletonCalculateBoneOrientations):=GetProcAddress(HLib, 'NuiSkeletonCalculateBoneOrientations');
  402. Pointer(NuiSkeletonGetNextFrame):=GetProcAddress(HLib, 'NuiSkeletonGetNextFrame');
  403. Pointer(NuiSkeletonSetTrackedSkeletons):=GetProcAddress(HLib, 'NuiSkeletonSetTrackedSkeletons');
  404. Pointer(NuiSkeletonTrackingDisable):=GetProcAddress(HLib, 'NuiSkeletonTrackingDisable');
  405. Pointer(NuiSkeletonTrackingEnable):=GetProcAddress(HLib, 'NuiSkeletonTrackingEnable');
  406. Pointer(NuiTransformSmooth):=GetProcAddress(HLib, 'NuiTransformSmooth');
  407. ARefCount:=1;
  408. end;
  409. Procedure UnloadNuiLibrary;
  410. begin
  411. Dec(ARefcount);
  412. If ARefCount>0 then
  413. Exit;
  414. NuiCameraElevationGetAngle:=nil;
  415. NuiCameraElevationSetAngle:=nil;
  416. NuiCreateSensorById:=nil;
  417. NuiCreateSensorByIndex:=nil;
  418. NuiGetAudioSource:=nil;
  419. NuiGetSensorCount:=nil;
  420. NuiImageGetColorPixelCoordinatesFromDepthPixel:=nil;
  421. NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution:=nil;
  422. NuiImageStreamGetImageFrameFlags:=nil;
  423. NuiImageStreamGetNextFrame:=nil;
  424. NuiImageStreamOpen:=nil;
  425. NuiImageStreamReleaseFrame:=nil;
  426. NuiImageStreamSetImageFrameFlags:=nil;
  427. NuiInitialize:=nil;
  428. NuiSetDeviceStatusCallback:=nil;
  429. NuiSetFrameEndEvent:=nil;
  430. NuiShutdown:=nil;
  431. NuiSkeletonCalculateBoneOrientations:=nil;
  432. NuiSkeletonGetNextFrame:=nil;
  433. NuiSkeletonSetTrackedSkeletons:=nil;
  434. NuiSkeletonTrackingDisable:=nil;
  435. NuiSkeletonTrackingEnable:=nil;
  436. NuiTransformSmooth:=nil;
  437. FreeLibrary(HLib);
  438. HLib:=NilHandle;
  439. end;
  440. Procedure NuiImageResolutionToSize(res : NUI_IMAGE_RESOLUTION; out refWidth, refHeight : DWORD);
  441. begin
  442. case res of
  443. NUI_IMAGE_RESOLUTION_80x60:
  444. begin
  445. refWidth := 80;
  446. refHeight := 60;
  447. end;
  448. NUI_IMAGE_RESOLUTION_320x240:
  449. begin
  450. refWidth := 320;
  451. refHeight := 240;
  452. end;
  453. NUI_IMAGE_RESOLUTION_640x480:
  454. begin
  455. refWidth := 640;
  456. refHeight := 480;
  457. end;
  458. NUI_IMAGE_RESOLUTION_1280x960:
  459. begin
  460. refWidth := 1280;
  461. refHeight := 960;
  462. end;
  463. else
  464. refWidth := 0;
  465. refHeight := 0;
  466. end;
  467. end;
  468. Function NuiDepthPixelToDepth(packedPixel: WORD) : WORD;
  469. begin
  470. Result:=packedPixel shr NUI_IMAGE_PLAYER_INDEX_SHIFT;
  471. end;
  472. Function NuiDepthPixelToPlayerIndex(packedPixel : WORD) : WORD;
  473. begin
  474. Result:=packedPixel and NUI_IMAGE_PLAYER_INDEX_MASK;
  475. end;
  476. Function HasSkeletalEngine(pNuiSensor : INuiSensor) : boolean;
  477. begin
  478. if Not assigned(pNuiSensor) then
  479. Result:=False
  480. else
  481. Result := ((pNuiSensor.NuiInitializationFlags() and NUI_INITIALIZE_FLAG_USES_SKELETON)<>0) or
  482. ((pNuiSensor.NuiInitializationFlags() and NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX)<>0);
  483. end;
  484. Procedure NuiTransformSkeletonToDepthImage(vPoint : TVector4;out lDepthX : Integer;out lDepthY : Integer;out usDepthValue : word; eResolution : NUI_IMAGE_RESOLUTION);inline;
  485. var
  486. w, h : DWORD;
  487. begin
  488. if (vPoint.z>FLT_EPSILON) then
  489. begin
  490. NuiImageResolutionToSize(eResolution,w,h);
  491. lDepthX:=round(w/2+vPoint.x*(w/320.0)*NUI_CAMERA_SKELETON_TO_DEPTH_IMAGE_MULTIPLIER_320x240/vPoint.z+0.5);
  492. lDepthY:=round(h/2-vPoint.y*(h/240.0)*NUI_CAMERA_SKELETON_TO_DEPTH_IMAGE_MULTIPLIER_320x240/vPoint.z+0.5);
  493. usDepthValue := round(vPoint.z *1000) shl 3;
  494. end
  495. else
  496. begin
  497. lDepthX := 0;
  498. lDepthY := 0;
  499. usDepthValue := 0;
  500. end;
  501. end;
  502. Procedure NuiTransformSkeletonToDepthImage(vPoint : TVector4;out lDepthX : Integer; out lDepthY : Integer;out usDepthValue : word); inline;
  503. begin
  504. NuiTransformSkeletonToDepthImage(vPoint,lDepthX,lDepthY,usDepthValue,NUI_IMAGE_RESOLUTION_320x240);
  505. end;
  506. Procedure NuiTransformSkeletonToDepthImage(vPoint : TVector4;out fDepthX : single;out fDepthY : single; eResolution : NUI_IMAGE_RESOLUTION); inline;
  507. var
  508. w, h : DWORD;
  509. begin
  510. if (vPoint.z>FLT_EPSILON) then
  511. begin
  512. NuiImageResolutionToSize(eResolution,w,h);
  513. fDepthX:=w/2+vPoint.x*(w/320.0)*NUI_CAMERA_SKELETON_TO_DEPTH_IMAGE_MULTIPLIER_320x240/vPoint.z;
  514. fDepthY:=h/2-vPoint.y*(h/240.0)*NUI_CAMERA_SKELETON_TO_DEPTH_IMAGE_MULTIPLIER_320x240/vPoint.z;
  515. end
  516. else
  517. begin
  518. fDepthX:=0.0;
  519. fDepthY:=0.0;
  520. end;
  521. end;
  522. Procedure NuiTransformSkeletonToDepthImage(vPoint : TVector4;out fDepthX : single;out fDepthY : single);
  523. begin
  524. NuiTransformSkeletonToDepthImage(vPoint, fDepthX, fDepthY,NUI_IMAGE_RESOLUTION_320x240);
  525. end;
  526. Function NuiTransformDepthImageToSkeleton(lDepthX : Integer;lDepthY : Integer; usDepthValue : word;eResolution : NUI_IMAGE_RESOLUTION) : TVector4; inline;
  527. var
  528. w,h : DWORD;
  529. Z : single;
  530. begin
  531. NuiImageResolutionToSize(eResolution,w,h);
  532. Z:=(usDepthValue shr 3)/1000.0;
  533. result.Z:=Z;
  534. result.X:=(lDepthX-w/2.0)*(320.0/w)*NUI_CAMERA_DEPTH_IMAGE_TO_SKELETON_MULTIPLIER_320x240*Z;
  535. result.Y:=-(lDepthY-h/2.0)*(240.0/h)*NUI_CAMERA_DEPTH_IMAGE_TO_SKELETON_MULTIPLIER_320x240*Z;
  536. result.W:=1.0;
  537. end;
  538. Function NuiTransformDepthImageToSkeleton(lDepthX,lDepthY : Integer;usDepthValue : word) : TVector4; inline;
  539. begin
  540. result:=NuiTransformDepthImageToSkeleton(lDepthX,lDepthY,usDepthValue,NUI_IMAGE_RESOLUTION_320x240);
  541. end;
  542. end.