Import: a 3D model doesn't ask how to interpret its alpha (#264)

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 <noreply@anthropic.com>
This commit is contained in:
bflatastic 2026-10-08 21:18:52 +07:00
parent 6ffbfe7cea
commit 69dc1b26fb
2 changed files with 17 additions and 2 deletions

View File

@ -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,

View File

@ -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")));
}