From 17e4d2b92efcbd19a6980e8507baf8bd1d0bce01 Mon Sep 17 00:00:00 2001 From: show50726 Date: Wed, 23 Oct 2024 01:46:24 +0800 Subject: [PATCH] Add public API in View for transparent picking (#8206) --- .../filament-android/src/main/cpp/View.cpp | 14 +++++++++ .../com/google/android/filament/View.java | 29 +++++++++++++++++++ filament/include/filament/View.h | 20 +++++++++++++ filament/src/View.cpp | 8 +++++ web/filament-js/filament.d.ts | 2 ++ web/filament-js/jsbindings.cpp | 2 ++ 6 files changed, 75 insertions(+) diff --git a/android/filament-android/src/main/cpp/View.cpp b/android/filament-android/src/main/cpp/View.cpp index ac04c5326e..f1eae2c4de 100644 --- a/android/filament-android/src/main/cpp/View.cpp +++ b/android/filament-android/src/main/cpp/View.cpp @@ -222,6 +222,20 @@ Java_com_google_android_filament_View_nIsFrontFaceWindingInverted(JNIEnv*, return static_cast(view->isFrontFaceWindingInverted()); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_View_nSetTransparentPickingEnabled(JNIEnv*, + jclass, jlong nativeView, jboolean enabled) { + View* view = (View*) nativeView; + view->setTransparentPickingEnabled(enabled); +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_google_android_filament_View_nIsTransparentPickingEnabled(JNIEnv*, + jclass, jlong nativeView) { + View* view = (View*) nativeView; + return static_cast(view->isTransparentPickingEnabled()); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_View_nSetAmbientOcclusion(JNIEnv*, jclass, jlong nativeView, jint ordinal) { View* view = (View*) nativeView; diff --git a/android/filament-android/src/main/java/com/google/android/filament/View.java b/android/filament-android/src/main/java/com/google/android/filament/View.java index f300d07f88..0bcd1299b7 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/View.java +++ b/android/filament-android/src/main/java/com/google/android/filament/View.java @@ -745,6 +745,33 @@ public class View { nSetFrontFaceWindingInverted(getNativeObject(), inverted); } + /** + * Returns true if transparent picking is enabled. + * + * @see #setTransparentPickingEnabled + */ + public boolean isTransparentPickingEnabled() { + return nIsTransparentPickingEnabled(getNativeObject()); + } + + /** + * Enables or disables transparent picking. Disabled by default. + * + * When transparent picking is enabled, View::pick() will pick from both + * transparent and opaque renderables. When disabled, View::pick() will only + * pick from opaque renderables. + * + *

+ * Transparent picking will create an extra pass for rendering depth + * from both transparent and opaque renderables. + *

+ * + * @param enabled true enables transparent picking, false disables it. + */ + public void setTransparentPickingEnabled(boolean enabled) { + nSetTransparentPickingEnabled(getNativeObject(), enabled); + } + /** * Sets options relative to dynamic lighting for this view. * @@ -1281,6 +1308,8 @@ public class View { private static native boolean nIsPostProcessingEnabled(long nativeView); private static native void nSetFrontFaceWindingInverted(long nativeView, boolean inverted); private static native boolean nIsFrontFaceWindingInverted(long nativeView); + private static native void nSetTransparentPickingEnabled(long nativeView, boolean enabled); + private static native boolean nIsTransparentPickingEnabled(long nativeView); private static native void nSetAmbientOcclusion(long nativeView, int ordinal); private static native int nGetAmbientOcclusion(long nativeView); private static native void nSetAmbientOcclusionOptions(long nativeView, float radius, float bias, float power, float resolution, float intensity, float bilateralThreshold, int quality, int lowPassFilter, int upsampling, boolean enabled, boolean bentNormals, float minHorizonAngleRad); diff --git a/filament/include/filament/View.h b/filament/include/filament/View.h index 139dcac7f4..5c258e5107 100644 --- a/filament/include/filament/View.h +++ b/filament/include/filament/View.h @@ -668,6 +668,26 @@ public: */ bool isFrontFaceWindingInverted() const noexcept; + /** + * Enables or disables transparent picking. Disabled by default. + * + * When transparent picking is enabled, View::pick() will pick from both + * transparent and opaque renderables. When disabled, View::pick() will only + * pick from opaque renderables. + * + * @param enabled true enables transparent picking, false disables it. + * + * @note Transparent picking will create an extra pass for rendering depth + * from both transparent and opaque renderables. + */ + void setTransparentPickingEnabled(bool enabled) noexcept; + + /** + * Returns true if transparent picking is enabled. + * See setTransparentPickingEnabled() for more information. + */ + bool isTransparentPickingEnabled() const noexcept; + /** * Enables use of the stencil buffer. * diff --git a/filament/src/View.cpp b/filament/src/View.cpp index 0d5d3aa61c..7bd4f718ad 100644 --- a/filament/src/View.cpp +++ b/filament/src/View.cpp @@ -185,6 +185,14 @@ bool View::isFrontFaceWindingInverted() const noexcept { return downcast(this)->isFrontFaceWindingInverted(); } +void View::setTransparentPickingEnabled(bool enabled) noexcept { + downcast(this)->setTransparentPickingEnabled(enabled); +} + +bool View::isTransparentPickingEnabled() const noexcept { + return downcast(this)->isTransparentPickingEnabled(); +} + void View::setDynamicLightingOptions(float zLightNear, float zLightFar) noexcept { downcast(this)->setDynamicLightingOptions(zLightNear, zLightFar); } diff --git a/web/filament-js/filament.d.ts b/web/filament-js/filament.d.ts index 17d874c352..05b48da136 100644 --- a/web/filament-js/filament.d.ts +++ b/web/filament-js/filament.d.ts @@ -514,6 +514,8 @@ export class View { public setAntiAliasing(antialiasing: View$AntiAliasing): void; public setStencilBufferEnabled(enabled: boolean): void; public isStencilBufferEnabled(): boolean; + public setTransparentPickingEnabled(enabled: boolean): void; + public isTransparentPickingEnabled(): boolean; } export class TransformManager { diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index 7dcdb7c183..c45c50b35b 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -680,6 +680,8 @@ class_("View") .function("setRenderTarget", EMBIND_LAMBDA(void, (View* self, RenderTarget* renderTarget), { self->setRenderTarget(renderTarget); }), allow_raw_pointers()) + .function("setTransparentPickingEnabled", &View::setTransparentPickingEnabled) + .function("isTransparentPickingEnabled", &View::isTransparentPickingEnabled) .function("setStencilBufferEnabled", &View::setStencilBufferEnabled) .function("isStencilBufferEnabled", &View::isStencilBufferEnabled) .function("setMaterialGlobal", &View::setMaterialGlobal)