diff --git a/android/filament-android/src/main/cpp/View.cpp b/android/filament-android/src/main/cpp/View.cpp index 0da7158447..2f2f897dd3 100644 --- a/android/filament-android/src/main/cpp/View.cpp +++ b/android/filament-android/src/main/cpp/View.cpp @@ -198,18 +198,40 @@ Java_com_google_android_filament_View_nSetAmbientOcclusionOptions(JNIEnv*, jclas jlong nativeView, jfloat radius, jfloat bias, jfloat power, jfloat resolution, jfloat intensity, jint quality, jint lowPassFilter, jint upsampling, jboolean enabled, jfloat minHorizonAngleRad) { View* view = (View*) nativeView; - View::AmbientOcclusionOptions options = { - .radius = radius, - .power = power, - .bias = bias, - .resolution = resolution, - .intensity = intensity, - .quality = (View::QualityLevel)quality, - .lowPassFilter = (View::QualityLevel)lowPassFilter, - .upsampling = (View::QualityLevel)upsampling, - .enabled = (bool)enabled, - .minHorizonAngleRad = minHorizonAngleRad - }; + View::AmbientOcclusionOptions options = view->getAmbientOcclusionOptions(); + options.radius = radius; + options.power = power; + options.bias = bias; + options.resolution = resolution; + options.intensity = intensity; + options.quality = (View::QualityLevel)quality; + options.lowPassFilter = (View::QualityLevel)lowPassFilter; + options.upsampling = (View::QualityLevel)upsampling; + options.enabled = (bool)enabled; + options.minHorizonAngleRad = minHorizonAngleRad; + view->setAmbientOcclusionOptions(options); +} + + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_View_nSetSSCTOptions(JNIEnv *, jclass, jlong nativeView, + jfloat ssctLightConeRad, jfloat ssctStartTraceDistance, jfloat ssctContactDistanceMax, + jfloat ssctIntensity, jfloat ssctLightDirX, jfloat ssctLightDirY, jfloat ssctLightDirZ, + jfloat ssctDepthBias, jfloat ssctDepthSlopeBias, jfloat ssctScale, jint ssctSampleCount, + jint ssctRayCount, jboolean ssctEnabled) { + View* view = (View*) nativeView; + View::AmbientOcclusionOptions options = view->getAmbientOcclusionOptions(); + options.ssct.lightConeRad = ssctLightConeRad; + options.ssct.startTraceDistance = ssctStartTraceDistance; + options.ssct.contactDistanceMax = ssctContactDistanceMax; + options.ssct.intensity = ssctIntensity; + options.ssct.lightDirection = math::float3{ ssctLightDirX, ssctLightDirY, ssctLightDirZ }; + options.ssct.depthBias = ssctDepthBias; + options.ssct.depthSlopeBias = ssctDepthSlopeBias; + options.ssct.scale = ssctScale; + options.ssct.sampleCount = (uint8_t)ssctSampleCount; + options.ssct.rayCount = (uint8_t)ssctRayCount; + options.ssct.enabled = (bool)ssctEnabled; view->setAmbientOcclusionOptions(options); } 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 4937a5ee31..18dd158194 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 @@ -203,6 +203,69 @@ public class View { * For e.g. a good values to try could be around 0.2. */ public float minHorizonAngleRad = 0.0f; + + + /** + * Full cone angle in radian, between 0 and pi/2. This affects the softness of the shadows, + * as well as how far they are cast. A smaller angle yields to sharper and shorter shadows. + * The default angle is about 60 degrees. + */ + public float ssctLightConeRad = 1.0f; + + /** + * Distance from where tracing starts. + * This affects how far shadows are cast. + */ + public float ssctStartTraceDistance = 0.01f; + + /** + * Maximum contact distance with the cone. Intersections between the traced cone and + * geometry samller than this distance are ignored. + */ + public float ssctContactDistanceMax = 1.0f; + + /** + * Intensity of the shadows. + */ + public float ssctIntensity = 0.8f; + + /** + * Light direction. + */ + @NonNull @Size(min = 3) + public float[] ssctLightDirection = { 0, -1, 0 }; + + /** + * Depth bias in world units (mitigate self shadowing) + */ + public float ssctDepthBias = 0.1f; + + /** + * Depth slope bias (mitigate self shadowing) + */ + public float ssctDepthSlopeBias = 0.1f; + + /** + * Shadows scaling. + */ + public float ssctScale = 1.0f; + + /** + * Tracing sample count, between 1 and 255. This affects the quality as well as the + * distance of the shadows. + */ + public int ssctSampleCount = 4; + + /** + * Numbers of rays to trace, between 1 and 255. This affects the noise of the shadows. + * Performance degrades quickly with this value. + */ + public int ssctRayCount = 1; + + /** + * Enables or disables SSCT. + */ + public boolean ssctEnabled = false; } /** @@ -1119,6 +1182,10 @@ public class View { nSetAmbientOcclusionOptions(getNativeObject(), options.radius, options.bias, options.power, options.resolution, options.intensity, options.quality.ordinal(), options.lowPassFilter.ordinal(), options.upsampling.ordinal(), options.enabled, options.minHorizonAngleRad); + nSetSSCTOptions(getNativeObject(), options.ssctLightConeRad, options.ssctStartTraceDistance, options.ssctContactDistanceMax, options.ssctIntensity, + options.ssctLightDirection[0], options.ssctLightDirection[1], options.ssctLightDirection[2], + options.ssctDepthBias, options.ssctDepthSlopeBias, options.ssctScale, options.ssctSampleCount, + options.ssctRayCount, options.ssctEnabled); } /** @@ -1283,6 +1350,7 @@ public class View { 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, int quality, int lowPassFilter, int upsampling, boolean enabled, float minHorizonAngleRad); + private static native void nSetSSCTOptions(long nativeView, float ssctLightConeRad, float ssctStartTraceDistance, float ssctContactDistanceMax, float ssctIntensity, float v, float v1, float v2, float ssctDepthBias, float ssctDepthSlopeBias, float ssctScale, int ssctSampleCount, int ssctRayCount, boolean ssctEnabled); private static native void nSetBloomOptions(long nativeView, long dirtNativeObject, float dirtStrength, float strength, int resolution, float anamorphism, int levels, int blendMode, boolean threshold, boolean enabled, float highlight); private static native void nSetFogOptions(long nativeView, float distance, float maximumOpacity, float height, float heightFalloff, float v, float v1, float v2, float density, float inScatteringStart, float inScatteringSize, boolean fogColorFromIbl, boolean enabled); private static native void nSetBlendMode(long nativeView, int blendMode);