From 44d4694c2956a073bc67697abedd8e1829e9d6b2 Mon Sep 17 00:00:00 2001 From: Ben Doherty Date: Wed, 30 Sep 2020 16:12:45 -0600 Subject: [PATCH] Add JNI binding for vsm msaa samples (#3139) --- .../src/main/cpp/LightManager.cpp | 7 ++++-- .../google/android/filament/LightManager.java | 23 +++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/android/filament-android/src/main/cpp/LightManager.cpp b/android/filament-android/src/main/cpp/LightManager.cpp index 1c71d1bf71..8cc37f69d7 100644 --- a/android/filament-android/src/main/cpp/LightManager.cpp +++ b/android/filament-android/src/main/cpp/LightManager.cpp @@ -77,7 +77,7 @@ Java_com_google_android_filament_LightManager_nBuilderShadowOptions(JNIEnv* env, jlong nativeBuilder, jint mapSize, jint cascades, jfloatArray splitPositions, jfloat constantBias, jfloat normalBias, jfloat shadowFar, jfloat shadowNearHint, jfloat shadowFarHint, jboolean stable, jboolean screenSpaceContactShadows, jint stepCount, - jfloat maxShadowDistance) { + jfloat maxShadowDistance, jint vsmMsaaSamples) { LightManager::Builder *builder = (LightManager::Builder *) nativeBuilder; LightManager::ShadowOptions shadowOptions { .mapSize = (uint32_t)mapSize, @@ -90,7 +90,10 @@ Java_com_google_android_filament_LightManager_nBuilderShadowOptions(JNIEnv* env, .stable = (bool)stable, .screenSpaceContactShadows = (bool)screenSpaceContactShadows, .stepCount = uint8_t(stepCount), - .maxShadowDistance = maxShadowDistance + .maxShadowDistance = maxShadowDistance, + .vsm = { + .msaaSamples = (uint8_t) vsmMsaaSamples + } }; jfloat *nativeSplits = env->GetFloatArrayElements(splitPositions, NULL); const jsize splitCount = std::min((jsize) 3, env->GetArrayLength(splitPositions)); diff --git a/android/filament-android/src/main/java/com/google/android/filament/LightManager.java b/android/filament-android/src/main/java/com/google/android/filament/LightManager.java index c51c26f035..ea537cf2e7 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/LightManager.java +++ b/android/filament-android/src/main/java/com/google/android/filament/LightManager.java @@ -305,6 +305,25 @@ public class LightManager { *

*/ public float maxShadowDistance = 0.3f; + + /* + * Options prefixed with 'vsm' are available when the View's ShadowType is set to VSM. + * + * @see View#setShadowType + */ + + /** + * The number of MSAA samples to use when rendering VSM shadow maps. + * Must be a power-of-two and greater than or equal to 1. A value of 1 effectively turns + * off MSAA. + * Higher values may not be available depending on the underlying hardware. + * + *

+ * Warning: This API is still experimental and subject to change. + *

+ */ + @IntRange(from = 1) + public int vsmMsaaSamples = 1; } public static class ShadowCascades { @@ -433,7 +452,7 @@ public class LightManager { options.mapSize, options.shadowCascades, options.cascadeSplitPositions, options.constantBias, options.normalBias, options.shadowFar, options.shadowNearHint, options.shadowFarHint, options.stable, options.screenSpaceContactShadows, - options.stepCount, options.maxShadowDistance); + options.stepCount, options.maxShadowDistance, options.vsmMsaaSamples); return this; } @@ -1059,7 +1078,7 @@ public class LightManager { private static native void nDestroyBuilder(long nativeBuilder); private static native boolean nBuilderBuild(long nativeBuilder, long nativeEngine, int entity); private static native void nBuilderCastShadows(long nativeBuilder, boolean enable); - private static native void nBuilderShadowOptions(long nativeBuilder, int mapSize, int cascades, float[] splitPositions, float constantBias, float normalBias, float shadowFar, float shadowNearHint, float shadowFarhint, boolean stable, boolean screenSpaceContactShadows, int stepCount, float maxShadowDistance); + private static native void nBuilderShadowOptions(long nativeBuilder, int mapSize, int cascades, float[] splitPositions, float constantBias, float normalBias, float shadowFar, float shadowNearHint, float shadowFarhint, boolean stable, boolean screenSpaceContactShadows, int stepCount, float maxShadowDistance, int vsmMsaaSamples); private static native void nBuilderCastLight(long nativeBuilder, boolean enabled); private static native void nBuilderPosition(long nativeBuilder, float x, float y, float z); private static native void nBuilderDirection(long nativeBuilder, float x, float y, float z);