using System; using Phantom.XRMOD.ActionNotification.Runtime; using UnityEditor; using UnityEngine; using UnityEngine.XR.ARSubsystems; namespace Phantom.XRMOD.XRMODPackageTools.Editor { public class AlgorithmBlock : AbstractBlock { private readonly Configures property; private bool enabledArAlgorithm = true; private string enableARAlgorithmMsg = "XR Algorithm"; public AlgorithmBlock(Configures _property) : base(_property) { property = _property; } public override Rect DrawBlock(Rect _area) { enabledArAlgorithm = EditorGUILayout.BeginFoldoutHeaderGroup(enabledArAlgorithm, enableARAlgorithmMsg, null, ShowHeaderContextMenu); var tmp_HeaderRect = GUILayoutUtility.GetLastRect(); if (enabledArAlgorithm) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(15f); EditorGUILayout.BeginVertical(); property.SDKDeviceType = (SDKDeviceType) EditorGUILayout.EnumPopup("Device Type", property.SDKDeviceType); MakeSureBuildPlatform(); if (property.SDKDeviceType == SDKDeviceType.HandheldAR || property.SDKDeviceType == SDKDeviceType.VisionOS || property.SDKDeviceType == SDKDeviceType.Rokid) { #if HANDHELD_ARMODULE_INSTALL || VISIONOS_INSTALL || ROKID_INSTALL property.Algorithm = (AlgorithmType) EditorGUILayout.EnumPopup("XR Algorithm", property.Algorithm); switch (property.Algorithm) { case AlgorithmType.ImageTracker: property.MaxMovingOfTracking = EditorGUILayout.IntField( new GUIContent("Max Moving Of Tracking", "You can specify the number of moving images to track simultaneously. "), property.MaxMovingOfTracking); break; #if HANDHELD_ARMODULE_INSTALL case AlgorithmType.FocusSlam: #endif case AlgorithmType.Anchor: property.PlaneDetectionMode = (PlaneDetectionMode) EditorGUILayout.EnumFlagsField("Plane Detection Mode", property.PlaneDetectionMode); break; } if (property.SDKDeviceType == SDKDeviceType.VisionOS && property.Algorithm != AlgorithmType.None && property.SpaceType != SpaceType.ExclusiveSpace) { EditorGUILayout.HelpBox("This algorithm only work in Exclusive space mode.", MessageType.Error); } #endif } else if (property.SDKDeviceType == SDKDeviceType.Pico) { property.MixedReality = EditorGUILayout.Toggle("Mixed Reality", property.MixedReality); } else if (property.SDKDeviceType == SDKDeviceType.XReal) { #if XREAL_INSTALL property.Algorithm = (AlgorithmType) EditorGUILayout.EnumPopup("XR Algorithm", property.Algorithm); switch (property.Algorithm) { case AlgorithmType.ImageTracker: property.MaxMovingOfTracking = EditorGUILayout.IntField( new GUIContent("Max Moving Of Tracking", "You can specify the number of moving images to track simultaneously. "), property.MaxMovingOfTracking); break; case AlgorithmType.FocusSlam: case AlgorithmType.Anchor: property.PlaneDetectionMode = (PlaneDetectionMode) EditorGUILayout.EnumFlagsField("Plane Detection Mode", property.PlaneDetectionMode); break; #if HANDHELD_ARMODULE_INSTALL case AlgorithmType.FaceMesh: EditorGUILayout.HelpBox("Not support this feature on XReal platform", MessageType.Error); break; #endif } #endif } else if (property.SDKDeviceType == SDKDeviceType.Quest) { #if QUEST_INSTALL property.Algorithm = (AlgorithmType) EditorGUILayout.EnumPopup("XR Algorithm", property.Algorithm); property.MixedReality = EditorGUILayout.Toggle("Mixed Reality", property.MixedReality); switch (property.Algorithm) { case AlgorithmType.Meshing: property.MaxMovingOfTracking = EditorGUILayout.IntField( new GUIContent("Max Moving Of Tracking", "You can specify the number of moving images to track simultaneously. "), property.MaxMovingOfTracking); break; case AlgorithmType.Anchor: property.PlaneDetectionMode = (PlaneDetectionMode) EditorGUILayout.EnumFlagsField("Plane Detection Mode", property.PlaneDetectionMode); break; } #endif } property.AlgorithmAutoStart = EditorGUILayout.Toggle(new GUIContent("Algorithm Auto Start", "Toggling this on/off will enable/disable the automatic startup of algorithm at runtime"), property.AlgorithmAutoStart); if (!property.AlgorithmAutoStart) EditorGUILayout.HelpBox( "If `algorithm auto start` is disabled, you need to start it manually by script.", MessageType.Warning); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); Utility.DrawHorizontalDivLine(); } EditorGUILayout.EndFoldoutHeaderGroup(); return tmp_HeaderRect; } private void MakeSureBuildPlatform() { var tmp_EditingProjectData = PackageToolsEditor.ALL_PROJECT_CACHE.GetEditingProjectData(); if (!tmp_EditingProjectData) return; var tmp_BuildSettingData = tmp_EditingProjectData.DetailCacheData.BuildSettingData; switch (property.SDKDeviceType) { case SDKDeviceType.VisionOS: tmp_BuildSettingData.BuildTarget = BuildTarget.VisionOS; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.VisionOS; break; case SDKDeviceType.HandheldAR: #if UNITY_IOS tmp_BuildSettingData.BuildTarget = BuildTarget.iOS; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.iOS; #else tmp_BuildSettingData.BuildTarget = BuildTarget.Android; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Android; #endif break; case SDKDeviceType.Hololens: tmp_BuildSettingData.BuildTarget = BuildTarget.WSAPlayer; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.WSA; break; case SDKDeviceType.Pico: case SDKDeviceType.Quest: case SDKDeviceType.Rokid: case SDKDeviceType.XReal: tmp_BuildSettingData.BuildTarget = BuildTarget.Android; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Android; break; case SDKDeviceType.WebAR: case SDKDeviceType.WebVR: case SDKDeviceType.Web3D: tmp_BuildSettingData.BuildTarget = BuildTarget.WebGL; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.WebGL; break; case SDKDeviceType.Classic3D: #if UNITY_IOS tmp_BuildSettingData.BuildTarget = BuildTarget.iOS; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.iOS; #elif UNITY_ANDROID tmp_BuildSettingData.BuildTarget = BuildTarget.Android; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Android; #elif UNITY_STANDALONE_OSX && CLASSIC3D_OSX tmp_BuildSettingData.BuildTarget = BuildTarget.StandaloneOSX; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Standalone; #elif UNITY_STANDALONE_WIN && CLASSIC3D_WIN tmp_BuildSettingData.BuildTarget = BuildTarget.StandaloneWindows64; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Standalone; #elif UNITY_STANDALONE_LINUX && CLASSIC3D_LINUX tmp_BuildSettingData.BuildTarget = BuildTarget.StandaloneLinux64; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Standalone; #elif UNITY_SERVER && DEDICATED_SERVER_OSX tmp_BuildSettingData.BuildTarget = BuildTarget.StandaloneOSX; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Standalone; #elif UNITY_SERVER && DEDICATED_SERVER_WIN tmp_BuildSettingData.BuildTarget = BuildTarget.StandaloneWindows64; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Standalone; #elif UNITY_SERVER && DEDICATED_SERVER_LINUX tmp_BuildSettingData.BuildTarget = BuildTarget.StandaloneLinux64; tmp_BuildSettingData.BuildTargetGroup = BuildTargetGroup.Standalone; #endif break; default: throw new ArgumentOutOfRangeException(); } ActionNotificationCenter.DefaultCenter.PostNotification(nameof(EditingProjectCommand), new BaseNotificationData()); } public override bool OnRemoved() { property.PlaneDetectionMode = PlaneDetectionMode.None; property.Algorithm = AlgorithmType.None; return false; } public override bool OpenReference() { Application.OpenURL($"{CONST_HELP_BASE_URL}ar-algorithm-block#ar-algorithm"); return false; } void ShowHeaderContextMenu(Rect _position) { var tmp_Menu = new GenericMenu(); tmp_Menu.AddItem(new GUIContent("Reset"), false, () => OnRemoved()); tmp_Menu.AddItem(new GUIContent(CONST_HELP_BUTTON_TITLE), false, () => OpenReference()); tmp_Menu.DropDown(_position); } } }