"""Tutorial 05 — First Simulation: Bare Earth RGB Image

Create a simple 10m × 10m bare earth scene to generate an orthophoto RGB image."""

import less

# ── Create a scene ───────────────────────────────────────────────
scene = less.Scene()
scene.size = 10.0

# Ground: Lambertian, reflectivity 30%
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.3))

# Lighting: Solar zenith angle 30°, azimuth angle 150° (southeast direction)
scene.illumination = less.Illumination(source=less.Sun(zenith=30, azimuth=150), atmosphere=less.SimpleSpectralAtmosphere(turbidity=2.0))

# Build the scene
sensor = less.OpticalImager(
    less.Orthographic(image_size=256),
    bands=[650, 550, 450],   # R, G, B
    quality=64,
)
image = scene.simulate(sensor)
image.save("05_bare_soil_rgb.png")
print(f"Image shape: {image.data.shape}")
print(f"Radiance range: {image.data.min():.4f} ~ {image.data.max():.4f} W/m^2/sr/nm")

# ── Try different parameters (no rebuild required)────────────────────────────
# low solar altitude angle
scene.illumination = less.Illumination(source=less.Sun(zenith=60, azimuth=90), atmosphere=less.SimpleSpectralAtmosphere(turbidity=2.0))
image2 = scene.simulate(sensor)
image2.save("05_bare_soil_low_sun.png")

# Add a corn
maize = less.Object("maize", mesh=less.examples.asset_path("maize.obj"))
maize.set_property(less.Prospect(cab=40, car=8, cw=0.012, cm=0.006, N=1.5))
scene.add(maize, positions=[[5.0, 5.0, 0.0]])
scene.rebuild()

image3 = scene.simulate(sensor)
image3.save("05_one_maize.png")

print("Tutorial 05 Complete!")
