From a67f42f0de7b518372e2a90431b07d1ea4dc31de Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 21 Mar 2025 17:18:16 +0800 Subject: [PATCH] refactoring --- .../lib/src/filament/src/filament_app.dart | 16 +++ .../viewer/src/ffi/src/ffi_filament_app.dart | 30 +++- .../lib/src/viewer/src/ffi/src/ffi_view.dart | 14 +- .../viewer/src/ffi/src/thermion_dart.g.dart | 134 ++++++++++++++---- .../src/ffi/src/thermion_viewer_ffi.dart | 7 + .../native/include/c_api/APIBoundaryTypes.h | 1 + thermion_dart/native/include/c_api/TEngine.h | 3 + thermion_dart/native/include/c_api/TView.h | 3 +- .../c_api/ThermionDartRenderThreadApi.h | 7 +- thermion_dart/native/src/c_api/TEngine.cpp | 18 +++ thermion_dart/native/src/c_api/TView.cpp | 23 ++- .../src/c_api/ThermionDartRenderThreadApi.cpp | 58 +++++++- 12 files changed, 262 insertions(+), 52 deletions(-) diff --git a/thermion_dart/lib/src/filament/src/filament_app.dart b/thermion_dart/lib/src/filament/src/filament_app.dart index 7e9c43db..bb6270cc 100644 --- a/thermion_dart/lib/src/filament/src/filament_app.dart +++ b/thermion_dart/lib/src/filament/src/filament_app.dart @@ -1,5 +1,6 @@ import 'dart:typed_data'; import 'package:thermion_dart/src/filament/src/engine.dart'; +import 'package:thermion_dart/src/filament/src/scene.dart'; import 'package:thermion_dart/thermion_dart.dart'; class FilamentConfig { @@ -63,6 +64,16 @@ abstract class FilamentApp { /// Future destroySwapChain(SwapChain swapChain); + /// + /// + /// + Future destroyView(View view); + + /// + /// + /// + Future destroyScene(Scene scene); + /// /// /// @@ -248,4 +259,9 @@ abstract class FilamentApp { int layer = 0, bool loadResourcesAsync = false, String? relativeResourcePath}); + + /// + /// + /// + Future createColorGrading(ToneMapper mapper); } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart index ab597853..8ecccd3c 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_filament_app.dart @@ -2,12 +2,13 @@ import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; -import 'package:path/path.dart'; import 'package:thermion_dart/src/filament/src/engine.dart'; +import 'package:thermion_dart/src/filament/src/scene.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/callbacks.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_asset.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_material.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_render_target.dart'; +import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_scene.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_swapchain.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_texture.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_view.dart'; @@ -199,9 +200,13 @@ class FFIFilamentApp extends FilamentApp { for (final swapChain in _swapChains.keys.toList()) { await destroySwapChain(swapChain); } + await withVoidCallback((cb) async { + Engine_destroyRenderThread(engine, cb); + }); + RenderThread_destroy(); RenderTicker_destroy(renderTicker); - Engine_destroy(engine); + calloc.free(viewsPtr); } @@ -725,6 +730,27 @@ class FFIFilamentApp extends FilamentApp { GltfResourceLoader_destroyRenderThread(engine, gltfResourceLoader, cb)); return FFIAsset(asset, this, animationManager.cast()); } + + Future destroyView(covariant FFIView view) async { + View_setColorGrading(view.view, nullptr); + for (final cg in view.colorGrading.entries) { + await withVoidCallback( + (cb) => Engine_destroyColorGradingRenderThread(engine, cg.value, cb)); + } + await withVoidCallback( + (cb) => Engine_destroyViewRenderThread(engine, view.view, cb)); + } + + Future destroyScene(covariant FFIScene scene) async { + await withVoidCallback( + (cb) => Engine_destroySceneRenderThread(engine, scene.scene, cb)); + } + + Future> createColorGrading(ToneMapper mapper) async { + return withPointerCallback((cb) => + ColorGrading_createRenderThread( + engine, TToneMapping.values[mapper.index], cb)); + } } class FinalizableUint8List implements Finalizable { diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart index c8b9e283..d6b2ed45 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_view.dart @@ -4,6 +4,7 @@ import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_render_target.dart'; import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_scene.dart'; import 'package:thermion_dart/src/filament/src/layers.dart'; import 'package:thermion_dart/src/filament/src/shared_types.dart'; +import 'package:thermion_dart/thermion_dart.dart'; import 'callbacks.dart'; import 'ffi_camera.dart'; @@ -92,10 +93,19 @@ class FFIView extends View { }); } + final colorGrading = >{}; + @override Future setToneMapper(ToneMapper mapper) async { - await withVoidCallback((cb) => View_setToneMappingRenderThread( - view, app.engine, TToneMapping.values[mapper.index], cb)); + if (colorGrading[mapper] == null) { + colorGrading[mapper] = + await FilamentApp.instance!.createColorGrading(mapper); + if (colorGrading[mapper] == nullptr) { + throw Exception("Failed to create color grading"); + } + } + + View_setColorGrading(view, colorGrading[mapper]!); } Future setStencilBufferEnabled(bool enabled) async { diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart index cc0aa67a..fca3b8c7 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart @@ -473,6 +473,30 @@ external TViewport View_getViewport( ffi.Pointer view, ); +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, + ffi.UnsignedInt)>(symbol: "ColorGrading_create", isLeaf: true) +external ffi.Pointer _ColorGrading_create( + ffi.Pointer tEngine, + int toneMapping, +); + +ffi.Pointer ColorGrading_create( + ffi.Pointer tEngine, + TToneMapping toneMapping, +) => + _ColorGrading_create( + tEngine, + toneMapping.value, + ); + +@ffi.Native, ffi.Pointer)>( + isLeaf: true) +external void View_setColorGrading( + ffi.Pointer tView, + ffi.Pointer tColorGrading, +); + @ffi.Native, ffi.UnsignedInt)>( symbol: "View_setBlendMode", isLeaf: true) external void _View_setBlendMode( @@ -566,26 +590,6 @@ void View_setRenderQuality( qualityLevel.value, ); -@ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.UnsignedInt)>(symbol: "View_setToneMapping", isLeaf: true) -external void _View_setToneMapping( - ffi.Pointer tView, - ffi.Pointer tEngine, - int toneMapping, -); - -void View_setToneMapping( - ffi.Pointer tView, - ffi.Pointer tEngine, - TToneMapping toneMapping, -) => - _View_setToneMapping( - tView, - tEngine, - toneMapping.value, - ); - @ffi.Native< ffi.Void Function( ffi.Pointer, ffi.Bool, ffi.Bool, ffi.Bool)>(isLeaf: true) @@ -1669,6 +1673,14 @@ external void Engine_buildMaterialRenderThread( onComplete, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, + ffi.Pointer>)>(isLeaf: true) +external void Engine_destroyRenderThread( + ffi.Pointer tEngine, + ffi.Pointer> onComplete, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Pointer>)>(isLeaf: true) @@ -1678,6 +1690,33 @@ external void Engine_destroySwapChainRenderThread( ffi.Pointer> onComplete, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>(isLeaf: true) +external void Engine_destroyViewRenderThread( + ffi.Pointer tEngine, + ffi.Pointer tView, + ffi.Pointer> onComplete, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>(isLeaf: true) +external void Engine_destroySceneRenderThread( + ffi.Pointer tEngine, + ffi.Pointer tScene, + ffi.Pointer> onComplete, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>(isLeaf: true) +external void Engine_destroyColorGradingRenderThread( + ffi.Pointer tEngine, + ffi.Pointer tColorGrading, + ffi.Pointer> onComplete, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Pointer>)>(isLeaf: true) @@ -1954,31 +1993,40 @@ external void Material_createImageMaterialRenderThread( @ffi.Native< ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.UnsignedInt, - ffi.Pointer>)>( - symbol: "View_setToneMappingRenderThread", isLeaf: true) -external void _View_setToneMappingRenderThread( - ffi.Pointer tView, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer)>>)>( + symbol: "ColorGrading_createRenderThread", isLeaf: true) +external void _ColorGrading_createRenderThread( ffi.Pointer tEngine, int toneMapping, - ffi.Pointer> callback, + ffi.Pointer)>> + callback, ); -void View_setToneMappingRenderThread( - ffi.Pointer tView, +void ColorGrading_createRenderThread( ffi.Pointer tEngine, TToneMapping toneMapping, - ffi.Pointer> callback, + ffi.Pointer)>> + callback, ) => - _View_setToneMappingRenderThread( - tView, + _ColorGrading_createRenderThread( tEngine, toneMapping.value, callback, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>(isLeaf: true) +external void View_setColorGradingRenderThread( + ffi.Pointer tView, + ffi.Pointer tColorGrading, + ffi.Pointer> callback, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Bool, ffi.Double, ffi.Pointer>)>(isLeaf: true) @@ -2912,6 +2960,28 @@ external void Engine_destroySwapChain( ffi.Pointer tSwapChain, ); +@ffi.Native, ffi.Pointer)>( + isLeaf: true) +external void Engine_destroyView( + ffi.Pointer tEngine, + ffi.Pointer tView, +); + +@ffi.Native, ffi.Pointer)>( + isLeaf: true) +external void Engine_destroyScene( + ffi.Pointer tEngine, + ffi.Pointer tScene, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer)>(isLeaf: true) +external void Engine_destroyColorGrading( + ffi.Pointer tEngine, + ffi.Pointer tColorGrading, +); + @ffi.Native Function(ffi.Pointer)>(isLeaf: true) external ffi.Pointer Engine_createCamera( ffi.Pointer tEngine, @@ -3542,6 +3612,8 @@ final class TGltfResourceLoader extends ffi.Opaque {} final class TFilamentAsset extends ffi.Opaque {} +final class TColorGrading extends ffi.Opaque {} + final class TMaterialKey extends ffi.Struct { @ffi.Bool() external bool doubleSided; diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart index c46f5101..a58bf824 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_viewer_ffi.dart @@ -90,6 +90,8 @@ class ThermionViewerFFI extends ThermionViewer { View_setAntiAliasing(view.view, false, false, false); View_setDitheringEnabled(view.view, false); View_setRenderQuality(view.view, TQualityLevel.MEDIUM); + + await FilamentApp.instance!.setClearColor(1.0, 0.0, 0.0, 1.0); scene = FFIScene(Engine_createScene(app.engine)); await view.setScene(scene); @@ -167,6 +169,9 @@ class ThermionViewerFFI extends ThermionViewer { for (final callback in _onDispose) { await callback.call(); } + View_setScene(view.view, nullptr); + await FilamentApp.instance!.destroyScene(scene); + await FilamentApp.instance!.destroyView(view); _onDispose.clear(); } @@ -426,6 +431,8 @@ class ThermionViewerFFI extends ThermionViewer { } } + + /// /// /// diff --git a/thermion_dart/native/include/c_api/APIBoundaryTypes.h b/thermion_dart/native/include/c_api/APIBoundaryTypes.h index ef118bb9..0153d991 100644 --- a/thermion_dart/native/include/c_api/APIBoundaryTypes.h +++ b/thermion_dart/native/include/c_api/APIBoundaryTypes.h @@ -42,6 +42,7 @@ extern "C" typedef struct TGltfAssetLoader TGltfAssetLoader; typedef struct TGltfResourceLoader TGltfResourceLoader; typedef struct TFilamentAsset TFilamentAsset; + typedef struct TColorGrading TColorGrading; struct TMaterialKey { bool doubleSided; diff --git a/thermion_dart/native/include/c_api/TEngine.h b/thermion_dart/native/include/c_api/TEngine.h index 4028461d..bce95b21 100644 --- a/thermion_dart/native/include/c_api/TEngine.h +++ b/thermion_dart/native/include/c_api/TEngine.h @@ -32,6 +32,9 @@ EMSCRIPTEN_KEEPALIVE TRenderer *Engine_createRenderer(TEngine *tEngine); EMSCRIPTEN_KEEPALIVE TSwapChain *Engine_createSwapChain(TEngine *tEngine, void *window, uint64_t flags); EMSCRIPTEN_KEEPALIVE TSwapChain *Engine_createHeadlessSwapChain(TEngine *tEngine, uint32_t width, uint32_t height, uint64_t flags); EMSCRIPTEN_KEEPALIVE void Engine_destroySwapChain(TEngine *tEngine, TSwapChain *tSwapChain); +EMSCRIPTEN_KEEPALIVE void Engine_destroyView(TEngine *tEngine, TView *tView); +EMSCRIPTEN_KEEPALIVE void Engine_destroyScene(TEngine *tEngine, TScene *tScene); +EMSCRIPTEN_KEEPALIVE void Engine_destroyColorGrading(TEngine *tEngine, TColorGrading *tColorGrading); EMSCRIPTEN_KEEPALIVE TCamera *Engine_createCamera(TEngine* tEngine); EMSCRIPTEN_KEEPALIVE TView *Engine_createView(TEngine *tEngine); diff --git a/thermion_dart/native/include/c_api/TView.h b/thermion_dart/native/include/c_api/TView.h index 63384ba4..1acb7f6d 100644 --- a/thermion_dart/native/include/c_api/TView.h +++ b/thermion_dart/native/include/c_api/TView.h @@ -39,6 +39,8 @@ enum TBlendMode { // View EMSCRIPTEN_KEEPALIVE TViewport View_getViewport(TView *view); +EMSCRIPTEN_KEEPALIVE TColorGrading *ColorGrading_create(TEngine* tEngine, TToneMapping toneMapping); +EMSCRIPTEN_KEEPALIVE void View_setColorGrading(TView *tView, TColorGrading *tColorGrading); EMSCRIPTEN_KEEPALIVE void View_setBlendMode(TView *view, TBlendMode blendMode); EMSCRIPTEN_KEEPALIVE void View_setViewport(TView *view, uint32_t width, uint32_t height); EMSCRIPTEN_KEEPALIVE void View_setRenderTarget(TView *view, TRenderTarget *renderTarget); @@ -52,7 +54,6 @@ EMSCRIPTEN_KEEPALIVE void View_setShadowType(TView* tView, int shadowType); EMSCRIPTEN_KEEPALIVE void View_setSoftShadowOptions(TView* tView, float penumbraScale, float penumbraRatioScale); EMSCRIPTEN_KEEPALIVE void View_setBloom(TView* tView, bool enabled, float strength); EMSCRIPTEN_KEEPALIVE void View_setRenderQuality(TView* tView, TQualityLevel qualityLevel); -EMSCRIPTEN_KEEPALIVE void View_setToneMapping(TView* tView, TEngine* tEngine, TToneMapping toneMapping); EMSCRIPTEN_KEEPALIVE void View_setAntiAliasing(TView *tView, bool msaa, bool fxaa, bool taa); EMSCRIPTEN_KEEPALIVE void View_setLayerEnabled(TView *tView, int layer, bool visible); EMSCRIPTEN_KEEPALIVE void View_setCamera(TView *tView, TCamera *tCamera); diff --git a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h index eb4740ff..cac219a0 100644 --- a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h @@ -37,7 +37,11 @@ namespace thermion EMSCRIPTEN_KEEPALIVE void Engine_createCameraRenderThread(TEngine* tEngine, void (*onComplete)(TCamera *)); EMSCRIPTEN_KEEPALIVE void Engine_createViewRenderThread(TEngine *tEngine, void (*onComplete)(TView *)); EMSCRIPTEN_KEEPALIVE void Engine_buildMaterialRenderThread(TEngine *tEngine, const uint8_t *materialData, size_t length, void (*onComplete)(TMaterial *)); + EMSCRIPTEN_KEEPALIVE void Engine_destroyRenderThread(TEngine *tEngine, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Engine_destroySwapChainRenderThread(TEngine *tEngine, TSwapChain *tSwapChain, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void Engine_destroyViewRenderThread(TEngine *tEngine, TView *tView, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void Engine_destroySceneRenderThread(TEngine *tEngine, TScene *tScene, void (*onComplete)()); + EMSCRIPTEN_KEEPALIVE void Engine_destroyColorGradingRenderThread(TEngine *tEngine, TColorGrading *tColorGrading, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Engine_destroyMaterialRenderThread(TEngine *tEngine, TMaterial *tMaterial, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Engine_destroyMaterialInstanceRenderThread(TEngine *tEngine, TMaterialInstance *tMaterialInstance, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Engine_destroySkyboxRenderThread(TEngine *tEngine, TSkybox *tSkybox, void (*onComplete)()); @@ -78,7 +82,8 @@ namespace thermion EMSCRIPTEN_KEEPALIVE void Material_createInstanceRenderThread(TMaterial *tMaterial, void (*onComplete)(TMaterialInstance *)); EMSCRIPTEN_KEEPALIVE void Material_createImageMaterialRenderThread(TEngine *tEngine, void (*onComplete)(TMaterial *)); - EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, TToneMapping toneMapping, void (*callback)()); + EMSCRIPTEN_KEEPALIVE void ColorGrading_createRenderThread(TEngine *tEngine, TToneMapping toneMapping, void (*callback)(TColorGrading *)); + EMSCRIPTEN_KEEPALIVE void View_setColorGradingRenderThread(TView *tView, TColorGrading *tColorGrading, void (*callback)()); EMSCRIPTEN_KEEPALIVE void View_setBloomRenderThread(TView *tView, bool enabled, double strength, void (*callback)()); EMSCRIPTEN_KEEPALIVE void View_setCameraRenderThread(TView *tView, TCamera *tCamera, void (*callback)()); diff --git a/thermion_dart/native/src/c_api/TEngine.cpp b/thermion_dart/native/src/c_api/TEngine.cpp index 94b6662c..93532153 100644 --- a/thermion_dart/native/src/c_api/TEngine.cpp +++ b/thermion_dart/native/src/c_api/TEngine.cpp @@ -121,6 +121,24 @@ namespace thermion engine->destroy(swapChain); } + EMSCRIPTEN_KEEPALIVE void Engine_destroyView(TEngine *tEngine, TView *tView) { + auto *engine = reinterpret_cast(tEngine); + auto *view = reinterpret_cast(tView); + engine->destroy(view); + } + + EMSCRIPTEN_KEEPALIVE void Engine_destroyScene(TEngine *tEngine, TScene *tScene) { + auto *engine = reinterpret_cast(tEngine); + auto *scene = reinterpret_cast(tScene); + engine->destroy(scene); + } + + EMSCRIPTEN_KEEPALIVE void Engine_destroyColorGrading(TEngine *tEngine, TColorGrading *tColorGrading) { + auto *engine = reinterpret_cast(tEngine); + auto *colorGrading = reinterpret_cast(tColorGrading); + engine->destroy(colorGrading); + } + EMSCRIPTEN_KEEPALIVE TView *Engine_createView(TEngine *tEngine) { auto *engine = reinterpret_cast(tEngine); diff --git a/thermion_dart/native/src/c_api/TView.cpp b/thermion_dart/native/src/c_api/TView.cpp index 99fc8d9e..839293da 100644 --- a/thermion_dart/native/src/c_api/TView.cpp +++ b/thermion_dart/native/src/c_api/TView.cpp @@ -100,9 +100,13 @@ using namespace filament; #endif } - EMSCRIPTEN_KEEPALIVE void View_setToneMapping(TView *tView, TEngine *tEngine, TToneMapping tToneMapping) - { - auto view = reinterpret_cast(tView); + EMSCRIPTEN_KEEPALIVE void View_setColorGrading(TView *tView, TColorGrading *tColorGrading) { + auto *view = reinterpret_cast(tView); + auto *colorGrading = reinterpret_cast(tColorGrading); + view->setColorGrading(colorGrading); + } + + EMSCRIPTEN_KEEPALIVE TColorGrading *ColorGrading_create(TEngine* tEngine, TToneMapping tToneMapping) { auto engine = reinterpret_cast(tEngine); ToneMapper *tm; @@ -122,17 +126,12 @@ using namespace filament; break; default: TRACE("ERROR: Unsupported tone mapping"); - return; - } - auto newColorGrading = ColorGrading::Builder().toneMapper(tm).build(*engine); - auto oldColorGrading = view->getColorGrading(); - view->setColorGrading(newColorGrading); - - if (oldColorGrading) - { - engine->destroy(oldColorGrading); + return nullptr; } + auto colorGrading = ColorGrading::Builder().toneMapper(tm).build(*engine); + delete tm; + return reinterpret_cast(colorGrading); } void View_setAntiAliasing(TView *tView, bool msaa, bool fxaa, bool taa) diff --git a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp index 2823fc50..8fc77ff9 100644 --- a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp @@ -133,6 +133,26 @@ extern "C" auto fut = _renderThread->add_task(lambda); } + EMSCRIPTEN_KEEPALIVE void Engine_destroyViewRenderThread(TEngine *tEngine, TView *tView, void (*onComplete)()) { + std::packaged_task lambda( + [=]() mutable + { + Engine_destroyView(tEngine, tView); + onComplete(); + }); + auto fut = _renderThread->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void Engine_destroySceneRenderThread(TEngine *tEngine, TScene *tScene, void (*onComplete)()) { + std::packaged_task lambda( + [=]() mutable + { + Engine_destroyScene(tEngine, tScene); + onComplete(); + }); + auto fut = _renderThread->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void Engine_createCameraRenderThread(TEngine* tEngine, void (*onComplete)(TCamera *)) { std::packaged_task lambda( [=]() mutable @@ -153,6 +173,16 @@ extern "C" auto fut = _renderThread->add_task(lambda); } + EMSCRIPTEN_KEEPALIVE void Engine_destroyRenderThread(TEngine *tEngine, void (*onComplete)()) { + std::packaged_task lambda( + [=]() mutable + { + Engine_destroy(tEngine); + onComplete(); + }); + auto fut = _renderThread->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void Engine_destroyTextureRenderThread(TEngine *engine, TTexture *tTexture, void (*onComplete)()) { std::packaged_task lambda( @@ -438,13 +468,35 @@ extern "C" }); auto fut = _renderThread->add_task(lambda); } - - EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, TToneMapping toneMapping, void (*callback)()) + + EMSCRIPTEN_KEEPALIVE void ColorGrading_createRenderThread(TEngine *tEngine, TToneMapping toneMapping, void (*callback)(TColorGrading *)) { std::packaged_task lambda( [=] { - View_setToneMapping(tView, tEngine, toneMapping); + auto cg = ColorGrading_create(tEngine, toneMapping); + callback(cg); + }); + auto fut = _renderThread->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void Engine_destroyColorGradingRenderThread(TEngine *tEngine, TColorGrading *tColorGrading, void (*callback)()) + { + std::packaged_task lambda( + [=] + { + Engine_destroyColorGrading(tEngine, tColorGrading); + callback(); + }); + auto fut = _renderThread->add_task(lambda); + } + + EMSCRIPTEN_KEEPALIVE void View_setColorGradingRenderThread(TView *tView, TColorGrading *tColorGrading, void (*callback)()) + { + std::packaged_task lambda( + [=] + { + View_setColorGrading(tView, tColorGrading); callback(); }); auto fut = _renderThread->add_task(lambda);