Hello
As a followup of Ellipsoid Terrain I am beginning to create an EllipsoidTerrainProvider. This will imply at least modifying the cpp code of Unity and I am usuccesfull right now.
The first step I would like to do is do a simple MonoBehaviour linked to cpp that logs at each update a message
In order to do that I created the following CesiumEllipsoidTerrainProvider.cs in CesiumForUnity/Runtime
using Reinterop;
using System;
using UnityEngine;
namespace CesiumForUnity
{
[ExecuteInEditMode]
[ReinteropNativeImplementation("CesiumForUnityNative::CesiumEllipsoidTerrainProviderImpl", "CesiumEllipsoidTerrainProviderImpl.h")]
public class CesiumEllipsoidTerrainProvider : MonoBehaviour, IDisposable, ISerializationCallbackReceiver
{
public void Dispose()
{
}
public void OnAfterDeserialize()
{
}
public void OnBeforeSerialize()
{
}
}
}
Then the CesiumEllipsoidTerrainProviderImpl.h in native~/Runtime/src
#pragma once
#include <Cesium3DTilesSelection/ViewUpdateResult.h>
#include <DotNet/CesiumForUnity/CesiumCreditSystem.h>
#include <DotNet/CesiumForUnity/CesiumGeoreference.h>
#include <DotNet/System/Action.h>
#include <memory>
#if UNITY_EDITOR
#include <DotNet/UnityEditor/CallbackFunction.h>
#endif
namespace DotNet::CesiumForUnity {
class CesiumEllipsoidTerrainProvider;
class CesiumCreditSystem;
} // namespace DotNet::CesiumForUnity
namespace Cesium3DTilesSelection {
class Tileset;
}
namespace CesiumForUnityNative {
class CesiumEllipsoidTerrainProviderImpl {
public:
CesiumEllipsoidTerrainProviderImpl(const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset);
~CesiumEllipsoidTerrainProviderImpl();
void Start(const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset);
void Update(const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset);
void OnValidate(const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset);
void OnEnable(const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset);
void OnDisable(const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset);
};
} // namespace CesiumForUnityNative
Then the CesiumEllipsoidTerrainProviderImpl.cpp in native~/Runtime/src
#include "CesiumEllipsoidTerrainProviderImpl.h"
#include "CameraManager.h"
#include "CesiumIonServerHelper.h"
#include "UnityPrepareRendererResources.h"
#include "UnityTileExcluderAdaptor.h"
#include "UnityTilesetExternals.h"
#include <Cesium3DTilesSelection/IonRasterOverlay.h>
#include <Cesium3DTilesSelection/Tileset.h>
#include <CesiumGeospatial/GlobeTransforms.h>
#include <CesiumIonClient/Connection.h>
#include <DotNet/CesiumForUnity/Cesium3DTileset.h>
#include <DotNet/CesiumForUnity/Cesium3DTilesetLoadFailureDetails.h>
#include <DotNet/CesiumForUnity/Cesium3DTilesetLoadType.h>
#include <DotNet/CesiumForUnity/CesiumDataSource.h>
#include <DotNet/CesiumForUnity/CesiumGeoreference.h>
#include <DotNet/CesiumForUnity/CesiumIonServer.h>
#include <DotNet/CesiumForUnity/CesiumRasterOverlay.h>
#include <DotNet/CesiumForUnity/CesiumTileExcluder.h>
#include <DotNet/System/Action.h>
#include <DotNet/System/Array1.h>
#include <DotNet/System/Object.h>
#include <DotNet/System/String.h>
#include <DotNet/UnityEngine/Application.h>
#include <DotNet/UnityEngine/Camera.h>
#include <DotNet/UnityEngine/Debug.h>
#include <DotNet/UnityEngine/Experimental/Rendering/FormatUsage.h>
#include <DotNet/UnityEngine/Experimental/Rendering/GraphicsFormat.h>
#include <DotNet/UnityEngine/GameObject.h>
#include <DotNet/UnityEngine/Material.h>
#include <DotNet/UnityEngine/Object.h>
#include <DotNet/UnityEngine/Quaternion.h>
#include <DotNet/UnityEngine/SystemInfo.h>
#include <DotNet/UnityEngine/Time.h>
#include <DotNet/UnityEngine/Transform.h>
#include <DotNet/UnityEngine/Vector3.h>
#include <variant>
#if UNITY_EDITOR
#include <DotNet/UnityEditor/CallbackFunction.h>
#include <DotNet/UnityEditor/EditorApplication.h>
#include <DotNet/UnityEditor/EditorUtility.h>
#include <DotNet/UnityEditor/SceneView.h>
#endif
using namespace Cesium3DTilesSelection;
using namespace DotNet;
namespace CesiumForUnityNative {
CesiumEllipsoidTerrainProviderImpl::CesiumEllipsoidTerrainProviderImpl(
const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset)
{
}
CesiumEllipsoidTerrainProviderImpl::~CesiumEllipsoidTerrainProviderImpl() {}
void CesiumEllipsoidTerrainProviderImpl::Start(
const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset) {}
void CesiumEllipsoidTerrainProviderImpl::Update(
const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset) {}
void CesiumEllipsoidTerrainProviderImpl::OnValidate(
const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset) {
}
void CesiumEllipsoidTerrainProviderImpl::OnEnable(
const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset) {
}
void CesiumEllipsoidTerrainProviderImpl::OnDisable(
const DotNet::CesiumForUnity::CesiumEllipsoidTerrainProvider& tileset) {
}
} // namespace CesiumForUnityNative
The code compiles using cmake and I regenerate the interop.
However I have the following error in Unity
NotImplementedException: The native implementation is missing so Update cannot be invoked. This may be caused by a missing call to CreateImplementation in one of your constructors, or it may be that the entire native implementation shared library is missing or out of date.
CesiumForUnity.Cesium3DTileset.Update () (at ./Reinterop/Reinterop.RoslynSourceGenerator/Cesium3DTileset-generated.cs:85)
Do you have an idea of what could be missing ?
Could you point me on some documentation about the techniques you are using for the interop ?
Thanks and regards