From 744e39e8dd7f8863f2b5168b09433141fa45e0ec Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 4 Jan 2025 14:48:48 +0800 Subject: [PATCH] fix: move removeIbl to render thread --- .../src/ffi/src/thermion_viewer_ffi.dart | 4 +++- .../native/include/c_api/ThermionDartApi.h | 3 ++- .../c_api/ThermionDartRenderThreadApi.h | 1 + .../native/src/c_api/ThermionDartApi.cpp | 9 +++++---- .../src/c_api/ThermionDartRenderThreadApi.cpp | 18 +++++++++++------- thermion_dart/test/light_tests.dart | 12 ++++++++++++ 6 files changed, 34 insertions(+), 13 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 00cb2dd8..c8f7fc8e 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 @@ -409,7 +409,9 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeIbl() async { - remove_ibl(_viewer!); + await withVoidCallback((cb) { + Viewer_removeIblRenderThread(_viewer!, cb); + }); } @override diff --git a/thermion_dart/native/include/c_api/ThermionDartApi.h b/thermion_dart/native/include/c_api/ThermionDartApi.h index 7ddf592a..843e9342 100644 --- a/thermion_dart/native/include/c_api/ThermionDartApi.h +++ b/thermion_dart/native/include/c_api/ThermionDartApi.h @@ -62,10 +62,11 @@ extern "C" EMSCRIPTEN_KEEPALIVE void load_skybox(TViewer *viewer, const char *skyboxPath); EMSCRIPTEN_KEEPALIVE void Viewer_loadIbl(TViewer *viewer, const char *iblPath, float intensity); + EMSCRIPTEN_KEEPALIVE void Viewer_removeIbl(TViewer *viewer); EMSCRIPTEN_KEEPALIVE void create_ibl(TViewer *viewer, float r, float g, float b, float intensity); EMSCRIPTEN_KEEPALIVE void rotate_ibl(TViewer *viewer, float *rotationMatrix); EMSCRIPTEN_KEEPALIVE void remove_skybox(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE void remove_ibl(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE EntityId get_main_camera(TViewer *viewer); diff --git a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h index d21e0b72..3a7ac7ac 100644 --- a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h @@ -38,6 +38,7 @@ namespace thermion EMSCRIPTEN_KEEPALIVE void Viewer_captureRenderTargetRenderThread(TViewer *viewer, TView *view, TSwapChain *swapChain, TRenderTarget *renderTarget, uint8_t *out, void (*onComplete)()); 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_removeIblRenderThread(TViewer *viewer, 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)()); diff --git a/thermion_dart/native/src/c_api/ThermionDartApi.cpp b/thermion_dart/native/src/c_api/ThermionDartApi.cpp index 931da94b..30c2fe15 100644 --- a/thermion_dart/native/src/c_api/ThermionDartApi.cpp +++ b/thermion_dart/native/src/c_api/ThermionDartApi.cpp @@ -89,6 +89,11 @@ extern "C" ((FilamentViewer *)viewer)->loadIbl(iblPath, intensity); } + EMSCRIPTEN_KEEPALIVE void Viewer_removeIbl(TViewer *viewer) + { + ((FilamentViewer *)viewer)->removeIbl(); + } + EMSCRIPTEN_KEEPALIVE void rotate_ibl(TViewer *viewer, float *rotationMatrix) { math::mat3f matrix(rotationMatrix[0], rotationMatrix[1], @@ -108,10 +113,6 @@ extern "C" ((FilamentViewer *)viewer)->removeSkybox(); } - EMSCRIPTEN_KEEPALIVE void remove_ibl(TViewer *viewer) - { - ((FilamentViewer *)viewer)->removeIbl(); - } EMSCRIPTEN_KEEPALIVE int get_instance_count(TSceneManager *sceneManager, EntityId entityId) { diff --git a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp index 58a9a47d..20e976c3 100644 --- a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp @@ -268,6 +268,17 @@ extern "C" auto fut = _rl->add_task(lambda); } + EMSCRIPTEN_KEEPALIVE void Viewer_removeIblRenderThread(TViewer *viewer, void (*onComplete)()) + { + std::packaged_task lambda( + [=]() mutable + { + Viewer_removeIbl(viewer); + onComplete(); + }); + auto fut = _rl->add_task(lambda); + } + EMSCRIPTEN_KEEPALIVE void Viewer_createRenderTargetRenderThread(TViewer *viewer, intptr_t texture, uint32_t width, uint32_t height, void (*onComplete)(TRenderTarget *)) { std::packaged_task lambda( @@ -549,13 +560,6 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(TViewer *viewer) - { - std::packaged_task lambda([=] - { remove_ibl(viewer); }); - auto fut = _rl->add_task(lambda); - } - EMSCRIPTEN_KEEPALIVE void View_setToneMappingRenderThread(TView *tView, TEngine *tEngine, thermion::ToneMapping toneMapping) { std::packaged_task lambda( diff --git a/thermion_dart/test/light_tests.dart b/thermion_dart/test/light_tests.dart index c46b0085..a21db24e 100644 --- a/thermion_dart/test/light_tests.dart +++ b/thermion_dart/test/light_tests.dart @@ -18,5 +18,17 @@ void main() async { await testHelper.capture(viewer, "remove_lights"); }); }); + + test('add/remove IBL', () async { + await testHelper.withViewer((viewer) async { + await viewer.loadGlb("file://${testHelper.testDir}/assets/cube.glb"); + + await viewer + .loadIbl("file://${testHelper.testDir}/assets/default_env_ibl.ktx"); + await testHelper.capture(viewer, "load_ibl"); + await viewer.removeIbl(); + await testHelper.capture(viewer, "remove_ibl"); + }); + }); }); }