Files
OneCAD/crates/ui-egui/src/viewport_appearance_tests.rs
T
bherbruckandClaude Opus 5.5 296683229d Rename SolveCraft to SolidCraft everywhere, with compatibility shims (#389)
* WIP deep rename (not for push)

* WIP2

* WIP3

* WIP4 wxs fix

* rustfmt

* Rename the remaining identifiers in merged crash-report code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RjGw4gA5ZvKrU8MQP6sBgT

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 17:17:01 -04:00

55 lines
2.9 KiB
Rust

use super::build_scene;
use crate::{Services, SolveApp};
use serde_json::json;
use solidcraft_engine::{Session, doc, geom::Vec3, kernel};
#[test]
fn placed_step_body_uses_imported_opacity_until_a_design_look_overrides_it() {
let body = kernel::box_solid(Vec3::ZERO, Vec3::new(10.0, 10.0, 10.0))
.unwrap()
.with_color(Some([0.2, 0.6, 0.8]))
.with_paint(Some(kernel::Paint { opacity: 0.4, faces: Vec::new() }));
let step =
kernel::step_export_bodies(&[kernel::ExportBody { name: "Imported glass".into(), body: &body, color: body.color() }], &Default::default())
.unwrap();
let mut document = doc::Document::default();
let component = document.add_component(Some("Imported part"), 0).unwrap();
let feature = document.add_feature(doc::FeatureKind::Import { file: "glass.step".into(), step, components: Vec::new() }, None).unwrap();
document.features.iter_mut().find(|f| f.id == feature).unwrap().component = component;
let mut session = Session::new(document);
let source = session.model.state().bodies[0].name.clone();
assert!((session.doc.model_body_opacity(&session.model.state().bodies[0]) - 0.4).abs() < 1e-6);
session.execute("occurrence.copy", &json!({"component":component,"translate":[30,0,0]})).unwrap();
let mut app = SolveApp::new(session, Services::default());
app.ui.ground_shadow = false;
app.ui.show_origin = false;
let placed = app.session.world_state().bodies.iter().find(|b| b.name != source).unwrap().name.clone();
app.session.selection = vec![solidcraft_engine::Sel::Body { name: placed }];
app.start("appearance.assign");
let crate::dialogs::Kind::Appearance(appearance) = &app.dialog.as_ref().unwrap().kind else { panic!("appearance dialog") };
assert!((appearance.opacity - 0.4).abs() < 1e-6);
assert_eq!(appearance.color, [51, 153, 204]);
crate::dialogs::cancel(&mut app);
let scene = build_scene(&app);
assert!(!scene.glass.is_empty());
assert!(
scene.tris.is_empty(),
"opaque triangles {}, bodies {:?}",
scene.tris.len(),
app.session.world_state().bodies.iter().map(|b| (&b.name, b.body.paint(), &b.imported)).collect::<Vec<_>>()
);
let (vertices, remainder) = scene.glass.as_chunks::<{ crate::gpu::TRI_SIZE }>();
assert!(remainder.is_empty());
assert!(vertices.iter().all(|v| v[27] == 102));
app.run("appearance.assign", json!({"bodies":[source],"color":"#336699","opacity":0.7})).unwrap();
let scene = build_scene(&app);
let (vertices, remainder) = scene.glass.as_chunks::<{ crate::gpu::TRI_SIZE }>();
assert!(remainder.is_empty());
assert!(vertices.iter().all(|v| v[27] == 179));
app.run("appearance.assign", json!({"bodies":[source]})).unwrap();
let scene = build_scene(&app);
let (vertices, remainder) = scene.glass.as_chunks::<{ crate::gpu::TRI_SIZE }>();
assert!(remainder.is_empty());
assert!(vertices.iter().all(|v| v[27] == 102));
}