From b4ea80a84c259e6bdde25311ab19253588cfb5b6 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Mon, 7 Jul 2025 17:21:13 +0800 Subject: [PATCH] don't allow creating instances for GridOverlay asset and only expose a single entity --- .../src/implementation/grid_overlay.dart | 29 +++++++++++++++++-- .../native/include/scene/GridOverlay.hpp | 4 +++ thermion_dart/native/src/GridOverlay.cpp | 7 ++--- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/thermion_dart/lib/src/filament/src/implementation/grid_overlay.dart b/thermion_dart/lib/src/filament/src/implementation/grid_overlay.dart index 3bb6ec53..eb038f02 100644 --- a/thermion_dart/lib/src/filament/src/implementation/grid_overlay.dart +++ b/thermion_dart/lib/src/filament/src/implementation/grid_overlay.dart @@ -12,16 +12,39 @@ class GridOverlay extends FFIAsset { static Future create( FFIFilamentApp app, Pointer animationManager) async { if (_overlay == null) { - _gridMaterial ??= FFIMaterial(Material_createGridMaterial(app.engine), app); - + _gridMaterial ??= + FFIMaterial(Material_createGridMaterial(app.engine), app); + final asset = await withPointerCallback((cb) => SceneAsset_createGridRenderThread( app.engine, _gridMaterial!.getNativeHandle(), cb)); _overlay = GridOverlay(asset, app, animationManager); var materialInstance = await _overlay!.getMaterialInstanceAt(); - await materialInstance.setParameterFloat3("gridColor", 0.1, 0.1, 0.1); + await materialInstance + .setTransparencyMode(TransparencyMode.TWO_PASSES_TWO_SIDES); + await materialInstance.setCullingMode(CullingMode.NONE); + + await materialInstance.setParameterFloat3("gridColor", 0.3, 0.35, 0.3); + + final ffiAsset = + FFIAsset(asset, FilamentApp.instance as FFIFilamentApp, nullptr); + await FilamentApp.instance!.setPriority(ffiAsset.entity, 0); + for (final child in await ffiAsset.getChildEntities()) { + await FilamentApp.instance!.setPriority(child, 7); + } + // await materialInstance.setParameterFloat("distance", 10.0); } return _overlay!; } + + /// + /// + /// + @override + Future createInstance( + {List? materialInstances = null}) async { + throw Exception( + "Only a single instance of the grid overlay can be created"); + } } diff --git a/thermion_dart/native/include/scene/GridOverlay.hpp b/thermion_dart/native/include/scene/GridOverlay.hpp index 9db9bc33..d220cd78 100644 --- a/thermion_dart/native/include/scene/GridOverlay.hpp +++ b/thermion_dart/native/include/scene/GridOverlay.hpp @@ -37,6 +37,10 @@ public: MaterialInstance** getMaterialInstances() override { return &_materialInstance; } size_t getMaterialInstanceCount() override { return 1; } + utils::Entity getEntity() override { + return _gridEntity; + } + void addAllEntities(Scene* scene) override; void removeAllEntities(Scene* scene) override; diff --git a/thermion_dart/native/src/GridOverlay.cpp b/thermion_dart/native/src/GridOverlay.cpp index 6ea82ade..be75e435 100644 --- a/thermion_dart/native/src/GridOverlay.cpp +++ b/thermion_dart/native/src/GridOverlay.cpp @@ -209,10 +209,7 @@ namespace thermion SceneAsset *GridOverlay::createInstance(MaterialInstance **materialInstances, size_t materialInstanceCount) { - auto instance = std::make_unique(_engine, _material); - auto *raw = instance.get(); - _instances.push_back(std::move(instance)); - return reinterpret_cast(raw); + return nullptr; } void GridOverlay::addAllEntities(Scene *scene) @@ -250,7 +247,7 @@ namespace thermion } size_t GridOverlay::getChildEntityCount() { - return 1; + return 0; } Entity GridOverlay::findEntityByName(const char *name)