From a5991c15c2ebab726b0102d53eebcd95cb3a7aaa Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 11 May 2024 22:40:22 +0800 Subject: [PATCH] EM_ASM callbacks --- .../native/src/DartFilamentFFIApi.cpp | 81 ++++++++++++++----- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/dart_filament/native/src/DartFilamentFFIApi.cpp b/dart_filament/native/src/DartFilamentFFIApi.cpp index 720496c2..b736e648 100644 --- a/dart_filament/native/src/DartFilamentFFIApi.cpp +++ b/dart_filament/native/src/DartFilamentFFIApi.cpp @@ -1,16 +1,3 @@ - -#include "DartFilamentFFIApi.h" - -#include "FilamentViewer.hpp" -#include "Log.hpp" -#include "ThreadPool.hpp" -#include "filament/LightManager.h" - -#include -#include -#include -#include - #ifdef __EMSCRIPTEN__ #define GL_GLEXT_PROTOTYPES #include @@ -29,11 +16,29 @@ extern "C" extern EMSCRIPTEN_KEEPALIVE EMSCRIPTEN_WEBGL_CONTEXT_HANDLE flutter_filament_web_create_gl_context(); } #include + + #endif +#include "DartFilamentFFIApi.h" + +#include "FilamentViewer.hpp" +#include "Log.hpp" +#include "ThreadPool.hpp" +#include "filament/LightManager.h" + +#include +#include +#include +#include + using namespace flutter_filament; using namespace std::chrono_literals; +void doSomeStuff(void* ptr) { + std::cout << "DOING SOME STUFF ON MAIN THREDA" << std::endl; +} + class RenderLoop { public: @@ -102,11 +107,18 @@ public: std::cout << "Failed to make context current." << std::endl; return (FilamentViewer*)nullptr; } + glClearColor(0.0, 1.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + emscripten_webgl_commit_frame(); + _viewer = new FilamentViewer((void* const) emContext, loader, platform, uberArchivePath); + MAIN_THREAD_EM_ASM({ + window.resolveCallback($0, $1); + }, callback, _viewer); #else _viewer = new FilamentViewer(context, loader, platform, uberArchivePath); + callback(_viewer); #endif - callback(_viewer); return _viewer; }); auto fut = add_task(lambda); } @@ -188,6 +200,7 @@ extern "C" void *const renderCallbackOwner, void (*callback)(void *const)) { + if (!_rl) { _rl = new RenderLoop(); @@ -212,7 +225,13 @@ extern "C" [=]() mutable { create_swap_chain(viewer, surface, width, height); + #ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + window.resolveCallback($0); + }, onComplete); + #else onComplete(); + #endif }); auto fut = _rl->add_task(lambda); } @@ -251,7 +270,14 @@ extern "C" std::packaged_task lambda([=]() mutable { update_viewport_and_camera_projection(viewer, width, height, scaleFactor); - onComplete(); }); + #ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + window.resolveCallback($0); + }, onComplete); + #else + onComplete(); + #endif + }); auto fut = _rl->add_task(lambda); } @@ -310,7 +336,13 @@ extern "C" std::packaged_task lambda([=]() mutable { auto entity = load_gltf(sceneManager, path, relativeResourcePath); - callback(entity); + #ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + window.resolveCallback($0, $1); + }, callback, entity); + #else + callback(entity); + #endif return entity; }); auto fut = _rl->add_task(lambda); } @@ -322,7 +354,13 @@ extern "C" [=]() mutable { auto entity = load_glb(sceneManager, path, numInstances); - callback(entity); + #ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + window.resolveCallback($0, $1); + }, callback, entity); + #else + callback(entity); + #endif return entity; }); auto fut = _rl->add_task(lambda); @@ -390,7 +428,14 @@ extern "C" std::packaged_task lambda([=] { load_skybox(viewer, skyboxPath); - onComplete(); }); + #ifdef __EMSCRIPTEN__ + MAIN_THREAD_EM_ASM({ + window.resolveCallback($0); + }, onComplete); + #else + onComplete(); + #endif + }); auto fut = _rl->add_task(lambda); }