From 2b2d07a1d2c490e6fbdcab354445a8b2660e9498 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Wed, 29 Nov 2023 17:39:45 +1100 Subject: [PATCH] CesiumIonServer, CesiumIonServerManager. --- Editor/CesiumEditorWindow.cs | 3 +- Editor/CesiumIonAssetsWindow.cs | 2 +- Editor/CesiumIonServerManager.cs | 95 +++++++++++++++++++++++++++ Editor/CesiumIonServerManager.cs.meta | 11 ++++ Editor/CesiumIonServerUI.cs | 13 ++++ Editor/CesiumIonServerUI.cs.meta | 11 ++++ Editor/CesiumIonSession.cs | 15 +++-- Runtime/CesiumIonServer.cs | 81 +++++++++++++++++++++++ Runtime/CesiumIonServer.cs.meta | 11 ++++ native~/extern/cesium-native | 2 +- 10 files changed, 234 insertions(+), 10 deletions(-) create mode 100644 Editor/CesiumIonServerManager.cs create mode 100644 Editor/CesiumIonServerManager.cs.meta create mode 100644 Editor/CesiumIonServerUI.cs create mode 100644 Editor/CesiumIonServerUI.cs.meta create mode 100644 Runtime/CesiumIonServer.cs create mode 100644 Runtime/CesiumIonServer.cs.meta diff --git a/Editor/CesiumEditorWindow.cs b/Editor/CesiumEditorWindow.cs index ae3b67ff..583b51c3 100644 --- a/Editor/CesiumEditorWindow.cs +++ b/Editor/CesiumEditorWindow.cs @@ -11,7 +11,7 @@ public partial class CesiumEditorWindow : EditorWindow { public static CesiumEditorWindow currentWindow = null; - [MenuItem("Cesium/Cesium")] + [MenuItem("Tools/Cesium/Cesium")] public static void ShowWindow() { // If no existing window, make a new one docked next to the Hierarchy window. @@ -60,6 +60,7 @@ void OnGUI() this._isIonLoadingProfile = ion.IsLoadingProfile(); } + CesiumIonServerUI.Selector(); this.DrawCesiumToolbar(); this._scrollPosition = EditorGUILayout.BeginScrollView(this._scrollPosition); diff --git a/Editor/CesiumIonAssetsWindow.cs b/Editor/CesiumIonAssetsWindow.cs index 679467c7..701bbece 100644 --- a/Editor/CesiumIonAssetsWindow.cs +++ b/Editor/CesiumIonAssetsWindow.cs @@ -10,7 +10,7 @@ public class CesiumIonAssetsWindow : EditorWindow { public static CesiumIonAssetsWindow currentWindow = null; - [MenuItem("Cesium/Cesium ion Assets")] + [MenuItem("Tools/Cesium/Cesium ion Assets")] public static void ShowWindow() { if (currentWindow == null) diff --git a/Editor/CesiumIonServerManager.cs b/Editor/CesiumIonServerManager.cs new file mode 100644 index 00000000..c5d9aa82 --- /dev/null +++ b/Editor/CesiumIonServerManager.cs @@ -0,0 +1,95 @@ +using System.Collections.Generic; +using System; +using UnityEditor; +using UnityEngine; + +namespace CesiumForUnity +{ + [FilePath("UserSettings/CesiumIonServerManager.asset", FilePathAttribute.Location.ProjectFolder)] + public class CesiumIonServerManager : ScriptableSingleton + { + public CesiumIonServer Current + { + get + { + if (this._currentCesiumIonServer == null) + { + this._currentCesiumIonServer = CesiumIonServer.defaultServer; + + // For backward compatibility, look for an existing user access token in the EditorPrefs + // and move it to the user access token map. + if (string.IsNullOrEmpty(this.GetUserAccessToken(this._currentCesiumIonServer))) + { + const string editorPrefKey = "CesiumUserAccessToken"; + string userAccessToken = EditorPrefs.GetString(editorPrefKey); + if (!string.IsNullOrEmpty(userAccessToken)) + { + this.SetUserAccessToken(this._currentCesiumIonServer, userAccessToken); + EditorPrefs.DeleteKey(editorPrefKey); + } + } + + } + return this._currentCesiumIonServer; + } + } + + public CesiumIonSession CurrentSession + { + get + { + return this.GetSession(this.Current); + } + } + + public CesiumIonSession GetSession(CesiumIonServer server) + { + CesiumIonSession session; + if (!this._sessions.TryGetValue(server, out session)) + { + session = new CesiumIonSession(server); + this._sessions.Add(server, session); + } + return session; + } + + private string GetUserAccessToken(CesiumIonServer server) + { + int index = this._userAccessTokenMap.FindIndex(record => record.server == server); + return index >= 0 ? this._userAccessTokenMap[index].token : null; + } + + private void SetUserAccessToken(CesiumIonServer server, string token) + { + int index = this._userAccessTokenMap.FindIndex(record => record.server == server); + if (index >= 0) + { + this._userAccessTokenMap[index].token = token; + } + else + { + UserAccessTokenRecord record = new UserAccessTokenRecord(); + record.server = server; + record.token = token; + this._userAccessTokenMap.Add(record); + } + + this.Save(true); + } + + [Serializable] + private class UserAccessTokenRecord + { + public CesiumIonServer server; + public string token; + } + + [SerializeField] + private List _userAccessTokenMap = new List(); + + [SerializeField] + private CesiumIonServer _currentCesiumIonServer; + + private Dictionary _sessions = new Dictionary(); + } +} diff --git a/Editor/CesiumIonServerManager.cs.meta b/Editor/CesiumIonServerManager.cs.meta new file mode 100644 index 00000000..6d4ff27b --- /dev/null +++ b/Editor/CesiumIonServerManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fd1d4ad8db4f0fc4793f9e010e57f1d5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/CesiumIonServerUI.cs b/Editor/CesiumIonServerUI.cs new file mode 100644 index 00000000..0b99a0a7 --- /dev/null +++ b/Editor/CesiumIonServerUI.cs @@ -0,0 +1,13 @@ +using UnityEditor; +using UnityEngine; + +namespace CesiumForUnity +{ + public class CesiumIonServerUI + { + public static void Selector() + { + + } + } +} diff --git a/Editor/CesiumIonServerUI.cs.meta b/Editor/CesiumIonServerUI.cs.meta new file mode 100644 index 00000000..d25bd7f5 --- /dev/null +++ b/Editor/CesiumIonServerUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 672b8571f8377934e8e7ab8c480df701 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/CesiumIonSession.cs b/Editor/CesiumIonSession.cs index 2922074d..568d333c 100644 --- a/Editor/CesiumIonSession.cs +++ b/Editor/CesiumIonSession.cs @@ -5,8 +5,6 @@ namespace CesiumForUnity [ReinteropNativeImplementation("CesiumForUnityNative::CesiumIonSessionImpl", "CesiumIonSessionImpl.h")] public partial class CesiumIonSession { - private static CesiumIonSession currentSession = null!; - public delegate void GUIUpdateDelegate(); public static event GUIUpdateDelegate OnConnectionUpdated; @@ -16,12 +14,15 @@ public partial class CesiumIonSession public static CesiumIonSession Ion() { - if (currentSession == null) - { - currentSession = new CesiumIonSession(); - } + return CesiumIonServerManager.instance.CurrentSession; + } + + internal CesiumIonServer server; - return currentSession; + public CesiumIonSession(CesiumIonServer server) + { + this.server = server; + this.CreateImplementation(); } public partial bool IsConnected(); diff --git a/Runtime/CesiumIonServer.cs b/Runtime/CesiumIonServer.cs new file mode 100644 index 00000000..bd775dca --- /dev/null +++ b/Runtime/CesiumIonServer.cs @@ -0,0 +1,81 @@ +using UnityEditor; +using UnityEngine; + +namespace CesiumForUnity +{ + /// + /// Defines a Cesium ion Server. This may be the public (SaaS) Cesium ion server at + /// ion.cesium.com, or it may be a self-hosted instance. + /// + [CreateAssetMenu(fileName = "CesiumIonServer", menuName = "Cesium/Cesium ion Server")] + public class CesiumIonServer : ScriptableObject + { + /// + /// The main URL of the Cesium ion server. For example, the server URL for the + /// public Cesium ion is https://ion.cesium.com. + /// + public string serverUrl = "https://ion.cesium.com"; + + /// + /// The URL of the main API endpoint of the Cesium ion server. For example, for + /// the default, public Cesium ion server, this is `https://api.cesium.com`. If + /// left blank, the API URL is automatically inferred from the Server URL. + /// + public string apiUrl = "https://api.cesium.com"; + + /// + /// The application ID to use to log in to this server using OAuth2. This + /// OAuth2 application must be configured on the server with the exact URL + /// `http://127.0.0.1/cesium-for-unreal/oauth2/callback`. + /// + public long oauth2ApplicationID = 190; + + /// + /// The ID of the default access token to use to access Cesium ion assets at + /// runtime. This property may be an empty string, in which case the ID is + /// found by searching the logged-in Cesium ion account for the + /// DefaultIonAccessToken. + /// + public string defaultIonAccessTokenId; + + /// + /// The default token used to access Cesium ion assets at runtime. This token + /// is embedded in packaged games for use at runtime. + /// + public string defaultIonAccessToken; + + /// + /// Gets the default Cesium ion Server (ion.cesium.com). + /// + /// + /// It is expected to be found at `Assets/CesiumSettings/CesiumIonServers/ion.cesium.com`. + /// In the Editor, it will be created if it does not already exist, so this method always + /// returns a valid instance. At runtime, this method returns null if the object does not + /// exist. + /// + public static CesiumIonServer defaultServer + { + get + { + CesiumIonServer result = Resources.Load("CesiumIonServers/ion.cesium.com"); + +#if UNITY_EDITOR + if (result == null) + { + if (!AssetDatabase.IsValidFolder("Assets/CesiumSettings")) + AssetDatabase.CreateFolder("Assets", "CesiumSettings"); + if (!AssetDatabase.IsValidFolder("Assets/CesiumSettings/Resources")) + AssetDatabase.CreateFolder("Assets/CesiumSettings", "Resources"); + if (!AssetDatabase.IsValidFolder("Assets/CesiumSettings/Resources/CesiumIonServers")) + AssetDatabase.CreateFolder("Assets/CesiumSettings/Resources", "CesiumIonServers"); + result = ScriptableObject.CreateInstance(); + AssetDatabase.CreateAsset(result, "Assets/CesiumSettings/Resources/CesiumIonServers/ion.cesium.com.asset"); + AssetDatabase.Refresh(); + } +#endif + + return result; + } + } + } +} diff --git a/Runtime/CesiumIonServer.cs.meta b/Runtime/CesiumIonServer.cs.meta new file mode 100644 index 00000000..6c3651eb --- /dev/null +++ b/Runtime/CesiumIonServer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d989861ef825b2e4fb3cbcd03f532909 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/native~/extern/cesium-native b/native~/extern/cesium-native index 6e720ff0..ea925e5d 160000 --- a/native~/extern/cesium-native +++ b/native~/extern/cesium-native @@ -1 +1 @@ -Subproject commit 6e720ff0fff9fd29cd16183ae19f1c399cda5e5c +Subproject commit ea925e5dd144fa14aff41724a03cf2d853cd0a1a