feat: add setTransparencyMode to Dart Material class

This commit is contained in:
Nick Fisher
2024-12-17 16:36:53 +08:00
parent aabea985bd
commit f873f7da66
4 changed files with 61 additions and 5 deletions

View File

@@ -139,7 +139,14 @@ class FFIMaterialInstance extends MaterialInstance {
Future dispose() async {
await withVoidCallback((cb) {
SceneManager_destroyMaterialInstanceRenderThread(sceneManager, pointer, cb);
SceneManager_destroyMaterialInstanceRenderThread(
sceneManager, pointer, cb);
});
}
@override
Future setTransparencyMode(TransparencyMode mode) async {
MaterialInstance_setTransparencyMode(
pointer, TTransparencyMode.values[mode.index]);
}
}

View File

@@ -70,7 +70,28 @@ enum StencilFace {
FRONT_AND_BACK
}
enum AlphaMode { OPAQUE, MASK, BLEND }
enum AlphaMode {
OPAQUE,
MASK,
BLEND
}
enum TransparencyMode {
//! the transparent object is drawn honoring the raster state
DEFAULT,
/**
* the transparent object is first drawn in the depth buffer,
* then in the color buffer, honoring the culling mode, but ignoring the depth test function
*/
TWO_PASSES_ONE_SIDE,
/**
* the transparent object is drawn twice in the color buffer,
* first with back faces only, then with front faces; the culling
* mode is ignored. Can be combined with two-sided lighting
*/
TWO_PASSES_TWO_SIDES
}
abstract class Material {
Future<MaterialInstance> createInstance();
@@ -115,6 +136,7 @@ abstract class MaterialInstance {
Future setStencilReadMask(int mask);
Future setStencilWriteMask(int mask);
Future dispose();
Future setTransparencyMode(TransparencyMode mode);
Future dispose();
}

View File

@@ -35,7 +35,6 @@ extern "C"
INVERT // Invert the current value
};
// StencilFace equivalent
enum TStencilFace
{
STENCIL_FACE_FRONT = 1,
@@ -43,7 +42,6 @@ extern "C"
STENCIL_FACE_FRONT_AND_BACK = 3
};
// Add these enum definitions at the top with the other enums
enum TCullingMode
{
CULLING_MODE_NONE = 0,
@@ -52,6 +50,23 @@ extern "C"
CULLING_MODE_FRONT_AND_BACK
};
enum TTransparencyMode {
//! the transparent object is drawn honoring the raster state
DEFAULT,
/**
* the transparent object is first drawn in the depth buffer,
* then in the color buffer, honoring the culling mode, but ignoring the depth test function
*/
TWO_PASSES_ONE_SIDE,
/**
* the transparent object is drawn twice in the color buffer,
* first with back faces only, then with front faces; the culling
* mode is ignored. Can be combined with two-sided lighting
*/
TWO_PASSES_TWO_SIDES
};
EMSCRIPTEN_KEEPALIVE TMaterialInstance *Material_createInstance(TMaterial *tMaterial);
EMSCRIPTEN_KEEPALIVE bool MaterialInstance_isStencilWriteEnabled(TMaterialInstance *materialInstance);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setStencilWrite(TMaterialInstance *materialInstance, bool enabled);
@@ -98,6 +113,10 @@ extern "C"
TMaterialInstance *materialInstance,
uint8_t mask);
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setTransparencyMode(
TMaterialInstance *materialInstance,
TTransparencyMode transparencyMode);
#ifdef __cplusplus
}

View File

@@ -139,6 +139,14 @@ namespace thermion
auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance);
instance->setStencilWriteMask(mask);
}
EMSCRIPTEN_KEEPALIVE void MaterialInstance_setTransparencyMode(
TMaterialInstance *materialInstance,
TTransparencyMode transparencyMode)
{
auto *instance = reinterpret_cast<::filament::MaterialInstance *>(materialInstance);
instance->setTransparencyMode((filament::TransparencyMode)transparencyMode);
}
#ifdef __cplusplus
}
}