diff --git a/Reinterop~/MethodsImplementedInCpp.cs b/Reinterop~/MethodsImplementedInCpp.cs index 6061b272..5493a77d 100644 --- a/Reinterop~/MethodsImplementedInCpp.cs +++ b/Reinterop~/MethodsImplementedInCpp.cs @@ -33,7 +33,9 @@ public static void Generate(CppGenerationContext context, TypeToGenerate item, G #endif void* {{createName}}(void* handle) { const {{wrapperType.GetFullyQualifiedName()}} wrapper{{{objectHandleType.GetFullyQualifiedName()}}(handle)}; - return reinterpret_cast(new {{implType.GetFullyQualifiedName()}}(wrapper)); + auto pImpl = new {{implType.GetFullyQualifiedName()}}(wrapper); + pImpl->addReference(); + return reinterpret_cast(pImpl); } """, TypeDefinitionsReferenced: new[] @@ -68,7 +70,7 @@ private void CreateImplementation() #endif void {{destroyName}}(void* pImpl) { auto pImplTyped = reinterpret_cast<{{implType.GetFullyQualifiedName()}}*>(pImpl); - delete pImplTyped; + if (pImplTyped) pImplTyped->releaseReference(); } """, TypeDefinitionsReferenced: new[] diff --git a/native~/Editor/src/CesiumEditorWindowImpl.h b/native~/Editor/src/CesiumEditorWindowImpl.h index 32ee1f07..1cacc626 100644 --- a/native~/Editor/src/CesiumEditorWindowImpl.h +++ b/native~/Editor/src/CesiumEditorWindowImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include #include @@ -13,7 +15,7 @@ class CesiumEditorWindow; namespace CesiumForUnityNative { -class CesiumEditorWindowImpl { +class CesiumEditorWindowImpl : public CesiumImpl { public: CesiumEditorWindowImpl( diff --git a/native~/Editor/src/CesiumIonSessionImpl.h b/native~/Editor/src/CesiumIonSessionImpl.h index a17f9515..4dd15c63 100644 --- a/native~/Editor/src/CesiumIonSessionImpl.h +++ b/native~/Editor/src/CesiumIonSessionImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include #include @@ -33,7 +35,7 @@ class Token; } // namespace CesiumIonClient namespace CesiumForUnityNative { -class CesiumIonSessionImpl { +class CesiumIonSessionImpl : public CesiumImpl { public: CesiumIonSessionImpl(const DotNet::CesiumForUnity::CesiumIonSession& session); ~CesiumIonSessionImpl(); diff --git a/native~/Editor/src/IonAssetsTreeViewImpl.h b/native~/Editor/src/IonAssetsTreeViewImpl.h index 5c701461..aa454af4 100644 --- a/native~/Editor/src/IonAssetsTreeViewImpl.h +++ b/native~/Editor/src/IonAssetsTreeViewImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -15,7 +17,7 @@ class IonAssetsTreeView; namespace CesiumForUnityNative { -class IonAssetsTreeViewImpl { +class IonAssetsTreeViewImpl : public CesiumImpl { public: IonAssetsTreeViewImpl( const DotNet::CesiumForUnity::IonAssetsTreeView& treeView); diff --git a/native~/Editor/src/SelectIonTokenWindowImpl.h b/native~/Editor/src/SelectIonTokenWindowImpl.h index 1953b5fb..63611e46 100644 --- a/native~/Editor/src/SelectIonTokenWindowImpl.h +++ b/native~/Editor/src/SelectIonTokenWindowImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -17,7 +19,7 @@ class CesiumIonServer; namespace CesiumForUnityNative { -class SelectIonTokenWindowImpl { +class SelectIonTokenWindowImpl : public CesiumImpl { public: static CesiumAsync::SharedFuture> diff --git a/native~/Runtime/src/Cesium3DTilesetImpl.h b/native~/Runtime/src/Cesium3DTilesetImpl.h index 03a17cf7..200b5a38 100644 --- a/native~/Runtime/src/Cesium3DTilesetImpl.h +++ b/native~/Runtime/src/Cesium3DTilesetImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -25,7 +27,7 @@ class Tileset; namespace CesiumForUnityNative { -class Cesium3DTilesetImpl { +class Cesium3DTilesetImpl : public CesiumImpl { public: Cesium3DTilesetImpl(const DotNet::CesiumForUnity::Cesium3DTileset& tileset); ~Cesium3DTilesetImpl(); diff --git a/native~/Runtime/src/CesiumBingMapsRasterOverlayImpl.h b/native~/Runtime/src/CesiumBingMapsRasterOverlayImpl.h index 345d7396..c32075ad 100644 --- a/native~/Runtime/src/CesiumBingMapsRasterOverlayImpl.h +++ b/native~/Runtime/src/CesiumBingMapsRasterOverlayImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include namespace DotNet::CesiumForUnity { @@ -13,7 +15,8 @@ class BingMapsRasterOverlay; namespace CesiumForUnityNative { -class CesiumBingMapsRasterOverlayImpl { +class CesiumBingMapsRasterOverlayImpl + : public CesiumImpl { public: CesiumBingMapsRasterOverlayImpl( const DotNet::CesiumForUnity::CesiumBingMapsRasterOverlay& overlay); diff --git a/native~/Runtime/src/CesiumCreditSystemImpl.h b/native~/Runtime/src/CesiumCreditSystemImpl.h index 0716fc3d..b33669e0 100644 --- a/native~/Runtime/src/CesiumCreditSystemImpl.h +++ b/native~/Runtime/src/CesiumCreditSystemImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -21,7 +23,7 @@ struct Credit; namespace CesiumForUnityNative { -class CesiumCreditSystemImpl { +class CesiumCreditSystemImpl : public CesiumImpl { public: CesiumCreditSystemImpl( const DotNet::CesiumForUnity::CesiumCreditSystem& creditSystem); diff --git a/native~/Runtime/src/CesiumDebugColorizeTilesRasterOverlayImpl.h b/native~/Runtime/src/CesiumDebugColorizeTilesRasterOverlayImpl.h index bdcfd33e..80553fac 100644 --- a/native~/Runtime/src/CesiumDebugColorizeTilesRasterOverlayImpl.h +++ b/native~/Runtime/src/CesiumDebugColorizeTilesRasterOverlayImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include namespace DotNet::CesiumForUnity { @@ -13,7 +15,8 @@ class DebugColorizeTilesRasterOverlay; namespace CesiumForUnityNative { -class CesiumDebugColorizeTilesRasterOverlayImpl { +class CesiumDebugColorizeTilesRasterOverlayImpl + : public CesiumImpl { public: CesiumDebugColorizeTilesRasterOverlayImpl( const DotNet::CesiumForUnity::CesiumDebugColorizeTilesRasterOverlay& diff --git a/native~/Runtime/src/CesiumEllipsoidImpl.h b/native~/Runtime/src/CesiumEllipsoidImpl.h index 6240b184..39a93473 100644 --- a/native~/Runtime/src/CesiumEllipsoidImpl.h +++ b/native~/Runtime/src/CesiumEllipsoidImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -12,7 +14,7 @@ class CesiumEllipsoid; namespace CesiumForUnityNative { -class CesiumEllipsoidImpl { +class CesiumEllipsoidImpl : public CesiumImpl { public: CesiumEllipsoidImpl( const DotNet::CesiumForUnity::CesiumEllipsoid& unityEllipsoid); diff --git a/native~/Runtime/src/CesiumFeatureIdAttributeImpl.h b/native~/Runtime/src/CesiumFeatureIdAttributeImpl.h index fcde2744..ed4e6d72 100644 --- a/native~/Runtime/src/CesiumFeatureIdAttributeImpl.h +++ b/native~/Runtime/src/CesiumFeatureIdAttributeImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include namespace DotNet::CesiumForUnity { @@ -12,7 +14,8 @@ struct MeshPrimitive; } // namespace CesiumGltf namespace CesiumForUnityNative { -class CesiumFeatureIdAttributeImpl { +class CesiumFeatureIdAttributeImpl + : public CesiumImpl { public: CesiumFeatureIdAttributeImpl( const DotNet::CesiumForUnity::CesiumFeatureIdAttribute& diff --git a/native~/Runtime/src/CesiumFeatureIdTextureImpl.h b/native~/Runtime/src/CesiumFeatureIdTextureImpl.h index 2771cdce..d824eeeb 100644 --- a/native~/Runtime/src/CesiumFeatureIdTextureImpl.h +++ b/native~/Runtime/src/CesiumFeatureIdTextureImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -19,7 +21,8 @@ struct FeatureIdTexture; } // namespace CesiumGltf namespace CesiumForUnityNative { -class CesiumFeatureIdTextureImpl { +class CesiumFeatureIdTextureImpl + : public CesiumImpl { public: CesiumFeatureIdTextureImpl( const DotNet::CesiumForUnity::CesiumFeatureIdTexture& featureIdTexture); diff --git a/native~/Runtime/src/CesiumFeatureImpl.h b/native~/Runtime/src/CesiumFeatureImpl.h index 7898788e..dc190c30 100644 --- a/native~/Runtime/src/CesiumFeatureImpl.h +++ b/native~/Runtime/src/CesiumFeatureImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -44,7 +46,7 @@ using ValueType = swl::variant< CesiumGltf::PropertyArrayView, CesiumGltf::PropertyArrayView>; -class CesiumFeatureImpl { +class CesiumFeatureImpl : public CesiumImpl { public: CesiumFeatureImpl(const DotNet::CesiumForUnity::CesiumFeature& feature); ~CesiumFeatureImpl(); diff --git a/native~/Runtime/src/CesiumGeoreferenceImpl.h b/native~/Runtime/src/CesiumGeoreferenceImpl.h index 173da1ef..a67a5658 100644 --- a/native~/Runtime/src/CesiumGeoreferenceImpl.h +++ b/native~/Runtime/src/CesiumGeoreferenceImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -16,7 +18,7 @@ class Transform; } namespace CesiumForUnityNative { -class CesiumGeoreferenceImpl { +class CesiumGeoreferenceImpl : public CesiumImpl { public: CesiumGeoreferenceImpl( const DotNet::CesiumForUnity::CesiumGeoreference& georeference); diff --git a/native~/Runtime/src/CesiumIonRasterOverlayImpl.h b/native~/Runtime/src/CesiumIonRasterOverlayImpl.h index 9693c2de..20a572df 100644 --- a/native~/Runtime/src/CesiumIonRasterOverlayImpl.h +++ b/native~/Runtime/src/CesiumIonRasterOverlayImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include namespace DotNet::CesiumForUnity { @@ -13,7 +15,8 @@ class IonRasterOverlay; namespace CesiumForUnityNative { -class CesiumIonRasterOverlayImpl { +class CesiumIonRasterOverlayImpl + : public CesiumImpl { public: CesiumIonRasterOverlayImpl( const DotNet::CesiumForUnity::CesiumIonRasterOverlay& overlay); diff --git a/native~/Runtime/src/CesiumMetadataImpl.h b/native~/Runtime/src/CesiumMetadataImpl.h index 2398fc70..a08b7f4b 100644 --- a/native~/Runtime/src/CesiumMetadataImpl.h +++ b/native~/Runtime/src/CesiumMetadataImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -21,7 +23,7 @@ class Transform; namespace CesiumForUnityNative { -class CesiumMetadataImpl { +class CesiumMetadataImpl : public CesiumImpl { public: CesiumMetadataImpl(const DotNet::CesiumForUnity::CesiumMetadata& metadata); ~CesiumMetadataImpl(); diff --git a/native~/Runtime/src/CesiumPolygonRasterOverlayImpl.h b/native~/Runtime/src/CesiumPolygonRasterOverlayImpl.h index 6f98398a..7eb7be48 100644 --- a/native~/Runtime/src/CesiumPolygonRasterOverlayImpl.h +++ b/native~/Runtime/src/CesiumPolygonRasterOverlayImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -25,7 +27,8 @@ class CartographicPolygon; namespace CesiumForUnityNative { -class CesiumPolygonRasterOverlayImpl { +class CesiumPolygonRasterOverlayImpl + : public CesiumImpl { public: CesiumPolygonRasterOverlayImpl( const DotNet::CesiumForUnity::CesiumPolygonRasterOverlay& overlay); diff --git a/native~/Runtime/src/CesiumPropertyTablePropertyImpl.h b/native~/Runtime/src/CesiumPropertyTablePropertyImpl.h index 4eadf0c5..3a147757 100644 --- a/native~/Runtime/src/CesiumPropertyTablePropertyImpl.h +++ b/native~/Runtime/src/CesiumPropertyTablePropertyImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include #include @@ -43,7 +45,8 @@ class double4x4; namespace CesiumForUnityNative { -class CesiumPropertyTablePropertyImpl { +class CesiumPropertyTablePropertyImpl + : public CesiumImpl { public: CesiumPropertyTablePropertyImpl( const DotNet::CesiumForUnity::CesiumPropertyTableProperty& property); diff --git a/native~/Runtime/src/CesiumSimplePlanarEllipsoidCurveImpl.h b/native~/Runtime/src/CesiumSimplePlanarEllipsoidCurveImpl.h index a6c543d2..303eca4b 100644 --- a/native~/Runtime/src/CesiumSimplePlanarEllipsoidCurveImpl.h +++ b/native~/Runtime/src/CesiumSimplePlanarEllipsoidCurveImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -17,7 +19,8 @@ struct double3; namespace CesiumForUnityNative { -class CesiumSimplePlanarEllipsoidCurveImpl { +class CesiumSimplePlanarEllipsoidCurveImpl + : public CesiumImpl { public: CesiumSimplePlanarEllipsoidCurveImpl( const DotNet::CesiumForUnity::CesiumSimplePlanarEllipsoidCurve& path); diff --git a/native~/Runtime/src/CesiumTileMapServiceRasterOverlayImpl.h b/native~/Runtime/src/CesiumTileMapServiceRasterOverlayImpl.h index 383eebdc..91a9ddde 100644 --- a/native~/Runtime/src/CesiumTileMapServiceRasterOverlayImpl.h +++ b/native~/Runtime/src/CesiumTileMapServiceRasterOverlayImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include namespace DotNet::CesiumForUnity { @@ -13,7 +15,8 @@ class TileMapServiceRasterOverlay; namespace CesiumForUnityNative { -class CesiumTileMapServiceRasterOverlayImpl { +class CesiumTileMapServiceRasterOverlayImpl + : public CesiumImpl { public: CesiumTileMapServiceRasterOverlayImpl( const DotNet::CesiumForUnity::CesiumTileMapServiceRasterOverlay& overlay); diff --git a/native~/Runtime/src/CesiumWebMapServiceRasterOverlayImpl.h b/native~/Runtime/src/CesiumWebMapServiceRasterOverlayImpl.h index f923f122..ea75e52c 100644 --- a/native~/Runtime/src/CesiumWebMapServiceRasterOverlayImpl.h +++ b/native~/Runtime/src/CesiumWebMapServiceRasterOverlayImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include namespace DotNet::CesiumForUnity { @@ -13,7 +15,8 @@ class WebMapServiceRasterOverlay; namespace CesiumForUnityNative { -class CesiumWebMapServiceRasterOverlayImpl { +class CesiumWebMapServiceRasterOverlayImpl + : public CesiumImpl { public: CesiumWebMapServiceRasterOverlayImpl( const DotNet::CesiumForUnity::CesiumWebMapServiceRasterOverlay& overlay); diff --git a/native~/Runtime/src/CesiumWebMapTileServiceRasterOverlayImpl.h b/native~/Runtime/src/CesiumWebMapTileServiceRasterOverlayImpl.h index d80c8e8c..e0f596dc 100644 --- a/native~/Runtime/src/CesiumWebMapTileServiceRasterOverlayImpl.h +++ b/native~/Runtime/src/CesiumWebMapTileServiceRasterOverlayImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include namespace DotNet::CesiumForUnity { @@ -13,7 +15,8 @@ class WebMapTileServiceRasterOverlay; namespace CesiumForUnityNative { -class CesiumWebMapTileServiceRasterOverlayImpl { +class CesiumWebMapTileServiceRasterOverlayImpl + : public CesiumImpl { public: CesiumWebMapTileServiceRasterOverlayImpl( const DotNet::CesiumForUnity::CesiumWebMapTileServiceRasterOverlay& diff --git a/native~/Runtime/src/TestGltfModelImpl.h b/native~/Runtime/src/TestGltfModelImpl.h index af513f3b..443a90c3 100644 --- a/native~/Runtime/src/TestGltfModelImpl.h +++ b/native~/Runtime/src/TestGltfModelImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -26,7 +28,7 @@ struct float4x4; namespace CesiumForUnityNative { -class TestGltfModelImpl { +class TestGltfModelImpl : public CesiumImpl { public: TestGltfModelImpl(const DotNet::CesiumForUnity::TestGltfModel& model); ~TestGltfModelImpl(); diff --git a/native~/Shared/src/CesiumImpl.h b/native~/Shared/src/CesiumImpl.h new file mode 100644 index 00000000..dc5d579b --- /dev/null +++ b/native~/Shared/src/CesiumImpl.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace CesiumForUnityNative { + +template +class CesiumImpl : public CesiumUtility::ReferenceCounted { +public: + CesiumImpl() = default; + + // Prevent copying of impl classes + CesiumImpl(CesiumImpl&&) = delete; + CesiumImpl(const CesiumImpl&) = delete; + CesiumImpl& operator=(CesiumImpl&&) = delete; + CesiumImpl& operator=(const CesiumImpl&) = delete; +}; + +} // namespace CesiumForUnityNative diff --git a/native~/Shared/src/NativeDownloadHandlerImpl.h b/native~/Shared/src/NativeDownloadHandlerImpl.h index b5f7d190..5c925a3a 100644 --- a/native~/Shared/src/NativeDownloadHandlerImpl.h +++ b/native~/Shared/src/NativeDownloadHandlerImpl.h @@ -1,5 +1,7 @@ #pragma once +#include "CesiumImpl.h" + #include #include @@ -12,7 +14,7 @@ class NativeDownloadHandler; namespace CesiumForUnityNative { -class NativeDownloadHandlerImpl { +class NativeDownloadHandlerImpl : public CesiumImpl { public: NativeDownloadHandlerImpl( const ::DotNet::CesiumForUnity::NativeDownloadHandler& handler);