diff --git a/CHANGES.md b/CHANGES.md index e7ae411f..8c070e57 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 building the package from source in Unity 6.5. ## v1.24.0 - 2026-07-01 diff --git a/Source/Editor/CesiumIonAssetsWindow.cs b/Source/Editor/CesiumIonAssetsWindow.cs index ec3a6818..5cc17e63 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 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 016162bc..155db02e 100644 --- a/Source/Editor/ConfigureReinteropEditor.cs +++ b/Source/Editor/ConfigureReinteropEditor.cs @@ -10,7 +10,6 @@ using UnityEngine; using UnityEngine.Networking; - namespace CesiumForUnity { [Reinterop] @@ -109,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(); diff --git a/Source/Editor/IonAssetsTreeView.cs b/Source/Editor/IonAssetsTreeView.cs index c893363a..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 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/Editor/IonAssetsTreeViewImpl.h b/native~/src/Editor/IonAssetsTreeViewImpl.h index aa454af4..487c4c37 100644 --- a/native~/src/Editor/IonAssetsTreeViewImpl.h +++ b/native~/src/Editor/IonAssetsTreeViewImpl.h @@ -6,7 +6,6 @@ #include #include -#include #include #include 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); }