From e4de0f3ae0269ee138b515760ab31bb5947071a6 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 8 Mar 2025 12:17:06 +0800 Subject: [PATCH] expose setParameterBool/hasParameter on material + instance --- .../src/viewer/src/ffi/src/ffi_material.dart | 16 +++++++++++-- .../viewer/src/ffi/src/thermion_dart.g.dart | 24 +++++++++++++++---- .../src/viewer/src/shared_types/material.dart | 2 ++ .../native/include/c_api/TMaterialInstance.h | 10 ++++---- .../native/src/c_api/TMaterialInstance.cpp | 10 ++++++++ 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_material.dart b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_material.dart index d163e0ec..0851da7b 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/ffi_material.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/ffi_material.dart @@ -22,6 +22,12 @@ class FFIMaterial extends Material { Engine_destroyMaterialRenderThread(engine, pointer, cb); }); } + + @override + Future hasParameter(String propertyName) async { + return Material_hasParameter( + pointer, propertyName.toNativeUtf8().cast()); + } } class FFIMaterialInstance extends MaterialInstance { @@ -154,7 +160,13 @@ class FFIMaterialInstance extends MaterialInstance { @override Future setParameterTexture(String name, covariant FFITexture texture, covariant FFITextureSampler sampler) async { - MaterialInstance_setParameterTexture( - pointer, name.toNativeUtf8().cast(), texture.pointer, sampler.pointer); + MaterialInstance_setParameterTexture(pointer, + name.toNativeUtf8().cast(), texture.pointer, sampler.pointer); + } + + @override + Future setParameterBool(String name, bool value) async { + MaterialInstance_setParameterBool( + pointer, name.toNativeUtf8().cast(), value); } } diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart index 11d54e45..7dd34bff 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart @@ -13,6 +13,13 @@ external ffi.Pointer Material_createInstance( ffi.Pointer tMaterial, ); +@ffi.Native, ffi.Pointer)>( + isLeaf: true) +external bool Material_hasParameter( + ffi.Pointer tMaterial, + ffi.Pointer propertyName, +); + @ffi.Native)>(isLeaf: true) external bool MaterialInstance_isStencilWriteEnabled( ffi.Pointer materialInstance, @@ -60,7 +67,7 @@ external void MaterialInstance_setDepthCulling( ffi.Double, ffi.Double, ffi.Double, ffi.Double)>(isLeaf: true) external void MaterialInstance_setParameterFloat4( ffi.Pointer materialInstance, - ffi.Pointer name, + ffi.Pointer propertyName, double x, double y, double w, @@ -72,7 +79,7 @@ external void MaterialInstance_setParameterFloat4( ffi.Double, ffi.Double)>(isLeaf: true) external void MaterialInstance_setParameterFloat2( ffi.Pointer materialInstance, - ffi.Pointer name, + ffi.Pointer propertyName, double x, double y, ); @@ -82,7 +89,7 @@ external void MaterialInstance_setParameterFloat2( ffi.Double)>(isLeaf: true) external void MaterialInstance_setParameterFloat( ffi.Pointer materialInstance, - ffi.Pointer name, + ffi.Pointer propertyName, double value, ); @@ -91,10 +98,19 @@ external void MaterialInstance_setParameterFloat( ffi.Int)>(isLeaf: true) external void MaterialInstance_setParameterInt( ffi.Pointer materialInstance, - ffi.Pointer name, + ffi.Pointer propertyName, int value, ); +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Bool)>(isLeaf: true) +external void MaterialInstance_setParameterBool( + ffi.Pointer materialInstance, + ffi.Pointer propertyName, + bool value, +); + @ffi.Native< ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Pointer, ffi.Pointer)>(isLeaf: true) diff --git a/thermion_dart/lib/src/viewer/src/shared_types/material.dart b/thermion_dart/lib/src/viewer/src/shared_types/material.dart index 0f85554c..d2c00195 100644 --- a/thermion_dart/lib/src/viewer/src/shared_types/material.dart +++ b/thermion_dart/lib/src/viewer/src/shared_types/material.dart @@ -93,6 +93,7 @@ enum TransparencyMode { abstract class Material { Future createInstance(); + Future hasParameter(String propertyName); Future dispose(); } @@ -106,6 +107,7 @@ abstract class MaterialInstance { Future setParameterFloat2(String name, double x, double y); Future setParameterFloat(String name, double x); Future setParameterInt(String name, int value); + Future setParameterBool(String name, bool value); Future setParameterTexture( String name, covariant Texture texture, covariant TextureSampler sampler); diff --git a/thermion_dart/native/include/c_api/TMaterialInstance.h b/thermion_dart/native/include/c_api/TMaterialInstance.h index 7165633d..85d2d8a8 100644 --- a/thermion_dart/native/include/c_api/TMaterialInstance.h +++ b/thermion_dart/native/include/c_api/TMaterialInstance.h @@ -68,16 +68,18 @@ extern "C" }; EMSCRIPTEN_KEEPALIVE TMaterialInstance *Material_createInstance(TMaterial *tMaterial); + EMSCRIPTEN_KEEPALIVE bool Material_hasParameter(TMaterial *tMaterial, const char *propertyName); EMSCRIPTEN_KEEPALIVE bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *materialInstance); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWrite(TMaterialInstance *materialInstance, bool enabled); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setCullingMode(TMaterialInstance *materialInstance, TCullingMode culling); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance *materialInstance, bool enabled); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(TMaterialInstance *materialInstance, bool enabled); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *materialInstance, const char *name, double x, double y, double w, double z); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance *materialInstance, const char *name, double x, double y); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance *materialInstance, const char *name, double value); - EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *name, int value); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat4(TMaterialInstance *materialInstance, const char *propertyName, double x, double y, double w, double z); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat2(TMaterialInstance *materialInstance, const char *propertyName, double x, double y); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance *materialInstance, const char *propertyName, double value); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *propertyName, int value); + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterBool(TMaterialInstance *materialInstance, const char *propertyName, bool value); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterTexture(TMaterialInstance *materialInstance, const char *propertyName, TTexture *texture, TTextureSampler *sampler); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *materialInstance, TSamplerCompareFunc depthFunc); diff --git a/thermion_dart/native/src/c_api/TMaterialInstance.cpp b/thermion_dart/native/src/c_api/TMaterialInstance.cpp index 207ee270..d364dbac 100644 --- a/thermion_dart/native/src/c_api/TMaterialInstance.cpp +++ b/thermion_dart/native/src/c_api/TMaterialInstance.cpp @@ -21,6 +21,11 @@ namespace thermion return reinterpret_cast(instance); } + EMSCRIPTEN_KEEPALIVE bool Material_hasParameter(TMaterial *tMaterial, const char *propertyName) { + auto *material = reinterpret_cast(tMaterial); + return material->hasParameter(propertyName); + } + EMSCRIPTEN_KEEPALIVE bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *tMaterialInstance) { return reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance)->isStencilWriteEnabled(); @@ -61,6 +66,11 @@ namespace thermion reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, value); } + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterBool(TMaterialInstance *materialInstance, const char *propertyName, bool value) + { + reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, value); + } + EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterTexture(TMaterialInstance *tMaterialInstance, const char *propertyName, TTexture* tTexture, TTextureSampler* tSampler) { auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto texture = reinterpret_cast<::filament::Texture*>(tTexture);