nightshade 0.8.0

A cross-platform data-oriented game engine.
Documentation
use super::{ComponentInspector, InspectorContext, impl_simple_inspector};
use crate::ecs::water::{VolumeFlowType, VolumeShape, Water};
use crate::prelude::*;

fn water_ui(world: &mut World, entity: Entity, ui: &mut egui::Ui, _context: &mut InspectorContext) {
    if let Some(water) = world.get_water_mut(entity) {
        ui.horizontal(|ui| {
            ui.label("Enabled:");
            ui.checkbox(&mut water.enabled, "");
        });

        ui.separator();
        ui.label(egui::RichText::new("Colors").strong());

        ui.horizontal(|ui| {
            ui.label("Base Color:");
            ui.color_edit_button_rgba_unmultiplied(&mut water.base_color);
        });

        ui.horizontal(|ui| {
            ui.label("Water Color:");
            ui.color_edit_button_rgba_unmultiplied(&mut water.water_color);
        });

        ui.separator();
        ui.label(egui::RichText::new("Wave Properties").strong());

        ui.horizontal(|ui| {
            ui.label("Base Height:");
            ui.add(egui::DragValue::new(&mut water.base_height).speed(0.1));
        });

        ui.horizontal(|ui| {
            ui.label("Wave Height:");
            ui.add(egui::Slider::new(&mut water.wave_height, 0.0..=2.0));
        });

        ui.horizontal(|ui| {
            ui.label("Choppy:");
            ui.add(egui::Slider::new(&mut water.choppy, 0.0..=10.0));
        });

        ui.horizontal(|ui| {
            ui.label("Speed:");
            ui.add(egui::Slider::new(&mut water.speed, 0.0..=5.0));
        });

        ui.horizontal(|ui| {
            ui.label("Frequency:");
            ui.add(egui::Slider::new(&mut water.frequency, 0.01..=2.0));
        });

        ui.separator();
        ui.label(egui::RichText::new("Lighting").strong());

        ui.horizontal(|ui| {
            ui.label("Specular Strength:");
            ui.add(egui::Slider::new(&mut water.specular_strength, 0.0..=5.0));
        });

        ui.horizontal(|ui| {
            ui.label("Fresnel Power:");
            ui.add(egui::Slider::new(&mut water.fresnel_power, 0.0..=10.0));
        });

        ui.separator();
        ui.label(egui::RichText::new("Water Type").strong());

        ui.horizontal(|ui| {
            ui.label("Vertical:");
            ui.checkbox(&mut water.is_vertical, "");
        });

        ui.horizontal(|ui| {
            ui.label("Volumetric:");
            ui.checkbox(&mut water.is_volumetric, "");
        });

        if water.is_volumetric {
            ui.separator();
            ui.label(egui::RichText::new("Volumetric Settings").strong());

            ui.horizontal(|ui| {
                ui.label("Shape:");
                egui::ComboBox::from_id_salt("volume_shape")
                    .selected_text(match water.volume_shape {
                        VolumeShape::Box => "Box",
                        VolumeShape::Cylinder => "Cylinder",
                        VolumeShape::Sphere => "Sphere",
                    })
                    .show_ui(ui, |ui| {
                        ui.selectable_value(&mut water.volume_shape, VolumeShape::Box, "Box");
                        ui.selectable_value(
                            &mut water.volume_shape,
                            VolumeShape::Cylinder,
                            "Cylinder",
                        );
                        ui.selectable_value(&mut water.volume_shape, VolumeShape::Sphere, "Sphere");
                    });
            });

            ui.horizontal(|ui| {
                ui.label("Flow Type:");
                egui::ComboBox::from_id_salt("volume_flow_type")
                    .selected_text(match water.volume_flow_type {
                        VolumeFlowType::Waterfall => "Waterfall",
                        VolumeFlowType::Mist => "Mist",
                        VolumeFlowType::Cascade => "Cascade",
                    })
                    .show_ui(ui, |ui| {
                        ui.selectable_value(
                            &mut water.volume_flow_type,
                            VolumeFlowType::Waterfall,
                            "Waterfall",
                        );
                        ui.selectable_value(
                            &mut water.volume_flow_type,
                            VolumeFlowType::Mist,
                            "Mist",
                        );
                        ui.selectable_value(
                            &mut water.volume_flow_type,
                            VolumeFlowType::Cascade,
                            "Cascade",
                        );
                    });
            });

            ui.label("Volume Size:");
            ui.horizontal(|ui| {
                ui.label("X:");
                ui.add(
                    egui::DragValue::new(&mut water.volume_size[0])
                        .speed(0.1)
                        .range(0.1..=100.0),
                );
                ui.label("Y:");
                ui.add(
                    egui::DragValue::new(&mut water.volume_size[1])
                        .speed(0.1)
                        .range(0.1..=100.0),
                );
                ui.label("Z:");
                ui.add(
                    egui::DragValue::new(&mut water.volume_size[2])
                        .speed(0.1)
                        .range(0.1..=100.0),
                );
            });
        }

        if !water.is_volumetric {
            ui.separator();
            ui.label(egui::RichText::new("Edge Settings").strong());

            ui.horizontal(|ui| {
                ui.label("Edge Feather:");
                ui.add(egui::Slider::new(
                    &mut water.edge_feather_distance,
                    0.0..=10.0,
                ));
            });
        }
    }
}

impl_simple_inspector!(
    WaterInspector,
    "Water",
    entity_has_water,
    set_water,
    remove_water,
    Water::default(),
    water_ui
);