expose setParameterBool/hasParameter on material + instance

This commit is contained in:
Nick Fisher
2025-03-08 12:17:06 +08:00
parent 72711ee64f
commit e4de0f3ae0
5 changed files with 52 additions and 10 deletions

View File

@@ -22,6 +22,12 @@ class FFIMaterial extends Material {
Engine_destroyMaterialRenderThread(engine, pointer, cb); Engine_destroyMaterialRenderThread(engine, pointer, cb);
}); });
} }
@override
Future<bool> hasParameter(String propertyName) async {
return Material_hasParameter(
pointer, propertyName.toNativeUtf8().cast<Char>());
}
} }
class FFIMaterialInstance extends MaterialInstance { class FFIMaterialInstance extends MaterialInstance {
@@ -154,7 +160,13 @@ class FFIMaterialInstance extends MaterialInstance {
@override @override
Future setParameterTexture(String name, covariant FFITexture texture, Future setParameterTexture(String name, covariant FFITexture texture,
covariant FFITextureSampler sampler) async { covariant FFITextureSampler sampler) async {
MaterialInstance_setParameterTexture( MaterialInstance_setParameterTexture(pointer,
pointer, name.toNativeUtf8().cast<Char>(), texture.pointer, sampler.pointer); name.toNativeUtf8().cast<Char>(), texture.pointer, sampler.pointer);
}
@override
Future setParameterBool(String name, bool value) async {
MaterialInstance_setParameterBool(
pointer, name.toNativeUtf8().cast<Char>(), value);
} }
} }

View File

@@ -13,6 +13,13 @@ external ffi.Pointer<TMaterialInstance> Material_createInstance(
ffi.Pointer<TMaterial> tMaterial, ffi.Pointer<TMaterial> tMaterial,
); );
@ffi.Native<ffi.Bool Function(ffi.Pointer<TMaterial>, ffi.Pointer<ffi.Char>)>(
isLeaf: true)
external bool Material_hasParameter(
ffi.Pointer<TMaterial> tMaterial,
ffi.Pointer<ffi.Char> propertyName,
);
@ffi.Native<ffi.Bool Function(ffi.Pointer<TMaterialInstance>)>(isLeaf: true) @ffi.Native<ffi.Bool Function(ffi.Pointer<TMaterialInstance>)>(isLeaf: true)
external bool MaterialInstance_isStencilWriteEnabled( external bool MaterialInstance_isStencilWriteEnabled(
ffi.Pointer<TMaterialInstance> materialInstance, ffi.Pointer<TMaterialInstance> materialInstance,
@@ -60,7 +67,7 @@ external void MaterialInstance_setDepthCulling(
ffi.Double, ffi.Double, ffi.Double, ffi.Double)>(isLeaf: true) ffi.Double, ffi.Double, ffi.Double, ffi.Double)>(isLeaf: true)
external void MaterialInstance_setParameterFloat4( external void MaterialInstance_setParameterFloat4(
ffi.Pointer<TMaterialInstance> materialInstance, ffi.Pointer<TMaterialInstance> materialInstance,
ffi.Pointer<ffi.Char> name, ffi.Pointer<ffi.Char> propertyName,
double x, double x,
double y, double y,
double w, double w,
@@ -72,7 +79,7 @@ external void MaterialInstance_setParameterFloat4(
ffi.Double, ffi.Double)>(isLeaf: true) ffi.Double, ffi.Double)>(isLeaf: true)
external void MaterialInstance_setParameterFloat2( external void MaterialInstance_setParameterFloat2(
ffi.Pointer<TMaterialInstance> materialInstance, ffi.Pointer<TMaterialInstance> materialInstance,
ffi.Pointer<ffi.Char> name, ffi.Pointer<ffi.Char> propertyName,
double x, double x,
double y, double y,
); );
@@ -82,7 +89,7 @@ external void MaterialInstance_setParameterFloat2(
ffi.Double)>(isLeaf: true) ffi.Double)>(isLeaf: true)
external void MaterialInstance_setParameterFloat( external void MaterialInstance_setParameterFloat(
ffi.Pointer<TMaterialInstance> materialInstance, ffi.Pointer<TMaterialInstance> materialInstance,
ffi.Pointer<ffi.Char> name, ffi.Pointer<ffi.Char> propertyName,
double value, double value,
); );
@@ -91,10 +98,19 @@ external void MaterialInstance_setParameterFloat(
ffi.Int)>(isLeaf: true) ffi.Int)>(isLeaf: true)
external void MaterialInstance_setParameterInt( external void MaterialInstance_setParameterInt(
ffi.Pointer<TMaterialInstance> materialInstance, ffi.Pointer<TMaterialInstance> materialInstance,
ffi.Pointer<ffi.Char> name, ffi.Pointer<ffi.Char> propertyName,
int value, int value,
); );
@ffi.Native<
ffi.Void Function(ffi.Pointer<TMaterialInstance>, ffi.Pointer<ffi.Char>,
ffi.Bool)>(isLeaf: true)
external void MaterialInstance_setParameterBool(
ffi.Pointer<TMaterialInstance> materialInstance,
ffi.Pointer<ffi.Char> propertyName,
bool value,
);
@ffi.Native< @ffi.Native<
ffi.Void Function(ffi.Pointer<TMaterialInstance>, ffi.Pointer<ffi.Char>, ffi.Void Function(ffi.Pointer<TMaterialInstance>, ffi.Pointer<ffi.Char>,
ffi.Pointer<TTexture>, ffi.Pointer<TTextureSampler>)>(isLeaf: true) ffi.Pointer<TTexture>, ffi.Pointer<TTextureSampler>)>(isLeaf: true)

View File

@@ -93,6 +93,7 @@ enum TransparencyMode {
abstract class Material { abstract class Material {
Future<MaterialInstance> createInstance(); Future<MaterialInstance> createInstance();
Future<bool> hasParameter(String propertyName);
Future dispose(); Future dispose();
} }
@@ -106,6 +107,7 @@ abstract class MaterialInstance {
Future setParameterFloat2(String name, double x, double y); Future setParameterFloat2(String name, double x, double y);
Future setParameterFloat(String name, double x); Future setParameterFloat(String name, double x);
Future setParameterInt(String name, int value); Future setParameterInt(String name, int value);
Future setParameterBool(String name, bool value);
Future setParameterTexture( Future setParameterTexture(
String name, covariant Texture texture, covariant TextureSampler sampler); String name, covariant Texture texture, covariant TextureSampler sampler);

View File

@@ -68,16 +68,18 @@ extern "C"
}; };
EMSCRIPTEN_KEEPALIVE TMaterialInstance *Material_createInstance(TMaterial *tMaterial); 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 bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *materialInstance);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWrite(TMaterialInstance *materialInstance, bool enabled); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWrite(TMaterialInstance *materialInstance, bool enabled);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setCullingMode(TMaterialInstance *materialInstance, TCullingMode culling); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setCullingMode(TMaterialInstance *materialInstance, TCullingMode culling);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance *materialInstance, bool enabled); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthWrite(TMaterialInstance *materialInstance, bool enabled);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthCulling(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_setParameterFloat4(TMaterialInstance *materialInstance, const char *propertyName, 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_setParameterFloat2(TMaterialInstance *materialInstance, const char *propertyName, double x, double y);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance *materialInstance, const char *name, double value); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterFloat(TMaterialInstance *materialInstance, const char *propertyName, double value);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterInt(TMaterialInstance *materialInstance, const char *name, int 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_setParameterTexture(TMaterialInstance *materialInstance, const char *propertyName, TTexture *texture, TTextureSampler *sampler);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *materialInstance, TSamplerCompareFunc depthFunc); EMSCRIPTEN_KEEPALIVE void MaterialInstance_setDepthFunc(TMaterialInstance *materialInstance, TSamplerCompareFunc depthFunc);

View File

@@ -21,6 +21,11 @@ namespace thermion
return reinterpret_cast<TMaterialInstance *>(instance); return reinterpret_cast<TMaterialInstance *>(instance);
} }
EMSCRIPTEN_KEEPALIVE bool Material_hasParameter(TMaterial *tMaterial, const char *propertyName) {
auto *material = reinterpret_cast<filament::Material *>(tMaterial);
return material->hasParameter(propertyName);
}
EMSCRIPTEN_KEEPALIVE bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *tMaterialInstance) EMSCRIPTEN_KEEPALIVE bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *tMaterialInstance)
{ {
return reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance)->isStencilWriteEnabled(); return reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance)->isStencilWriteEnabled();
@@ -61,6 +66,11 @@ namespace thermion
reinterpret_cast<::filament::MaterialInstance *>(materialInstance)->setParameter(propertyName, value); 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) { EMSCRIPTEN_KEEPALIVE void MaterialInstance_setParameterTexture(TMaterialInstance *tMaterialInstance, const char *propertyName, TTexture* tTexture, TTextureSampler* tSampler) {
auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance); auto *materialInstance = reinterpret_cast<::filament::MaterialInstance *>(tMaterialInstance);
auto texture = reinterpret_cast<::filament::Texture*>(tTexture); auto texture = reinterpret_cast<::filament::Texture*>(tTexture);