From ca4b0650fa0eca9e95c447fbbdc433dc9447ba6c Mon Sep 17 00:00:00 2001 From: Powei Feng Date: Mon, 26 Jan 2026 13:27:23 -0800 Subject: [PATCH] Re-commit "Generalize scene description for automated testing (#9627)" Contains a fix to the default sunlight parameters that broke the renderdiff tests. --- .../src/main/cpp/AutomationEngine.cpp | 43 +- .../filament/utils/AutomationEngine.java | 25 +- .../android/filament/gltf/MainActivity.kt | 6 +- docs/dup/matdbg.html | 4 +- docs/dup/uberz.html | 4 +- docs/dup/viewer.html | 333 +++++++++++ docs/remote/filament.js | 11 +- docs/remote/filament.wasm | Bin 3113375 -> 3240803 bytes docs/searchindex.js | 2 +- docs/searchindex.json | 2 +- docs/toc.html | 2 +- docs/toc.js | 2 +- docs_src/build/duplicates.json | 3 + docs_src/src_mdbook/src/SUMMARY.md | 1 + docs_src/src_raw/remote/filament.js | 11 +- docs_src/src_raw/remote/filament.wasm | Bin 3113375 -> 3240803 bytes .../gltf-viewer/FILViewController.mm | 2 +- libs/viewer/README.md | 147 +++++ libs/viewer/include/viewer/AutomationEngine.h | 11 +- libs/viewer/include/viewer/Settings.h | 95 +++- libs/viewer/include/viewer/ViewerGui.h | 3 + libs/viewer/schemas/README.md | 14 - libs/viewer/schemas/automation.json | 43 -- libs/viewer/src/AutomationEngine.cpp | 86 ++- libs/viewer/src/AutomationSpec.cpp | 23 +- libs/viewer/src/Settings.cpp | 515 ++++++++++++++---- libs/viewer/src/ViewerGui.cpp | 90 +-- libs/viewer/tests/test_settings.cpp | 85 +++ samples/gltf_viewer.cpp | 42 +- test/renderdiff/tests/presubmit.json | 4 +- test/renderdiff/tests/sample.json | 2 +- 31 files changed, 1322 insertions(+), 289 deletions(-) create mode 100644 docs/dup/viewer.html create mode 100644 libs/viewer/README.md delete mode 100644 libs/viewer/schemas/README.md delete mode 100644 libs/viewer/schemas/automation.json diff --git a/android/filament-utils-android/src/main/cpp/AutomationEngine.cpp b/android/filament-utils-android/src/main/cpp/AutomationEngine.cpp index e55a9605ee..8b6204ad5d 100644 --- a/android/filament-utils-android/src/main/cpp/AutomationEngine.cpp +++ b/android/filament-utils-android/src/main/cpp/AutomationEngine.cpp @@ -159,37 +159,50 @@ extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_utils_AutomationEngine_nGetViewerOptions(JNIEnv* env, jclass, jlong nativeObject, jobject result) { AutomationEngine* automation = (AutomationEngine*) nativeObject; - auto options = automation->getViewerOptions(); + const auto& settings = automation->getSettings(); + const auto& options = settings.viewer; const jclass klass = env->GetObjectClass(result); - const jfieldID cameraAperture = env->GetFieldID(klass, "cameraAperture", "F"); - const jfieldID cameraSpeed = env->GetFieldID(klass, "cameraSpeed", "F"); - const jfieldID cameraISO = env->GetFieldID(klass, "cameraISO", "F"); - const jfieldID cameraNear = env->GetFieldID(klass, "cameraNear", "F"); - const jfieldID cameraFar = env->GetFieldID(klass, "cameraFar", "F"); const jfieldID groundShadowStrength = env->GetFieldID(klass, "groundShadowStrength", "F"); const jfieldID groundPlaneEnabled = env->GetFieldID(klass, "groundPlaneEnabled", "Z"); const jfieldID skyboxEnabled = env->GetFieldID(klass, "skyboxEnabled", "Z"); - const jfieldID cameraFocalLength = env->GetFieldID(klass, "cameraFocalLength", "F"); - const jfieldID cameraFocusDistance = env->GetFieldID(klass, "cameraFocusDistance", "F"); const jfieldID autoScaleEnabled = env->GetFieldID(klass, "autoScaleEnabled", "Z"); const jfieldID autoInstancingEnabled = env->GetFieldID(klass, "autoInstancingEnabled", "Z"); - env->SetFloatField(result, cameraAperture, options.cameraAperture); - env->SetFloatField(result, cameraSpeed, options.cameraSpeed); - env->SetFloatField(result, cameraISO, options.cameraISO); - env->SetFloatField(result, cameraNear, options.cameraNear); - env->SetFloatField(result, cameraFar, options.cameraFar); env->SetFloatField(result, groundShadowStrength, options.groundShadowStrength); env->SetBooleanField(result, groundPlaneEnabled, options.groundPlaneEnabled); env->SetBooleanField(result, skyboxEnabled, options.skyboxEnabled); - env->SetFloatField(result, cameraFocalLength, options.cameraFocalLength); - env->SetFloatField(result, cameraFocusDistance, options.cameraFocusDistance); env->SetBooleanField(result, autoScaleEnabled, options.autoScaleEnabled); env->SetBooleanField(result, autoInstancingEnabled, options.autoInstancingEnabled); } +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_utils_AutomationEngine_nGetCameraSettings(JNIEnv* env, jclass, + jlong nativeObject, jobject result) { + AutomationEngine* automation = (AutomationEngine*) nativeObject; + const auto& settings = automation->getSettings(); + const auto& camera = settings.camera; + + const jclass klass = env->GetObjectClass(result); + + const jfieldID aperture = env->GetFieldID(klass, "aperture", "F"); + const jfieldID shutterSpeed = env->GetFieldID(klass, "shutterSpeed", "F"); + const jfieldID sensitivity = env->GetFieldID(klass, "sensitivity", "F"); + const jfieldID near = env->GetFieldID(klass, "near", "F"); + const jfieldID far = env->GetFieldID(klass, "far", "F"); + const jfieldID focalLength = env->GetFieldID(klass, "focalLength", "F"); + const jfieldID focusDistance = env->GetFieldID(klass, "focusDistance", "F"); + + env->SetFloatField(result, aperture, camera.aperture); + env->SetFloatField(result, shutterSpeed, camera.shutterSpeed); + env->SetFloatField(result, sensitivity, camera.sensitivity); + env->SetFloatField(result, near, camera.near); + env->SetFloatField(result, far, camera.far); + env->SetFloatField(result, focalLength, camera.focalLength); + env->SetFloatField(result, focusDistance, camera.focusDistance); +} + extern "C" JNIEXPORT jlong JNICALL Java_com_google_android_filament_utils_AutomationEngine_nGetColorGrading(JNIEnv*, jclass, jlong nativeObject, jlong nativeEngine) { diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/AutomationEngine.java b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/AutomationEngine.java index daa1da4274..2d6c8fa368 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/AutomationEngine.java +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/AutomationEngine.java @@ -94,20 +94,23 @@ public class AutomationEngine { * Allows remote control for the viewer. */ public static class ViewerOptions { - public float cameraAperture = 16.0f; - public float cameraSpeed = 125.0f; - public float cameraISO = 100.0f; - public float cameraNear = 0.1f; - public float cameraFar = 100.0f; public float groundShadowStrength = 0.75f; public boolean groundPlaneEnabled = false; public boolean skyboxEnabled = true; - public float cameraFocalLength = 28.0f; - public float cameraFocusDistance = 0.0f; public boolean autoScaleEnabled = true; public boolean autoInstancingEnabled = false; } + public static class CameraSettings { + public float aperture = 16.0f; + public float shutterSpeed = 125.0f; + public float sensitivity = 100.0f; + public float near = 0.1f; + public float far = 100.0f; + public float focalLength = 28.0f; + public float focusDistance = 10.0f; + } + /** * Creates an automation engine from a JSON specification. * @@ -229,6 +232,13 @@ public class AutomationEngine { return result; } + @NonNull + public CameraSettings getCameraSettings() { + CameraSettings result = new CameraSettings(); + nGetCameraSettings(mNativeObject, result); + return result; + } + /** * Gets a color grading object that corresponds to the latest settings. * @@ -280,6 +290,7 @@ public class AutomationEngine { long[] materials, long ibl, int sunlight, int[] assetLights, long lightManager, long scene, long renderer); private static native void nGetViewerOptions(long nativeObject, Object result); + private static native void nGetCameraSettings(long nativeObject, Object result); private static native long nGetColorGrading(long nativeObject, long nativeEngine); private static native void nSignalBatchMode(long nativeObject); private static native void nStopRunning(long nativeObject); diff --git a/android/samples/sample-gltf-viewer/src/main/java/com/google/android/filament/gltf/MainActivity.kt b/android/samples/sample-gltf-viewer/src/main/java/com/google/android/filament/gltf/MainActivity.kt index 56855eb274..e80815917a 100644 --- a/android/samples/sample-gltf-viewer/src/main/java/com/google/android/filament/gltf/MainActivity.kt +++ b/android/samples/sample-gltf-viewer/src/main/java/com/google/android/filament/gltf/MainActivity.kt @@ -389,9 +389,9 @@ class MainActivity : Activity() { viewerContent.assetLights = modelViewer.asset?.lightEntities automation.applySettings(modelViewer.engine, json, viewerContent) modelViewer.view.colorGrading = automation.getColorGrading(modelViewer.engine) - modelViewer.cameraFocalLength = automation.viewerOptions.cameraFocalLength - modelViewer.cameraNear = automation.viewerOptions.cameraNear - modelViewer.cameraFar = automation.viewerOptions.cameraFar + modelViewer.cameraFocalLength = automation.cameraSettings.focalLength + modelViewer.cameraNear = automation.cameraSettings.near + modelViewer.cameraFar = automation.cameraSettings.far updateRootTransform() } diff --git a/docs/dup/matdbg.html b/docs/dup/matdbg.html index 0845035e77..3fcd6cbfcf 100644 --- a/docs/dup/matdbg.html +++ b/docs/dup/matdbg.html @@ -352,7 +352,7 @@ used to create the SPIR-V is not available.

- @@ -366,7 +366,7 @@ used to create the SPIR-V is not available.

- diff --git a/docs/dup/uberz.html b/docs/dup/uberz.html index 69bc78776a..95499f204d 100644 --- a/docs/dup/uberz.html +++ b/docs/dup/uberz.html @@ -236,7 +236,7 @@ mapping should be specified as an optional feature of the ubershade