From f8ae90b6310259660d1fbe0840658bef6b66016b Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 18 Dec 2024 08:57:26 +0800 Subject: [PATCH] internal: add destroyRenderTargetRenderThread --- .../src/ffi/src/thermion_viewer_ffi.dart | 20 +++++-------------- .../c_api/ThermionDartRenderThreadApi.h | 1 + .../src/c_api/ThermionDartRenderThreadApi.cpp | 10 ++++++++++ 3 files changed, 16 insertions(+), 15 deletions(-) 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 2d62bba0..8f47f411 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 @@ -93,19 +93,10 @@ class ThermionViewerFFI extends ThermionViewer { _logger.info( "Viewer is being (or has been) disposed; this will clean up all render targets."); } else { - Viewer_destroyRenderTarget(_viewer!, renderTarget.renderTarget); - } - } - - /// - /// - /// - Future setRenderTarget(FFIRenderTarget? renderTarget) async { - final view = (await getViewAt(0)) as FFIView; - if (renderTarget != null) { - View_setRenderTarget(view.view, renderTarget.renderTarget); - } else { - View_setRenderTarget(view.view, nullptr); + await withVoidCallback((cb) { + Viewer_destroyRenderTargetRenderThread( + _viewer!, renderTarget.renderTarget, cb); + }); } } @@ -1769,8 +1760,7 @@ class ThermionViewerFFI extends ThermionViewer { _sceneManager!, material.pointer, cb); } }); - _grid = - FFIAsset(ptr, _sceneManager!, _engine!, _unlitMaterialProvider!); + _grid = FFIAsset(ptr, _sceneManager!, _engine!, _unlitMaterialProvider!); } await _grid!.addToScene(); await setLayerVisibility(VisibilityLayers.OVERLAY, true); diff --git a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h index 9fff460f..d21e0b72 100644 --- a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h @@ -39,6 +39,7 @@ namespace thermion EMSCRIPTEN_KEEPALIVE void Viewer_requestFrameRenderThread(TViewer *viewer, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Viewer_loadIblRenderThread(TViewer *viewer, const char *iblPath, float intensity, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Viewer_createRenderTargetRenderThread(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height, void (*onComplete)(TRenderTarget *)); + EMSCRIPTEN_KEEPALIVE void Viewer_destroyRenderTargetRenderThread(TViewer *viewer, TRenderTarget *tRenderTarget, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE void Engine_buildMaterialRenderThread(TEngine *tEngine, const uint8_t* materialData, size_t length, void (*onComplete)(TMaterial *)); EMSCRIPTEN_KEEPALIVE void Engine_destroyMaterialRenderThread(TEngine *tEngine, TMaterial *tMaterial, void (*onComplete)()); diff --git a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp index 7a8e53fb..862c98d0 100644 --- a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp @@ -279,6 +279,16 @@ extern "C" auto fut = _rl->add_task(lambda); } + EMSCRIPTEN_KEEPALIVE void Viewer_destroyRenderTargetRenderThread(TViewer *tViewer, TRenderTarget *tRenderTarget, void (*onComplete)()) { + std::packaged_task lambda( + [=]() mutable + { + Viewer_destroyRenderTarget(tViewer, tRenderTarget); + onComplete(); + }); + auto fut = _rl->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void Engine_buildMaterialRenderThread(TEngine *tEngine, const uint8_t *materialData, size_t length, void (*onComplete)(TMaterial *)) { std::packaged_task lambda(