Unity SDK Docs 1.5.0-beta.6
Loading...
Searching...
No Matches
CameraImage.cs
1/*
2 * Copyright (C) 2020-2023 Tilt Five, Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17using System;
18using System.Collections.Generic;
19using System.Runtime.InteropServices;
20using UnityEngine;
21
22using TiltFive;
24
25namespace TiltFive
26{
30 public class CameraImage : Singleton<CameraImage>
31 {
32
36 private Dictionary<GlassesHandle, CameraImageCore> cameraImageCores = new Dictionary<GlassesHandle, CameraImageCore>();
37
38 #region Public Functions
39
40 internal static void Initialize(GlassesHandle glassesHandle)
41 {
42 Instance.cameraImageCores[glassesHandle] = new CameraImageCore(glassesHandle);
43 }
44
45 internal static void RemoveCore(GlassesHandle glassesHandle){
46 if(!Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore)) { return; }
47 cameraImageCore.Dispose();
48 Instance.cameraImageCores.Remove(glassesHandle);
49 }
50
58 public static bool TryGetFilledCameraImageBuffer(PlayerIndex playerIndex, ref T5_CamImage camImage)
59 {
60 if(!Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
61 {
62 return false;
63 }
64
65 return TryGetFilledCameraImageBuffer(glassesHandle, ref camImage);
66 }
67
68 internal static bool TryGetFilledCameraImageBuffer(GlassesHandle glassesHandle, ref T5_CamImage camImage)
69 {
70 if(!Glasses.IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
71 {
72 return false;
73 }
74
75 return cameraImageCore.TryGetFilledCameraImageBuffer(ref camImage);
76 }
77
86
87 public static bool TrySubmitEmptyCameraImageBuffer(PlayerIndex playerIndex, IntPtr imageBuffer, UInt32 bufferSize)
88 {
89 if(!Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
90 {
91 return false;
92 }
93
94 return TrySubmitEmptyCameraImageBuffer(glassesHandle, imageBuffer, bufferSize);
95 }
96
97 internal static bool TrySubmitEmptyCameraImageBuffer(GlassesHandle glassesHandle, IntPtr imageBuffer, UInt32 bufferSize)
98 {
99 if(!Glasses.IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
100 {
101 return false;
102 }
103
104 return cameraImageCore.TrySubmitEmptyCameraImageBuffer(imageBuffer, bufferSize);
105 }
106
115
116 public static bool TryCancelCameraImageBuffer(PlayerIndex playerIndex, byte[] imageBuffer)
117 {
118 if(!Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
119 {
120 return false;
121 }
122
123 return TryCancelCameraImageBuffer(glassesHandle, imageBuffer);
124 }
125
126 internal static bool TryCancelCameraImageBuffer(GlassesHandle glassesHandle, byte[] imageBuffer)
127 {
128 if(!Glasses.IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
129 {
130 return false;
131 }
132
133 return cameraImageCore.TryCancelCameraImageBuffer(imageBuffer);
134 }
135
141
143 {
144 if(!Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
145 {
146 return false;
147 }
148
149 return TryConfigureCameraImageStream(glassesHandle, config);
150 }
151
152 internal static bool TryConfigureCameraImageStream(GlassesHandle glassesHandle, T5_CameraStreamConfig config)
153 {
154 if(!Glasses.IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
155 {
156 return false;
157 }
158
159 return cameraImageCore.TryConfigureCameraImageStream(config);
160 }
161
167
168 public static bool TryGetDewarpedPixelCoordinate(PlayerIndex playerIndex, ref T5_PixelDewarp pixelDewarp)
169 {
170 if(!Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
171 {
172 return false;
173 }
174
175 return TryGetDewarpedPixelCoordinate(glassesHandle, ref pixelDewarp);
176 }
177
178 internal static bool TryGetDewarpedPixelCoordinate(GlassesHandle glassesHandle, ref T5_PixelDewarp pixelDewarp)
179 {
180 if(!Glasses.IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
181 {
182 return false;
183 }
184
185 return cameraImageCore.TryGetDewarpedPixelCoordinate(ref pixelDewarp);
186 }
187
188 #endregion Public Functions
189
190
194 private class CameraImageCore : IDisposable
195 {
196 public GlassesHandle glassesHandle;
197
198 public CameraImageCore(GlassesHandle glassesId)
199 {
200 this.glassesHandle = glassesId;
201 }
202
203 public virtual void Dispose(){
204 Log.Info($"CameraImageCore for {glassesHandle} disconnected");
205 return;
206 }
207
208 public bool TryGetDewarpedPixelCoordinate(ref T5_PixelDewarp pixelDewarp)
209 {
210 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
211 try
212 {
213 result = NativePlugin.GetDewarpedPixelCoordinate(glassesHandle, ref pixelDewarp);
214 }
215 catch (System.Exception e)
216 {
217 Log.Error($"Error calculating pixel dewarp location: {e.Message}");
218 }
219 return result == NativePlugin.T5_RESULT_SUCCESS;
220 }
221
222 public bool TryConfigureCameraImageStream(T5_CameraStreamConfig config)
223 {
224 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
225 try
226 {
227 result = NativePlugin.ConfigureCameraStream(glassesHandle, config);
228 }
229 catch (System.Exception e)
230 {
231 Log.Error($"Error enabling Camera Stream: {e.Message}");
232 }
233 return result == NativePlugin.T5_RESULT_SUCCESS;
234 }
235
236 public bool TryGetFilledCameraImageBuffer(ref T5_CamImage camImage)
237 {
238 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
239
240 try
241 {
242 result = NativePlugin.GetFilledCamImageBuffer(glassesHandle, ref camImage);
243 }
244 catch (System.Exception e)
245 {
246 Log.Error($"Error getting Camera Image: {e.Message}");
247 }
248 return result == NativePlugin.T5_RESULT_SUCCESS;
249 }
250
251 public bool TrySubmitEmptyCameraImageBuffer(IntPtr imageBuffer, UInt32 bufferSize)
252 {
253 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
254 try
255 {
256 result = NativePlugin.SubmitEmptyCamImageBuffer(glassesHandle, imageBuffer, bufferSize);
257 }
258 catch (System.Exception e)
259 {
260 Log.Error($"Error submitting Camera Image Buffer: {e.Message}");
261 }
262
263 return result == NativePlugin.T5_RESULT_SUCCESS;
264 }
265
266 public bool TryCancelCameraImageBuffer(byte[] imageBuffer)
267 {
268 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
269 try
270 {
271 GCHandle handle = GCHandle.Alloc(imageBuffer, GCHandleType.Pinned);
272 var ImageBufferHandle = handle.AddrOfPinnedObject();
273 result = NativePlugin.CancelCamImageBuffer(glassesHandle, ImageBufferHandle);
274 handle.Free();
275 }
276 catch (System.Exception e)
277 {
278 Log.Error($"Error clearing Camera Image Buffers: {e.Message}");
279 }
280
281 return result == NativePlugin.T5_RESULT_SUCCESS;
282 }
283 }
284 }
285}
The Camera Frame API and runtime.
static bool TrySubmitEmptyCameraImageBuffer(PlayerIndex playerIndex, IntPtr imageBuffer, UInt32 bufferSize)
Submit a camera image buffer to be used by the camera image stream. As images become available the bu...
static bool TryCancelCameraImageBuffer(PlayerIndex playerIndex, byte[] imageBuffer)
Specify an image buffer to be released from the Tilt Five Service. If true is returned,...
static bool TryGetDewarpedPixelCoordinate(PlayerIndex playerIndex, ref T5_PixelDewarp pixelDewarp)
Attempt to calculate a dewarped pixel location.
static bool TryConfigureCameraImageStream(PlayerIndex playerIndex, T5_CameraStreamConfig config)
Attempt to configure the Camera Stream.
static bool TryGetFilledCameraImageBuffer(PlayerIndex playerIndex, ref T5_CamImage camImage)
Attempt to request a new filled buffer from the camera image stream. If an empty buffer has been subm...
The Glasses API and runtime.
Definition Glasses.cs:35
static bool IsConnected(PlayerIndex playerIndex=PlayerIndex.One)
Indicate if the specified glasses are connected.
Definition Glasses.cs:404
Provides access to player settings and functionality.
Definition Player.cs:31
PlayerIndex
The Player index (e.g. Player One, Player Two, etc)
Represents a wrapper on a buffer comtaining a camera image.
Camera Stream Configuration.
Pixel Coordinate Dewarp Wrapper.