From 3e39aa3630e9646d4c97d665bf3ed64810b92192 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 2 Jan 2025 14:50:38 +0800 Subject: [PATCH] feat: allow setting material instance directly on ThermionAsset --- .../lib/src/viewer/src/ffi/src/ffi_asset.dart | 68 ++++++++++++++++++- .../src/viewer/src/shared_types/entities.dart | 11 +++ 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart index 14f77b87..4e71f0ed 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_asset.dart @@ -7,16 +7,50 @@ import 'package:thermion_dart/thermion_dart.dart'; class FFIAsset extends ThermionAsset { + /// + /// + /// final Pointer pointer; + + /// + /// + /// final Pointer sceneManager; + + /// + /// + /// Pointer get renderableManager => Engine_getRenderableManager(engine); + + /// + /// + /// final Pointer engine; + + /// + /// + /// FFIAsset? _highlight; + + /// + /// + /// final Pointer _unlitMaterialProvider; + + /// + /// + /// final bool isInstance; + /// + /// + /// late final ThermionEntity entity; + + /// + /// + /// final ThermionViewer viewer; FFIAsset(this.pointer, this.sceneManager, this.engine, @@ -100,6 +134,9 @@ class FFIAsset extends ThermionAsset { return result; } + /// + /// + /// @override Future removeStencilHighlight() async { if (_highlight != null) { @@ -111,6 +148,9 @@ class FFIAsset extends ThermionAsset { } } + /// + /// + /// @override Future setStencilHighlight( {double r = 1.0, @@ -175,11 +215,17 @@ class FFIAsset extends ThermionAsset { SceneManager_addToScene(sceneManager, targetHighlightEntity); } + /// + /// + /// @override Future addToScene() async { SceneAsset_addToScene(pointer, SceneManager_getScene(sceneManager)); } + /// + /// + /// @override Future removeFromScene() async { SceneManager_removeFromScene(sceneManager, entity); @@ -194,14 +240,17 @@ class FFIAsset extends ThermionAsset { late ThermionEntity targetEntity; if (RenderableManager_isRenderable(renderableManager, entity)) { targetEntity = entity; - } else { + } else { targetEntity = (await getChildEntities()).first; } - final aabb3 = SceneManager_getRenderableBoundingBox(sceneManager, targetEntity); + final aabb3 = + SceneManager_getRenderableBoundingBox(sceneManager, targetEntity); return aabb3; } - + /// + /// + /// @override Future setBoundingBoxVisibility(bool visible) async { if (boundingBoxAsset == null) { @@ -293,4 +342,17 @@ class FFIAsset extends ThermionAsset { await boundingBoxAsset!.removeFromScene(); } } + + /// + /// + /// + @override + Future setMaterialInstanceAt(FFIMaterialInstance instance) async { + var childEntities = await getChildEntities(); + final entities = [entity, ...childEntities]; + for (final entity in entities) { + RenderableManager_setMaterialInstanceAt( + Engine_getRenderableManager(engine), entity, 0, instance.pointer); + } + } } diff --git a/thermion_dart/lib/src/viewer/src/shared_types/entities.dart b/thermion_dart/lib/src/viewer/src/shared_types/entities.dart index 159c7c48..6a2e6b75 100644 --- a/thermion_dart/lib/src/viewer/src/shared_types/entities.dart +++ b/thermion_dart/lib/src/viewer/src/shared_types/entities.dart @@ -12,10 +12,21 @@ export 'light_options.dart'; typedef ThermionEntity = int; abstract class ThermionAsset { + /// + /// + /// ThermionEntity get entity; + /// + /// + /// Future> getChildEntities(); + /// + /// + /// + Future setMaterialInstanceAt(covariant MaterialInstance instance); + /// /// Renders an outline around [entity] with the given color. ///