maple 0.4.0

A 3D game engine
Documentation
use maple::prelude::*;

fn main() {
    App::new(Config::default())
        .add_plugin(Core3D)
        .load_scene(MainScene)
        .run();
}

pub struct MainScene;

impl SceneBuilder for MainScene {
    fn build(self, assets: &AssetLibrary) -> Scene {
        let scene = Scene::default();

        scene.spawn(
            Environment::new(assets.load("res/kloofendal_48d_partly_cloudy_puresky_4k.hdr"))
                .with_ibl_strength(0.2),
        );

        scene
            .spawn(
                Camera3D::builder()
                    .fov(90.0)
                    .exposure(0.5)
                    .position(Vec3 {
                        x: 0.0,
                        y: 1.0,
                        z: 5.0,
                    })
                    .far_plane(100.0)
                    .near_plane(0.01)
                    .looking_at(Vec3::ZERO)
                    .build(),
            )
            .on::<Update>(Camera3D::free_fly(1.0, 1.0))
            .on::<Ready>(|ctx| {
                ctx.get_resource_mut::<Window>().set_cursor_locked(true);
            })
            .on::<FixedUpdate>(|ctx| {
                let input = ctx.get_resource::<Input>();

                if input.keys.contains(&KeyCode::ArrowUp) {
                    ctx.node_mut().exposure += 0.01
                }
                if input.keys.contains(&KeyCode::ArrowDown) {
                    ctx.node_mut().exposure -= 0.01
                }
            })
            .spawn_child(PointLight::builder().intensity(5.0))
            .on::<Ready>(|ctx| {
                let parent = ctx.node_parent_ref::<Camera3D>().unwrap();

                let forward = parent.transform.get_forward_vector();

                ctx.node_mut().transform.position = forward * 2.0;
            })
            .spawn_child(
                MeshInstance3D::builder()
                    .mesh(assets.add(Sphere::default().radius(0.04)))
                    .material(assets.add(PbrMaterial {
                        emissive_factor: Color::WHITE.with_intensity(5.0),
                        cast_shadows: false,
                        ..Default::default()
                    })),
            );

        let alpha_blend_mode_test = assets.load::<GltfScene>("res/AlphaBlendModeTest.glb");

        let model = scene.spawn(Empty::builder().scale_factor(1.0).build());
        model.child_asset(alpha_blend_mode_test);

        scene
    }
}