Browse Source

no message

“hujiajun” 1 year ago
parent
commit
d58f6c5316

+ 0 - 1
.gitignore

@@ -37,7 +37,6 @@
 /.vscode
 /Assets/Samples/*
 /Assets/Samples.meta
-/Packages/*
 /Build/*
 /AssetBundles
 /HybridCLRData

+ 476 - 0
Assets/Editor/AddVuforiaEnginePackage.cs

@@ -0,0 +1,476 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using UnityEditor;
+using UnityEngine;
+
+public class AddVuforiaEnginePackage
+{
+    static readonly string sPackagesPath = Path.Combine(Application.dataPath, "..", "Packages");
+    static readonly string sManifestJsonPath = Path.Combine(sPackagesPath, "manifest.json");
+    const string VUFORIA_VERSION = "10.13.3";
+    const string VUFORIA_TAR_FILE_DIR = "Assets/Editor/Migration/";
+    const string DEPENDENCIES_DIR = "Assets/Resources/VuforiaDependencies";
+    const string PACKAGES_RELATIVE_PATH = "Packages";
+    const string MRTK_PACKAGE = "com.microsoft.mixedreality.toolkit.foundation";
+
+    static readonly ScopedRegistry sVuforiaRegistry = new ScopedRegistry
+    {
+        name = "Vuforia",
+        url = "https://registry.packages.developer.vuforia.com/",
+        scopes = new[] { "com.ptc.vuforia" }
+    };
+
+    static AddVuforiaEnginePackage()
+    {
+        if (Application.isBatchMode)
+            return;
+        
+        var manifest = Manifest.JsonDeserialize(sManifestJsonPath);
+
+        var packages = GetPackageDescriptions();
+            
+        if (!packages.All(p => IsVuforiaUpToDate(manifest, p.BundleId)))
+            DisplayAddPackageDialog(manifest, packages);
+        
+        ResolveDependencies(manifest);
+    }
+
+    public static void ResolveDependenciesSilent()
+    {
+        var manifest = Manifest.JsonDeserialize(sManifestJsonPath);
+        
+        var packages = GetDependencyDescriptions();
+        if (packages != null && packages.Count > 0)
+            MoveDependencies(manifest, packages);
+        
+        CleanupDependenciesFolder();
+    }
+    
+    static void ResolveDependencies(Manifest manifest)
+    {
+        var packages = GetDependencyDescriptions();
+        if (packages != null && packages.Count > 0)
+            DisplayDependenciesDialog(manifest, packages);
+    }
+    
+    static bool IsVuforiaUpToDate(Manifest manifest, string bundleId)
+    {
+        var dependencies = manifest.Dependencies.Split(',').ToList();
+        var upToDate = false;
+
+        if(dependencies.Any(d => d.Contains(bundleId) && d.Contains("file:")))
+            upToDate = IsUsingRightFileVersion(manifest, bundleId);
+
+        return upToDate;
+    }
+    
+    static bool IsUsingRightFileVersion(Manifest manifest, string bundleId)
+    {
+        var dependencies = manifest.Dependencies.Split(',').ToList();
+        return dependencies.Any(d => d.Contains(bundleId) && d.Contains("file:") && VersionNumberIsTheLatestTarball(d));
+    }
+
+    static bool VersionNumberIsTheLatestTarball(string package)
+    {
+        var version = package.Split('-');
+        if (version.Length >= 2)
+        {
+            version[1] = version[1].TrimEnd(".tgz\"".ToCharArray());
+            return IsCurrentVersionHigher(version[1]);
+        }
+
+        return false;
+    }
+
+    static bool IsCurrentVersionHigher(string currentVersionString)
+    {
+        if (string.IsNullOrEmpty(currentVersionString) || string.IsNullOrEmpty(VUFORIA_VERSION))
+            return false;
+
+        var currentVersion = TryConvertStringToVersion(currentVersionString);
+        var updatingVersion = TryConvertStringToVersion(VUFORIA_VERSION);
+        
+        if (currentVersion >= updatingVersion)
+            return true;
+
+        return false;
+    }
+
+    static Version TryConvertStringToVersion(string versionString)
+    {
+        Version res;
+        try
+        {
+            res = new Version(versionString);
+        }
+        catch (Exception)
+        {
+            return new Version();
+        }
+
+        return new Version(res.Major, res.Minor, res.Build);
+    }
+
+    static void DisplayAddPackageDialog(Manifest manifest, IEnumerable<PackageDescription> packages)
+    {
+        if (EditorUtility.DisplayDialog("Add Vuforia Engine Package",
+            $"Would you like to update your project to include the Vuforia Engine {VUFORIA_VERSION} package from the unitypackage?\n" +
+            $"If an older Vuforia Engine package is already present in your project it will be upgraded to version {VUFORIA_VERSION}\n\n",
+            "Update", "Cancel"))
+        {
+            foreach (var package in packages)
+            {
+                MovePackageFile(VUFORIA_TAR_FILE_DIR, package.FileName);
+                UpdateManifest(manifest, package.BundleId, package.FileName);
+            }
+        }
+    }
+    
+    static void DisplayDependenciesDialog(Manifest manifest, IEnumerable<PackageDescription> packages)
+    {
+        if (EditorUtility.DisplayDialog("Add Sample Dependencies",
+                                        "Would you like to update your project to include all of its dependencies?\n" +
+                                        "If a different version of the package is already present, it will be deleted.\n\n",
+                                        "Update", "Cancel"))
+        {
+            MoveDependencies(manifest, packages);
+            CleanupDependenciesFolder();
+            if (ShouldProjectRestart(packages))
+                DisplayRestartDialog();
+        }
+    }
+
+    static void DisplayRestartDialog()
+    {
+        if (EditorUtility.DisplayDialog("Restart Unity Editor",
+                                        "Due to a Unity lifecycle issue, this project needs to be closed and re-opened " +
+                                        "after importing this Vuforia Engine sample.\n\n",
+                                        "Restart", "Cancel"))
+        {
+            RestartEditor();
+        }
+    }
+
+    static List<PackageDescription> GetPackageDescriptions()
+    {
+        var tarFilePaths = Directory.GetFiles(Path.Combine(Directory.GetCurrentDirectory(), VUFORIA_TAR_FILE_DIR)).Where(f => f.EndsWith(".tgz"));
+
+        // Define a regular expression for repeated words.
+        var rx = new Regex(@"(([a-z]+)(\.[a-z]+)*)\-((\d+)\.(\d+)\.(\d+))", RegexOptions.Compiled | RegexOptions.IgnoreCase);
+
+        var packageDescriptions = new List<PackageDescription>();
+
+        foreach (var filePath in tarFilePaths)
+        {
+            var fileName = Path.GetFileName(filePath);
+            // Find matches.
+            var matches = rx.Matches(fileName);
+
+            // Report on each match.
+            foreach (Match match in matches)
+            {
+                var groups = match.Groups;
+                var bundleId = groups[1].Value;
+                var versionString = groups[4].Value;
+
+                if (string.Equals(versionString, VUFORIA_VERSION))
+                {
+                    packageDescriptions.Add(new PackageDescription()
+                    {
+                        BundleId = bundleId,
+                        FileName = fileName
+                    });
+                }
+            }
+        }
+
+        return packageDescriptions;
+    }
+    
+    static List<PackageDescription> GetDependencyDescriptions()
+    {
+        var dependencyDirectory = Path.Combine(Directory.GetCurrentDirectory(), DEPENDENCIES_DIR);
+        if (!Directory.Exists(dependencyDirectory))
+            return null;
+        var tarFilePaths = Directory.GetFiles(dependencyDirectory).Where(f => f.EndsWith(".tgz"));
+
+        // Define a regular expression for repeated words.
+        var rx = new Regex(@"(([a-z]+)(\.[a-z]+)+)(\-((\d+)\.(\d+)\.(\d+)))*", RegexOptions.Compiled | RegexOptions.IgnoreCase);
+
+        var packageDescriptions = new List<PackageDescription>();
+
+        foreach (var filePath in tarFilePaths)
+        {
+            var fileName = Path.GetFileName(filePath);
+            // Find matches.
+            var matches = rx.Matches(fileName);
+
+            // Report on each match.
+            foreach (Match match in matches)
+            {
+                var groups = match.Groups;
+                var bundleId = groups[1].Value;
+                bundleId = bundleId.Replace(".tgz", "");
+
+                packageDescriptions.Add(new PackageDescription
+                                        {
+                                            BundleId = bundleId,
+                                            FileName = fileName
+                                        });
+            }
+        }
+
+        return packageDescriptions;
+    }
+
+    static void MoveDependencies(Manifest manifest, IEnumerable<PackageDescription> packages)
+    {
+        foreach (var package in packages)
+        {
+            RemoveDependency(manifest, package.BundleId, package.FileName);
+            MovePackageFile(DEPENDENCIES_DIR, package.FileName);
+            UpdateManifest(manifest, package.BundleId, package.FileName);
+        }
+    }
+    
+    static void MovePackageFile(string folder, string fileName)
+    {
+        var sourceFile = Path.Combine(Directory.GetCurrentDirectory(), folder, fileName);
+        var destFile = Path.Combine(Directory.GetCurrentDirectory(), PACKAGES_RELATIVE_PATH, fileName);
+        File.Copy(sourceFile, destFile, true);
+        File.Delete(sourceFile);
+        File.Delete(sourceFile + ".meta");
+    }
+
+    static void UpdateManifest(Manifest manifest, string bundleId, string fileName)
+    {
+        //remove existing, outdated NPM scoped registry if present
+        var registries = manifest.ScopedRegistries.ToList();
+        if (registries.Contains(sVuforiaRegistry))
+        {
+            registries.Remove(sVuforiaRegistry);
+            manifest.ScopedRegistries = registries.ToArray();
+        }
+
+        //add specified vuforia version via Git URL
+        SetVuforiaVersion(manifest, bundleId, fileName);
+
+        manifest.JsonSerialize(sManifestJsonPath);
+
+        AssetDatabase.Refresh();
+    }
+
+    static void RemoveDependency(Manifest manifest, string bundleId, string fileName)
+    {
+        var destFile = Path.Combine(Directory.GetCurrentDirectory(), PACKAGES_RELATIVE_PATH, fileName);
+        if (File.Exists(destFile))
+            File.Delete(destFile);
+        
+        // remove existing
+        var dependencies = manifest.Dependencies.Split(',').ToList();
+        for (var i = 0; i < dependencies.Count; i++)
+        {
+            if (dependencies[i].Contains(bundleId))
+            {
+                dependencies.RemoveAt(i);
+                break;
+            }
+        }
+
+        manifest.Dependencies = string.Join(",", dependencies);
+
+        manifest.JsonSerialize(sManifestJsonPath);
+
+        AssetDatabase.Refresh();
+    }
+
+    static void CleanupDependenciesFolder()
+    {
+        if (!Directory.Exists(DEPENDENCIES_DIR)) 
+            return;
+        
+        Directory.Delete(DEPENDENCIES_DIR);
+        File.Delete(DEPENDENCIES_DIR + ".meta");
+        AssetDatabase.Refresh();
+    }
+
+    static bool ShouldProjectRestart(IEnumerable<PackageDescription> packages)
+    {
+        return packages.Any(p => p.BundleId == MRTK_PACKAGE);
+    }
+
+    static void RestartEditor()
+    {
+        EditorApplication.OpenProject(Directory.GetCurrentDirectory());
+    }
+
+    static void SetVuforiaVersion(Manifest manifest, string bundleId, string fileName)
+    {
+        var dependencies = manifest.Dependencies.Split(',').ToList();
+
+        var versionEntry = $"\"file:{fileName}\"";
+        var versionSet = false;
+        for (var i = 0; i < dependencies.Count; i++)
+        {
+            if (!dependencies[i].Contains(bundleId))
+                continue;
+
+            var kvp = dependencies[i].Split(':');
+            dependencies[i] = kvp[0] + ": " + versionEntry;
+            versionSet = true;
+        }
+
+        if (!versionSet)
+            dependencies.Insert(0, $"\n    \"{bundleId}\": {versionEntry}");
+
+        manifest.Dependencies = string.Join(",", dependencies);
+    }
+
+    class Manifest
+    {
+        const int INDEX_NOT_FOUND = -1;
+        const string DEPENDENCIES_KEY = "\"dependencies\"";
+
+        public ScopedRegistry[] ScopedRegistries;
+        public string Dependencies;
+
+        public void JsonSerialize(string path)
+        {
+            var jsonString = GetJsonString();
+
+            var startIndex = GetDependenciesStart(jsonString);
+            var endIndex = GetDependenciesEnd(jsonString, startIndex);
+
+            var stringBuilder = new StringBuilder();
+
+            stringBuilder.Append(jsonString.Substring(0, startIndex));
+            stringBuilder.Append(Dependencies);
+            stringBuilder.Append(jsonString.Substring(endIndex, jsonString.Length - endIndex));
+
+            File.WriteAllText(path, stringBuilder.ToString());
+        }
+
+        string GetJsonString()
+        {
+            if (ScopedRegistries.Length > 0)
+                return JsonUtility.ToJson(
+                    new UnitySerializableManifest { scopedRegistries = ScopedRegistries, dependencies = new DependencyPlaceholder() },
+                    true);
+
+            return JsonUtility.ToJson(
+                new UnitySerializableManifestDependenciesOnly() { dependencies = new DependencyPlaceholder() },
+                true);
+        }
+
+
+        public static Manifest JsonDeserialize(string path)
+        {
+            var jsonString = File.ReadAllText(path);
+
+            var registries = JsonUtility.FromJson<UnitySerializableManifest>(jsonString).scopedRegistries ?? new ScopedRegistry[0];
+            var dependencies = DeserializeDependencies(jsonString);
+
+            return new Manifest { ScopedRegistries = registries, Dependencies = dependencies };
+        }
+
+        static string DeserializeDependencies(string json)
+        {
+            var startIndex = GetDependenciesStart(json);
+            var endIndex = GetDependenciesEnd(json, startIndex);
+
+            if (startIndex == INDEX_NOT_FOUND || endIndex == INDEX_NOT_FOUND)
+                return null;
+
+            var dependencies = json.Substring(startIndex, endIndex - startIndex);
+            return dependencies;
+        }
+
+        static int GetDependenciesStart(string json)
+        {
+            var dependenciesIndex = json.IndexOf(DEPENDENCIES_KEY, StringComparison.InvariantCulture);
+            if (dependenciesIndex == INDEX_NOT_FOUND)
+                return INDEX_NOT_FOUND;
+
+            var dependenciesStartIndex = json.IndexOf('{', dependenciesIndex + DEPENDENCIES_KEY.Length);
+
+            if (dependenciesStartIndex == INDEX_NOT_FOUND)
+                return INDEX_NOT_FOUND;
+
+            dependenciesStartIndex++; //add length of '{' to starting point
+
+            return dependenciesStartIndex;
+        }
+
+        static int GetDependenciesEnd(string jsonString, int dependenciesStartIndex)
+        {
+            return jsonString.IndexOf('}', dependenciesStartIndex);
+        }
+    }
+
+    class UnitySerializableManifestDependenciesOnly
+    {
+        public DependencyPlaceholder dependencies;
+    }
+
+    class UnitySerializableManifest
+    {
+        public ScopedRegistry[] scopedRegistries;
+        public DependencyPlaceholder dependencies;
+    }
+
+    [Serializable]
+    struct ScopedRegistry
+    {
+        public string name;
+        public string url;
+        public string[] scopes;
+
+        public override bool Equals(object obj)
+        {
+            if (!(obj is ScopedRegistry))
+                return false;
+
+            var other = (ScopedRegistry)obj;
+
+            return name == other.name &&
+                   url == other.url &&
+                   scopes.SequenceEqual(other.scopes);
+        }
+
+        public static bool operator ==(ScopedRegistry a, ScopedRegistry b)
+        {
+            return a.Equals(b);
+        }
+
+        public static bool operator !=(ScopedRegistry a, ScopedRegistry b)
+        {
+            return !a.Equals(b);
+        }
+
+        public override int GetHashCode()
+        {
+            var hash = 17;
+
+            foreach (var scope in scopes)
+                hash = hash * 23 + (scope == null ? 0 : scope.GetHashCode());
+
+            hash = hash * 23 + (name == null ? 0 : name.GetHashCode());
+            hash = hash * 23 + (url == null ? 0 : url.GetHashCode());
+
+            return hash;
+        }
+    }
+
+    [Serializable]
+    struct DependencyPlaceholder { }
+    
+    struct PackageDescription
+    {
+        public string BundleId;
+        public string FileName;
+    }
+}

+ 11 - 0
Assets/Editor/AddVuforiaEnginePackage.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3bbef22eb814a9647b6c1f03e99d95da
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Packages/com.ptc.vuforia.engine-10.15.4.tgz


BIN
Packages/jh.xr.engine/Runtime/SDK/Common/StandardAssets/Models/Cursors/Cursor_Focusblack.fbm/eyemap.jpg


BIN
Packages/jh.xr.engine/Runtime/SDK/Examples/StandardAssets/Models/model_1.1/block_wood.fbm/fangkai.png


BIN
Packages/jh.xr.engine/Runtime/SDK/Examples/StandardAssets/Models/model_1.1/polyfly.fbm/polyflyVRay 完成贴图.png


BIN
Packages/jh.xr.engine/Runtime/SDK/Examples/StandardAssets/Models/model_1.1/polyqo.fbm/polyqo.png


BIN
Packages/jh.xr.engine/Runtime/SDK/Modules/Module_InputSystem/InputDeviceKS/Resources/Model/SObinLowXY.fbm/texmap.png


+ 57 - 0
Packages/manifest.json

@@ -0,0 +1,57 @@
+{
+  "dependencies": {
+    "com.code-philosophy.hybridclr": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/HYBRIDCLR.git",
+    "com.ghz.avideoplayer": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/VideoPlayerXR.git#EasyMovieTexture",
+    "com.ghz.mqtt": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/GHZMQTTXR.git",
+    "com.ptc.vuforia.engine": "file:com.ptc.vuforia.engine-10.15.4.tgz",
+    "com.unity.assetbundlebrowser": "1.7.0",
+    "com.unity.feature.development": "1.0.1",
+    "com.unity.ide.rider": "3.0.18",
+    "com.unity.ide.visualstudio": "2.0.17",
+    "com.unity.ide.vscode": "1.2.5",
+    "com.unity.test-framework": "1.1.33",
+    "com.unity.textmeshpro": "3.0.6",
+    "com.unity.timeline": "1.6.4",
+    "com.unity.ugui": "1.0.0",
+    "com.unity.visualscripting": "1.7.8",
+    "com.unity.xr.arcore": "4.2.7",
+    "com.unity.xr.arfoundation": "4.2.7",
+    "com.unity.xr.arkit-face-tracking": "4.2.7",
+    "com.unity.xr.interactionsubsystems": "1.0.1",
+    "com.unity.xr.openxr": "1.5.3",
+    "jh.immersalsdk.engine": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/ImmersalSDK.git#ImmersalSDK_Nreal",
+    "jh.trilib.engine": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/TriLibXR.git",
+    "jh.xr.engine": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/GHZSDKXR.git#XRSDK_Nreal",
+    "com.unity.modules.ai": "1.0.0",
+    "com.unity.modules.androidjni": "1.0.0",
+    "com.unity.modules.animation": "1.0.0",
+    "com.unity.modules.assetbundle": "1.0.0",
+    "com.unity.modules.audio": "1.0.0",
+    "com.unity.modules.cloth": "1.0.0",
+    "com.unity.modules.director": "1.0.0",
+    "com.unity.modules.imageconversion": "1.0.0",
+    "com.unity.modules.imgui": "1.0.0",
+    "com.unity.modules.jsonserialize": "1.0.0",
+    "com.unity.modules.particlesystem": "1.0.0",
+    "com.unity.modules.physics": "1.0.0",
+    "com.unity.modules.physics2d": "1.0.0",
+    "com.unity.modules.screencapture": "1.0.0",
+    "com.unity.modules.terrain": "1.0.0",
+    "com.unity.modules.terrainphysics": "1.0.0",
+    "com.unity.modules.tilemap": "1.0.0",
+    "com.unity.modules.ui": "1.0.0",
+    "com.unity.modules.uielements": "1.0.0",
+    "com.unity.modules.umbra": "1.0.0",
+    "com.unity.modules.unityanalytics": "1.0.0",
+    "com.unity.modules.unitywebrequest": "1.0.0",
+    "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
+    "com.unity.modules.unitywebrequestaudio": "1.0.0",
+    "com.unity.modules.unitywebrequesttexture": "1.0.0",
+    "com.unity.modules.unitywebrequestwww": "1.0.0",
+    "com.unity.modules.vehicles": "1.0.0",
+    "com.unity.modules.video": "1.0.0",
+    "com.unity.modules.vr": "1.0.0",
+    "com.unity.modules.wind": "1.0.0",
+    "com.unity.modules.xr": "1.0.0"
+  }
+}

+ 566 - 0
Packages/packages-lock.json

@@ -0,0 +1,566 @@
+{
+  "dependencies": {
+    "com.code-philosophy.hybridclr": {
+      "version": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/HYBRIDCLR.git",
+      "depth": 0,
+      "source": "git",
+      "dependencies": {},
+      "hash": "a774bfd53315a737da668dd15702e2e8b53d8fcf"
+    },
+    "com.ghz.avideoplayer": {
+      "version": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/VideoPlayerXR.git#EasyMovieTexture",
+      "depth": 0,
+      "source": "git",
+      "dependencies": {},
+      "hash": "02ea5ea09b44c45961603ef9031dfbd29ef316eb"
+    },
+    "com.ghz.mqtt": {
+      "version": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/GHZMQTTXR.git",
+      "depth": 0,
+      "source": "git",
+      "dependencies": {},
+      "hash": "b4ced428663806195240117e0b069ad1891c9f53"
+    },
+    "com.ptc.vuforia.engine": {
+      "version": "file:com.ptc.vuforia.engine-10.15.4.tgz",
+      "depth": 0,
+      "source": "local-tarball",
+      "dependencies": {
+        "com.unity.ugui": "1.0.0"
+      }
+    },
+    "com.unity.assetbundlebrowser": {
+      "version": "1.7.0",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {},
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.editorcoroutines": {
+      "version": "1.0.0",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {},
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.ext.nunit": {
+      "version": "1.0.6",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {},
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.feature.development": {
+      "version": "1.0.1",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.ide.visualstudio": "2.0.16",
+        "com.unity.ide.rider": "3.0.16",
+        "com.unity.ide.vscode": "1.2.5",
+        "com.unity.editorcoroutines": "1.0.0",
+        "com.unity.performance.profile-analyzer": "1.1.1",
+        "com.unity.test-framework": "1.1.31",
+        "com.unity.testtools.codecoverage": "1.2.2"
+      }
+    },
+    "com.unity.ide.rider": {
+      "version": "3.0.18",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.ext.nunit": "1.0.6"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.ide.visualstudio": {
+      "version": "2.0.17",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.test-framework": "1.1.9"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.ide.vscode": {
+      "version": "1.2.5",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {},
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.inputsystem": {
+      "version": "1.4.4",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.modules.uielements": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.performance.profile-analyzer": {
+      "version": "1.1.1",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {},
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.settings-manager": {
+      "version": "1.0.3",
+      "depth": 2,
+      "source": "registry",
+      "dependencies": {},
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.subsystemregistration": {
+      "version": "1.1.0",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.modules.subsystems": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.test-framework": {
+      "version": "1.1.33",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.ext.nunit": "1.0.6",
+        "com.unity.modules.imgui": "1.0.0",
+        "com.unity.modules.jsonserialize": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.testtools.codecoverage": {
+      "version": "1.2.2",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.test-framework": "1.0.16",
+        "com.unity.settings-manager": "1.0.1"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.textmeshpro": {
+      "version": "3.0.6",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.ugui": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.timeline": {
+      "version": "1.6.4",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.modules.director": "1.0.0",
+        "com.unity.modules.animation": "1.0.0",
+        "com.unity.modules.audio": "1.0.0",
+        "com.unity.modules.particlesystem": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.ugui": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.ui": "1.0.0",
+        "com.unity.modules.imgui": "1.0.0"
+      }
+    },
+    "com.unity.visualscripting": {
+      "version": "1.7.8",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.ugui": "1.0.0",
+        "com.unity.modules.jsonserialize": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.arcore": {
+      "version": "4.2.7",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.xr.arsubsystems": "4.2.7",
+        "com.unity.xr.management": "4.0.1",
+        "com.unity.modules.androidjni": "1.0.0",
+        "com.unity.modules.unitywebrequest": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.arfoundation": {
+      "version": "4.2.7",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.xr.arsubsystems": "4.2.7",
+        "com.unity.xr.management": "4.0.1",
+        "com.unity.modules.particlesystem": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.arkit": {
+      "version": "4.2.7",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.editorcoroutines": "1.0.0",
+        "com.unity.xr.arsubsystems": "4.2.7",
+        "com.unity.xr.management": "4.0.1"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.arkit-face-tracking": {
+      "version": "4.2.7",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.xr.arkit": "4.2.7",
+        "com.unity.xr.arsubsystems": "4.2.7"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.arsubsystems": {
+      "version": "4.2.7",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.subsystemregistration": "1.1.0",
+        "com.unity.xr.management": "4.0.1"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.interactionsubsystems": {
+      "version": "1.0.1",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.subsystemregistration": "1.0.5"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.legacyinputhelpers": {
+      "version": "2.1.10",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.modules.vr": "1.0.0",
+        "com.unity.modules.xr": "1.0.0"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.management": {
+      "version": "4.2.0",
+      "depth": 1,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.modules.subsystems": "1.0.0",
+        "com.unity.modules.vr": "1.0.0",
+        "com.unity.modules.xr": "1.0.0",
+        "com.unity.xr.legacyinputhelpers": "2.1.7",
+        "com.unity.subsystemregistration": "1.0.6"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "com.unity.xr.openxr": {
+      "version": "1.5.3",
+      "depth": 0,
+      "source": "registry",
+      "dependencies": {
+        "com.unity.xr.management": "4.0.1",
+        "com.unity.xr.legacyinputhelpers": "2.1.2",
+        "com.unity.inputsystem": "1.4.2"
+      },
+      "url": "https://packages.unity.com"
+    },
+    "jh.immersalsdk.engine": {
+      "version": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/ImmersalSDK.git#ImmersalSDK_Nreal",
+      "depth": 0,
+      "source": "git",
+      "dependencies": {
+        "com.unity.xr.management": "4.0.1",
+        "com.unity.xr.legacyinputhelpers": "2.1.2",
+        "com.unity.inputsystem": "1.4.2"
+      },
+      "hash": "12e268d7733ff732984a15a792f2bd2dc666915a"
+    },
+    "jh.trilib.engine": {
+      "version": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/TriLibXR.git",
+      "depth": 0,
+      "source": "git",
+      "dependencies": {},
+      "hash": "c5c738ff16760f354d638d62cda2206176c2ba75"
+    },
+    "jh.xr.engine": {
+      "version": "ssh://git@gogs.ghz-tech.com:30979/GHzGlass/GHZSDKXR.git#XRSDK_Nreal",
+      "depth": 0,
+      "source": "git",
+      "dependencies": {
+        "com.unity.xr.management": "4.0.1",
+        "com.unity.xr.legacyinputhelpers": "2.1.2",
+        "com.unity.inputsystem": "1.4.2"
+      },
+      "hash": "3fea32e6b476d1263feb964f80debcfa5e4a32e1"
+    },
+    "com.unity.modules.ai": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.androidjni": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.animation": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.assetbundle": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.audio": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.cloth": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.physics": "1.0.0"
+      }
+    },
+    "com.unity.modules.director": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.audio": "1.0.0",
+        "com.unity.modules.animation": "1.0.0"
+      }
+    },
+    "com.unity.modules.imageconversion": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.imgui": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.jsonserialize": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.particlesystem": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.physics": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.physics2d": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.screencapture": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.imageconversion": "1.0.0"
+      }
+    },
+    "com.unity.modules.subsystems": {
+      "version": "1.0.0",
+      "depth": 1,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.jsonserialize": "1.0.0"
+      }
+    },
+    "com.unity.modules.terrain": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.terrainphysics": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.physics": "1.0.0",
+        "com.unity.modules.terrain": "1.0.0"
+      }
+    },
+    "com.unity.modules.tilemap": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.physics2d": "1.0.0"
+      }
+    },
+    "com.unity.modules.ui": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.uielements": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.ui": "1.0.0",
+        "com.unity.modules.imgui": "1.0.0",
+        "com.unity.modules.jsonserialize": "1.0.0",
+        "com.unity.modules.uielementsnative": "1.0.0"
+      }
+    },
+    "com.unity.modules.uielementsnative": {
+      "version": "1.0.0",
+      "depth": 1,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.ui": "1.0.0",
+        "com.unity.modules.imgui": "1.0.0",
+        "com.unity.modules.jsonserialize": "1.0.0"
+      }
+    },
+    "com.unity.modules.umbra": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.unityanalytics": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.unitywebrequest": "1.0.0",
+        "com.unity.modules.jsonserialize": "1.0.0"
+      }
+    },
+    "com.unity.modules.unitywebrequest": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.unitywebrequestassetbundle": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.assetbundle": "1.0.0",
+        "com.unity.modules.unitywebrequest": "1.0.0"
+      }
+    },
+    "com.unity.modules.unitywebrequestaudio": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.unitywebrequest": "1.0.0",
+        "com.unity.modules.audio": "1.0.0"
+      }
+    },
+    "com.unity.modules.unitywebrequesttexture": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.unitywebrequest": "1.0.0",
+        "com.unity.modules.imageconversion": "1.0.0"
+      }
+    },
+    "com.unity.modules.unitywebrequestwww": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.unitywebrequest": "1.0.0",
+        "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
+        "com.unity.modules.unitywebrequestaudio": "1.0.0",
+        "com.unity.modules.audio": "1.0.0",
+        "com.unity.modules.assetbundle": "1.0.0",
+        "com.unity.modules.imageconversion": "1.0.0"
+      }
+    },
+    "com.unity.modules.vehicles": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.physics": "1.0.0"
+      }
+    },
+    "com.unity.modules.video": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.audio": "1.0.0",
+        "com.unity.modules.ui": "1.0.0",
+        "com.unity.modules.unitywebrequest": "1.0.0"
+      }
+    },
+    "com.unity.modules.vr": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.jsonserialize": "1.0.0",
+        "com.unity.modules.physics": "1.0.0",
+        "com.unity.modules.xr": "1.0.0"
+      }
+    },
+    "com.unity.modules.wind": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {}
+    },
+    "com.unity.modules.xr": {
+      "version": "1.0.0",
+      "depth": 0,
+      "source": "builtin",
+      "dependencies": {
+        "com.unity.modules.physics": "1.0.0",
+        "com.unity.modules.jsonserialize": "1.0.0",
+        "com.unity.modules.subsystems": "1.0.0"
+      }
+    }
+  }
+}