99.imdk_unity 上传

This commit is contained in:
2025-06-19 10:56:43 +08:00
parent d48c1f1f7b
commit 820c663ab8
651 changed files with 123674 additions and 0 deletions
@@ -0,0 +1,188 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System;
using System.Runtime.InteropServices;
using System.Threading;
using UnityEngine;
namespace Immersal.XR
{
public interface ICameraData
{
IImageData GetImageData();
byte[] GetBytes();
CameraData Copy(IImageData imageData);
public void ReleaseReference();
public void CheckReferences();
int Width { get; }
int Height { get; }
int Channels { get; }
CameraDataFormat Format { get; }
Vector4 Intrinsics { get; }
Vector3 CameraPositionOnCapture { get; }
Quaternion CameraRotationOnCapture { get; }
double[] Distortion { get; }
Quaternion Orientation { get; }
}
public class CameraData : ICameraData
{
public int Width { get; set; }
public int Height { get; set; }
public int Channels { get; set; }
public CameraDataFormat Format { get; set; }
public Vector4 Intrinsics { get; set; } // x = principal point x, y = principal point y, z = focal length x, w = focal length y
public Vector3 CameraPositionOnCapture { get; set; }
public Quaternion CameraRotationOnCapture { get; set; }
public double[] Distortion { get; set; } // not yet used
public Quaternion Orientation { get; set; }
private readonly IImageData m_ImageData;
private int m_ReferenceCount;
private bool m_IsDisposed;
public CameraData(IImageData imageData)
{
m_ImageData = imageData;
m_ImageData.SetCameraDataReference(this);
}
public IImageData GetImageData()
{
if (m_IsDisposed) throw new ObjectDisposedException("Immersal.XR.CameraData");
Interlocked.Increment(ref m_ReferenceCount);
return m_ImageData;
}
public byte[] GetBytes()
{
if (m_IsDisposed) throw new ObjectDisposedException("Immersal.XR.CameraData");
return m_ImageData.ManagedBytes;
}
public void ReleaseReference()
{
Interlocked.Decrement(ref m_ReferenceCount);
CheckReferences();
}
public void CheckReferences()
{
if (m_ReferenceCount <= 0)
{
Dispose();
}
}
private void Dispose()
{
if (m_IsDisposed)
{
ImmersalLogger.LogWarning("Attempting to dispose already disposed CameraData");
return;
}
if (m_ImageData != null)
{
m_ImageData.DisposeData();
}
else
{
ImmersalLogger.LogWarning("Attempting to dispose null ImageData");
}
m_IsDisposed = true;
}
public CameraData Copy(IImageData imageData)
{
CameraData data = new CameraData(imageData)
{
Width = this.Width,
Height = this.Height,
Intrinsics = this.Intrinsics,
Format = this.Format,
Channels = this.Channels,
CameraPositionOnCapture = this.CameraPositionOnCapture,
CameraRotationOnCapture = this.CameraRotationOnCapture,
Orientation = this.Orientation,
Distortion = this.Distortion
};
return data;
}
}
public interface IImageData : IDisposable
{
public IntPtr UnmanagedDataPointer { get; }
public byte[] ManagedBytes { get; }
void SetCameraDataReference(ICameraData cameraData);
void DisposeData();
}
public abstract class ImageData: IImageData
{
public abstract IntPtr UnmanagedDataPointer { get; }
public abstract byte[] ManagedBytes { get; }
public abstract void DisposeData();
private ICameraData m_CameraData;
private bool m_CameraDataReferenceSet = false;
public void Dispose()
{
if (m_CameraData == null)
{
ImmersalLogger.LogWarning("Disposing ImageData with no CameraData reference.");
DisposeData();
return;
}
m_CameraData.ReleaseReference();
}
public void SetCameraDataReference(ICameraData cameraData)
{
if (m_CameraDataReferenceSet)
{
ImmersalLogger.LogError("CameraData reference already set.");
return;
}
m_CameraData = cameraData;
m_CameraDataReferenceSet = true;
}
}
public sealed class SimpleImageData : ImageData
{
public override IntPtr UnmanagedDataPointer => m_UnmanagedDataPointer;
public override byte[] ManagedBytes { get; }
private IntPtr m_UnmanagedDataPointer;
private GCHandle m_managedDataHandle;
public SimpleImageData(byte[] bytes)
{
ManagedBytes = bytes;
m_managedDataHandle = GCHandle.Alloc(ManagedBytes, GCHandleType.Pinned);
m_UnmanagedDataPointer = m_managedDataHandle.AddrOfPinnedObject();
}
public override void DisposeData()
{
m_managedDataHandle.Free();
m_UnmanagedDataPointer = IntPtr.Zero;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 03a98a5ff49164b08addce88bff9bfed
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System.Threading.Tasks;
namespace Immersal.XR
{
public interface IDataProcessingChain<T>
{
public Task ProcessNewData(T inputData);
public Task UpdateChain();
public T GetCurrentData();
public Task ResetProcessors();
public void AddProcessor(IDataProcessor<T> processor);
public void RemoveProcessor(IDataProcessor<T> processor);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 52c0b4f597e8a4721a94e07ba8c7719a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
public interface IImmersalSession
{
void PauseSession();
void ResumeSession();
Task ResetSession();
Task StopSession(bool cancelRunningTask = true);
void StartSession();
Task LocalizeOnce();
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ffba8fb68d0ca444ca8e3a96cb3d32bf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,71 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System;
using System.Threading;
using System.Threading.Tasks;
using Immersal.REST;
using UnityEngine;
namespace Immersal.XR
{
public interface ILocalizationResult
{
bool Success { get; }
int MapId { get; }
LocalizeInfo LocalizeInfo { get; }
}
public interface ILocalizationMethodConfiguration
{
XRMap[] MapsToAdd { get; }
XRMap[] MapsToRemove { get; }
SolverType? SolverType { get; }
int? PriorNNCountMin { get; }
int? PriorNNCountMax { get; }
Vector3? PriorScale { get; }
float? PriorRadius { get; }
}
public enum ConfigurationMode
{
WhenNecessary,
Always
}
public interface ILocalizationMethod : IHasNullOrDeadCheck
{
ConfigurationMode ConfigurationMode { get; }
IMapOption[] MapOptions { get; }
Task<bool> Configure(ILocalizationMethodConfiguration configuration);
Task<ILocalizationResult> Localize(ICameraData cameraData, CancellationToken cancellationToken);
Task StopAndCleanUp();
Task OnMapRegistered(XRMap map);
}
// Utility interface and extension method for checking if an interface is null.
// Directly comparing an interface to null sidesteps the custom null-checks used with Unity objects.
// This means the interface reference might not be null in the C# sense, even if the object it is
// referencing has been destroyed in the Unity context.
// This is only an issue if the class implementing the interface is inheriting from Unity objects.
public interface IHasNullOrDeadCheck {}
public static class NullOrDeadCheckExtension
{
public static bool IsNullOrDead(this IHasNullOrDeadCheck obj)
{
// Casting to UnityEngine.Object will force the check to utilize Unity's custom null-checking
if (obj is UnityEngine.Object o)
return o == null;
return obj == null;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 138bfe17044ec4f6e95318d640e0c4c8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,60 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Immersal.REST;
namespace Immersal.XR
{
public interface ILocalizationResults
{
ILocalizationResult[] Results { get; }
}
public interface ILocalizerConfiguration
{
Dictionary<ILocalizationMethod, XRMap[]> ConfigurationsToAdd { get; }
Dictionary<ILocalizationMethod, XRMap[]> ConfigurationsToRemove { get; }
bool StopRunningTasks { get; }
}
public interface ILocalizerConfigurationResult
{
bool Success { get; set; }
}
public interface ILocalizer
{
ILocalizationMethod[] AvailableLocalizationMethods { get; }
Task<ILocalizerConfigurationResult> ConfigureLocalizer(ILocalizerConfiguration configuration);
Task<ILocalizationResults> Localize(ICameraData cameraData);
Task<List<LocalizationTask>> CreateLocalizationTasks(ICameraData cameraData);
Task<ILocalizationResults> LocalizeAllMethods(ICameraData cameraData);
Task StopAndCleanUp();
Task StopLocalizationForMethod(ILocalizationMethod localizationMethod);
bool TryGetLocalizationTask(ILocalizationMethod localizationMethod, out LocalizationTask task);
}
public class LocalizationTask
{
public Task<ILocalizationResult> LocalizationMethodTask { get; private set; }
public CancellationTokenSource CancellationTokenSource { get; private set; }
public LocalizationTask(Task<ILocalizationResult> task, CancellationTokenSource cancellationTokenSource)
{
LocalizationMethodTask = task;
CancellationTokenSource = cancellationTokenSource;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 17af27cd6aa4e429186d011bbb43b70f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,76 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System;
using UnityEditor;
using UnityEngine;
namespace Immersal.XR
{
public interface IMapOption
{
string Name { get; }
void DrawEditorGUI(XRMap map);
}
// Example IMapOption implementation
[Serializable]
public class IntOption : IMapOption
{
public string Name { get; private set; }
[SerializeField]
public int Value;
public IntOption(string name, int initialValue)
{
Name = name;
Value = initialValue;
}
public void DrawEditorGUI(XRMap map)
{
#if UNITY_EDITOR
Value = EditorGUILayout.IntField(Name, Value);
#endif
}
}
[Serializable]
public class SerializableMapOption
{
public string TypeName;
public string Data;
// Serialize an IMapOption instance
public static SerializableMapOption Serialize(IMapOption option)
{
var serializableOption = new SerializableMapOption
{
TypeName = option.GetType().AssemblyQualifiedName,
Data = JsonUtility.ToJson(option)
};
return serializableOption;
}
// Deserialize into an IMapOption instance
public IMapOption Deserialize()
{
var type = Type.GetType(TypeName);
if (type != null)
{
return (IMapOption)JsonUtility.FromJson(Data, type);
}
return null;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6a4ee57b73bcb4fe5bf2d6c043df6930
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,80 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System;
using System.Threading.Tasks;
using UnityEngine;
namespace Immersal.XR
{
public interface IPlatformUpdateResult
{
bool Success { get; }
IPlatformStatus Status { get; }
ICameraData CameraData { get; }
}
public interface IPlatformStatus
{
int TrackingQuality { get; }
}
public enum CameraDataFormat
{
SingleChannel,
RGB
}
public interface IPlatformConfigureResult
{
bool Success { get; }
}
public interface IPlatformSupport
{
Task<IPlatformUpdateResult> UpdatePlatform();
Task<IPlatformUpdateResult> UpdatePlatform(IPlatformConfiguration oneShotConfiguration);
Task<IPlatformConfigureResult> ConfigurePlatform();
Task<IPlatformConfigureResult> ConfigurePlatform(IPlatformConfiguration configuration);
Task StopAndCleanUp();
}
public interface IPlatformConfiguration
{
CameraDataFormat CameraDataFormat { get; }
}
#region Simple implementations
public struct SimplePlatformConfigureResult : IPlatformConfigureResult
{
public bool Success { get; set; }
}
public struct SimplePlatformUpdateResult : IPlatformUpdateResult
{
public bool Success { get; set; }
public IPlatformStatus Status { get; set; }
public ICameraData CameraData { get; set; }
}
public struct SimplePlatformStatus : IPlatformStatus
{
public int TrackingQuality { get; set; }
}
public struct PlatformConfiguration : IPlatformConfiguration
{
public CameraDataFormat CameraDataFormat { get; set; }
}
#endregion
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: bb89d50895fb74e67a68ee7887a68478
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,34 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sdk@immersal.com for licensing requests.
===============================================================================*/
using System.Threading.Tasks;
using UnityEngine;
namespace Immersal.XR
{
public interface ISceneUpdateable
{
Task SceneUpdate(SceneUpdateData data);
Transform GetTransform();
Task ResetScene();
}
public static class SceneUpdateableExtensions
{
public static Matrix4x4 ToMapSpace(this ISceneUpdateable sceneUpdateable, Vector3 pos, Quaternion rot)
{
Transform spaceTransform = sceneUpdateable.GetTransform();
Matrix4x4 pose = Matrix4x4.TRS(pos, rot, Vector3.one);
Matrix4x4 spacePose = Matrix4x4.TRS(spaceTransform.position, spaceTransform.rotation, Vector3.one);
return spacePose.inverse * pose;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1470387a4d318459a91c6a30cb5ef9b5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,20 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
using System.Threading.Tasks;
namespace Immersal.XR
{
public interface ISceneUpdater
{
Task UpdateScene(MapEntry entry, ICameraData cameraData, ILocalizationResult localizationResult);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 39b89922d087d4f66824b1389aa59801
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,27 @@
/*===============================================================================
Copyright (C) 2024 Immersal - Part of Hexagon. All Rights Reserved.
This file is part of the Immersal SDK.
The Immersal SDK cannot be copied, distributed, or made available to
third-parties for commercial purposes without written permission of Immersal Ltd.
Contact sales@immersal.com for licensing requests.
===============================================================================*/
namespace Immersal.XR
{
public interface ITrackingStatus
{
int LocalizationAttemptCount { get; }
int LocalizationSuccessCount { get; }
int TrackingQuality { get; }
}
public interface ITrackingAnalyzer
{
ITrackingStatus TrackingStatus { get; }
void Analyze(IPlatformStatus platformStatus, ILocalizationResults localizationResults);
void Reset();
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fea0f6762065741059e6568ded85996f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: