fission-3d 0.2.0

3D scene primitives and rendering data types for Fission applications
Documentation
use fission_3d::{Point3D, Primitive3D, Scene3D, Scene3DLowerer};
use fission_core::{
    env::Env, lowering::LoweringContext, op::Color, ui::traits::LowerDyn, RuntimeState,
};
use fission_ir::op::{EmbedKind, LayoutOp};

#[test]
fn test_scene3d_builder() {
    let scene = Scene3D::new()
        .width(800.0)
        .height(600.0)
        .add_primitive(Primitive3D::Cube {
            center: Point3D::new(0.0, 0.0, 0.0),
            size: 1.0,
            color: Color::RED,
        })
        .add_primitive(Primitive3D::Sphere {
            center: Point3D::new(2.0, 2.0, 2.0),
            radius: 0.5,
            color: Color::BLUE,
        });

    assert_eq!(scene.width, Some(800.0));
    assert_eq!(scene.height, Some(600.0));
    assert_eq!(scene.primitives.len(), 2);
}

#[test]
fn test_scene3d_lowering() {
    let scene = Scene3D::new().width(100.0).height(200.0);
    let lowerer = Scene3DLowerer { scene };

    let env = Env::default();
    let runtime_state = RuntimeState::default();
    let mut cx = LoweringContext::new(&env, &runtime_state, None, None);

    // Simulate lowering context initialization
    let root_id = cx.next_node_id();
    cx.push_scope(root_id);

    let generated_id = lowerer.lower_dyn(&mut cx);

    let ir = cx.ir;
    let node = ir.nodes.get(&generated_id).expect("Node should exist");

    match &node.op {
        fission_ir::Op::Layout(LayoutOp::Embed {
            kind: EmbedKind::Custom(payload),
            width,
            height,
            ..
        }) => {
            assert_eq!(*width, Some(100.0));
            assert_eq!(*height, Some(200.0));
            assert!(!payload.is_empty());
        }
        _ => panic!("Expected Embed LayoutOp"),
    }
}