From e8ba136863f2d1bdbbb71db9d0fdf62127ca2d02 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Fri, 29 Sep 2023 17:58:12 +0800 Subject: [PATCH] more FFI work --- ios/include/PolyvoxFilamentApi.h | 4 +- ios/include/PolyvoxFilamentFFIApi.h | 32 +- ios/include/ResourceBuffer.hpp | 2 +- ios/src/FilamentViewer.cpp | 8 +- ios/src/PolyvoxFilamentApi.cpp | 5 +- ios/src/PolyvoxFilamentFFIApi.cpp | 355 ++++++++++++---- lib/filament_controller_ffi.dart | 53 +-- lib/filament_widget.dart | 64 +-- lib/generated_bindings.dart | 382 ++++++++++++------ .../Classes/SwiftPolyvoxFilamentPlugin.swift | 24 +- macos/include/PolyvoxFilamentApi.h | 4 +- macos/include/PolyvoxFilamentFFIApi.h | 32 +- macos/include/ResourceBuffer.hpp | 2 +- macos/src/FilamentViewer.cpp | 8 +- macos/src/PolyvoxFilamentApi.cpp | 5 +- macos/src/PolyvoxFilamentFFIApi.cpp | 355 ++++++++++++---- pubspec.yaml | 6 +- 17 files changed, 927 insertions(+), 414 deletions(-) diff --git a/ios/include/PolyvoxFilamentApi.h b/ios/include/PolyvoxFilamentApi.h index b501ee52..4fc2bed6 100644 --- a/ios/include/PolyvoxFilamentApi.h +++ b/ios/include/PolyvoxFilamentApi.h @@ -3,13 +3,15 @@ #include "ResourceBuffer.hpp" +#include + typedef int32_t EntityId; const void* create_filament_viewer(const void* const context, const ResourceLoaderWrapper* const loader); ResourceLoaderWrapper* make_resource_loader(LoadFilamentResourceFromOwner loadFn, FreeFilamentResourceFromOwner freeFn, void* owner); void destroy_filament_viewer(const void* const viewer); void* get_asset_manager(const void* const viewer); -void create_render_target(const void* const viewer, uint32_t textureId, uint32_t width, uint32_t height); +void create_render_target(const void* const viewer, intptr_t texture, uint32_t width, uint32_t height); void clear_background_image(const void* const viewer); void set_background_image(const void* const viewer, const char *path, bool fillHeight); void set_background_image_position(const void* const viewer, float x, float y, bool clamp); diff --git a/ios/include/PolyvoxFilamentFFIApi.h b/ios/include/PolyvoxFilamentFFIApi.h index bd6c2516..6cafa42f 100644 --- a/ios/include/PolyvoxFilamentFFIApi.h +++ b/ios/include/PolyvoxFilamentFFIApi.h @@ -1,13 +1,13 @@ #ifndef _POLYVOX_FILAMENT_FFI_API_H #define _POLYVOX_FILAMENT_FFI_API_H -#include "PolyvoxFilamentApi.h" - /// /// This header replicates most of the methods in PolyvoxFilamentApi.h, and is only intended to be used to generate client FFI bindings. /// The intention is that calling one of these methods will call its respective method in PolyvoxFilamentApi.h, but wrapped in some kind of thread runner to ensure thread safety. /// +#include "PolyvoxFilamentApi.h" + typedef int32_t EntityId; void* const create_filament_viewer_ffi(void* const context, const ResourceLoaderWrapper* const loader, void (*renderCallback)(void* const renderCallbackOwner), void* const renderCallbackOwner); @@ -33,25 +33,25 @@ void remove_light_ffi(void* const viewer, EntityId entityId); void clear_lights_ffi(void* const viewer); EntityId load_glb_ffi(void* const assetManager, const char *assetPath, bool unlit); EntityId load_gltf_ffi(void* const assetManager, const char *assetPath, const char *relativePath); -void remove_asset_ffi(void* const const viewer, EntityId asset); -void clear_assets_ffi(void* const const viewer); +void remove_asset_ffi(void* const viewer, EntityId asset); +void clear_assets_ffi(void* const viewer); bool set_camera_ffi(void* const viewer, EntityId asset, const char *nodeName); void apply_weights_ffi( - void* assetManager, + void* const assetManager, EntityId asset, const char *const entityName, float *const weights, int count ); void set_morph_target_weights_ffi( - void* assetManager, + void* const assetManager, EntityId asset, const char *const entityName, const float *const morphData, int numWeights ); bool set_morph_animation_ffi( - void* assetManager, + void* const assetManager, EntityId asset, const char *const entityName, const float *const morphData, @@ -61,7 +61,7 @@ bool set_morph_animation_ffi( float frameLengthInMs); void set_bone_animation_ffi( - void* assetManager, + void* const assetManager, EntityId asset, const float* const frameData, int numFrames, @@ -71,13 +71,13 @@ void set_bone_animation_ffi( int numMeshTargets, float frameLengthInMs); -void play_animation_ffi(void* assetManager, EntityId asset, int index, bool loop, bool reverse, bool replaceActive, float crossfade); -void set_animation_frame_ffi(void* assetManager, EntityId asset, int animationIndex, int animationFrame); -void stop_animation_ffi(void* assetManager, EntityId asset, int index); -int get_animation_count_ffi(void* assetManager, EntityId asset); -void get_animation_name_ffi(void* assetManager, EntityId asset, char *const outPtr, int index); -float get_animation_duration_ffi(void* assetManager, EntityId asset, int index); -void get_morph_target_name_ffi(void* assetManager, EntityId asset, const char *meshName, char *const outPtr, int index); -int get_morph_target_name_count_ffi(void* assetManager, EntityId asset, const char *meshName); +void play_animation_ffi(void* const assetManager, EntityId asset, int index, bool loop, bool reverse, bool replaceActive, float crossfade); +void set_animation_frame_ffi(void* const assetManager, EntityId asset, int animationIndex, int animationFrame); +void stop_animation_ffi(void* const assetManager, EntityId asset, int index); +int get_animation_count_ffi(void* const assetManager, EntityId asset); +void get_animation_name_ffi(void* const assetManager, EntityId asset, char *const outPtr, int index); +float get_animation_duration_ffi(void* const assetManager, EntityId asset, int index); +void get_morph_target_name_ffi(void* const assetManager, EntityId asset, const char *meshName, char *const outPtr, int index); +int get_morph_target_name_count_ffi(void* const assetManager, EntityId asset, const char *meshName); #endif // _POLYVOX_FILAMENT_FFI_API_H diff --git a/ios/include/ResourceBuffer.hpp b/ios/include/ResourceBuffer.hpp index d22e05c8..a8e51325 100644 --- a/ios/include/ResourceBuffer.hpp +++ b/ios/include/ResourceBuffer.hpp @@ -33,7 +33,7 @@ extern "C" { #endif const void * const data; - const uint32_t size; + const int64_t size; const uint32_t id; }; diff --git a/ios/src/FilamentViewer.cpp b/ios/src/FilamentViewer.cpp index 7fc12ad4..1f053842 100644 --- a/ios/src/FilamentViewer.cpp +++ b/ios/src/FilamentViewer.cpp @@ -112,6 +112,8 @@ FilamentViewer::FilamentViewer(const void* context, const ResourceLoaderWrapper* #if TARGET_OS_IPHONE _engine = Engine::create(Engine::Backend::METAL); + #elif TARGET_OS_OSX + _engine = Engine::create(Engine::Backend::METAL); #else _engine = Engine::create(Engine::Backend::OPENGL); //L, nullptr, (void*)context, nullptr); #endif @@ -565,7 +567,7 @@ void FilamentViewer::createSwapChain(const void *window, uint32_t width, uint32_ Log("Swapchain created."); } -void FilamentViewer::createRenderTarget(intptr_t textureId, uint32_t width, uint32_t height) { +void FilamentViewer::createRenderTarget(intptr_t texture, uint32_t width, uint32_t height) { // Create filament textures and render targets (note the color buffer has the import call) _rtColor = filament::Texture::Builder() .width(width) @@ -573,7 +575,7 @@ void FilamentViewer::createRenderTarget(intptr_t textureId, uint32_t width, uint .levels(1) .usage(filament::Texture::Usage::COLOR_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE) .format(filament::Texture::InternalFormat::RGBA8) - .import(textureId) + .import(texture) .build(*_engine); _rtDepth = filament::Texture::Builder() .width(width) @@ -590,7 +592,7 @@ void FilamentViewer::createRenderTarget(intptr_t textureId, uint32_t width, uint // Make a specific viewport just for our render target _view->setRenderTarget(_rt); - Log("Set render target for glTextureId %u %u x %u", textureId, width, height); + Log("Set render target for glTextureId %u %u x %u", texture, width, height); } diff --git a/ios/src/PolyvoxFilamentApi.cpp b/ios/src/PolyvoxFilamentApi.cpp index 4ecc0757..21334347 100644 --- a/ios/src/PolyvoxFilamentApi.cpp +++ b/ios/src/PolyvoxFilamentApi.cpp @@ -15,6 +15,7 @@ using namespace polyvox; extern "C" { #include "PolyvoxFilamentApi.h" + FLUTTER_PLUGIN_EXPORT const void* create_filament_viewer(const void* context, const ResourceLoaderWrapper* const loader) { return (const void*) new FilamentViewer(context, loader); @@ -24,8 +25,8 @@ extern "C" { return new ResourceLoaderWrapper(loadFn, freeFn, owner); } - FLUTTER_PLUGIN_EXPORT void create_render_target(const void* const viewer, uint32_t textureId, uint32_t width, uint32_t height) { - ((FilamentViewer*)viewer)->createRenderTarget(textureId, width, height); + FLUTTER_PLUGIN_EXPORT void create_render_target(const void* const viewer, intptr_t texture, uint32_t width, uint32_t height) { + ((FilamentViewer*)viewer)->createRenderTarget(texture, width, height); } FLUTTER_PLUGIN_EXPORT void destroy_filament_viewer(const void* const viewer) { diff --git a/ios/src/PolyvoxFilamentFFIApi.cpp b/ios/src/PolyvoxFilamentFFIApi.cpp index 8ed0021c..c84b2c48 100644 --- a/ios/src/PolyvoxFilamentFFIApi.cpp +++ b/ios/src/PolyvoxFilamentFFIApi.cpp @@ -5,6 +5,7 @@ #include "Log.hpp" #include "ThreadPool.hpp" + #include #include @@ -12,10 +13,13 @@ using namespace polyvox; #define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) -class RenderLoop { +class RenderLoop +{ public: - explicit RenderLoop() { - _t = new std::thread([this]() { + explicit RenderLoop() + { + _t = new std::thread([this]() + { while(!_stop) { std::function task; { @@ -35,121 +39,294 @@ public: } task(); - } - }); - } - ~RenderLoop() { - _stop = true; + } }); + } + ~RenderLoop() + { + _stop = true; _t->join(); - } + } - void* const createViewer(void* const context, const ResourceLoaderWrapper* const loader, void (*renderCallback)(void*), void* const owner) { + void *const createViewer(void *const context, const ResourceLoaderWrapper *const loader, void (*renderCallback)(void *), void *const owner) + { _renderCallback = renderCallback; - _renderCallbackOwner = owner; - std::packaged_task lambda([&]() mutable { - return new FilamentViewer(context, loader); - }); + _renderCallbackOwner = owner; + std::packaged_task lambda([&]() mutable + { return new FilamentViewer(context, loader); }); auto fut = add_task(lambda); fut.wait(); _viewer = fut.get(); - return (void* const)_viewer; + return (void *const)_viewer; } - void setRendering(bool rendering) { + void setRendering(bool rendering) + { _rendering = rendering; } - void doRender() { + void doRender() + { render(_viewer, 0); _renderCallback(_renderCallbackOwner); } - template - auto add_task(std::packaged_task& pt) -> std::future { - std::unique_lock lock(_access); - auto ret = pt.get_future(); - _tasks.push_back([pt=std::make_shared>(std::move(pt))]{ (*pt)();}); - _cond.notify_one(); - return ret; - } -private: + template + auto add_task(std::packaged_task &pt) -> std::future + { + std::unique_lock lock(_access); + auto ret = pt.get_future(); + _tasks.push_back([pt = std::make_shared>(std::move(pt))] + { (*pt)(); }); + _cond.notify_one(); + return ret; + } + +private: bool _stop = false; bool _rendering = false; int _frameIntervalInMilliseconds = 1000 / 60; - std::mutex _access; - FilamentViewer* _viewer = nullptr; - void (*_renderCallback)(void* const) = nullptr; - void* _renderCallbackOwner = nullptr; - std::thread* _t = nullptr; - std::condition_variable _cond; - std::deque> _tasks; - + std::mutex _access; + FilamentViewer *_viewer = nullptr; + void (*_renderCallback)(void *const) = nullptr; + void *_renderCallbackOwner = nullptr; + std::thread *_t = nullptr; + std::condition_variable _cond; + std::deque> _tasks; }; +extern "C" +{ +#include "PolyvoxFilamentApi.h" + static RenderLoop *_rl; -extern "C" { - - #include "PolyvoxFilamentApi.h" - - static RenderLoop* _rl; - - FLUTTER_PLUGIN_EXPORT void* const create_filament_viewer_ffi(void* const context, const ResourceLoaderWrapper* const loader, void (*renderCallback)(void* const renderCallbackOwner), void* const renderCallbackOwner) { - if(!_rl) { - _rl = new RenderLoop(); + FLUTTER_PLUGIN_EXPORT void *const create_filament_viewer_ffi(void *const context, const ResourceLoaderWrapper *const loader, void (*renderCallback)(void *const renderCallbackOwner), void *const renderCallbackOwner) + { + if (!_rl) + { + _rl = new RenderLoop(); + } + return _rl->createViewer(context, loader, renderCallback, renderCallbackOwner); } - return _rl->createViewer(context, loader, renderCallback, renderCallbackOwner); - } - - FLUTTER_PLUGIN_EXPORT void create_swap_chain_ffi(void* const viewer, void* const surface, uint32_t width, uint32_t height) { - std::packaged_task lambda([&]() mutable { - create_swap_chain(viewer, surface, width, height); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } + FLUTTER_PLUGIN_EXPORT void create_swap_chain_ffi(void *const viewer, void *const surface, uint32_t width, uint32_t height) + { + std::packaged_task lambda([&]() mutable + { create_swap_chain(viewer, surface, width, height); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } - FLUTTER_PLUGIN_EXPORT void create_render_target_ffi(void* const viewer, uint32_t nativeTextureId, uint32_t width, uint32_t height) { - std::packaged_task lambda([&]() mutable { - create_render_target(viewer, nativeTextureId, width, height); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } + FLUTTER_PLUGIN_EXPORT void create_render_target_ffi(void *const viewer, uint32_t nativeTextureId, uint32_t width, uint32_t height) + { + std::packaged_task lambda([&]() mutable + { create_render_target(viewer, nativeTextureId, width, height); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void update_viewport_and_camera_projection_ffi(void *const viewer, const uint32_t width, const uint32_t height, const float scaleFactor) + { + std::packaged_task lambda([&]() mutable + { update_viewport_and_camera_projection(viewer, width, height, scaleFactor); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } - FLUTTER_PLUGIN_EXPORT void update_viewport_and_camera_projection_ffi(void* const viewer, const uint32_t width, const uint32_t height, const float scaleFactor) { - std::packaged_task lambda([&]() mutable { - update_viewport_and_camera_projection(viewer, width, height, scaleFactor); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } - + FLUTTER_PLUGIN_EXPORT void set_rendering_ffi(bool rendering) + { + if (!_rl) + { + Log("No render loop!"); // PANIC? + } else { + if(rendering) { + Log("Set rendering to true"); + } else { + Log("Set rendering to false"); + } + _rl->setRendering(rendering); + } + } - FLUTTER_PLUGIN_EXPORT bool set_rendering_ffi(bool rendering) { - if(!_rl) { - return false; - } - _rl->setRendering(rendering); - return true; - } + FLUTTER_PLUGIN_EXPORT void render_ffi(void *const viewer) + { + std::packaged_task lambda([&]() mutable + { _rl->doRender(); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } - FLUTTER_PLUGIN_EXPORT void render_ffi(void* const viewer) { - std::packaged_task lambda([&]() mutable { - _rl->doRender(); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } + FLUTTER_PLUGIN_EXPORT void set_background_color_ffi(void *const viewer, const float r, const float g, const float b, const float a) + { + std::packaged_task lambda([&]() mutable + { set_background_color(viewer, r, g, b, a); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } - FLUTTER_PLUGIN_EXPORT void set_background_color_ffi(void* const viewer, const float r, const float g, const float b, const float a) { - std::packaged_task lambda([&]() mutable { - set_background_color(viewer, r, g,b, a); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } + FLUTTER_PLUGIN_EXPORT EntityId load_glb_ffi(void *const assetManager, const char *path) + { + std::packaged_task lambda([&]() mutable + { return load_glb(assetManager, path, false); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + return fut.get(); + } + FLUTTER_PLUGIN_EXPORT void clear_background_image_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { clear_background_image(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + + FLUTTER_PLUGIN_EXPORT void set_background_image_ffi(void *const viewer, const char *path, bool fillHeight) + { + std::packaged_task lambda([&] + { set_background_image(viewer, path, fillHeight); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void set_background_image_position_ffi(void *const viewer, float x, float y, bool clamp) + { + std::packaged_task lambda([&] + { set_background_image_position(viewer, x, y, clamp); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void set_tone_mapping_ffi(void *const viewer, int toneMapping) + { + std::packaged_task lambda([&] + { set_tone_mapping(viewer, toneMapping); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void set_bloom_ffi(void *const viewer, float strength) + { + std::packaged_task lambda([&] + { set_bloom(viewer, strength); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void load_skybox_ffi(void *const viewer, const char *skyboxPath) + { + std::packaged_task lambda([&] + { load_skybox(viewer, skyboxPath); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void load_ibl_ffi(void *const viewer, const char *iblPath, float intensity) + { + std::packaged_task lambda([&] + { load_ibl(viewer, iblPath, intensity); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void remove_skybox_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { remove_skybox(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void remove_ibl_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { remove_ibl(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + EntityId add_light_ffi(void *const viewer, uint8_t type, float colour, float intensity, float posX, float posY, float posZ, float dirX, float dirY, float dirZ, bool shadows) + { + std::packaged_task lambda([&] + { return add_light(viewer, type, colour, intensity, posX, posY, posZ, dirX, dirY, dirZ, shadows); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + return fut.get(); + } + FLUTTER_PLUGIN_EXPORT void remove_light_ffi(void *const viewer, EntityId entityId) + { + std::packaged_task lambda([&] + { remove_light(viewer, entityId); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void clear_lights_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { clear_lights(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + + FLUTTER_PLUGIN_EXPORT void remove_asset_ffi(void *const viewer, EntityId asset) + { + std::packaged_task lambda([&] + { remove_asset(viewer, asset); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void clear_assets_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { clear_assets(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + + FLUTTER_PLUGIN_EXPORT bool set_camera_ffi(void *const viewer, EntityId asset, const char *nodeName) + { + std::packaged_task lambda([&] + { return set_camera(viewer, asset, nodeName); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + return fut.get(); + } + + FLUTTER_PLUGIN_EXPORT void set_bone_animation_ffi( + void *assetManager, + EntityId asset, + const float *const frameData, + int numFrames, + int numBones, + const char **const boneNames, + const char **const meshName, + int numMeshTargets, + float frameLengthInMs) + { + std::packaged_task lambda([&] + { set_bone_animation( + assetManager, asset, frameData, numFrames, numBones, + boneNames, meshName, numMeshTargets, frameLengthInMs); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + // implementations of rest of animation functions + FLUTTER_PLUGIN_EXPORT void get_morph_target_name_ffi(void *assetManager, EntityId asset, const char *meshName, char *const outPtr, int index) + { + std::packaged_task lambda([&] + { get_morph_target_name(assetManager, asset, meshName, outPtr, index); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + + FLUTTER_PLUGIN_EXPORT int get_morph_target_name_count_ffi(void *assetManager, EntityId asset, const char *meshName) + { + std::packaged_task lambda([&] + { return get_morph_target_name_count(assetManager, asset, meshName); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + return fut.get(); + } + + void set_morph_target_weights_ffi( + void* const assetManager, + EntityId asset, + const char *const entityName, + const float *const morphData, + int numWeights + ) { + // TODO + } } diff --git a/lib/filament_controller_ffi.dart b/lib/filament_controller_ffi.dart index eab70760..387cb9ca 100644 --- a/lib/filament_controller_ffi.dart +++ b/lib/filament_controller_ffi.dart @@ -48,7 +48,7 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - _lib.set_rendering_ffi(_viewer!, render ? 1 : 0); + _lib.set_rendering_ffi(_viewer!, render); } Future render() async { @@ -59,7 +59,7 @@ class FilamentControllerFFI extends FilamentController { } Future setFrameRate(int framerate) async { - await _channel.invokeMethod("setFrameInterval", 1.0 / framerate); + _lib.set_frame_interval_ffi(1.0 / framerate); } void setPixelRatio(double ratio) { @@ -107,7 +107,9 @@ class FilamentControllerFFI extends FilamentController { await _channel.invokeMethod("createTexture", [size.width, size.height]); var flutterTextureId = textures[0]; _textureId = flutterTextureId; - var pixelBuffer = textures[1] as int; + var surfaceAddress = textures[1] as int? ?? 0; + + // void* on iOS/MacOS, GLuid on Android/Windows/Linux var nativeTexture = textures[2] as int; var renderCallbackResult = await _channel.invokeMethod("getRenderCallback"); @@ -127,9 +129,11 @@ class FilamentControllerFFI extends FilamentController { renderCallbackOwner); _lib.create_swap_chain( - _viewer!, Pointer.fromAddress(pixelBuffer), width, height); - - _lib.create_render_target(_viewer!, nativeTexture, width, height); + _viewer!, Pointer.fromAddress(surfaceAddress), width, height); + if (nativeTexture != 0) { + assert(surfaceAddress == 0); + _lib.create_render_target(_viewer!, nativeTexture, width, height); + } _lib.update_viewport_and_camera_projection_ffi( _viewer!, width, height, 1.0); @@ -162,7 +166,7 @@ class FilamentControllerFFI extends FilamentController { throw Exception("No viewer available, ignoring"); } _lib.set_background_image_ffi( - _viewer!, path.toNativeUtf8().cast(), fillHeight ? 1 : 0); + _viewer!, path.toNativeUtf8().cast(), fillHeight); } Future setBackgroundColor(Color color) async { @@ -182,7 +186,7 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - _lib.set_background_image_position_ffi(_viewer!, x, y, clamp ? 1 : 0); + _lib.set_background_image_position_ffi(_viewer!, x, y, clamp); } Future loadSkybox(String skyboxPath) async { @@ -229,7 +233,7 @@ class FilamentControllerFFI extends FilamentController { throw Exception("No viewer available, ignoring"); } var entity = _lib.add_light_ffi(_viewer!, type, colour, intensity, posX, - posY, posZ, dirX, dirY, dirZ, castShadows ? 1 : 0); + posY, posZ, dirX, dirY, dirZ, castShadows); return entity; } @@ -255,7 +259,7 @@ class FilamentControllerFFI extends FilamentController { throw Exception("Not yet implemented"); } var asset = _lib.load_glb_ffi( - _assetManager!, path.toNativeUtf8().cast(), unlit ? 1 : 0); + _assetManager!, path.toNativeUtf8().cast(), unlit); if (asset == FILAMENT_ASSET_ERROR) { throw Exception("An error occurred loading the asset at $path"); } @@ -278,7 +282,7 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - _lib.grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, 1); + _lib.grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, true); } Future panUpdate(double x, double y) async { @@ -299,7 +303,7 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - _lib.grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, 0); + _lib.grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, false); } Future rotateUpdate(double x, double y) async { @@ -372,9 +376,10 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - var duration = await _channel.invokeMethod( - "getAnimationDuration", [_assetManager!, asset, animationIndex]); - return duration as double; + var duration = + _lib.get_animation_duration_ffi(_assetManager!, asset, animationIndex); + + return duration; } /// @@ -470,7 +475,7 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - await _channel.invokeMethod("scrollBegin"); + _lib.scroll_begin(_viewer!); } Future zoomUpdate(double z) async { @@ -495,8 +500,8 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - _lib.play_animation_ffi(_assetManager!, asset, index, loop ? 1 : 0, - reverse ? 1 : 0, replaceActive ? 1 : 0, crossfade); + _lib.play_animation_ffi( + _assetManager!, asset, index, loop, reverse, replaceActive, crossfade); } Future setAnimationFrame( @@ -504,23 +509,23 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - await _channel.invokeMethod( - "setAnimationFrame", [_assetManager!, asset, index, animationFrame]); + _lib.set_animation_frame(_assetManager!, asset, index, animationFrame); } Future stopAnimation(FilamentEntity asset, int animationIndex) async { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - await _channel - .invokeMethod("stopAnimation", [_assetManager!, asset, animationIndex]); + _lib.stop_animation(_assetManager!, asset, animationIndex); } Future setCamera(FilamentEntity asset, String? name) async { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - if (await _channel.invokeMethod("setCamera", [asset, name]) != true) { + var result = _lib.set_camera( + _viewer!, asset, name?.toNativeUtf8()?.cast() ?? nullptr); + if (result != 1) { throw Exception("Failed to set camera"); } } @@ -572,7 +577,7 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null || _resizing) { throw Exception("No viewer available, ignoring"); } - _lib.set_view_frustum_culling(_viewer!, enabled ? 1 : 0); + _lib.set_view_frustum_culling(_viewer!, enabled); } Future setCameraExposure( diff --git a/lib/filament_widget.dart b/lib/filament_widget.dart index 1e7fe15c..2f38c22e 100644 --- a/lib/filament_widget.dart +++ b/lib/filament_widget.dart @@ -71,39 +71,39 @@ class _FilamentWidgetState extends State { Timer? _resizeTimer; void _handleStateChange(AppLifecycleState state) async { - switch (state) { - case AppLifecycleState.detached: - print("Detached"); - _textureId = null; + // switch (state) { + // case AppLifecycleState.detached: + // print("Detached"); + // _textureId = null; - await widget.controller.destroyViewer(); - await widget.controller.destroyTexture(); - break; - case AppLifecycleState.hidden: - print("Hidden"); - if (Platform.isIOS) { - _textureId = null; - await widget.controller.destroyViewer(); - await widget.controller.destroyTexture(); - } - break; - case AppLifecycleState.inactive: - print("Inactive"); - break; - case AppLifecycleState.paused: - print("Paused"); - break; - case AppLifecycleState.resumed: - print("Resumed"); - if (_textureId == null) { - var size = ((context.findRenderObject()) as RenderBox).size; - print("Size after resuming : $size"); - await widget.controller - .createViewer(size.width.toInt(), size.height.toInt()); - print("Created viewer Size after resuming"); - } - break; - } + // await widget.controller.destroyViewer(); + // await widget.controller.destroyTexture(); + // break; + // case AppLifecycleState.hidden: + // print("Hidden"); + // if (Platform.isIOS) { + // _textureId = null; + // await widget.controller.destroyViewer(); + // await widget.controller.destroyTexture(); + // } + // break; + // case AppLifecycleState.inactive: + // print("Inactive"); + // break; + // case AppLifecycleState.paused: + // print("Paused"); + // break; + // case AppLifecycleState.resumed: + // print("Resumed"); + // if (_textureId == null) { + // var size = ((context.findRenderObject()) as RenderBox).size; + // print("Size after resuming : $size"); + // await widget.controller + // .createViewer(size.width.toInt(), size.height.toInt()); + // print("Created viewer Size after resuming"); + // } + // break; + // } _lastState = state; } diff --git a/lib/generated_bindings.dart b/lib/generated_bindings.dart index 8e525dfb..f526516f 100644 --- a/lib/generated_bindings.dart +++ b/lib/generated_bindings.dart @@ -90,13 +90,13 @@ class NativeLibrary { void create_render_target( ffi.Pointer viewer, - int textureId, + int texture, int width, int height, ) { return _create_render_target( viewer, - textureId, + texture, width, height, ); @@ -104,7 +104,7 @@ class NativeLibrary { late final _create_render_targetPtr = _lookup< ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, + ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32)>>('create_render_target'); late final _create_render_target = _create_render_targetPtr .asFunction, int, int, int)>(); @@ -126,7 +126,7 @@ class NativeLibrary { void set_background_image( ffi.Pointer viewer, ffi.Pointer path, - int fillHeight, + bool fillHeight, ) { return _set_background_image( viewer, @@ -138,15 +138,15 @@ class NativeLibrary { late final _set_background_imagePtr = _lookup< ffi.NativeFunction< ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Int)>>('set_background_image'); + ffi.Bool)>>('set_background_image'); late final _set_background_image = _set_background_imagePtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer, int)>(); + void Function(ffi.Pointer, ffi.Pointer, bool)>(); void set_background_image_position( ffi.Pointer viewer, double x, double y, - int clamp, + bool clamp, ) { return _set_background_image_position( viewer, @@ -159,9 +159,9 @@ class NativeLibrary { late final _set_background_image_positionPtr = _lookup< ffi.NativeFunction< ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, - ffi.Int)>>('set_background_image_position'); + ffi.Bool)>>('set_background_image_position'); late final _set_background_image_position = _set_background_image_positionPtr - .asFunction, double, double, int)>(); + .asFunction, double, double, bool)>(); void set_background_color( ffi.Pointer viewer, @@ -295,7 +295,7 @@ class NativeLibrary { double dirX, double dirY, double dirZ, - int shadows, + bool shadows, ) { return _add_light( viewer, @@ -325,10 +325,10 @@ class NativeLibrary { ffi.Float, ffi.Float, ffi.Float, - ffi.Int)>>('add_light'); + ffi.Bool)>>('add_light'); late final _add_light = _add_lightPtr.asFunction< int Function(ffi.Pointer, int, double, double, double, double, - double, double, double, double, int)>(); + double, double, double, double, bool)>(); void remove_light( ffi.Pointer viewer, @@ -364,7 +364,7 @@ class NativeLibrary { int load_glb( ffi.Pointer assetManager, ffi.Pointer assetPath, - int unlit, + bool unlit, ) { return _load_glb( assetManager, @@ -376,9 +376,9 @@ class NativeLibrary { late final _load_glbPtr = _lookup< ffi.NativeFunction< EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Int)>>('load_glb'); + ffi.Bool)>>('load_glb'); late final _load_glb = _load_glbPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + int Function(ffi.Pointer, ffi.Pointer, bool)>(); int load_gltf( ffi.Pointer assetManager, @@ -400,7 +400,7 @@ class NativeLibrary { int Function(ffi.Pointer, ffi.Pointer, ffi.Pointer)>(); - int set_camera( + bool set_camera( ffi.Pointer viewer, int asset, ffi.Pointer nodeName, @@ -414,14 +414,14 @@ class NativeLibrary { late final _set_cameraPtr = _lookup< ffi.NativeFunction< - ffi.Int Function(ffi.Pointer, EntityId, + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer)>>('set_camera'); late final _set_camera = _set_cameraPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + bool Function(ffi.Pointer, int, ffi.Pointer)>(); void set_view_frustum_culling( ffi.Pointer viewer, - int enabled, + bool enabled, ) { return _set_view_frustum_culling( viewer, @@ -431,10 +431,10 @@ class NativeLibrary { late final _set_view_frustum_cullingPtr = _lookup< ffi - .NativeFunction, ffi.Int)>>( + .NativeFunction, ffi.Bool)>>( 'set_view_frustum_culling'); late final _set_view_frustum_culling = _set_view_frustum_cullingPtr - .asFunction, int)>(); + .asFunction, bool)>(); void render( ffi.Pointer viewer, @@ -579,7 +579,7 @@ class NativeLibrary { ffi.Pointer viewer, double x, double y, - int pan, + bool pan, ) { return _grab_begin( viewer, @@ -592,9 +592,9 @@ class NativeLibrary { late final _grab_beginPtr = _lookup< ffi.NativeFunction< ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, - ffi.Int)>>('grab_begin'); + ffi.Bool)>>('grab_begin'); late final _grab_begin = _grab_beginPtr - .asFunction, double, double, int)>(); + .asFunction, double, double, bool)>(); void grab_update( ffi.Pointer viewer, @@ -686,7 +686,7 @@ class NativeLibrary { void Function(ffi.Pointer, int, ffi.Pointer, ffi.Pointer, int)>(); - int set_morph_animation( + bool set_morph_animation( ffi.Pointer assetManager, int asset, ffi.Pointer entityName, @@ -710,7 +710,7 @@ class NativeLibrary { late final _set_morph_animationPtr = _lookup< ffi.NativeFunction< - ffi.Int Function( + ffi.Bool Function( ffi.Pointer, EntityId, ffi.Pointer, @@ -720,7 +720,7 @@ class NativeLibrary { ffi.Int, ffi.Float)>>('set_morph_animation'); late final _set_morph_animation = _set_morph_animationPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, + bool Function(ffi.Pointer, int, ffi.Pointer, ffi.Pointer, ffi.Pointer, int, int, double)>(); void set_bone_animation( @@ -775,9 +775,9 @@ class NativeLibrary { ffi.Pointer assetManager, int asset, int index, - int loop, - int reverse, - int replaceActive, + bool loop, + bool reverse, + bool replaceActive, double crossfade, ) { return _play_animation( @@ -793,10 +793,11 @@ class NativeLibrary { late final _play_animationPtr = _lookup< ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, - ffi.Int, ffi.Int, ffi.Float)>>('play_animation'); + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, + ffi.Bool, ffi.Bool, ffi.Float)>>('play_animation'); late final _play_animation = _play_animationPtr.asFunction< - void Function(ffi.Pointer, int, int, int, int, int, double)>(); + void Function( + ffi.Pointer, int, int, bool, bool, bool, double)>(); void set_animation_frame( ffi.Pointer assetManager, @@ -974,7 +975,7 @@ class NativeLibrary { late final _clear_assets = _clear_assetsPtr.asFunction)>(); - int set_material_color( + bool set_material_color( ffi.Pointer assetManager, int asset, ffi.Pointer meshName, @@ -998,7 +999,7 @@ class NativeLibrary { late final _set_material_colorPtr = _lookup< ffi.NativeFunction< - ffi.Int Function( + ffi.Bool Function( ffi.Pointer, EntityId, ffi.Pointer, @@ -1008,7 +1009,7 @@ class NativeLibrary { ffi.Float, ffi.Float)>>('set_material_color'); late final _set_material_color = _set_material_colorPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, int, + bool Function(ffi.Pointer, int, ffi.Pointer, int, double, double, double, double)>(); void transform_to_unit_cube( @@ -1385,7 +1386,7 @@ class NativeLibrary { void set_rendering_ffi( ffi.Pointer viewer, - int rendering, + bool rendering, ) { return _set_rendering_ffi( viewer, @@ -1395,10 +1396,10 @@ class NativeLibrary { late final _set_rendering_ffiPtr = _lookup< ffi - .NativeFunction, ffi.Int)>>( + .NativeFunction, ffi.Bool)>>( 'set_rendering_ffi'); late final _set_rendering_ffi = _set_rendering_ffiPtr - .asFunction, int)>(); + .asFunction, bool)>(); void set_frame_interval_ffi( double frameInterval, @@ -1478,7 +1479,7 @@ class NativeLibrary { void set_background_image_ffi( ffi.Pointer viewer, ffi.Pointer path, - int fillHeight, + bool fillHeight, ) { return _set_background_image_ffi( viewer, @@ -1490,16 +1491,16 @@ class NativeLibrary { late final _set_background_image_ffiPtr = _lookup< ffi.NativeFunction< ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Int)>>('set_background_image_ffi'); + ffi.Bool)>>('set_background_image_ffi'); late final _set_background_image_ffi = _set_background_image_ffiPtr.asFunction< - void Function(ffi.Pointer, ffi.Pointer, int)>(); + void Function(ffi.Pointer, ffi.Pointer, bool)>(); void set_background_image_position_ffi( ffi.Pointer viewer, double x, double y, - int clamp, + bool clamp, ) { return _set_background_image_position_ffi( viewer, @@ -1512,10 +1513,10 @@ class NativeLibrary { late final _set_background_image_position_ffiPtr = _lookup< ffi.NativeFunction< ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, - ffi.Int)>>('set_background_image_position_ffi'); + ffi.Bool)>>('set_background_image_position_ffi'); late final _set_background_image_position_ffi = _set_background_image_position_ffiPtr.asFunction< - void Function(ffi.Pointer, double, double, int)>(); + void Function(ffi.Pointer, double, double, bool)>(); void set_tone_mapping_ffi( ffi.Pointer viewer, @@ -1626,7 +1627,7 @@ class NativeLibrary { double dirX, double dirY, double dirZ, - int shadows, + bool shadows, ) { return _add_light_ffi( viewer, @@ -1656,10 +1657,10 @@ class NativeLibrary { ffi.Float, ffi.Float, ffi.Float, - ffi.Int)>>('add_light_ffi'); + ffi.Bool)>>('add_light_ffi'); late final _add_light_ffi = _add_light_ffiPtr.asFunction< int Function(ffi.Pointer, int, double, double, double, double, - double, double, double, double, int)>(); + double, double, double, double, bool)>(); void remove_light_ffi( ffi.Pointer viewer, @@ -1695,7 +1696,7 @@ class NativeLibrary { int load_glb_ffi( ffi.Pointer assetManager, ffi.Pointer assetPath, - int unlit, + bool unlit, ) { return _load_glb_ffi( assetManager, @@ -1707,9 +1708,9 @@ class NativeLibrary { late final _load_glb_ffiPtr = _lookup< ffi.NativeFunction< EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Int)>>('load_glb_ffi'); + ffi.Bool)>>('load_glb_ffi'); late final _load_glb_ffi = _load_glb_ffiPtr.asFunction< - int Function(ffi.Pointer, ffi.Pointer, int)>(); + int Function(ffi.Pointer, ffi.Pointer, bool)>(); int load_gltf_ffi( ffi.Pointer assetManager, @@ -1762,7 +1763,7 @@ class NativeLibrary { late final _clear_assets_ffi = _clear_assets_ffiPtr.asFunction)>(); - int set_camera_ffi( + bool set_camera_ffi( ffi.Pointer viewer, int asset, ffi.Pointer nodeName, @@ -1776,10 +1777,10 @@ class NativeLibrary { late final _set_camera_ffiPtr = _lookup< ffi.NativeFunction< - ffi.Int Function(ffi.Pointer, EntityId, + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer)>>('set_camera_ffi'); late final _set_camera_ffi = _set_camera_ffiPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer)>(); + bool Function(ffi.Pointer, int, ffi.Pointer)>(); void apply_weights_ffi( ffi.Pointer assetManager, @@ -1838,7 +1839,7 @@ class NativeLibrary { void Function(ffi.Pointer, int, ffi.Pointer, ffi.Pointer, int)>(); - int set_morph_animation_ffi( + bool set_morph_animation_ffi( ffi.Pointer assetManager, int asset, ffi.Pointer entityName, @@ -1862,7 +1863,7 @@ class NativeLibrary { late final _set_morph_animation_ffiPtr = _lookup< ffi.NativeFunction< - ffi.Int Function( + ffi.Bool Function( ffi.Pointer, EntityId, ffi.Pointer, @@ -1872,7 +1873,7 @@ class NativeLibrary { ffi.Int, ffi.Float)>>('set_morph_animation_ffi'); late final _set_morph_animation_ffi = _set_morph_animation_ffiPtr.asFunction< - int Function(ffi.Pointer, int, ffi.Pointer, + bool Function(ffi.Pointer, int, ffi.Pointer, ffi.Pointer, ffi.Pointer, int, int, double)>(); void set_bone_animation_ffi( @@ -1927,9 +1928,9 @@ class NativeLibrary { ffi.Pointer assetManager, int asset, int index, - int loop, - int reverse, - int replaceActive, + bool loop, + bool reverse, + bool replaceActive, double crossfade, ) { return _play_animation_ffi( @@ -1945,10 +1946,11 @@ class NativeLibrary { late final _play_animation_ffiPtr = _lookup< ffi.NativeFunction< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, - ffi.Int, ffi.Int, ffi.Float)>>('play_animation_ffi'); + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, + ffi.Bool, ffi.Bool, ffi.Float)>>('play_animation_ffi'); late final _play_animation_ffi = _play_animation_ffiPtr.asFunction< - void Function(ffi.Pointer, int, int, int, int, int, double)>(); + void Function( + ffi.Pointer, int, int, bool, bool, bool, double)>(); void set_animation_frame_ffi( ffi.Pointer assetManager, @@ -2097,10 +2099,102 @@ class NativeLibrary { int Function(ffi.Pointer, int, ffi.Pointer)>(); } +final class __mbstate_t extends ffi.Union { + @ffi.Array.multi([128]) + external ffi.Array __mbstate8; + + @ffi.LongLong() + external int _mbstateL; +} + +final class __darwin_pthread_handler_rec extends ffi.Struct { + external ffi + .Pointer)>> + __routine; + + external ffi.Pointer __arg; + + external ffi.Pointer<__darwin_pthread_handler_rec> __next; +} + +final class _opaque_pthread_attr_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + @ffi.Array.multi([56]) + external ffi.Array __opaque; +} + +final class _opaque_pthread_cond_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + @ffi.Array.multi([40]) + external ffi.Array __opaque; +} + +final class _opaque_pthread_condattr_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + @ffi.Array.multi([8]) + external ffi.Array __opaque; +} + +final class _opaque_pthread_mutex_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + @ffi.Array.multi([56]) + external ffi.Array __opaque; +} + +final class _opaque_pthread_mutexattr_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + @ffi.Array.multi([8]) + external ffi.Array __opaque; +} + +final class _opaque_pthread_once_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + @ffi.Array.multi([8]) + external ffi.Array __opaque; +} + +final class _opaque_pthread_rwlock_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + @ffi.Array.multi([192]) + external ffi.Array __opaque; +} + +final class _opaque_pthread_rwlockattr_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + @ffi.Array.multi([16]) + external ffi.Array __opaque; +} + +final class _opaque_pthread_t extends ffi.Struct { + @ffi.Long() + external int __sig; + + external ffi.Pointer<__darwin_pthread_handler_rec> __cleanup_stack; + + @ffi.Array.multi([8176]) + external ffi.Array __opaque; +} + final class ResourceBuffer extends ffi.Struct { external ffi.Pointer data; - @ffi.Uint32() + @ffi.Int64() external int size; @ffi.Uint32() @@ -2131,128 +2225,174 @@ typedef FreeFilamentResourceFromOwner = ffi.Pointer< .NativeFunction)>>; typedef EntityId = ffi.Int32; -const int INT64_MAX = 9223372036854775807; +const int __WORDSIZE = 64; -const int INT64_MIN = -9223372036854775808; +const int __DARWIN_ONLY_64_BIT_INO_T = 1; -const int UINT64_MAX = -1; +const int __DARWIN_ONLY_UNIX_CONFORMANCE = 1; -const int __INT_LEAST64_MIN = -9223372036854775808; +const int __DARWIN_ONLY_VERS_1050 = 1; -const int __INT_LEAST64_MAX = 9223372036854775807; +const int __DARWIN_UNIX03 = 1; -const int __UINT_LEAST64_MAX = -1; +const int __DARWIN_64_BIT_INO_T = 1; -const int __INT_LEAST32_MIN = -2147483648; +const int __DARWIN_VERS_1050 = 1; -const int __INT_LEAST32_MAX = 2147483647; +const int __DARWIN_NON_CANCELABLE = 0; -const int __UINT_LEAST32_MAX = 4294967295; +const String __DARWIN_SUF_EXTSN = '\$DARWIN_EXTSN'; -const int __INT_LEAST16_MIN = -32768; +const int __DARWIN_C_ANSI = 4096; -const int __INT_LEAST16_MAX = 32767; +const int __DARWIN_C_FULL = 900000; -const int __UINT_LEAST16_MAX = 65535; +const int __DARWIN_C_LEVEL = 900000; -const int __INT_LEAST8_MIN = -128; +const int __STDC_WANT_LIB_EXT1__ = 1; -const int __INT_LEAST8_MAX = 127; +const int __DARWIN_NO_LONG_LONG = 0; -const int __UINT_LEAST8_MAX = 255; +const int _DARWIN_FEATURE_64_BIT_INODE = 1; -const int INT_LEAST64_MIN = -9223372036854775808; +const int _DARWIN_FEATURE_ONLY_64_BIT_INODE = 1; -const int INT_LEAST64_MAX = 9223372036854775807; +const int _DARWIN_FEATURE_ONLY_VERS_1050 = 1; -const int UINT_LEAST64_MAX = -1; +const int _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE = 1; -const int INT_FAST64_MIN = -9223372036854775808; +const int _DARWIN_FEATURE_UNIX_CONFORMANCE = 3; -const int INT_FAST64_MAX = 9223372036854775807; +const int __has_ptrcheck = 0; -const int UINT_FAST64_MAX = -1; +const int __DARWIN_NULL = 0; -const int INT32_MAX = 2147483647; +const int __PTHREAD_SIZE__ = 8176; -const int INT32_MIN = -2147483648; +const int __PTHREAD_ATTR_SIZE__ = 56; -const int UINT32_MAX = 4294967295; +const int __PTHREAD_MUTEXATTR_SIZE__ = 8; -const int INT_LEAST32_MIN = -2147483648; +const int __PTHREAD_MUTEX_SIZE__ = 56; -const int INT_LEAST32_MAX = 2147483647; +const int __PTHREAD_CONDATTR_SIZE__ = 8; -const int UINT_LEAST32_MAX = 4294967295; +const int __PTHREAD_COND_SIZE__ = 40; -const int INT_FAST32_MIN = -2147483648; +const int __PTHREAD_ONCE_SIZE__ = 8; -const int INT_FAST32_MAX = 2147483647; +const int __PTHREAD_RWLOCK_SIZE__ = 192; -const int UINT_FAST32_MAX = 4294967295; +const int __PTHREAD_RWLOCKATTR_SIZE__ = 16; -const int INT16_MAX = 32767; - -const int INT16_MIN = -32768; - -const int UINT16_MAX = 65535; - -const int INT_LEAST16_MIN = -32768; - -const int INT_LEAST16_MAX = 32767; - -const int UINT_LEAST16_MAX = 65535; - -const int INT_FAST16_MIN = -32768; - -const int INT_FAST16_MAX = 32767; - -const int UINT_FAST16_MAX = 65535; +const int USER_ADDR_NULL = 0; const int INT8_MAX = 127; +const int INT16_MAX = 32767; + +const int INT32_MAX = 2147483647; + +const int INT64_MAX = 9223372036854775807; + const int INT8_MIN = -128; +const int INT16_MIN = -32768; + +const int INT32_MIN = -2147483648; + +const int INT64_MIN = -9223372036854775808; + const int UINT8_MAX = 255; +const int UINT16_MAX = 65535; + +const int UINT32_MAX = 4294967295; + +const int UINT64_MAX = -1; + const int INT_LEAST8_MIN = -128; +const int INT_LEAST16_MIN = -32768; + +const int INT_LEAST32_MIN = -2147483648; + +const int INT_LEAST64_MIN = -9223372036854775808; + const int INT_LEAST8_MAX = 127; +const int INT_LEAST16_MAX = 32767; + +const int INT_LEAST32_MAX = 2147483647; + +const int INT_LEAST64_MAX = 9223372036854775807; + const int UINT_LEAST8_MAX = 255; +const int UINT_LEAST16_MAX = 65535; + +const int UINT_LEAST32_MAX = 4294967295; + +const int UINT_LEAST64_MAX = -1; + const int INT_FAST8_MIN = -128; +const int INT_FAST16_MIN = -32768; + +const int INT_FAST32_MIN = -2147483648; + +const int INT_FAST64_MIN = -9223372036854775808; + const int INT_FAST8_MAX = 127; +const int INT_FAST16_MAX = 32767; + +const int INT_FAST32_MAX = 2147483647; + +const int INT_FAST64_MAX = 9223372036854775807; + const int UINT_FAST8_MAX = 255; -const int INTPTR_MIN = -9223372036854775808; +const int UINT_FAST16_MAX = 65535; + +const int UINT_FAST32_MAX = 4294967295; + +const int UINT_FAST64_MAX = -1; const int INTPTR_MAX = 9223372036854775807; +const int INTPTR_MIN = -9223372036854775808; + const int UINTPTR_MAX = -1; +const int INTMAX_MAX = 9223372036854775807; + +const int UINTMAX_MAX = -1; + +const int INTMAX_MIN = -9223372036854775808; + const int PTRDIFF_MIN = -9223372036854775808; const int PTRDIFF_MAX = 9223372036854775807; const int SIZE_MAX = -1; -const int INTMAX_MIN = -9223372036854775808; +const int RSIZE_MAX = 9223372036854775807; -const int INTMAX_MAX = 9223372036854775807; +const int WCHAR_MAX = 2147483647; -const int UINTMAX_MAX = -1; - -const int SIG_ATOMIC_MIN = -2147483648; - -const int SIG_ATOMIC_MAX = 2147483647; +const int WCHAR_MIN = -2147483648; const int WINT_MIN = -2147483648; const int WINT_MAX = 2147483647; -const int WCHAR_MAX = 2147483647; +const int SIG_ATOMIC_MIN = -2147483648; -const int WCHAR_MIN = -2147483648; +const int SIG_ATOMIC_MAX = 2147483647; + +const int __bool_true_false_are_defined = 1; + +const int true1 = 1; + +const int false1 = 0; diff --git a/macos/Classes/SwiftPolyvoxFilamentPlugin.swift b/macos/Classes/SwiftPolyvoxFilamentPlugin.swift index 3972abbe..436879e2 100644 --- a/macos/Classes/SwiftPolyvoxFilamentPlugin.swift +++ b/macos/Classes/SwiftPolyvoxFilamentPlugin.swift @@ -55,7 +55,8 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture instance.resources[resId] = nsData let length = nsData.length print("Resolved asset to file of length \(length) at path \(path!)") - return ResourceBuffer(data:nsData.bytes, size:UInt32(nsData.count), id:UInt32(resId)) + + return ResourceBuffer(data:nsData.bytes, size:Int64(nsData.length), id:UInt32(resId)) } catch { print("ERROR LOADING RESOURCE") } @@ -160,8 +161,10 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture result([ unsafeBitCast(renderCallback, to:Int64.self), unsafeBitCast(Unmanaged.passUnretained(self), to:UInt64.self)]) case "createTexture": - let args = call.arguments as! Array - createPixelBuffer(width:Int(args[0]), height:Int(args[1])) + let args = call.arguments as! [Any] + let width = UInt32(args[0] as! Int64) + let height = UInt32(args[1] as! Int64) + createPixelBuffer(width:Int(width), height:Int(height)) var cvret = CVMetalTextureCacheCreate( kCFAllocatorDefault, @@ -178,14 +181,19 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture cvMetalTextureCache!, pixelBuffer!, nil, MTLPixelFormat.bgra8Unorm, - Int(args[0]), Int(args[1]), + Int(width), Int(height), 0, &cvMetalTexture); metalTexture = CVMetalTextureGetTexture(cvMetalTexture!); // createDisplayLink() - let pixelBufferAddress = Int(bitPattern:CVPixelBufferGetBaseAddress(pixelBuffer!)); - let metalTextureAddress = Int(bitPattern:Unmanaged.passUnretained(metalTexture!).toOpaque()) - result([self.flutterTextureId as! Any, pixelBufferAddress, metalTextureAddress]) + let pixelBufferPtr = CVPixelBufferGetBaseAddress(pixelBuffer!); + let pixelBufferAddress = Int(bitPattern:pixelBufferPtr); + let metalTexturePtr = Unmanaged.passUnretained(metalTexture!).toOpaque() + let metalTextureAddress = Int(bitPattern:metalTexturePtr) + + let callback = make_resource_loader(loadResource, freeResource, Unmanaged.passUnretained(self).toOpaque()) + + result([self.flutterTextureId as Any, nil, metalTextureAddress]) case "destroyTexture": if(viewer != nil) { result(FlutterError(code: "INVALID_ARGUMENTS", message: "Destroy the viewer before destroying the texture", details: nil)) @@ -217,7 +225,7 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture resize(width:Int32(width), height:Int32(height)) create_swap_chain(viewer, CVPixelBufferGetBaseAddress(pixelBuffer!), width, height) let metalTextureId = Int(bitPattern:Unmanaged.passUnretained(metalTexture!).toOpaque()) - create_render_target(viewer, UInt32(metalTextureId), width, height); + create_render_target(viewer, metalTextureId, width, height); update_viewport_and_camera_projection(viewer, width, height, Float(args[2] as! Double)) rendering = true print("Resized to \(args[0])x\(args[1])") diff --git a/macos/include/PolyvoxFilamentApi.h b/macos/include/PolyvoxFilamentApi.h index b501ee52..4fc2bed6 100644 --- a/macos/include/PolyvoxFilamentApi.h +++ b/macos/include/PolyvoxFilamentApi.h @@ -3,13 +3,15 @@ #include "ResourceBuffer.hpp" +#include + typedef int32_t EntityId; const void* create_filament_viewer(const void* const context, const ResourceLoaderWrapper* const loader); ResourceLoaderWrapper* make_resource_loader(LoadFilamentResourceFromOwner loadFn, FreeFilamentResourceFromOwner freeFn, void* owner); void destroy_filament_viewer(const void* const viewer); void* get_asset_manager(const void* const viewer); -void create_render_target(const void* const viewer, uint32_t textureId, uint32_t width, uint32_t height); +void create_render_target(const void* const viewer, intptr_t texture, uint32_t width, uint32_t height); void clear_background_image(const void* const viewer); void set_background_image(const void* const viewer, const char *path, bool fillHeight); void set_background_image_position(const void* const viewer, float x, float y, bool clamp); diff --git a/macos/include/PolyvoxFilamentFFIApi.h b/macos/include/PolyvoxFilamentFFIApi.h index bd6c2516..6cafa42f 100644 --- a/macos/include/PolyvoxFilamentFFIApi.h +++ b/macos/include/PolyvoxFilamentFFIApi.h @@ -1,13 +1,13 @@ #ifndef _POLYVOX_FILAMENT_FFI_API_H #define _POLYVOX_FILAMENT_FFI_API_H -#include "PolyvoxFilamentApi.h" - /// /// This header replicates most of the methods in PolyvoxFilamentApi.h, and is only intended to be used to generate client FFI bindings. /// The intention is that calling one of these methods will call its respective method in PolyvoxFilamentApi.h, but wrapped in some kind of thread runner to ensure thread safety. /// +#include "PolyvoxFilamentApi.h" + typedef int32_t EntityId; void* const create_filament_viewer_ffi(void* const context, const ResourceLoaderWrapper* const loader, void (*renderCallback)(void* const renderCallbackOwner), void* const renderCallbackOwner); @@ -33,25 +33,25 @@ void remove_light_ffi(void* const viewer, EntityId entityId); void clear_lights_ffi(void* const viewer); EntityId load_glb_ffi(void* const assetManager, const char *assetPath, bool unlit); EntityId load_gltf_ffi(void* const assetManager, const char *assetPath, const char *relativePath); -void remove_asset_ffi(void* const const viewer, EntityId asset); -void clear_assets_ffi(void* const const viewer); +void remove_asset_ffi(void* const viewer, EntityId asset); +void clear_assets_ffi(void* const viewer); bool set_camera_ffi(void* const viewer, EntityId asset, const char *nodeName); void apply_weights_ffi( - void* assetManager, + void* const assetManager, EntityId asset, const char *const entityName, float *const weights, int count ); void set_morph_target_weights_ffi( - void* assetManager, + void* const assetManager, EntityId asset, const char *const entityName, const float *const morphData, int numWeights ); bool set_morph_animation_ffi( - void* assetManager, + void* const assetManager, EntityId asset, const char *const entityName, const float *const morphData, @@ -61,7 +61,7 @@ bool set_morph_animation_ffi( float frameLengthInMs); void set_bone_animation_ffi( - void* assetManager, + void* const assetManager, EntityId asset, const float* const frameData, int numFrames, @@ -71,13 +71,13 @@ void set_bone_animation_ffi( int numMeshTargets, float frameLengthInMs); -void play_animation_ffi(void* assetManager, EntityId asset, int index, bool loop, bool reverse, bool replaceActive, float crossfade); -void set_animation_frame_ffi(void* assetManager, EntityId asset, int animationIndex, int animationFrame); -void stop_animation_ffi(void* assetManager, EntityId asset, int index); -int get_animation_count_ffi(void* assetManager, EntityId asset); -void get_animation_name_ffi(void* assetManager, EntityId asset, char *const outPtr, int index); -float get_animation_duration_ffi(void* assetManager, EntityId asset, int index); -void get_morph_target_name_ffi(void* assetManager, EntityId asset, const char *meshName, char *const outPtr, int index); -int get_morph_target_name_count_ffi(void* assetManager, EntityId asset, const char *meshName); +void play_animation_ffi(void* const assetManager, EntityId asset, int index, bool loop, bool reverse, bool replaceActive, float crossfade); +void set_animation_frame_ffi(void* const assetManager, EntityId asset, int animationIndex, int animationFrame); +void stop_animation_ffi(void* const assetManager, EntityId asset, int index); +int get_animation_count_ffi(void* const assetManager, EntityId asset); +void get_animation_name_ffi(void* const assetManager, EntityId asset, char *const outPtr, int index); +float get_animation_duration_ffi(void* const assetManager, EntityId asset, int index); +void get_morph_target_name_ffi(void* const assetManager, EntityId asset, const char *meshName, char *const outPtr, int index); +int get_morph_target_name_count_ffi(void* const assetManager, EntityId asset, const char *meshName); #endif // _POLYVOX_FILAMENT_FFI_API_H diff --git a/macos/include/ResourceBuffer.hpp b/macos/include/ResourceBuffer.hpp index d22e05c8..a8e51325 100644 --- a/macos/include/ResourceBuffer.hpp +++ b/macos/include/ResourceBuffer.hpp @@ -33,7 +33,7 @@ extern "C" { #endif const void * const data; - const uint32_t size; + const int64_t size; const uint32_t id; }; diff --git a/macos/src/FilamentViewer.cpp b/macos/src/FilamentViewer.cpp index 7fc12ad4..1f053842 100644 --- a/macos/src/FilamentViewer.cpp +++ b/macos/src/FilamentViewer.cpp @@ -112,6 +112,8 @@ FilamentViewer::FilamentViewer(const void* context, const ResourceLoaderWrapper* #if TARGET_OS_IPHONE _engine = Engine::create(Engine::Backend::METAL); + #elif TARGET_OS_OSX + _engine = Engine::create(Engine::Backend::METAL); #else _engine = Engine::create(Engine::Backend::OPENGL); //L, nullptr, (void*)context, nullptr); #endif @@ -565,7 +567,7 @@ void FilamentViewer::createSwapChain(const void *window, uint32_t width, uint32_ Log("Swapchain created."); } -void FilamentViewer::createRenderTarget(intptr_t textureId, uint32_t width, uint32_t height) { +void FilamentViewer::createRenderTarget(intptr_t texture, uint32_t width, uint32_t height) { // Create filament textures and render targets (note the color buffer has the import call) _rtColor = filament::Texture::Builder() .width(width) @@ -573,7 +575,7 @@ void FilamentViewer::createRenderTarget(intptr_t textureId, uint32_t width, uint .levels(1) .usage(filament::Texture::Usage::COLOR_ATTACHMENT | filament::Texture::Usage::SAMPLEABLE) .format(filament::Texture::InternalFormat::RGBA8) - .import(textureId) + .import(texture) .build(*_engine); _rtDepth = filament::Texture::Builder() .width(width) @@ -590,7 +592,7 @@ void FilamentViewer::createRenderTarget(intptr_t textureId, uint32_t width, uint // Make a specific viewport just for our render target _view->setRenderTarget(_rt); - Log("Set render target for glTextureId %u %u x %u", textureId, width, height); + Log("Set render target for glTextureId %u %u x %u", texture, width, height); } diff --git a/macos/src/PolyvoxFilamentApi.cpp b/macos/src/PolyvoxFilamentApi.cpp index 4ecc0757..21334347 100644 --- a/macos/src/PolyvoxFilamentApi.cpp +++ b/macos/src/PolyvoxFilamentApi.cpp @@ -15,6 +15,7 @@ using namespace polyvox; extern "C" { #include "PolyvoxFilamentApi.h" + FLUTTER_PLUGIN_EXPORT const void* create_filament_viewer(const void* context, const ResourceLoaderWrapper* const loader) { return (const void*) new FilamentViewer(context, loader); @@ -24,8 +25,8 @@ extern "C" { return new ResourceLoaderWrapper(loadFn, freeFn, owner); } - FLUTTER_PLUGIN_EXPORT void create_render_target(const void* const viewer, uint32_t textureId, uint32_t width, uint32_t height) { - ((FilamentViewer*)viewer)->createRenderTarget(textureId, width, height); + FLUTTER_PLUGIN_EXPORT void create_render_target(const void* const viewer, intptr_t texture, uint32_t width, uint32_t height) { + ((FilamentViewer*)viewer)->createRenderTarget(texture, width, height); } FLUTTER_PLUGIN_EXPORT void destroy_filament_viewer(const void* const viewer) { diff --git a/macos/src/PolyvoxFilamentFFIApi.cpp b/macos/src/PolyvoxFilamentFFIApi.cpp index 8ed0021c..c84b2c48 100644 --- a/macos/src/PolyvoxFilamentFFIApi.cpp +++ b/macos/src/PolyvoxFilamentFFIApi.cpp @@ -5,6 +5,7 @@ #include "Log.hpp" #include "ThreadPool.hpp" + #include #include @@ -12,10 +13,13 @@ using namespace polyvox; #define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) -class RenderLoop { +class RenderLoop +{ public: - explicit RenderLoop() { - _t = new std::thread([this]() { + explicit RenderLoop() + { + _t = new std::thread([this]() + { while(!_stop) { std::function task; { @@ -35,121 +39,294 @@ public: } task(); - } - }); - } - ~RenderLoop() { - _stop = true; + } }); + } + ~RenderLoop() + { + _stop = true; _t->join(); - } + } - void* const createViewer(void* const context, const ResourceLoaderWrapper* const loader, void (*renderCallback)(void*), void* const owner) { + void *const createViewer(void *const context, const ResourceLoaderWrapper *const loader, void (*renderCallback)(void *), void *const owner) + { _renderCallback = renderCallback; - _renderCallbackOwner = owner; - std::packaged_task lambda([&]() mutable { - return new FilamentViewer(context, loader); - }); + _renderCallbackOwner = owner; + std::packaged_task lambda([&]() mutable + { return new FilamentViewer(context, loader); }); auto fut = add_task(lambda); fut.wait(); _viewer = fut.get(); - return (void* const)_viewer; + return (void *const)_viewer; } - void setRendering(bool rendering) { + void setRendering(bool rendering) + { _rendering = rendering; } - void doRender() { + void doRender() + { render(_viewer, 0); _renderCallback(_renderCallbackOwner); } - template - auto add_task(std::packaged_task& pt) -> std::future { - std::unique_lock lock(_access); - auto ret = pt.get_future(); - _tasks.push_back([pt=std::make_shared>(std::move(pt))]{ (*pt)();}); - _cond.notify_one(); - return ret; - } -private: + template + auto add_task(std::packaged_task &pt) -> std::future + { + std::unique_lock lock(_access); + auto ret = pt.get_future(); + _tasks.push_back([pt = std::make_shared>(std::move(pt))] + { (*pt)(); }); + _cond.notify_one(); + return ret; + } + +private: bool _stop = false; bool _rendering = false; int _frameIntervalInMilliseconds = 1000 / 60; - std::mutex _access; - FilamentViewer* _viewer = nullptr; - void (*_renderCallback)(void* const) = nullptr; - void* _renderCallbackOwner = nullptr; - std::thread* _t = nullptr; - std::condition_variable _cond; - std::deque> _tasks; - + std::mutex _access; + FilamentViewer *_viewer = nullptr; + void (*_renderCallback)(void *const) = nullptr; + void *_renderCallbackOwner = nullptr; + std::thread *_t = nullptr; + std::condition_variable _cond; + std::deque> _tasks; }; +extern "C" +{ +#include "PolyvoxFilamentApi.h" + static RenderLoop *_rl; -extern "C" { - - #include "PolyvoxFilamentApi.h" - - static RenderLoop* _rl; - - FLUTTER_PLUGIN_EXPORT void* const create_filament_viewer_ffi(void* const context, const ResourceLoaderWrapper* const loader, void (*renderCallback)(void* const renderCallbackOwner), void* const renderCallbackOwner) { - if(!_rl) { - _rl = new RenderLoop(); + FLUTTER_PLUGIN_EXPORT void *const create_filament_viewer_ffi(void *const context, const ResourceLoaderWrapper *const loader, void (*renderCallback)(void *const renderCallbackOwner), void *const renderCallbackOwner) + { + if (!_rl) + { + _rl = new RenderLoop(); + } + return _rl->createViewer(context, loader, renderCallback, renderCallbackOwner); } - return _rl->createViewer(context, loader, renderCallback, renderCallbackOwner); - } - - FLUTTER_PLUGIN_EXPORT void create_swap_chain_ffi(void* const viewer, void* const surface, uint32_t width, uint32_t height) { - std::packaged_task lambda([&]() mutable { - create_swap_chain(viewer, surface, width, height); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } + FLUTTER_PLUGIN_EXPORT void create_swap_chain_ffi(void *const viewer, void *const surface, uint32_t width, uint32_t height) + { + std::packaged_task lambda([&]() mutable + { create_swap_chain(viewer, surface, width, height); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } - FLUTTER_PLUGIN_EXPORT void create_render_target_ffi(void* const viewer, uint32_t nativeTextureId, uint32_t width, uint32_t height) { - std::packaged_task lambda([&]() mutable { - create_render_target(viewer, nativeTextureId, width, height); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } + FLUTTER_PLUGIN_EXPORT void create_render_target_ffi(void *const viewer, uint32_t nativeTextureId, uint32_t width, uint32_t height) + { + std::packaged_task lambda([&]() mutable + { create_render_target(viewer, nativeTextureId, width, height); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void update_viewport_and_camera_projection_ffi(void *const viewer, const uint32_t width, const uint32_t height, const float scaleFactor) + { + std::packaged_task lambda([&]() mutable + { update_viewport_and_camera_projection(viewer, width, height, scaleFactor); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } - FLUTTER_PLUGIN_EXPORT void update_viewport_and_camera_projection_ffi(void* const viewer, const uint32_t width, const uint32_t height, const float scaleFactor) { - std::packaged_task lambda([&]() mutable { - update_viewport_and_camera_projection(viewer, width, height, scaleFactor); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } - + FLUTTER_PLUGIN_EXPORT void set_rendering_ffi(bool rendering) + { + if (!_rl) + { + Log("No render loop!"); // PANIC? + } else { + if(rendering) { + Log("Set rendering to true"); + } else { + Log("Set rendering to false"); + } + _rl->setRendering(rendering); + } + } - FLUTTER_PLUGIN_EXPORT bool set_rendering_ffi(bool rendering) { - if(!_rl) { - return false; - } - _rl->setRendering(rendering); - return true; - } + FLUTTER_PLUGIN_EXPORT void render_ffi(void *const viewer) + { + std::packaged_task lambda([&]() mutable + { _rl->doRender(); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } - FLUTTER_PLUGIN_EXPORT void render_ffi(void* const viewer) { - std::packaged_task lambda([&]() mutable { - _rl->doRender(); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } + FLUTTER_PLUGIN_EXPORT void set_background_color_ffi(void *const viewer, const float r, const float g, const float b, const float a) + { + std::packaged_task lambda([&]() mutable + { set_background_color(viewer, r, g, b, a); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } - FLUTTER_PLUGIN_EXPORT void set_background_color_ffi(void* const viewer, const float r, const float g, const float b, const float a) { - std::packaged_task lambda([&]() mutable { - set_background_color(viewer, r, g,b, a); - }); - auto fut = _rl->add_task(lambda); - fut.wait(); - } + FLUTTER_PLUGIN_EXPORT EntityId load_glb_ffi(void *const assetManager, const char *path) + { + std::packaged_task lambda([&]() mutable + { return load_glb(assetManager, path, false); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + return fut.get(); + } + FLUTTER_PLUGIN_EXPORT void clear_background_image_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { clear_background_image(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + + FLUTTER_PLUGIN_EXPORT void set_background_image_ffi(void *const viewer, const char *path, bool fillHeight) + { + std::packaged_task lambda([&] + { set_background_image(viewer, path, fillHeight); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void set_background_image_position_ffi(void *const viewer, float x, float y, bool clamp) + { + std::packaged_task lambda([&] + { set_background_image_position(viewer, x, y, clamp); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void set_tone_mapping_ffi(void *const viewer, int toneMapping) + { + std::packaged_task lambda([&] + { set_tone_mapping(viewer, toneMapping); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void set_bloom_ffi(void *const viewer, float strength) + { + std::packaged_task lambda([&] + { set_bloom(viewer, strength); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void load_skybox_ffi(void *const viewer, const char *skyboxPath) + { + std::packaged_task lambda([&] + { load_skybox(viewer, skyboxPath); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void load_ibl_ffi(void *const viewer, const char *iblPath, float intensity) + { + std::packaged_task lambda([&] + { load_ibl(viewer, iblPath, intensity); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void remove_skybox_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { remove_skybox(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void remove_ibl_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { remove_ibl(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + EntityId add_light_ffi(void *const viewer, uint8_t type, float colour, float intensity, float posX, float posY, float posZ, float dirX, float dirY, float dirZ, bool shadows) + { + std::packaged_task lambda([&] + { return add_light(viewer, type, colour, intensity, posX, posY, posZ, dirX, dirY, dirZ, shadows); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + return fut.get(); + } + FLUTTER_PLUGIN_EXPORT void remove_light_ffi(void *const viewer, EntityId entityId) + { + std::packaged_task lambda([&] + { remove_light(viewer, entityId); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void clear_lights_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { clear_lights(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + + FLUTTER_PLUGIN_EXPORT void remove_asset_ffi(void *const viewer, EntityId asset) + { + std::packaged_task lambda([&] + { remove_asset(viewer, asset); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + FLUTTER_PLUGIN_EXPORT void clear_assets_ffi(void *const viewer) + { + std::packaged_task lambda([&] + { clear_assets(viewer); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + + FLUTTER_PLUGIN_EXPORT bool set_camera_ffi(void *const viewer, EntityId asset, const char *nodeName) + { + std::packaged_task lambda([&] + { return set_camera(viewer, asset, nodeName); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + return fut.get(); + } + + FLUTTER_PLUGIN_EXPORT void set_bone_animation_ffi( + void *assetManager, + EntityId asset, + const float *const frameData, + int numFrames, + int numBones, + const char **const boneNames, + const char **const meshName, + int numMeshTargets, + float frameLengthInMs) + { + std::packaged_task lambda([&] + { set_bone_animation( + assetManager, asset, frameData, numFrames, numBones, + boneNames, meshName, numMeshTargets, frameLengthInMs); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + // implementations of rest of animation functions + FLUTTER_PLUGIN_EXPORT void get_morph_target_name_ffi(void *assetManager, EntityId asset, const char *meshName, char *const outPtr, int index) + { + std::packaged_task lambda([&] + { get_morph_target_name(assetManager, asset, meshName, outPtr, index); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + } + + FLUTTER_PLUGIN_EXPORT int get_morph_target_name_count_ffi(void *assetManager, EntityId asset, const char *meshName) + { + std::packaged_task lambda([&] + { return get_morph_target_name_count(assetManager, asset, meshName); }); + auto fut = _rl->add_task(lambda); + fut.wait(); + return fut.get(); + } + + void set_morph_target_weights_ffi( + void* const assetManager, + EntityId asset, + const char *const entityName, + const float *const morphData, + int numWeights + ) { + // TODO + } } diff --git a/pubspec.yaml b/pubspec.yaml index 652e6c49..d26931ff 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,17 +22,13 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^1.0.0 - ffigen: ^9.0.1 + ffigen: ^8.0.2 ffigen: output: 'lib/generated_bindings.dart' headers: entry-points: - - 'ios/include/PolyvoxFilamentApi.h' - 'ios/include/PolyvoxFilamentFFIApi.h' - compiler-opts-automatic: - macos: - include-c-standard-library: false flutter: assets: