Error while trying to code a custom ellipsoid terrain provider

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

Hi @carlopiersanti,

It sounds like you may have missed the “Build for the Editor” step of the Developer Setup? After you generate the reinterop files, you still have to build them with the C++ implementation files using cmake. But let us know if you’ve done that step and you’re still having issues.

Ok many things were wrong :

  • Class needs to be partial and at least expose one method that will be implemented on cpp otherwise interop won’t trigger
  • Internal log method must be called in dummy code ConfigureReinterop otherwise code won’t be generated
  • I had to close unity between each step and build Reinterop before building the code (I was doing the opposite)

Thanks for your support and regards

1 Like