36 private Dictionary<GlassesHandle, CameraImageCore> cameraImageCores =
new Dictionary<GlassesHandle, CameraImageCore>();
38 #region Public Functions
40 internal static void Initialize(GlassesHandle glassesHandle)
42 Instance.cameraImageCores[glassesHandle] =
new CameraImageCore(glassesHandle);
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);
60 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
70 if(!
Glasses.
IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
75 return cameraImageCore.TryGetFilledCameraImageBuffer(ref camImage);
89 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
99 if(!
Glasses.
IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
104 return cameraImageCore.TrySubmitEmptyCameraImageBuffer(imageBuffer, bufferSize);
118 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
128 if(!
Glasses.
IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
133 return cameraImageCore.TryCancelCameraImageBuffer(imageBuffer);
144 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
154 if(!
Glasses.
IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
159 return cameraImageCore.TryConfigureCameraImageStream(config);
170 if(!
Player.TryGetGlassesHandle(playerIndex, out var glassesHandle))
180 if(!
Glasses.
IsConnected(glassesHandle) || !Instance.cameraImageCores.TryGetValue(glassesHandle, out var cameraImageCore))
185 return cameraImageCore.TryGetDewarpedPixelCoordinate(ref pixelDewarp);
188 #endregion Public Functions
194 private class CameraImageCore : IDisposable
196 public GlassesHandle glassesHandle;
198 public CameraImageCore(GlassesHandle glassesId)
200 this.glassesHandle = glassesId;
203 public virtual void Dispose(){
204 Log.Info($
"CameraImageCore for {glassesHandle} disconnected");
208 public bool TryGetDewarpedPixelCoordinate(ref T5_PixelDewarp pixelDewarp)
210 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
213 result = NativePlugin.GetDewarpedPixelCoordinate(glassesHandle, ref pixelDewarp);
215 catch (System.Exception e)
217 Log.Error($
"Error calculating pixel dewarp location: {e.Message}");
219 return result == NativePlugin.T5_RESULT_SUCCESS;
222 public bool TryConfigureCameraImageStream(T5_CameraStreamConfig config)
224 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
227 result = NativePlugin.ConfigureCameraStream(glassesHandle, config);
229 catch (System.Exception e)
231 Log.Error($
"Error enabling Camera Stream: {e.Message}");
233 return result == NativePlugin.T5_RESULT_SUCCESS;
236 public bool TryGetFilledCameraImageBuffer(ref T5_CamImage camImage)
238 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
242 result = NativePlugin.GetFilledCamImageBuffer(glassesHandle, ref camImage);
244 catch (System.Exception e)
246 Log.Error($
"Error getting Camera Image: {e.Message}");
248 return result == NativePlugin.T5_RESULT_SUCCESS;
251 public bool TrySubmitEmptyCameraImageBuffer(IntPtr imageBuffer, UInt32 bufferSize)
253 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
256 result = NativePlugin.SubmitEmptyCamImageBuffer(glassesHandle, imageBuffer, bufferSize);
258 catch (System.Exception e)
260 Log.Error($
"Error submitting Camera Image Buffer: {e.Message}");
263 return result == NativePlugin.T5_RESULT_SUCCESS;
266 public bool TryCancelCameraImageBuffer(
byte[] imageBuffer)
268 int result = NativePlugin.T5_RESULT_UNKNOWN_ERROR;
271 GCHandle handle = GCHandle.Alloc(imageBuffer, GCHandleType.Pinned);
272 var ImageBufferHandle = handle.AddrOfPinnedObject();
273 result = NativePlugin.CancelCamImageBuffer(glassesHandle, ImageBufferHandle);
276 catch (System.Exception e)
278 Log.Error($
"Error clearing Camera Image Buffers: {e.Message}");
281 return result == NativePlugin.T5_RESULT_SUCCESS;