nightshade 0.8.0

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

fn decal_ui(world: &mut World, entity: Entity, ui: &mut egui::Ui, _context: &mut InspectorContext) {
    if let Some(decal) = world.get_decal_mut(entity) {
        ui.label(egui::RichText::new("Texture").strong());
        let mut texture_name = decal.texture.clone().unwrap_or_default();
        if ui.text_edit_singleline(&mut texture_name).changed() {
            decal.texture = if texture_name.is_empty() {
                None
            } else {
                Some(texture_name)
            };
        }

        let mut emissive_name = decal.emissive_texture.clone().unwrap_or_default();
        ui.horizontal(|ui| {
            ui.label("Emissive Texture:");
            if ui.text_edit_singleline(&mut emissive_name).changed() {
                decal.emissive_texture = if emissive_name.is_empty() {
                    None
                } else {
                    Some(emissive_name)
                };
            }
        });

        ui.horizontal(|ui| {
            ui.label("Emissive Strength:");
            ui.add(egui::Slider::new(&mut decal.emissive_strength, 0.0..=10.0));
        });

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

        ui.horizontal(|ui| {
            ui.label("Color:");
            ui.color_edit_button_rgba_unmultiplied(&mut decal.color);
        });

        ui.horizontal(|ui| {
            ui.label("Width:");
            ui.add(
                egui::DragValue::new(&mut decal.size.x)
                    .speed(0.1)
                    .range(0.01..=100.0),
            );
            ui.label("Height:");
            ui.add(
                egui::DragValue::new(&mut decal.size.y)
                    .speed(0.1)
                    .range(0.01..=100.0),
            );
        });

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

        ui.horizontal(|ui| {
            ui.label("Depth:");
            ui.add(egui::Slider::new(&mut decal.depth, 0.01..=10.0));
        });

        ui.horizontal(|ui| {
            ui.label("Normal Threshold:");
            ui.add(egui::Slider::new(&mut decal.normal_threshold, 0.0..=1.0));
        });

        ui.horizontal(|ui| {
            ui.label("Fade Start:");
            ui.add(
                egui::DragValue::new(&mut decal.fade_start)
                    .speed(1.0)
                    .range(0.0..=1000.0),
            );
        });

        ui.horizontal(|ui| {
            ui.label("Fade End:");
            ui.add(
                egui::DragValue::new(&mut decal.fade_end)
                    .speed(1.0)
                    .range(0.0..=1000.0),
            );
        });
    }
}

impl_simple_inspector!(
    DecalInspector,
    "Decal",
    entity_has_decal,
    set_decal,
    remove_decal,
    Decal::default(),
    decal_ui
);