From 95b378348c0e4aac24282d6f8ff04dc7d61fb304 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 27 Sep 2024 15:11:47 +0800 Subject: [PATCH] refactor!: remove RenderThread methods no longer needed --- .../src/ffi/src/thermion_viewer_ffi.dart | 80 +++++++++---------- .../include/ThermionDartRenderThreadApi.h | 26 +----- .../src/ThermionDartRenderThreadApi.cpp | 80 +++---------------- 3 files changed, 47 insertions(+), 139 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 3b0f698a..38021be7 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 @@ -336,7 +336,7 @@ class ThermionViewerFFI extends ThermionViewer { Future loadIbl(String lightingPath, {double intensity = 30000}) async { final pathPtr = lightingPath.toNativeUtf8(allocator: allocator).cast(); - load_ibl_render_thread(_viewer!, pathPtr, intensity); + load_ibl(_viewer!, pathPtr, intensity); } /// @@ -365,7 +365,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeIbl() async { - remove_ibl_render_thread(_viewer!); + remove_ibl(_viewer!); } @override @@ -408,7 +408,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future addDirectLight(DirectLight directLight) async { - var entity = await withIntCallback((callback) => add_light_render_thread( + var entity = add_light( _viewer!, directLight.type.index, directLight.color, @@ -426,7 +426,7 @@ class ThermionViewerFFI extends ThermionViewer { directLight.sunHaloSize, directLight.sunHaloFallof, directLight.castShadows, - callback)); + ); if (entity == _FILAMENT_ASSET_ERROR) { throw Exception("Failed to add light to scene"); } @@ -440,7 +440,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future removeLight(ThermionEntity entity) async { - remove_light_render_thread(_viewer!, entity); + remove_light(_viewer!, entity); _sceneUpdateEventController.add(SceneUpdateEvent.remove(entity)); } @@ -449,8 +449,7 @@ class ThermionViewerFFI extends ThermionViewer { /// @override Future clearLights() async { - clear_lights_render_thread(_viewer!); - + clear_lights(_viewer!); _sceneUpdateEventController.add(SceneUpdateEvent.clearLights()); } @@ -941,12 +940,21 @@ class ThermionViewerFFI extends ThermionViewer { /// /// Future setTransform(ThermionEntity entity, Matrix4 transform) async { - final ptr = allocator(16); - for (int i = 0; i < 16; i++) { - ptr[i] = transform[i]; - } - set_transform(_sceneManager!, entity, ptr); - allocator.free(ptr); + SceneManager_setTransform( + _sceneManager!, entity, transform.storage.address); + } + + /// + /// + /// + Future queueTransformUpdates( + List entities, List transforms) async { + var tEntities = Int32List.fromList(entities); + var tTransforms = + Float64List.fromList(transforms.expand((t) => t.storage).toList()); + + SceneManager_queueTransformUpdates(_sceneManager!, tEntities.address, + tTransforms.address, tEntities.length); } /// @@ -1466,36 +1474,6 @@ class ThermionViewerFFI extends ThermionViewer { set_scale(_sceneManager!, entity, scale); } - /// - /// - /// - Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion rotation, - {bool relative = false}) async { - queue_rotation_update(_sceneManager!, entity, rotation.radians, rotation.x, - rotation.y, rotation.z, rotation.w, relative); - } - - /// - /// - /// - @override - Future queueRotationUpdate( - ThermionEntity entity, double rads, double x, double y, double z, - {bool relative = false}) async { - var quat = Quaternion.axisAngle(Vector3(x, y, z), rads); - await queueRotationUpdateQuat(entity, quat, relative: relative); - } - - /// - /// - /// - @override - Future queuePositionUpdate( - ThermionEntity entity, double x, double y, double z, - {bool relative = false}) async { - queue_position_update(_sceneManager!, entity, x, y, z, relative); - } - /// /// Queues an update to the worldspace position for [entity] to the viewport coordinates {x,y}. /// The actual update will occur on the next frame, and will be subject to collision detection. @@ -2176,7 +2154,15 @@ class ThermionViewerFFI extends ThermionViewer { for (final hook in _hooks) { await hook.call(); } - request_frame_render_thread(_viewer!); + final completer = Completer(); + + final callback = NativeCallable.listener(() { + completer.complete(true); + }); + + request_frame_render_thread(_viewer!, callback.nativeFunction); + + await completer.future; } Future createCamera() async { @@ -2261,4 +2247,10 @@ class ThermionFFIMaterialInstance extends MaterialInstance { Future setDepthWriteEnabled(bool enabled) async { MaterialInstance_setDepthWrite(this._pointer, enabled); } + + @override + Future setParameterFloat2(String name, double x, double y) async { + MaterialInstance_setParameterFloat2( + _pointer, name.toNativeUtf8().cast(), x, y); + } } diff --git a/thermion_dart/native/include/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/ThermionDartRenderThreadApi.h index 8f11c03d..cccafd34 100644 --- a/thermion_dart/native/include/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/ThermionDartRenderThreadApi.h @@ -33,7 +33,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void capture_render_thread(TViewer *viewer, uint8_t* out, void (*onComplete)()); EMSCRIPTEN_KEEPALIVE FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback); EMSCRIPTEN_KEEPALIVE void set_rendering_render_thread(TViewer *viewer, bool rendering, void(*onComplete)()); - EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer, void(*onComplete)()); EMSCRIPTEN_KEEPALIVE void set_frame_interval_render_thread(TViewer *viewer, float frameInterval); EMSCRIPTEN_KEEPALIVE void set_background_color_render_thread(TViewer *viewer, const float r, const float g, const float b, const float a); EMSCRIPTEN_KEEPALIVE void clear_background_image_render_thread(TViewer *viewer); @@ -42,30 +42,8 @@ extern "C" EMSCRIPTEN_KEEPALIVE void set_tone_mapping_render_thread(TViewer *viewer, int toneMapping); EMSCRIPTEN_KEEPALIVE void set_bloom_render_thread(TViewer *viewer, float strength); EMSCRIPTEN_KEEPALIVE void load_skybox_render_thread(TViewer *viewer, const char *skyboxPath, void (*onComplete)()); - EMSCRIPTEN_KEEPALIVE void load_ibl_render_thread(TViewer *viewer, const char *iblPath, float intensity); EMSCRIPTEN_KEEPALIVE void remove_skybox_render_thread(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE void remove_ibl_render_thread(TViewer *viewer); - EMSCRIPTEN_KEEPALIVE void add_light_render_thread( - TViewer *viewer, - uint8_t type, - float colour, - float intensity, - float posX, - float posY, - float posZ, - float dirX, - float dirY, - float dirZ, - float falloffRadius, - float spotLightConeInner, - float spotLightConeOuter, - float sunAngularRadius, - float sunHaloSize, - float sunHaloFallof, - bool shadows, - void (*callback)(EntityId)); - EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(TViewer *viewer, EntityId entityId); - EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(TViewer *viewer); + EMSCRIPTEN_KEEPALIVE void load_glb_render_thread(TSceneManager *sceneManager, const char *assetPath, int numInstances, bool keepData, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void load_glb_from_buffer_render_thread(TSceneManager *sceneManager, const uint8_t *const data, size_t length, int numInstances, bool keepData, int priority, int layer, void (*callback)(EntityId)); EMSCRIPTEN_KEEPALIVE void load_gltf_render_thread(TSceneManager *sceneManager, const char *assetPath, const char *relativePath, bool keepData, void (*callback)(EntityId)); diff --git a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp index cf412269..57e3636b 100644 --- a/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/ThermionDartRenderThreadApi.cpp @@ -82,9 +82,10 @@ public: } } - void requestFrame() + void requestFrame(void (*callback)()) { this->_render = true; + this->_requestFrameRenderCallback = callback; } void iter() @@ -93,6 +94,7 @@ public: if (_render) { doRender(); + this->_requestFrameRenderCallback(); _render = false; // Calculate and print FPS @@ -214,9 +216,12 @@ public: return ret; } +public: + std::atomic_bool _render = false; + private: + void(*_requestFrameRenderCallback)() = nullptr; bool _stop = false; - bool _render = false; int _frameIntervalInMicroseconds = 1000000 / 60; std::mutex _mutex; std::condition_variable _cv; @@ -317,7 +322,7 @@ extern "C" auto fut = _rl->add_task(lambda); } - EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer) + EMSCRIPTEN_KEEPALIVE void request_frame_render_thread(TViewer *viewer, void(*onComplete)()) { if (!_rl) { @@ -325,7 +330,7 @@ extern "C" } else { - _rl->requestFrame(); + _rl->requestFrame(onComplete); } } @@ -505,73 +510,6 @@ extern "C" auto fut = _rl->add_task(lambda); } - void add_light_render_thread( - TViewer *viewer, - uint8_t type, - float colour, - float intensity, - float posX, - float posY, - float posZ, - float dirX, - float dirY, - float dirZ, - float falloffRadius, - float spotLightConeInner, - float spotLightConeOuter, - float sunAngularRadius, - float sunHaloSize, - float sunHaloFallof, - bool shadows, - void (*callback)(EntityId)) - { - std::packaged_task lambda([=] - { - auto entity = add_light( - viewer, - type, - colour, - intensity, - posX, - posY, - posZ, - dirX, - dirY, - dirZ, - falloffRadius, - spotLightConeInner, - spotLightConeOuter, - sunAngularRadius, - sunHaloSize, - sunHaloFallof, - shadows); -#ifdef __EMSCRIPTEN__ - MAIN_THREAD_EM_ASM({ - moduleArg.dartFilamentResolveCallback($0, $1); - }, callback, entity); -#else - callback(entity); -#endif - - return entity; }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void remove_light_render_thread(TViewer *viewer, - EntityId entityId) - { - std::packaged_task lambda([=] - { remove_light(viewer, entityId); }); - auto fut = _rl->add_task(lambda); - } - - EMSCRIPTEN_KEEPALIVE void clear_lights_render_thread(TViewer *viewer) - { - std::packaged_task lambda([=] - { clear_lights(viewer); }); - auto fut = _rl->add_task(lambda); - } - EMSCRIPTEN_KEEPALIVE void remove_entity_render_thread(TViewer *viewer, EntityId asset, void (*callback)()) {