From 08bae4fcbeb9ce2c9c047c57925b8be42a31a851 Mon Sep 17 00:00:00 2001 From: "nicolas.raggueneau" Date: Tue, 20 Feb 2024 13:21:40 +0100 Subject: [PATCH 01/10] use a component to identify cesium camera --- Runtime/CesiumCamera.cs | 18 ++++++++++++++++++ Runtime/CesiumCamera.cs.meta | 3 +++ Runtime/ConfigureReinterop.cs | 4 +++- native~/Runtime/src/CameraManager.cpp | 8 +++++++- 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 Runtime/CesiumCamera.cs create mode 100644 Runtime/CesiumCamera.cs.meta diff --git a/Runtime/CesiumCamera.cs b/Runtime/CesiumCamera.cs new file mode 100644 index 00000000..d8dddffd --- /dev/null +++ b/Runtime/CesiumCamera.cs @@ -0,0 +1,18 @@ +using System; +using UnityEngine; + +namespace CesiumForUnity +{ + //add this component to a camera to identify the camera to use by cesium + public class CesiumCamera : MonoBehaviour + { + public static Camera camera; + + private void OnEnable() + { + //try to get the camera if any; + camera = GetComponent(); + + } + } +} \ No newline at end of file diff --git a/Runtime/CesiumCamera.cs.meta b/Runtime/CesiumCamera.cs.meta new file mode 100644 index 00000000..14eb44ee --- /dev/null +++ b/Runtime/CesiumCamera.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8f611ac3ad714a278b11f439684f752b +timeCreated: 1705677806 \ No newline at end of file diff --git a/Runtime/ConfigureReinterop.cs b/Runtime/ConfigureReinterop.cs index 1f8c4805..554bc28a 100644 --- a/Runtime/ConfigureReinterop.cs +++ b/Runtime/ConfigureReinterop.cs @@ -56,7 +56,9 @@ internal partial class ConfigureReinterop public void ExposeToCPP() { - Camera c = Camera.main; + Camera c = CesiumCamera.camera ?? Camera.main; + + Transform t = c.transform; Vector3 u = t.up; Vector3 f = t.forward; diff --git a/native~/Runtime/src/CameraManager.cpp b/native~/Runtime/src/CameraManager.cpp index 586eaada..7f55382a 100644 --- a/native~/Runtime/src/CameraManager.cpp +++ b/native~/Runtime/src/CameraManager.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -98,7 +99,12 @@ std::vector CameraManager::getAllCameras(const GameObject& context) { } std::vector result; - Camera camera = Camera::main(); + + Camera camera = CesiumCamera::camera(); + if (camera == nullptr) { + camera = Camera::main(); + } + if (camera != nullptr) { result.emplace_back( unityCameraToViewState(pCoordinateSystem, unityWorldToTileset, camera)); From f1d3d805879e6a36ec0b1b017baeb689743ef4d1 Mon Sep 17 00:00:00 2001 From: "nicolas.raggueneau" Date: Thu, 4 Jul 2024 12:31:14 +0200 Subject: [PATCH 02/10] Prepare the support of multiple cameras --- Runtime/CesiumCamera.cs | 19 +++++++++++++++---- Runtime/ConfigureReinterop.cs | 14 +++++++++++++- native~/Runtime/src/CameraManager.cpp | 13 ++++++++++--- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/Runtime/CesiumCamera.cs b/Runtime/CesiumCamera.cs index d8dddffd..4bb70023 100644 --- a/Runtime/CesiumCamera.cs +++ b/Runtime/CesiumCamera.cs @@ -1,17 +1,28 @@ using System; using UnityEngine; +using System.Collections.Generic; namespace CesiumForUnity { - //add this component to a camera to identify the camera to use by cesium + //add this component to a camera to identify the cameras to use by cesium public class CesiumCamera : MonoBehaviour { - public static Camera camera; + public static List cameraList = new(); private void OnEnable() { - //try to get the camera if any; - camera = GetComponent(); + if (TryGetComponent(out Camera camera)) + { + cameraList.Add(camera); + } + } + + private void OnDisable() + { + if (TryGetComponent(out Camera camera)) + { + cameraList.Remove(camera); + } } } diff --git a/Runtime/ConfigureReinterop.cs b/Runtime/ConfigureReinterop.cs index 554bc28a..a0c69e49 100644 --- a/Runtime/ConfigureReinterop.cs +++ b/Runtime/ConfigureReinterop.cs @@ -56,7 +56,19 @@ internal partial class ConfigureReinterop public void ExposeToCPP() { - Camera c = CesiumCamera.camera ?? Camera.main; + + + Camera c = Camera.main; + List lc = new List(); + + lc = CesiumCamera.cameraList; + lc.Add(c); + for (int i = 0; i < lc.Count; ++i) + { + c = lc[i]; + } + + Transform t = c.transform; diff --git a/native~/Runtime/src/CameraManager.cpp b/native~/Runtime/src/CameraManager.cpp index 7f55382a..04794bec 100644 --- a/native~/Runtime/src/CameraManager.cpp +++ b/native~/Runtime/src/CameraManager.cpp @@ -14,6 +14,8 @@ #include #include #include +#include + #include #if UNITY_EDITOR @@ -26,6 +28,7 @@ using namespace CesiumGeospatial; using namespace CesiumUtility; using namespace DotNet::UnityEngine; using namespace DotNet::CesiumForUnity; +using namespace DotNet; #if UNITY_EDITOR using namespace DotNet::UnityEditor; @@ -100,9 +103,13 @@ std::vector CameraManager::getAllCameras(const GameObject& context) { std::vector result; - Camera camera = CesiumCamera::camera(); - if (camera == nullptr) { - camera = Camera::main(); + + Camera camera = Camera::main(); + + System::Collections::Generic::List1 cameraList = CesiumCamera::cameraList(); + + if (cameraList.Count()>0) { + camera = cameraList[0]; } if (camera != nullptr) { From 0bd5f40b71fbb7117b0de33546c7132fc71d9f02 Mon Sep 17 00:00:00 2001 From: "nicolas.raggueneau" Date: Mon, 12 Aug 2024 17:36:04 +0200 Subject: [PATCH 03/10] Multiple cameras support --- native~/Runtime/src/CameraManager.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/native~/Runtime/src/CameraManager.cpp b/native~/Runtime/src/CameraManager.cpp index b515b6fc..78d9a1d5 100644 --- a/native~/Runtime/src/CameraManager.cpp +++ b/native~/Runtime/src/CameraManager.cpp @@ -112,20 +112,18 @@ std::vector CameraManager::getAllCameras(const GameObject& context) { std::vector result; - Camera camera = Camera::main(); - System::Collections::Generic::List1 cameraList = CesiumCamera::cameraList(); - if (cameraList.Count()>0) { - camera = cameraList[0]; + if (cameraList.Count()==0) { + cameraList.Add(Camera::main()); } - if (camera != nullptr) { - result.emplace_back(unityCameraToViewState( + for (int i=0; i < cameraList.Count(); i++){ + result.emplace_back(unityCameraToViewState( georeferenceComponent, pCoordinateSystem, unityWorldToTileset, - camera)); + cameraList[i])); } #if UNITY_EDITOR From 2839f59128ba27fb462bbbdb37f380506553007f Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 9 Sep 2024 21:14:50 +1000 Subject: [PATCH 04/10] Add CesiumCameraManager. --- Runtime/CesiumCamera.cs | 29 ------ Runtime/CesiumCamera.cs.meta | 3 - Runtime/CesiumCameraManager.cs | 107 ++++++++++++++++++++ Runtime/CesiumCameraManager.cs.meta | 11 ++ Runtime/ConfigureReinterop.cs | 23 ++--- native~/Runtime/src/CameraManager.cpp | 104 ++++++++++++++----- native~/Runtime/src/CameraManager.h | 11 +- native~/Runtime/src/Cesium3DTilesetImpl.cpp | 25 ++++- native~/Runtime/src/Cesium3DTilesetImpl.h | 7 +- 9 files changed, 241 insertions(+), 79 deletions(-) delete mode 100644 Runtime/CesiumCamera.cs delete mode 100644 Runtime/CesiumCamera.cs.meta create mode 100644 Runtime/CesiumCameraManager.cs create mode 100644 Runtime/CesiumCameraManager.cs.meta diff --git a/Runtime/CesiumCamera.cs b/Runtime/CesiumCamera.cs deleted file mode 100644 index 4bb70023..00000000 --- a/Runtime/CesiumCamera.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using UnityEngine; -using System.Collections.Generic; - -namespace CesiumForUnity -{ - //add this component to a camera to identify the cameras to use by cesium - public class CesiumCamera : MonoBehaviour - { - public static List cameraList = new(); - - private void OnEnable() - { - if (TryGetComponent(out Camera camera)) - { - cameraList.Add(camera); - } - } - - private void OnDisable() - { - if (TryGetComponent(out Camera camera)) - { - cameraList.Remove(camera); - } - - } - } -} \ No newline at end of file diff --git a/Runtime/CesiumCamera.cs.meta b/Runtime/CesiumCamera.cs.meta deleted file mode 100644 index 14eb44ee..00000000 --- a/Runtime/CesiumCamera.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 8f611ac3ad714a278b11f439684f752b -timeCreated: 1705677806 \ No newline at end of file diff --git a/Runtime/CesiumCameraManager.cs b/Runtime/CesiumCameraManager.cs new file mode 100644 index 00000000..97897553 --- /dev/null +++ b/Runtime/CesiumCameraManager.cs @@ -0,0 +1,107 @@ +using Reinterop; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using UnityEngine; + +namespace CesiumForUnity +{ + /// + /// Manages the set of cameras that are used for Cesium3DTileset culling and level-of-detail. + /// + [DisallowMultipleComponent] + [AddComponentMenu("Cesium/Cesium Camera Manager")] + [Icon("Packages/com.cesium.unity/Editor/Resources/Cesium-24x24.png")] + public class CesiumCameraManager : MonoBehaviour + { + /// + /// Gets the instance suitable for use with the given game object. + /// + /// + /// This method looks for an existing instance using `GetComponentInParent`. If it fails to find one, then + /// it will create one. When one is created, it be added to the same `GameObject` that has the + /// `CesiumGeoreference` (found using `GetComponentInParent` again) if there is one. If there is no + /// `CesiumGeoreference`, the instance is added to the originally-provided `GameObject`. + /// + /// The game object. + /// + public static CesiumCameraManager GetOrCreate(GameObject gameObject) + { + if (gameObject == null) throw new ArgumentNullException("gameObject"); + + CesiumCameraManager result = gameObject.GetComponentInParent(); + if (result == null) + return CesiumCameraManager.Create(gameObject); + else + return result; + } + + public static CesiumCameraManager GetOrCreate(Component component) + { + if (component == null) throw new ArgumentNullException("component"); + + return CesiumCameraManager.GetOrCreate(component.gameObject); + } + + private static CesiumCameraManager Create(GameObject gameObject) + { + // Add it to the same game object that has the CesiumGeoreference, if any. + // Otherwise, add it to the current game object. + CesiumGeoreference georeference = gameObject.GetComponentInParent(); + GameObject owner = georeference == null ? gameObject : georeference.gameObject; + if (owner == null) return null; + + return owner.AddComponent(); + } + + #region User-editable properties + + [SerializeField] + private bool _useMainCamera = true; + + /// + /// Determines whether the camera tagged `MainCamera` should be used for Cesium3DTileset + /// culling and level-of-detail. + /// + public bool useMainCamera + { + get => this._useMainCamera; + set + { + this._useMainCamera = value; + } + } + + [SerializeField] + private bool _useActiveSceneViewCameraInEditor = true; + + /// + /// Determines whether the camera associated with the Editor's active scene view should be + /// used for Cesium3DTileset culling and level-of-detail. In a game, this property has + /// no effect. + /// + public bool useActiveSceneViewCameraInEditor + { + get => this._useActiveSceneViewCameraInEditor; + set + { + this._useActiveSceneViewCameraInEditor = value; + } + } + + [SerializeField] + private List _additionalCameras = new List(); + + /// + /// Additional Cameras to use for Cesium3DTileset culling and level-of-detail. These cameras + /// may be disabled, which is useful for creating a virtual camera that affects Cesium3DTileset + /// but that is not actually rendered. + /// + public List additionalCameras + { + get => this._additionalCameras; + } + + #endregion + } +} \ No newline at end of file diff --git a/Runtime/CesiumCameraManager.cs.meta b/Runtime/CesiumCameraManager.cs.meta new file mode 100644 index 00000000..639b3d75 --- /dev/null +++ b/Runtime/CesiumCameraManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: be1fb41cdd01d7649a082f1a8f2bd114 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/ConfigureReinterop.cs b/Runtime/ConfigureReinterop.cs index ec14cfc5..f29240dd 100644 --- a/Runtime/ConfigureReinterop.cs +++ b/Runtime/ConfigureReinterop.cs @@ -56,20 +56,7 @@ internal partial class ConfigureReinterop public void ExposeToCPP() { - - Camera c = Camera.main; - List lc = new List(); - - lc = CesiumCamera.cameraList; - lc.Add(c); - for (int i = 0; i < lc.Count; ++i) - { - c = lc[i]; - } - - - Transform t = c.transform; Vector3 u = t.up; @@ -894,6 +881,16 @@ Cesium3DTilesetLoadFailureDetails tilesetDetails length = float3x3Array.Length; length = float4x4Array.Length; + CesiumCameraManager manager = CesiumCameraManager.GetOrCreate(go); + manager = CesiumCameraManager.GetOrCreate(tileset); + manager.useActiveSceneViewCameraInEditor = false; + manager.useMainCamera = false; + Camera camera = null; + for (int i = 0; i < manager.additionalCameras.Count; ++i) + { + camera = manager.additionalCameras[i]; + } + #if UNITY_EDITOR SceneView sv = SceneView.lastActiveSceneView; sv.pivot = sv.pivot; diff --git a/native~/Runtime/src/CameraManager.cpp b/native~/Runtime/src/CameraManager.cpp index 78d9a1d5..bf92d2be 100644 --- a/native~/Runtime/src/CameraManager.cpp +++ b/native~/Runtime/src/CameraManager.cpp @@ -1,5 +1,6 @@ #include "CameraManager.h" +#include "Cesium3DTilesetImpl.h" #include "CesiumGeoreferenceImpl.h" #include "UnityTransforms.h" @@ -7,16 +8,15 @@ #include #include +#include #include #include -#include +#include #include #include #include #include #include -#include - #include #if UNITY_EDITOR @@ -43,7 +43,7 @@ ViewState unityCameraToViewState( const CesiumGeoreference& georeference, const LocalHorizontalCoordinateSystem* pCoordinateSystem, const glm::dmat4& unityWorldToTileset, - Camera& camera) { + const Camera& camera) { Transform transform = camera.transform(); Vector3 cameraPositionUnity = transform.position(); @@ -94,14 +94,58 @@ ViewState unityCameraToViewState( } // namespace -std::vector CameraManager::getAllCameras(const GameObject& context) { +namespace { + +void addMainCamera( + std::vector& result, + const CesiumGeoreference& georeferenceComponent, + const CesiumGeospatial::LocalHorizontalCoordinateSystem* pCoordinateSystem, + const glm::dmat4& unityWorldToTileset) { + Camera camera = Camera::main(); + if (camera != nullptr) { + result.emplace_back(unityCameraToViewState( + georeferenceComponent, + pCoordinateSystem, + unityWorldToTileset, + camera)); + } +} + +void addActiveSceneCameraInEditor( + std::vector& result, + const CesiumGeoreference& georeferenceComponent, + const CesiumGeospatial::LocalHorizontalCoordinateSystem* pCoordinateSystem, + const glm::dmat4& unityWorldToTileset) { +#if UNITY_EDITOR + if (!EditorApplication::isPlaying()) { + SceneView lastActiveEditorView = SceneView::lastActiveSceneView(); + if (lastActiveEditorView != nullptr) { + Camera editorCamera = lastActiveEditorView.camera(); + if (editorCamera != nullptr) { + result.emplace_back(unityCameraToViewState( + georeferenceComponent, + pCoordinateSystem, + unityWorldToTileset, + editorCamera)); + } + } + } +#endif +} + +} // namespace + +/*static*/ std::vector +CameraManager::getAllCameras( + const DotNet::CesiumForUnity::Cesium3DTileset& tileset, + const CesiumForUnityNative::Cesium3DTilesetImpl& impl) { const LocalHorizontalCoordinateSystem* pCoordinateSystem = nullptr; glm::dmat4 unityWorldToTileset = - UnityTransforms::fromUnity(context.transform().worldToLocalMatrix()); + UnityTransforms::fromUnity(tileset.transform().worldToLocalMatrix()); CesiumGeoreference georeferenceComponent = - context.GetComponentInParent(); + tileset.gameObject().GetComponentInParent(); if (georeferenceComponent != nullptr) { CesiumGeoreferenceImpl& georeference = georeferenceComponent.NativeImplementation(); @@ -110,37 +154,41 @@ std::vector CameraManager::getAllCameras(const GameObject& context) { } std::vector result; - - System::Collections::Generic::List1 cameraList = CesiumCamera::cameraList(); + const CesiumCameraManager& cameraManager = impl.getCameraManager(); - if (cameraList.Count()==0) { - cameraList.Add(Camera::main()); + if (cameraManager == nullptr || cameraManager.useMainCamera()) { + addMainCamera( + result, + georeferenceComponent, + pCoordinateSystem, + unityWorldToTileset); } - for (int i=0; i < cameraList.Count(); i++){ - result.emplace_back(unityCameraToViewState( + if (cameraManager == nullptr || + cameraManager.useActiveSceneViewCameraInEditor()) { + addActiveSceneCameraInEditor( + result, georeferenceComponent, pCoordinateSystem, - unityWorldToTileset, - cameraList[i])); + unityWorldToTileset); } -#if UNITY_EDITOR - if (!EditorApplication::isPlaying()) { - SceneView lastActiveEditorView = SceneView::lastActiveSceneView(); - if (lastActiveEditorView != nullptr) { - Camera editorCamera = lastActiveEditorView.camera(); - if (editorCamera != nullptr) { - result.emplace_back(unityCameraToViewState( - georeferenceComponent, - pCoordinateSystem, - unityWorldToTileset, - editorCamera)); - } + if (cameraManager != nullptr) { + System::Collections::Generic::List1 cameras = + cameraManager.additionalCameras(); + for (int32_t i = 0, len = cameras.Count(); i < len; ++i) { + Camera camera = cameras[i]; + if (camera == nullptr) + continue; + + result.emplace_back(unityCameraToViewState( + georeferenceComponent, + pCoordinateSystem, + unityWorldToTileset, + camera)); } } -#endif return result; } diff --git a/native~/Runtime/src/CameraManager.h b/native~/Runtime/src/CameraManager.h index e67e4bac..3fd7da37 100644 --- a/native~/Runtime/src/CameraManager.h +++ b/native~/Runtime/src/CameraManager.h @@ -8,12 +8,19 @@ namespace DotNet::UnityEngine { class GameObject; } +namespace DotNet::CesiumForUnity { +class Cesium3DTileset; +} + namespace CesiumForUnityNative { +class Cesium3DTilesetImpl; + class CameraManager { public: - static std::vector - getAllCameras(const DotNet::UnityEngine::GameObject& context); + static std::vector getAllCameras( + const DotNet::CesiumForUnity::Cesium3DTileset& tileset, + const CesiumForUnityNative::Cesium3DTilesetImpl& impl); }; } // namespace CesiumForUnityNative diff --git a/native~/Runtime/src/Cesium3DTilesetImpl.cpp b/native~/Runtime/src/Cesium3DTilesetImpl.cpp index 186b3a07..3ce1b6ee 100644 --- a/native~/Runtime/src/Cesium3DTilesetImpl.cpp +++ b/native~/Runtime/src/Cesium3DTilesetImpl.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +61,7 @@ Cesium3DTilesetImpl::Cesium3DTilesetImpl( _updateInEditorCallback(nullptr), #endif _creditSystem(nullptr), + _cameraManager(nullptr), _destroyTilesetOnNextUpdate(false), _lastOpaqueMaterialHash(0) { } @@ -110,8 +113,9 @@ void Cesium3DTilesetImpl::Update( } #endif - if (this->_creditSystem == nullptr) { - // Refresh the tileset so it creates and uses a new credit system. + if (this->_creditSystem == nullptr || this->_cameraManager == nullptr) { + // Refresh the tileset so it creates and uses a new credit system and camera + // manager. this->DestroyTileset(tileset); } @@ -122,7 +126,7 @@ void Cesium3DTilesetImpl::Update( } std::vector viewStates = - CameraManager::getAllCameras(tileset.gameObject()); + CameraManager::getAllCameras(tileset, *this); const ViewUpdateResult& updateResult = this->_pTileset->updateView( viewStates, @@ -209,6 +213,7 @@ void Cesium3DTilesetImpl::OnDisable( #endif this->_creditSystem = nullptr; + this->_cameraManager = nullptr; this->DestroyTileset(tileset); } @@ -388,6 +393,16 @@ void Cesium3DTilesetImpl::setCreditSystem( this->_creditSystem = creditSystem; } +const DotNet::CesiumForUnity::CesiumCameraManager& +Cesium3DTilesetImpl::getCameraManager() const { + return this->_cameraManager; +} + +void Cesium3DTilesetImpl::setCameraManager( + const DotNet::CesiumForUnity::CesiumCameraManager& cameraManager) { + this->_cameraManager = cameraManager; +} + void Cesium3DTilesetImpl::updateLastViewUpdateResultState( const DotNet::CesiumForUnity::Cesium3DTileset& tileset, const Cesium3DTilesSelection::ViewUpdateResult& currentResult) { @@ -545,6 +560,10 @@ void Cesium3DTilesetImpl::LoadTileset( options.contentOptions = contentOptions; + CesiumForUnity::CesiumCameraManager cameraManager = + CesiumForUnity::CesiumCameraManager::GetOrCreate(tileset); + this->setCameraManager(cameraManager); + this->_lastUpdateResult = ViewUpdateResult(); if (tileset.tilesetSource() == diff --git a/native~/Runtime/src/Cesium3DTilesetImpl.h b/native~/Runtime/src/Cesium3DTilesetImpl.h index 03a17cf7..1616b9dc 100644 --- a/native~/Runtime/src/Cesium3DTilesetImpl.h +++ b/native~/Runtime/src/Cesium3DTilesetImpl.h @@ -2,6 +2,7 @@ #include +#include #include #include #include @@ -15,7 +16,6 @@ namespace DotNet::CesiumForUnity { class Cesium3DTileset; -class CesiumCreditSystem; class CesiumRasterOverlay; } // namespace DotNet::CesiumForUnity @@ -65,6 +65,10 @@ class Cesium3DTilesetImpl { void setCreditSystem( const DotNet::CesiumForUnity::CesiumCreditSystem& creditSystem); + const DotNet::CesiumForUnity::CesiumCameraManager& getCameraManager() const; + void setCameraManager( + const DotNet::CesiumForUnity::CesiumCameraManager& cameraManager); + private: void updateOverlayMaterialKeys( const DotNet::System::Array1& @@ -81,6 +85,7 @@ class Cesium3DTilesetImpl { DotNet::UnityEditor::CallbackFunction _updateInEditorCallback; #endif DotNet::CesiumForUnity::CesiumCreditSystem _creditSystem; + DotNet::CesiumForUnity::CesiumCameraManager _cameraManager; bool _destroyTilesetOnNextUpdate; int32_t _lastOpaqueMaterialHash; }; From ecf704b08e915f0ec56ae9a1531936332bfeff3f Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 9 Sep 2024 21:45:32 +1000 Subject: [PATCH 05/10] Add properties UI for CesiumCameraManager. --- Editor/CesiumCameraManagerEditor.cs | 59 ++++++++++++++++++++++++ Editor/CesiumCameraManagerEditor.cs.meta | 11 +++++ Runtime/CesiumCameraManager.cs | 8 ++-- Runtime/ConfigureReinterop.cs | 2 +- native~/Runtime/src/CameraManager.cpp | 2 +- 5 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 Editor/CesiumCameraManagerEditor.cs create mode 100644 Editor/CesiumCameraManagerEditor.cs.meta diff --git a/Editor/CesiumCameraManagerEditor.cs b/Editor/CesiumCameraManagerEditor.cs new file mode 100644 index 00000000..437e0229 --- /dev/null +++ b/Editor/CesiumCameraManagerEditor.cs @@ -0,0 +1,59 @@ +using UnityEditor; +using UnityEngine; + +namespace CesiumForUnity +{ + [CustomEditor(typeof(CesiumCameraManager))] + public class CesiumCameraManagerEditor : Editor + { + private SerializedProperty _useMainCamera; + private SerializedProperty _useActiveSceneViewCameraInEditor; + private SerializedProperty _additionalCameras; + + private void OnEnable() + { + this._useMainCamera = + this.serializedObject.FindProperty("_useMainCamera"); + this._useActiveSceneViewCameraInEditor = + this.serializedObject.FindProperty("_useSceneViewCameraInEditor"); + this._additionalCameras = + this.serializedObject.FindProperty("_additionalCameras"); + } + + public override void OnInspectorGUI() + { + this.serializedObject.Update(); + this.DrawProperties(); + this.serializedObject.ApplyModifiedProperties(); + } + + private static readonly string useMainCameraTooltip = CesiumEditorUtility.FormatTooltip(@" + Whether the camera tagged `MainCamera` should be used for Cesium3DTileset + culling and level-of-detail."); + + private static readonly string useActiveSceneViewCameraInEditorTooltip = CesiumEditorUtility.FormatTooltip(@" + Whether the camera associated with the Editor's active scene view should be + used for Cesium3DTileset culling and level-of-detail. In a game, this property has + no effect."); + + private static readonly string additionalCamerasTooltip = CesiumEditorUtility.FormatTooltip(@" + Additional Cameras to use for Cesium3DTileset culling and level-of-detail, in addition to the ones + controlled by the checkboxes above. These additional cameras may be disabled, which is useful for + creating a virtual camera that affects Cesium3DTileset but that is not actually rendered."); + + private void DrawProperties() + { + GUIContent useMainCameraContent = new GUIContent("Use MainCamera", useMainCameraTooltip); + EditorGUILayout.PropertyField( + this._useMainCamera, useMainCameraContent); + + GUIContent useActiveSceneViewCameraInEditorContent = new GUIContent("Use Editor Scene View Camera", useActiveSceneViewCameraInEditorTooltip); + EditorGUILayout.PropertyField( + this._useActiveSceneViewCameraInEditor, useActiveSceneViewCameraInEditorContent); + + GUIContent additionalCamerasContent = new GUIContent("Additional Cameras", additionalCamerasTooltip); + EditorGUILayout.PropertyField( + this._additionalCameras, additionalCamerasContent); + } + } +} \ No newline at end of file diff --git a/Editor/CesiumCameraManagerEditor.cs.meta b/Editor/CesiumCameraManagerEditor.cs.meta new file mode 100644 index 00000000..4248e738 --- /dev/null +++ b/Editor/CesiumCameraManagerEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9b6152cad9e34244ad2e77613b7f6ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/CesiumCameraManager.cs b/Runtime/CesiumCameraManager.cs index 97897553..acaf6049 100644 --- a/Runtime/CesiumCameraManager.cs +++ b/Runtime/CesiumCameraManager.cs @@ -73,19 +73,19 @@ public bool useMainCamera } [SerializeField] - private bool _useActiveSceneViewCameraInEditor = true; + private bool _useSceneViewCameraInEditor = true; /// /// Determines whether the camera associated with the Editor's active scene view should be /// used for Cesium3DTileset culling and level-of-detail. In a game, this property has /// no effect. /// - public bool useActiveSceneViewCameraInEditor + public bool useSceneViewCameraInEditor { - get => this._useActiveSceneViewCameraInEditor; + get => this._useSceneViewCameraInEditor; set { - this._useActiveSceneViewCameraInEditor = value; + this._useSceneViewCameraInEditor = value; } } diff --git a/Runtime/ConfigureReinterop.cs b/Runtime/ConfigureReinterop.cs index f29240dd..b8fede75 100644 --- a/Runtime/ConfigureReinterop.cs +++ b/Runtime/ConfigureReinterop.cs @@ -883,7 +883,7 @@ Cesium3DTilesetLoadFailureDetails tilesetDetails CesiumCameraManager manager = CesiumCameraManager.GetOrCreate(go); manager = CesiumCameraManager.GetOrCreate(tileset); - manager.useActiveSceneViewCameraInEditor = false; + manager.useSceneViewCameraInEditor = false; manager.useMainCamera = false; Camera camera = null; for (int i = 0; i < manager.additionalCameras.Count; ++i) diff --git a/native~/Runtime/src/CameraManager.cpp b/native~/Runtime/src/CameraManager.cpp index bf92d2be..ca32973e 100644 --- a/native~/Runtime/src/CameraManager.cpp +++ b/native~/Runtime/src/CameraManager.cpp @@ -166,7 +166,7 @@ CameraManager::getAllCameras( } if (cameraManager == nullptr || - cameraManager.useActiveSceneViewCameraInEditor()) { + cameraManager.useSceneViewCameraInEditor()) { addActiveSceneCameraInEditor( result, georeferenceComponent, From 5721573dce6c84a75a07cad8509c477bffbd2c40 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 9 Sep 2024 22:02:32 +1000 Subject: [PATCH 06/10] Don't crash when tileset isn't inside a georeference. --- Editor/CesiumCameraManagerEditor.cs | 2 +- native~/Runtime/src/Cesium3DTilesetImpl.cpp | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Editor/CesiumCameraManagerEditor.cs b/Editor/CesiumCameraManagerEditor.cs index 437e0229..253d5ec6 100644 --- a/Editor/CesiumCameraManagerEditor.cs +++ b/Editor/CesiumCameraManagerEditor.cs @@ -39,7 +39,7 @@ Whether the camera associated with the Editor's active scene view should be private static readonly string additionalCamerasTooltip = CesiumEditorUtility.FormatTooltip(@" Additional Cameras to use for Cesium3DTileset culling and level-of-detail, in addition to the ones controlled by the checkboxes above. These additional cameras may be disabled, which is useful for - creating a virtual camera that affects Cesium3DTileset but that is not actually rendered."); + creating a virtual camera that affects Cesium3DTileset but that is not actually used for rendering."); private void DrawProperties() { diff --git a/native~/Runtime/src/Cesium3DTilesetImpl.cpp b/native~/Runtime/src/Cesium3DTilesetImpl.cpp index 3ce1b6ee..94721a3a 100644 --- a/native~/Runtime/src/Cesium3DTilesetImpl.cpp +++ b/native~/Runtime/src/Cesium3DTilesetImpl.cpp @@ -325,6 +325,9 @@ void Cesium3DTilesetImpl::FocusTileset( DotNet::CesiumForUnity::CesiumGeoreference georeferenceComponent = tileset.gameObject() .GetComponentInParent(); + if (georeferenceComponent == nullptr) { + return; + } const CesiumGeospatial::LocalHorizontalCoordinateSystem& georeferenceCrs = georeferenceComponent.NativeImplementation().getCoordinateSystem( @@ -491,9 +494,10 @@ void Cesium3DTilesetImpl::LoadTileset( DotNet::CesiumForUnity::CesiumGeoreference georeferenceComponent = tileset.gameObject() .GetComponentInParent(); - - options.ellipsoid = - georeferenceComponent.ellipsoid().NativeImplementation().GetEllipsoid(); + if (georeferenceComponent != nullptr) { + options.ellipsoid = + georeferenceComponent.ellipsoid().NativeImplementation().GetEllipsoid(); + } TilesetContentOptions contentOptions{}; contentOptions.generateMissingNormalsSmooth = tileset.generateSmoothNormals(); From 1bbbc789c7b2b2c58ae97aba24301f23d864a50d Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 9 Sep 2024 22:06:03 +1000 Subject: [PATCH 07/10] Update CHANGES.md. --- CHANGES.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index fb874fdc..51b023c0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,15 @@ # Change Log +## Next Version (not yet released) + +##### Additions :tada: + +- Added a new `CesiumCameraManager` component. It allows configuration of the cameras to use for Cesium3DTileset culling and level-of-detail. + +##### Fixes :wrench: + +- Fixed a bug that could cause a `NullReferenceException` when a `Cesium3DTileset` was not nested into a game object with a `CesiumGeoreference`. + ## v1.12.0 - 2024-09-02 ##### Breaking Changes :mega: From bb1829b647dbe69bd830f0086844454b5f37bd45 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Mon, 9 Sep 2024 22:08:31 +1000 Subject: [PATCH 08/10] Formatting. --- native~/Runtime/src/CameraManager.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/native~/Runtime/src/CameraManager.cpp b/native~/Runtime/src/CameraManager.cpp index ca32973e..775a31a2 100644 --- a/native~/Runtime/src/CameraManager.cpp +++ b/native~/Runtime/src/CameraManager.cpp @@ -165,8 +165,7 @@ CameraManager::getAllCameras( unityWorldToTileset); } - if (cameraManager == nullptr || - cameraManager.useSceneViewCameraInEditor()) { + if (cameraManager == nullptr || cameraManager.useSceneViewCameraInEditor()) { addActiveSceneCameraInEditor( result, georeferenceComponent, From f48a11bcb3e3ad105ecf35854732cded2f970873 Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Wed, 18 Sep 2024 19:30:01 +1000 Subject: [PATCH 09/10] Changes from review. --- Editor/CesiumCameraManagerEditor.cs | 12 +++++++++--- Runtime/CesiumCameraManager.cs | 13 +++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Editor/CesiumCameraManagerEditor.cs b/Editor/CesiumCameraManagerEditor.cs index 253d5ec6..6e161d2e 100644 --- a/Editor/CesiumCameraManagerEditor.cs +++ b/Editor/CesiumCameraManagerEditor.cs @@ -23,6 +23,7 @@ private void OnEnable() public override void OnInspectorGUI() { this.serializedObject.Update(); + EditorGUIUtility.labelWidth = CesiumEditorStyle.inspectorLabelWidth; this.DrawProperties(); this.serializedObject.ApplyModifiedProperties(); } @@ -37,9 +38,12 @@ Whether the camera associated with the Editor's active scene view should be no effect."); private static readonly string additionalCamerasTooltip = CesiumEditorUtility.FormatTooltip(@" - Additional Cameras to use for Cesium3DTileset culling and level-of-detail, in addition to the ones - controlled by the checkboxes above. These additional cameras may be disabled, which is useful for - creating a virtual camera that affects Cesium3DTileset but that is not actually used for rendering."); + Other Cameras to use for Cesium3DTileset culling and level-of-detail, in addition to + the ones controlled by the checkboxes above. + + These additional cameras will be used even when they are disabled, which is useful for + creating a virtual camera that affects Cesium3DTileset loading without being used for + rendering."); private void DrawProperties() { @@ -47,9 +51,11 @@ private void DrawProperties() EditorGUILayout.PropertyField( this._useMainCamera, useMainCameraContent); + EditorGUI.BeginDisabledGroup(EditorApplication.isPlaying); GUIContent useActiveSceneViewCameraInEditorContent = new GUIContent("Use Editor Scene View Camera", useActiveSceneViewCameraInEditorTooltip); EditorGUILayout.PropertyField( this._useActiveSceneViewCameraInEditor, useActiveSceneViewCameraInEditorContent); + EditorGUI.EndDisabledGroup(); GUIContent additionalCamerasContent = new GUIContent("Additional Cameras", additionalCamerasTooltip); EditorGUILayout.PropertyField( diff --git a/Runtime/CesiumCameraManager.cs b/Runtime/CesiumCameraManager.cs index acaf6049..1814687c 100644 --- a/Runtime/CesiumCameraManager.cs +++ b/Runtime/CesiumCameraManager.cs @@ -36,7 +36,7 @@ public static CesiumCameraManager GetOrCreate(GameObject gameObject) return result; } - public static CesiumCameraManager GetOrCreate(Component component) + internal static CesiumCameraManager GetOrCreate(Component component) { if (component == null) throw new ArgumentNullException("component"); @@ -93,10 +93,15 @@ public bool useSceneViewCameraInEditor private List _additionalCameras = new List(); /// - /// Additional Cameras to use for Cesium3DTileset culling and level-of-detail. These cameras - /// may be disabled, which is useful for creating a virtual camera that affects Cesium3DTileset - /// but that is not actually rendered. + /// Other cameras to use for Cesium3DTileset culling and level-of-detail, in addition + /// to the ones controlled by and + /// . /// + /// + /// These additional cameras will be used even when they are disabled, which is useful for + /// creating a virtual camera that affects Cesium3DTileset loading without being used + /// for rendering. + /// public List additionalCameras { get => this._additionalCameras; From a88c5955047f9c9390fda657a08b62e43444d83f Mon Sep 17 00:00:00 2001 From: Kevin Ring Date: Wed, 18 Sep 2024 19:37:05 +1000 Subject: [PATCH 10/10] Remove unnecessary method. --- Runtime/CesiumCameraManager.cs | 7 ------- Runtime/ConfigureReinterop.cs | 1 - native~/Runtime/src/Cesium3DTilesetImpl.cpp | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/Runtime/CesiumCameraManager.cs b/Runtime/CesiumCameraManager.cs index 1814687c..4967fd6e 100644 --- a/Runtime/CesiumCameraManager.cs +++ b/Runtime/CesiumCameraManager.cs @@ -36,13 +36,6 @@ public static CesiumCameraManager GetOrCreate(GameObject gameObject) return result; } - internal static CesiumCameraManager GetOrCreate(Component component) - { - if (component == null) throw new ArgumentNullException("component"); - - return CesiumCameraManager.GetOrCreate(component.gameObject); - } - private static CesiumCameraManager Create(GameObject gameObject) { // Add it to the same game object that has the CesiumGeoreference, if any. diff --git a/Runtime/ConfigureReinterop.cs b/Runtime/ConfigureReinterop.cs index b8fede75..5c536437 100644 --- a/Runtime/ConfigureReinterop.cs +++ b/Runtime/ConfigureReinterop.cs @@ -882,7 +882,6 @@ Cesium3DTilesetLoadFailureDetails tilesetDetails length = float4x4Array.Length; CesiumCameraManager manager = CesiumCameraManager.GetOrCreate(go); - manager = CesiumCameraManager.GetOrCreate(tileset); manager.useSceneViewCameraInEditor = false; manager.useMainCamera = false; Camera camera = null; diff --git a/native~/Runtime/src/Cesium3DTilesetImpl.cpp b/native~/Runtime/src/Cesium3DTilesetImpl.cpp index 94721a3a..7df9cff5 100644 --- a/native~/Runtime/src/Cesium3DTilesetImpl.cpp +++ b/native~/Runtime/src/Cesium3DTilesetImpl.cpp @@ -565,7 +565,7 @@ void Cesium3DTilesetImpl::LoadTileset( options.contentOptions = contentOptions; CesiumForUnity::CesiumCameraManager cameraManager = - CesiumForUnity::CesiumCameraManager::GetOrCreate(tileset); + CesiumForUnity::CesiumCameraManager::GetOrCreate(tileset.gameObject()); this->setCameraManager(cameraManager); this->_lastUpdateResult = ViewUpdateResult();