lifecycler 0.2.3

Bevy Game Jam #5 submission. Terminal aquarium.
Documentation
use std::f32::consts::PI;

use bevy::prelude::*;

pub(super) fn plugin(app: &mut App) {
    app.add_systems(Startup, setup_tank_system);
}

#[derive(Component)]
pub struct Tank;

fn setup_tank_system(
    mut commands: Commands,
    asset_server: Res<AssetServer>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    commands.spawn((
        Tank,
        SceneBundle {
            transform: Transform::from_scale(Vec3::new(2., 0.5, 2.))
                .with_rotation(Quat::from_rotation_x(PI / 2.)),
            scene: asset_server.load(
                GltfAssetLabel::Scene(0).from_asset("embedded://lifecycler/../assets/tank.glb"),
            ),
            ..default()
        },
    ));
    commands.spawn(SceneBundle {
        transform: Transform::from_scale(Vec3::new(1.8, 1., 0.5))
            .with_translation(Vec3::new(0., -1.75, 0.)),
        scene: asset_server.load(
            GltfAssetLabel::Scene(0).from_asset("embedded://lifecycler/../assets/gravel.glb"),
        ),
        ..default()
    });

    commands.spawn(SceneBundle {
        transform: Transform::from_scale(Vec3::new(2., 0.6, 2.0))
            .with_translation(Vec3::new(0., 0.0, 0.))
            .with_rotation(Quat::from_rotation_x(PI / 2.)),
        scene: asset_server
            .load(GltfAssetLabel::Scene(0).from_asset("embedded://lifecycler/../assets/base.glb")),
        ..default()
    });

    commands.spawn(SceneBundle {
        transform: Transform::from_scale(Vec3::new(2., 2., 0.6))
            .with_translation(Vec3::new(0., 0.0, 0.))
            .with_rotation(Quat::from_rotation_x(0.)),
        scene: asset_server
            .load(GltfAssetLabel::Scene(0).from_asset("embedded://lifecycler/../assets/frame.glb")),
        ..default()
    });

    let coral_bundle = PbrBundle {
        transform: Transform::IDENTITY
            .with_scale(Vec3::splat(0.35))
            .with_rotation(Quat::from_euler(
                EulerRot::ZXY,
                3. * PI / 2.,
                1. * PI / 2.,
                0.,
            )),
        material: materials.add(StandardMaterial::from_color(Color::srgb(0.2, 0.6, 0.5))),
        ..default()
    };

    let mut coral_bundle_1 = coral_bundle.clone();
    coral_bundle_1.transform = coral_bundle_1
        .transform
        .with_translation(Vec3::new(-1.24, -1.8, 0.));
    coral_bundle_1.mesh = asset_server.load(
        (GltfAssetLabel::Primitive {
            mesh: 0,
            primitive: 0,
        })
        .from_asset("embedded://lifecycler/../assets/coral.glb"),
    );
    commands.spawn(coral_bundle_1);

    let mut coral_bundle_2 = coral_bundle.clone();
    coral_bundle_2.transform = coral_bundle_2
        .transform
        .with_translation(Vec3::new(1.2, -1.8, 0.))
        .with_scale(Vec3::splat(0.25));
    coral_bundle_2.mesh = asset_server.load(
        (GltfAssetLabel::Primitive {
            mesh: 1,
            primitive: 0,
        })
        .from_asset("embedded://lifecycler/../assets/coral.glb"),
    );
    commands.spawn(coral_bundle_2);

    let rock_bundle = SceneBundle {
        scene: asset_server
            .load(GltfAssetLabel::Scene(0).from_asset("embedded://lifecycler/../assets/rocks.glb")),
        ..default()
    };

    let mut rock_bundle_1 = rock_bundle.clone();
    rock_bundle_1.transform = Transform::from_xyz(-1.5, -1.8, -0.5)
        .with_scale(Vec3::splat(0.3))
        .with_rotation(Quat::from_euler(
            EulerRot::XYZ,
            0. * PI / 2.,
            3. * PI / 2.,
            0. * PI / 2.,
        ));
    commands.spawn(rock_bundle_1);

    let mut rock_bundle_2 = rock_bundle.clone();
    rock_bundle_2.transform = Transform::from_xyz(-1.7, -1.8, -0.2)
        .with_scale(Vec3::splat(0.15))
        .with_rotation(Quat::from_euler(
            EulerRot::XYZ,
            0. * PI / 2.,
            2. * PI / 2.,
            0. * PI / 2.,
        ));
    commands.spawn(rock_bundle_2);

    let mut rock_bundle_2 = rock_bundle.clone();
    rock_bundle_2.transform = Transform::from_xyz(1.6, -1.8, -0.3)
        .with_scale(Vec3::splat(0.2))
        .with_rotation(Quat::from_euler(
            EulerRot::XYZ,
            0. * PI / 2.,
            1. * PI / 2.,
            0. * PI / 2.,
        ));
    commands.spawn(rock_bundle_2);

    let mut rock_bundle_3 = rock_bundle.clone();
    rock_bundle_3.transform = Transform::from_xyz(-0.6, -1.8, -0.4)
        .with_scale(Vec3::splat(0.15))
        .with_rotation(Quat::from_euler(
            EulerRot::XYZ,
            0. * PI / 2.,
            1. * PI / 2.,
            0. * PI / 2.,
        ));
    commands.spawn(rock_bundle_3);

    let mut rock_bundle_4 = rock_bundle.clone();
    rock_bundle_4.transform = Transform::from_xyz(-0.3, -1.8, -0.4)
        .with_scale(Vec3::splat(0.1))
        .with_rotation(Quat::from_euler(
            EulerRot::XYZ,
            0. * PI / 2.,
            1. * PI / 2.,
            0. * PI / 2.,
        ));
    commands.spawn(rock_bundle_4);
}