From a92b1c12b1bf2185af47e6b3a8cdfda21c22fe1f Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Fri, 17 Jul 2026 12:55:42 +0200 Subject: [PATCH 01/10] Add logic to use EntityIds instead of instance IDs in 6.4 and newer Older versions still use instance IDs. --- Source/Runtime/ConfigureReinterop.cs | 3 +-- Source/Runtime/Helpers.cs | 18 ++++++++++++++ native~/src/Runtime/CesiumMetadataImpl.cpp | 13 ++++++---- native~/src/Runtime/CesiumMetadataImpl.h | 6 ++--- .../Runtime/UnityPrepareRendererResources.cpp | 24 ++++++++++--------- 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/Source/Runtime/ConfigureReinterop.cs b/Source/Runtime/ConfigureReinterop.cs index 8146391f..119130c3 100644 --- a/Source/Runtime/ConfigureReinterop.cs +++ b/Source/Runtime/ConfigureReinterop.cs @@ -142,7 +142,6 @@ public void ExposeToCPP() mesh.SetIndices(new NativeArray(), MeshTopology.Triangles, 0, true, 0); mesh.RecalculateBounds(); int vertexCount = mesh.vertexCount; - int instanceID = mesh.GetInstanceID(); Vector3[] vertices = mesh.vertices; Vector3 vertex = vertices[0]; @@ -521,7 +520,7 @@ public void ExposeToCPP() Mesh.ApplyAndDisposeWritableMeshData(meshDataArray, meshes, MeshUpdateFlags.Default); - Physics.BakeMesh(mesh.GetInstanceID(), false); + Helpers.BakeMeshFromId(Helpers.GetObjectId(mesh)); CesiumCreditComponent creditComponent = new CesiumCreditComponent("text", "link", -1); List creditComponents = new List(); diff --git a/Source/Runtime/Helpers.cs b/Source/Runtime/Helpers.cs index e2ef4540..5ded15c0 100644 --- a/Source/Runtime/Helpers.cs +++ b/Source/Runtime/Helpers.cs @@ -209,5 +209,23 @@ public static double Mod(double m, double n) } return ((m % n) + n) % n; } + + public static ulong GetObjectId(UnityEngine.Object o) + { +#if UNITY_6000_4_OR_NEWER + return EntityId.ToULong(o.GetEntityId()); +#else + return (ulong)o.GetInstanceID(); +#endif + } + + public static void BakeMeshFromId(ulong id) + { +#if UNITY_6000_4_OR_NEWER + Physics.BakeMesh(EntityId.FromULong(id), false); +#else + Physics.BakeMesh((int)id, false); +#endif + } } } diff --git a/native~/src/Runtime/CesiumMetadataImpl.cpp b/native~/src/Runtime/CesiumMetadataImpl.cpp index 76ef23e1..2ac5274f 100644 --- a/native~/src/Runtime/CesiumMetadataImpl.cpp +++ b/native~/src/Runtime/CesiumMetadataImpl.cpp @@ -9,9 +9,11 @@ #include #include +#include #include #include #include +#include #include using namespace DotNet; @@ -58,14 +60,14 @@ CesiumMetadataImpl::CesiumMetadataImpl( CesiumMetadataImpl::~CesiumMetadataImpl() {} void CesiumMetadataImpl::addMetadata( - int32_t instanceID, + uint64_t objectId, const CesiumGltf::Model* pModel, const CesiumGltf::MeshPrimitive* pPrimitive) { - this->_pModels.insert({instanceID, {pModel, pPrimitive}}); + this->_pModels.insert({objectId, {pModel, pPrimitive}}); } -void CesiumMetadataImpl::removeMetadata(int32_t instanceID) { - auto find = this->_pModels.find(instanceID); +void CesiumMetadataImpl::removeMetadata(uint64_t objectId) { + auto find = this->_pModels.find(objectId); if (find != this->_pModels.end()) { this->_pModels.erase(find); } @@ -78,7 +80,8 @@ CesiumForUnityNative::CesiumMetadataImpl::GetFeatures( const DotNet::CesiumForUnity::CesiumMetadata& metadata, const DotNet::UnityEngine::Transform& transform, int triangleIndex) { - auto find = this->_pModels.find(transform.GetInstanceID()); + auto find = + this->_pModels.find(CesiumForUnity::Helpers::GetObjectId(transform)); if (find == this->_pModels.end()) { return DotNet::System::Array1(0); } diff --git a/native~/src/Runtime/CesiumMetadataImpl.h b/native~/src/Runtime/CesiumMetadataImpl.h index a08b7f4b..09adf23a 100644 --- a/native~/src/Runtime/CesiumMetadataImpl.h +++ b/native~/src/Runtime/CesiumMetadataImpl.h @@ -29,11 +29,11 @@ class CesiumMetadataImpl : public CesiumImpl { ~CesiumMetadataImpl(); void addMetadata( - int32_t instanceID, + uint64_t objectId, const CesiumGltf::Model* pModel, const CesiumGltf::MeshPrimitive* pPrimitive); - void removeMetadata(int32_t instanceID); + void removeMetadata(uint64_t objectId); DotNet::System::Array1 GetFeatures( const DotNet::CesiumForUnity::CesiumMetadata& metadata, @@ -42,7 +42,7 @@ class CesiumMetadataImpl : public CesiumImpl { private: std::unordered_map< - int32_t, + uint64_t, std::pair> _pModels; }; diff --git a/native~/src/Runtime/UnityPrepareRendererResources.cpp b/native~/src/Runtime/UnityPrepareRendererResources.cpp index 38d78ca7..e296f550 100644 --- a/native~/src/Runtime/UnityPrepareRendererResources.cpp +++ b/native~/src/Runtime/UnityPrepareRendererResources.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -55,7 +56,6 @@ #include #include #include -#include #include #include #include @@ -992,9 +992,9 @@ UnityPrepareRendererResources::prepareInLoadThread( if (shouldCreatePhysicsMeshes) { // Baking physics meshes takes awhile, so do that in a // worker thread. - const std::int32_t len = meshes.Length(); - std::vector instanceIDs; - for (int32_t i = 0; i < len; ++i) { + const std::uint64_t len = meshes.Length(); + std::vector objectIds; + for (uint64_t i = 0; i < len; ++i) { // Don't attempt to bake a physics mesh from points, lines, or // an invalid triangle mesh. switch (primitiveInfos[i].mode) { @@ -1007,10 +1007,11 @@ UnityPrepareRendererResources::prepareInLoadThread( } } - instanceIDs.push_back(meshes[i].GetInstanceID()); + objectIds.push_back( + CesiumForUnity::Helpers::GetObjectId(meshes[i])); } - if (instanceIDs.size() > 0) { + if (objectIds.size() > 0) { #ifndef __EMSCRIPTEN__ return asyncSystem.runInWorkerThread( #else @@ -1018,10 +1019,10 @@ UnityPrepareRendererResources::prepareInLoadThread( return asyncSystem.runInMainThread( #endif [workerResult = std::move(workerResult), - instanceIDs = std::move(instanceIDs), + objectIds = std::move(objectIds), meshes = std::move(meshes)]() mutable { - for (std::int32_t instanceID : instanceIDs) { - UnityEngine::Physics::BakeMesh(instanceID, false); + for (std::uint64_t objectID : objectIds) { + CesiumForUnity::Helpers::BakeMeshFromId(objectID); } LoadThreadResult* pResult = new LoadThreadResult{ @@ -1628,7 +1629,8 @@ void* UnityPrepareRendererResources::prepareInMainThread( // For backwards compatibility. if (metadataComponent != nullptr) { metadataComponent.NativeImplementation().addMetadata( - primitiveGameObject.transform().GetInstanceID(), + CesiumForUnity::Helpers::GetObjectId( + primitiveGameObject.transform()), &gltf, &primitive); } else { @@ -1680,7 +1682,7 @@ void freePrimitiveGameObject( // Kept for backwards compatibility. if (metadataComponent != nullptr) { metadataComponent.NativeImplementation().removeMetadata( - primitiveGameObject.transform().GetInstanceID()); + CesiumForUnity::Helpers::GetObjectId(primitiveGameObject.transform())); } else { freePrimitiveFeatures(primitiveGameObject); } From 802cefe39b867575614c09d5b69420224359890a Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Fri, 17 Jul 2026 12:57:57 +0200 Subject: [PATCH 02/10] Use templated versions of TreeView, etc. --- Source/Editor/CesiumIonAssetsWindow.cs | 4 ++-- Source/Editor/ConfigureReinteropEditor.cs | 4 ++-- Source/Editor/IonAssetsTreeView.cs | 16 ++++++++-------- native~/src/Editor/IonAssetsTreeViewImpl.h | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Source/Editor/CesiumIonAssetsWindow.cs b/Source/Editor/CesiumIonAssetsWindow.cs index ec3a6818..88fca404 100644 --- a/Source/Editor/CesiumIonAssetsWindow.cs +++ b/Source/Editor/CesiumIonAssetsWindow.cs @@ -29,7 +29,7 @@ public static void ShowWindow() currentWindow.Focus(); } - private TreeViewState _assetsTreeState; + private TreeViewState _assetsTreeState; private IonAssetsTreeView _assetsTreeView; private SearchField _searchField; private CesiumIonServerSelector _serverSelector; @@ -74,7 +74,7 @@ private void OnCurrentServerChanged(CesiumIonServerManager manager) void BuildTreeView() { - this._assetsTreeState = new TreeViewState(); + this._assetsTreeState = new TreeViewState(); this._assetsTreeView = new IonAssetsTreeView(this._assetsTreeState); this._assetsTreeView.Reload(); } diff --git a/Source/Editor/ConfigureReinteropEditor.cs b/Source/Editor/ConfigureReinteropEditor.cs index 016162bc..95f43844 100644 --- a/Source/Editor/ConfigureReinteropEditor.cs +++ b/Source/Editor/ConfigureReinteropEditor.cs @@ -109,10 +109,10 @@ public void ExposeToCPP() string productName = Application.productName; string osVersion = System.Environment.OSVersion.VersionString; - TreeViewItem root = new TreeViewItem(0, -1, "root"); + TreeViewItem root = new TreeViewItem(0, -1, "root"); int id = root.id; - TreeViewState treeState = new TreeViewState(); + TreeViewState treeState = new TreeViewState(); IonAssetsTreeView treeView = new IonAssetsTreeView(treeState); treeView.Reload(); diff --git a/Source/Editor/IonAssetsTreeView.cs b/Source/Editor/IonAssetsTreeView.cs index c893363a..0635b8a7 100644 --- a/Source/Editor/IonAssetsTreeView.cs +++ b/Source/Editor/IonAssetsTreeView.cs @@ -96,11 +96,11 @@ public static string FormatDate(string assetDate) } [ReinteropNativeImplementation("CesiumForUnityNative::IonAssetsTreeViewImpl", "IonAssetsTreeViewImpl.h")] - public partial class IonAssetsTreeView : TreeView + public partial class IonAssetsTreeView : TreeView { private MultiColumnHeaderState _headerState; - public IonAssetsTreeView(TreeViewState assetsTreeState) + public IonAssetsTreeView(TreeViewState assetsTreeState) : base(assetsTreeState) { BuildMultiColumnHeader(); @@ -135,19 +135,19 @@ private void BuildMultiColumnHeader() multiColumnHeader = new IonAssetsMultiColumnHeader(this._headerState, this); } - protected override TreeViewItem BuildRoot() + protected override TreeViewItem BuildRoot() { int rootId = 0; int rootDepth = -1; - return new TreeViewItem(rootId, rootDepth, "Root"); + return new TreeViewItem(rootId, rootDepth, "Root"); } public partial int GetAssetsCount(); - protected override IList BuildRows(TreeViewItem root) + protected override IList> BuildRows(TreeViewItem root) { int count = GetAssetsCount(); - IList rows = new List(); + IList> rows = new List>(); // All items are counted as children of the root item, such that when displayed // they appear in a list. const int itemDepth = 0; @@ -157,7 +157,7 @@ protected override IList BuildRows(TreeViewItem root) // The root of the tree is typically assigned as 0, so all of the ids // have to be offset by 1. Otherwise, the selection behavior of the TreeView // may be inaccurate. - TreeViewItem assetItem = new TreeViewItem(i + 1, itemDepth); + TreeViewItem assetItem = new TreeViewItem(i + 1, itemDepth); rows.Add(assetItem); root.AddChild(assetItem); } @@ -202,7 +202,7 @@ protected override void SearchChanged(string newSearch) this.SetSelection(new List()); } - protected override bool CanMultiSelect(TreeViewItem item) + protected override bool CanMultiSelect(TreeViewItem item) { return false; } diff --git a/native~/src/Editor/IonAssetsTreeViewImpl.h b/native~/src/Editor/IonAssetsTreeViewImpl.h index aa454af4..7f2cc695 100644 --- a/native~/src/Editor/IonAssetsTreeViewImpl.h +++ b/native~/src/Editor/IonAssetsTreeViewImpl.h @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include From 19377044b7252640e263314285f2d4e97955f8b3 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Fri, 17 Jul 2026 13:14:11 +0200 Subject: [PATCH 03/10] Add CHANGES entry --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index e7ae411f..3b56d8dc 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ ##### Additions :tada: - Added support for the Linux platform (x86-64 only). +- Added support for Unity 6.5. ## v1.24.0 - 2026-07-01 From 6a11a5a2bb4391273ed8a98f586c5ebd81b74ccc Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Fri, 17 Jul 2026 17:50:10 +0200 Subject: [PATCH 04/10] Accomodate Unity releases before 6.2 --- Source/Editor/CesiumIonAssetsWindow.cs | 7 ++++++- Source/Editor/ConfigureReinteropEditor.cs | 8 ++++++-- Source/Editor/IonAssetsTreeView.cs | 22 ++++++++++++++-------- native~/src/Editor/IonAssetsTreeViewImpl.h | 1 - 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Source/Editor/CesiumIonAssetsWindow.cs b/Source/Editor/CesiumIonAssetsWindow.cs index 88fca404..6e9a8fa9 100644 --- a/Source/Editor/CesiumIonAssetsWindow.cs +++ b/Source/Editor/CesiumIonAssetsWindow.cs @@ -5,6 +5,11 @@ using UnityEditor; using UnityEditor.IMGUI.Controls; +#if UNITY_6000_2_OR_NEWER +using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; +using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; +#endif + namespace CesiumForUnity { public class CesiumIonAssetsWindow : EditorWindow @@ -29,7 +34,7 @@ public static void ShowWindow() currentWindow.Focus(); } - private TreeViewState _assetsTreeState; + private TreeViewState _assetsTreeState; private IonAssetsTreeView _assetsTreeView; private SearchField _searchField; private CesiumIonServerSelector _serverSelector; diff --git a/Source/Editor/ConfigureReinteropEditor.cs b/Source/Editor/ConfigureReinteropEditor.cs index 95f43844..2f60cd2e 100644 --- a/Source/Editor/ConfigureReinteropEditor.cs +++ b/Source/Editor/ConfigureReinteropEditor.cs @@ -10,6 +10,10 @@ using UnityEngine; using UnityEngine.Networking; +#if UNITY_6000_2_OR_NEWER +using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; +using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; +#endif namespace CesiumForUnity { @@ -109,10 +113,10 @@ public void ExposeToCPP() string productName = Application.productName; string osVersion = System.Environment.OSVersion.VersionString; - TreeViewItem root = new TreeViewItem(0, -1, "root"); + TreeViewItem root = new TreeViewItem(0, -1, "root"); int id = root.id; - TreeViewState treeState = new TreeViewState(); + TreeViewState treeState = new TreeViewState(); IonAssetsTreeView treeView = new IonAssetsTreeView(treeState); treeView.Reload(); diff --git a/Source/Editor/IonAssetsTreeView.cs b/Source/Editor/IonAssetsTreeView.cs index 0635b8a7..48b9df28 100644 --- a/Source/Editor/IonAssetsTreeView.cs +++ b/Source/Editor/IonAssetsTreeView.cs @@ -5,6 +5,12 @@ using UnityEditor.IMGUI.Controls; using UnityEngine; +#if UNITY_6000_2_OR_NEWER +using TreeView = UnityEditor.IMGUI.Controls.TreeView; +using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; +using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; +#endif + namespace CesiumForUnity { public enum IonAssetsColumn @@ -96,11 +102,11 @@ public static string FormatDate(string assetDate) } [ReinteropNativeImplementation("CesiumForUnityNative::IonAssetsTreeViewImpl", "IonAssetsTreeViewImpl.h")] - public partial class IonAssetsTreeView : TreeView + public partial class IonAssetsTreeView : TreeView { private MultiColumnHeaderState _headerState; - public IonAssetsTreeView(TreeViewState assetsTreeState) + public IonAssetsTreeView(TreeViewState assetsTreeState) : base(assetsTreeState) { BuildMultiColumnHeader(); @@ -135,19 +141,19 @@ private void BuildMultiColumnHeader() multiColumnHeader = new IonAssetsMultiColumnHeader(this._headerState, this); } - protected override TreeViewItem BuildRoot() + protected override TreeViewItem BuildRoot() { int rootId = 0; int rootDepth = -1; - return new TreeViewItem(rootId, rootDepth, "Root"); + return new TreeViewItem(rootId, rootDepth, "Root"); } public partial int GetAssetsCount(); - protected override IList> BuildRows(TreeViewItem root) + protected override IList BuildRows(TreeViewItem root) { int count = GetAssetsCount(); - IList> rows = new List>(); + IList rows = new List(); // All items are counted as children of the root item, such that when displayed // they appear in a list. const int itemDepth = 0; @@ -157,7 +163,7 @@ protected override IList> BuildRows(TreeViewItem root) // The root of the tree is typically assigned as 0, so all of the ids // have to be offset by 1. Otherwise, the selection behavior of the TreeView // may be inaccurate. - TreeViewItem assetItem = new TreeViewItem(i + 1, itemDepth); + TreeViewItem assetItem = new TreeViewItem(i + 1, itemDepth); rows.Add(assetItem); root.AddChild(assetItem); } @@ -202,7 +208,7 @@ protected override void SearchChanged(string newSearch) this.SetSelection(new List()); } - protected override bool CanMultiSelect(TreeViewItem item) + protected override bool CanMultiSelect(TreeViewItem item) { return false; } diff --git a/native~/src/Editor/IonAssetsTreeViewImpl.h b/native~/src/Editor/IonAssetsTreeViewImpl.h index 7f2cc695..487c4c37 100644 --- a/native~/src/Editor/IonAssetsTreeViewImpl.h +++ b/native~/src/Editor/IonAssetsTreeViewImpl.h @@ -6,7 +6,6 @@ #include #include -#include #include #include From 2c29c7fa049d8a0861b7acf26936a0e0e9e3e930 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Fri, 17 Jul 2026 18:52:28 +0200 Subject: [PATCH 05/10] Use new TreeView classes in Unity 6.4 newer While some discussion on the Web implies that the generic TreeView classes exist in 6.2, our CI does not agree. --- Source/Editor/CesiumIonAssetsWindow.cs | 2 +- Source/Editor/ConfigureReinteropEditor.cs | 2 +- Source/Editor/IonAssetsTreeView.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Editor/CesiumIonAssetsWindow.cs b/Source/Editor/CesiumIonAssetsWindow.cs index 6e9a8fa9..57bc9405 100644 --- a/Source/Editor/CesiumIonAssetsWindow.cs +++ b/Source/Editor/CesiumIonAssetsWindow.cs @@ -5,7 +5,7 @@ using UnityEditor; using UnityEditor.IMGUI.Controls; -#if UNITY_6000_2_OR_NEWER +#if UNITY_6000_4_OR_NEWER using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; #endif diff --git a/Source/Editor/ConfigureReinteropEditor.cs b/Source/Editor/ConfigureReinteropEditor.cs index 2f60cd2e..70f777e8 100644 --- a/Source/Editor/ConfigureReinteropEditor.cs +++ b/Source/Editor/ConfigureReinteropEditor.cs @@ -10,7 +10,7 @@ using UnityEngine; using UnityEngine.Networking; -#if UNITY_6000_2_OR_NEWER +#if UNITY_6000_4_OR_NEWER using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; #endif diff --git a/Source/Editor/IonAssetsTreeView.cs b/Source/Editor/IonAssetsTreeView.cs index 48b9df28..64c12471 100644 --- a/Source/Editor/IonAssetsTreeView.cs +++ b/Source/Editor/IonAssetsTreeView.cs @@ -5,7 +5,7 @@ using UnityEditor.IMGUI.Controls; using UnityEngine; -#if UNITY_6000_2_OR_NEWER +#if UNITY_6000_4_OR_NEWER using TreeView = UnityEditor.IMGUI.Controls.TreeView; using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; From 384bfa19f743a74bcc66b5304935822e25d6695b Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Fri, 17 Jul 2026 19:14:18 +0200 Subject: [PATCH 06/10] Remove a TreeViewState straggler --- Source/Editor/CesiumIonAssetsWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Editor/CesiumIonAssetsWindow.cs b/Source/Editor/CesiumIonAssetsWindow.cs index 57bc9405..8f531c9d 100644 --- a/Source/Editor/CesiumIonAssetsWindow.cs +++ b/Source/Editor/CesiumIonAssetsWindow.cs @@ -79,7 +79,7 @@ private void OnCurrentServerChanged(CesiumIonServerManager manager) void BuildTreeView() { - this._assetsTreeState = new TreeViewState(); + this._assetsTreeState = new TreeViewState(); this._assetsTreeView = new IonAssetsTreeView(this._assetsTreeState); this._assetsTreeView.Reload(); } From b90a4c497328be8bd952c91154e53cd448883017 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Fri, 17 Jul 2026 23:18:19 +0200 Subject: [PATCH 07/10] Revert "Use new TreeView classes in Unity 6.4 newer" This reverts commit 2c29c7fa049d8a0861b7acf26936a0e0e9e3e930. Try using TreeView generic classes in older versions of Unity. --- Source/Editor/CesiumIonAssetsWindow.cs | 2 +- Source/Editor/ConfigureReinteropEditor.cs | 2 +- Source/Editor/IonAssetsTreeView.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Editor/CesiumIonAssetsWindow.cs b/Source/Editor/CesiumIonAssetsWindow.cs index 8f531c9d..5cc17e63 100644 --- a/Source/Editor/CesiumIonAssetsWindow.cs +++ b/Source/Editor/CesiumIonAssetsWindow.cs @@ -5,7 +5,7 @@ using UnityEditor; using UnityEditor.IMGUI.Controls; -#if UNITY_6000_4_OR_NEWER +#if UNITY_6000_2_OR_NEWER using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; #endif diff --git a/Source/Editor/ConfigureReinteropEditor.cs b/Source/Editor/ConfigureReinteropEditor.cs index 70f777e8..2f60cd2e 100644 --- a/Source/Editor/ConfigureReinteropEditor.cs +++ b/Source/Editor/ConfigureReinteropEditor.cs @@ -10,7 +10,7 @@ using UnityEngine; using UnityEngine.Networking; -#if UNITY_6000_4_OR_NEWER +#if UNITY_6000_2_OR_NEWER using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; #endif diff --git a/Source/Editor/IonAssetsTreeView.cs b/Source/Editor/IonAssetsTreeView.cs index 64c12471..48b9df28 100644 --- a/Source/Editor/IonAssetsTreeView.cs +++ b/Source/Editor/IonAssetsTreeView.cs @@ -5,7 +5,7 @@ using UnityEditor.IMGUI.Controls; using UnityEngine; -#if UNITY_6000_4_OR_NEWER +#if UNITY_6000_2_OR_NEWER using TreeView = UnityEditor.IMGUI.Controls.TreeView; using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; From c8298f6233c8568b230cc2e4a779f8c7bd7d41cb Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Tue, 21 Jul 2026 19:04:01 +0200 Subject: [PATCH 08/10] Change CHANGES.md to reflect Unity 6.5 reality --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 3b56d8dc..8c070e57 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,7 +5,7 @@ ##### Additions :tada: - Added support for the Linux platform (x86-64 only). -- Added support for Unity 6.5. +- Added support for building the package from source in Unity 6.5. ## v1.24.0 - 2026-07-01 From ec63617d4d3bfc5c4b7c0d9eded64a62a62ff135 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Thu, 23 Jul 2026 17:40:38 +0200 Subject: [PATCH 09/10] Use CesiumTreeViewState class to avoid idef in reinterop --- Source/Editor/CesiumTreeViewState.cs | 20 ++++++++++++++++++++ Source/Editor/CesiumTreeViewState.cs.meta | 2 ++ Source/Editor/ConfigureReinteropEditor.cs | 10 +--------- 3 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 Source/Editor/CesiumTreeViewState.cs create mode 100644 Source/Editor/CesiumTreeViewState.cs.meta diff --git a/Source/Editor/CesiumTreeViewState.cs b/Source/Editor/CesiumTreeViewState.cs new file mode 100644 index 00000000..d470aaed --- /dev/null +++ b/Source/Editor/CesiumTreeViewState.cs @@ -0,0 +1,20 @@ +#if UNITY_EDITOR +using UnityEditor.IMGUI.Controls; + +#if UNITY_6000_2_OR_NEWER +using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; +#endif + +// Class for bridging the gap between templated and non-templated +// versions of TreeView et al., for the benefit of Reinterop. + +namespace CesiumForUnity +{ + public class CesiumTreeViewState : TreeViewState + { + public CesiumTreeViewState() + { + } + } +} +#endif diff --git a/Source/Editor/CesiumTreeViewState.cs.meta b/Source/Editor/CesiumTreeViewState.cs.meta new file mode 100644 index 00000000..dff64509 --- /dev/null +++ b/Source/Editor/CesiumTreeViewState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 54a18d48f74b84f6584545050a282fbf \ No newline at end of file diff --git a/Source/Editor/ConfigureReinteropEditor.cs b/Source/Editor/ConfigureReinteropEditor.cs index 2f60cd2e..155db02e 100644 --- a/Source/Editor/ConfigureReinteropEditor.cs +++ b/Source/Editor/ConfigureReinteropEditor.cs @@ -10,11 +10,6 @@ using UnityEngine; using UnityEngine.Networking; -#if UNITY_6000_2_OR_NEWER -using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; -using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; -#endif - namespace CesiumForUnity { [Reinterop] @@ -113,10 +108,7 @@ public void ExposeToCPP() string productName = Application.productName; string osVersion = System.Environment.OSVersion.VersionString; - TreeViewItem root = new TreeViewItem(0, -1, "root"); - int id = root.id; - - TreeViewState treeState = new TreeViewState(); + CesiumTreeViewState treeState = new CesiumTreeViewState(); IonAssetsTreeView treeView = new IonAssetsTreeView(treeState); treeView.Reload(); From 6b4eaa6dcf696b9aa105e983ef183aa92928242e Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Fri, 24 Jul 2026 18:07:59 +0200 Subject: [PATCH 10/10] Refactor to avoid any C++ use of TreeView methods or objects --- Source/Editor/CesiumIonAssetsWindow.cs | 4 ++-- Source/Editor/ConfigureReinteropEditor.cs | 6 +----- Source/Editor/IonAssetsTreeView.cs | 16 +++++++++++++--- native~/src/Editor/IonAssetsTreeViewImpl.cpp | 14 ++++++-------- native~/src/Editor/IonAssetsTreeViewImpl.h | 6 +++++- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Source/Editor/CesiumIonAssetsWindow.cs b/Source/Editor/CesiumIonAssetsWindow.cs index 5cc17e63..5405c4ad 100644 --- a/Source/Editor/CesiumIonAssetsWindow.cs +++ b/Source/Editor/CesiumIonAssetsWindow.cs @@ -34,7 +34,7 @@ public static void ShowWindow() currentWindow.Focus(); } - private TreeViewState _assetsTreeState; + private CesiumTreeViewState _assetsTreeState; private IonAssetsTreeView _assetsTreeView; private SearchField _searchField; private CesiumIonServerSelector _serverSelector; @@ -79,7 +79,7 @@ private void OnCurrentServerChanged(CesiumIonServerManager manager) void BuildTreeView() { - this._assetsTreeState = new TreeViewState(); + this._assetsTreeState = new CesiumTreeViewState(); this._assetsTreeView = new IonAssetsTreeView(this._assetsTreeState); this._assetsTreeView.Reload(); } diff --git a/Source/Editor/ConfigureReinteropEditor.cs b/Source/Editor/ConfigureReinteropEditor.cs index 155db02e..158dfb70 100644 --- a/Source/Editor/ConfigureReinteropEditor.cs +++ b/Source/Editor/ConfigureReinteropEditor.cs @@ -112,11 +112,7 @@ public void ExposeToCPP() IonAssetsTreeView treeView = new IonAssetsTreeView(treeState); treeView.Reload(); - MultiColumnHeader header = treeView.multiColumnHeader; - int sorted = header.sortedColumnIndex; - bool ascending = header.IsSortedAscending(sorted); - - string searchString = treeView.searchString; + string searchString = "searchString"; int length = searchString.Length; searchString.Contains("string", StringComparison.CurrentCultureIgnoreCase); string.Equals("stringA", "stringB"); diff --git a/Source/Editor/IonAssetsTreeView.cs b/Source/Editor/IonAssetsTreeView.cs index 48b9df28..9cde4b26 100644 --- a/Source/Editor/IonAssetsTreeView.cs +++ b/Source/Editor/IonAssetsTreeView.cs @@ -8,7 +8,6 @@ #if UNITY_6000_2_OR_NEWER using TreeView = UnityEditor.IMGUI.Controls.TreeView; using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem; -using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState; #endif namespace CesiumForUnity @@ -106,7 +105,7 @@ public partial class IonAssetsTreeView : TreeView { private MultiColumnHeaderState _headerState; - public IonAssetsTreeView(TreeViewState assetsTreeState) + public IonAssetsTreeView(CesiumTreeViewState assetsTreeState) : base(assetsTreeState) { BuildMultiColumnHeader(); @@ -200,7 +199,18 @@ protected override void RowGUI(RowGUIArgs args) private partial void CellGUI(Rect cellRect, int assetIndex, IonAssetsColumn column); - public partial void Refresh(); + public void Refresh() + { + int sortedColumnIndex = this.multiColumnHeader.sortedColumnIndex; + bool ascending = false; + if (sortedColumnIndex >= 0) + { + ascending = this.multiColumnHeader.IsSortedAscending(sortedColumnIndex); + } + this.RefreshFiltered(this.searchString, sortedColumnIndex, ascending); + } + + private partial void RefreshFiltered(String searchString, int sortedColumnIndex, bool ascending); protected override void SearchChanged(string newSearch) { diff --git a/native~/src/Editor/IonAssetsTreeViewImpl.cpp b/native~/src/Editor/IonAssetsTreeViewImpl.cpp index 2545da79..44fff05d 100644 --- a/native~/src/Editor/IonAssetsTreeViewImpl.cpp +++ b/native~/src/Editor/IonAssetsTreeViewImpl.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -114,8 +113,11 @@ void IonAssetsTreeViewImpl::CellGUI( } } -void IonAssetsTreeViewImpl::Refresh( - const DotNet::CesiumForUnity::IonAssetsTreeView& treeView) { +void IonAssetsTreeViewImpl::RefreshFiltered( + const DotNet::CesiumForUnity::IonAssetsTreeView& treeView, + System::String searchString, + int sortedColumnIndex, + bool isAscending) { CesiumIonSessionImpl& session = getNativeSession(); const CesiumIonClient::Assets& assets = session.getAssets(getSession()); @@ -126,18 +128,14 @@ void IonAssetsTreeViewImpl::Refresh( std::make_shared(assets.items[i]); } - System::String searchString = treeView.searchString(); if (searchString != nullptr && searchString.Length() > 0) { applyFilter(searchString); } - int sortedColumnIndex = treeView.multiColumnHeader().sortedColumnIndex(); if (sortedColumnIndex >= 0) { CesiumForUnity::IonAssetsColumn column = (CesiumForUnity::IonAssetsColumn)sortedColumnIndex; - bool sortAscending = - treeView.multiColumnHeader().IsSortedAscending(sortedColumnIndex); - applySorting(column, sortAscending); + applySorting(column, isAscending); } treeView.Reload(); diff --git a/native~/src/Editor/IonAssetsTreeViewImpl.h b/native~/src/Editor/IonAssetsTreeViewImpl.h index 487c4c37..5ed1ff5b 100644 --- a/native~/src/Editor/IonAssetsTreeViewImpl.h +++ b/native~/src/Editor/IonAssetsTreeViewImpl.h @@ -46,7 +46,11 @@ class IonAssetsTreeViewImpl : public CesiumImpl { const DotNet::CesiumForUnity::IonAssetsTreeView& treeView, int index); - void Refresh(const DotNet::CesiumForUnity::IonAssetsTreeView& treeView); + void RefreshFiltered( + const DotNet::CesiumForUnity::IonAssetsTreeView& treeView, + DotNet::System::String searchString, + int sortedColumnIndex, + bool isAscending); void AddAssetToLevel( const DotNet::CesiumForUnity::IonAssetsTreeView& treeView,