From 69dc1b26fbc50af2d079a38229dbb835561a8d34 Mon Sep 17 00:00:00 2001 From: bflatastic Date: Thu, 8 Oct 2026 21:18:52 +0700 Subject: [PATCH] Import: a 3D model doesn't ask how to interpret its alpha (#264) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Importing a glTF / OBJ model opened Interpret Footage: the probe reports straight alpha and the file has no alpha label, so with Settings ▸ Import ▸ Interpret Unlabeled Alpha As at Ask User (the default) the model was listed as unlabeled. Only image footage (stills, sequences, video) can have unlabeled alpha; a model renders its own, and audio and data have none. Test: importing_a_model_does_not_ask_about_alpha (engine). Co-Authored-By: Claude Opus 5.5 --- crates/engine/src/commands/file.rs | 8 ++++++-- crates/engine/src/tests_model3d.rs | 11 +++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/crates/engine/src/commands/file.rs b/crates/engine/src/commands/file.rs index fd215751..3a3e03c5 100644 --- a/crates/engine/src/commands/file.rs +++ b/crates/engine/src/commands/file.rs @@ -264,9 +264,13 @@ impl Prober { { warning = Some(format!("{path}: {gaps}")); } - // Settings ▸ Import ▸ Interpret Unlabeled Alpha As. + // Settings ▸ Import ▸ Interpret Unlabeled Alpha As: images only (a 3D model renders its + // own alpha, and audio and data have none). let mut ask_alpha = false; - if f.alpha != effectcraft_project::AlphaMode::Ignore && !alpha_is_labeled(path, &f.codec) { + if matches!(f.kind, FootageKind::Still | FootageKind::Sequence | FootageKind::Video) + && f.alpha != effectcraft_project::AlphaMode::Ignore + && !alpha_is_labeled(path, &f.codec) + { let setting = if f.kind == FootageKind::Video { self.movie_alpha } else { self.still_alpha }; match setting { Some(a) => f.alpha = a, diff --git a/crates/engine/src/tests_model3d.rs b/crates/engine/src/tests_model3d.rs index 1d8b80f9..d142e5f7 100644 --- a/crates/engine/src/tests_model3d.rs +++ b/crates/engine/src/tests_model3d.rs @@ -229,3 +229,14 @@ fn adding_models_switches_classic_comps_to_advanced_3d() { s.execute("comp.renderer", json!({"renderer": "classic3d"})).unwrap(); assert!(toasts(&mut s).iter().any(|m| m.contains("Classic 3D doesn't draw"))); } + +/// Importing a 3D model doesn't ask how to interpret its alpha (Interpret Footage): a model +/// renders its own. +#[test] +fn importing_a_model_does_not_ask_about_alpha() { + let mut s = session(); + assert_eq!(s.prefs.unlabeled_alpha(false), None, "Ask User"); + let r = s.execute("file.import", json!({"paths": [fixture("quad.glb")]})).unwrap(); + assert_eq!(r["unlabeledAlpha"], json!([])); + assert!(!s.drain_events().iter().any(|e| matches!(e, crate::Event::Frontend { command, .. } if command == "file.interpretFootage"))); +}