diff --git a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt index d7abeb8f5e..81d1f7ef55 100644 --- a/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt +++ b/android/filament-utils-android/src/main/java/com/google/android/filament/utils/ModelViewer.kt @@ -266,6 +266,35 @@ class ModelViewer( } } + /** + * Resets the model's transform, animation, and camera state to defaults. + * Call this when reusing the same model across multiple tests. + */ + fun resetToDefaultState() { + // 1. Reset Camera parameters + cameraFocalLength = 28f + cameraNear = kNearPlane + cameraFar = kFarPlane + updateCameraProjection() + + // 2. Reset the manipulator's look-at vectors to initial state + cameraManipulator?.let { cm -> + cm.jumpToBookmark(cm.homeBookmark) + } + + // 3. Reset Animations + animator?.let { + if (it.animationCount > 0) { + it.applyAnimation(0, 0.0f) + } + it.updateBoneMatrices() + } + + // 4. Re-apply the unit cube transform to clear custom scaling/translation + clearRootTransform() + transformToUnitCube() + } + /** * Frees all entities associated with the most recently-loaded model. */ diff --git a/android/samples/sample-render-validation/src/main/java/com/google/android/filament/validation/MainActivity.kt b/android/samples/sample-render-validation/src/main/java/com/google/android/filament/validation/MainActivity.kt index 942a230465..f0fecf45a8 100644 --- a/android/samples/sample-render-validation/src/main/java/com/google/android/filament/validation/MainActivity.kt +++ b/android/samples/sample-render-validation/src/main/java/com/google/android/filament/validation/MainActivity.kt @@ -175,7 +175,7 @@ class MainActivity : Activity(), ValidationRunner.Callback { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) choreographer = Choreographer.getInstance() - modelViewer = ModelViewer(surfaceView) + modelViewer = ModelViewer(surfaceView=surfaceView, manipulator=null) inputManager = ValidationInputManager(this) // Initialize IBL diff --git a/android/samples/sample-render-validation/src/main/java/com/google/android/filament/validation/ValidationRunner.kt b/android/samples/sample-render-validation/src/main/java/com/google/android/filament/validation/ValidationRunner.kt index 762e274542..e75b4a4fea 100644 --- a/android/samples/sample-render-validation/src/main/java/com/google/android/filament/validation/ValidationRunner.kt +++ b/android/samples/sample-render-validation/src/main/java/com/google/android/filament/validation/ValidationRunner.kt @@ -81,6 +81,17 @@ class ValidationRunner( } private fun startModel(modelName: String) { + if (currentModelName == modelName) { + Log.i("ValidationRunner", "Reusing model $modelName") + callback?.onStatusChanged("Reusing $modelName for ${currentTestConfig?.name}") + + modelViewer.resetToDefaultState() + + frameCounter = 0 + currentState = State.WARMUP + return + } + currentModelName = modelName val modelPath = config.models[modelName] if (modelPath == null) {