canhorn / EventHorizon.Blazor.TypeScript.Interop.Generator

This project is a Blazor Interop C# Generator, has a sample against the BabylonJS library.
https://wonderful-pond-05f7b3b10.azurestaticapps.net/
MIT License
132 stars 19 forks source link

Setting an array of class type? #35

Open limefrogyank opened 3 years ago

limefrogyank commented 3 years ago

I'm at a loss as to how to add an array of a class type. For example, in RenderTargetTexture, you need to add any meshes that you want rendered into a property on the RenderTargetTexture object called renderList. This is a plain array of type AbstractMesh[]. The generator picks this up just fine. I try to use it like this:

_shadowRenderTarget.renderList = new AbstractMesh[] { _moleculeMesh };

However, when I later call render() on the RenderTargetTexture, BabylonJS spits out an error. The actual JS AbstractMesh object is the Cached version that has the ___guid. There doesn't seem to be a way to translate those C# objects to the javascript objects. I can't seem to find a way to manipulate arrays, so I'm not sure what to do next.

limefrogyank commented 3 years ago

Looks like I might have to write a custom CachedEntityConverter

limefrogyank commented 3 years ago

Wasn't sure how to do the CachedEntityConverter. Instead this javascript hack seems to work:

function pushClassToArray(root, identifier, ...args) {
    try {
        var arrayEntity = blazorInterop.cacheEntity(root, identifier);
        for (var i = 0; i < args.length; i++) {
            blazorInterop.call(arrayEntity, "push", args[i]);            
        }
    } catch (ex) {
        console.log("error", ex);
    }
}

used like this with a synchronous JSRuntime:

            Runtime.InvokeVoid("pushClassToArray", _shadowRenderTarget.___guid, "renderList", _moleculeMesh);
canhorn commented 3 years ago

This looks like a deficiency in the generator, I will look at getting this in.