"""Tutorial 08 — Building a Farm Scene

10m × 10m corn field, row spacing 0.75m, plant spacing 0.40m, ortho + perspective imaging."""

import less
import numpy as np

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

scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.15))
scene.illumination = less.Illumination(source=less.Sun(zenith=30, azimuth=150), atmosphere=less.NoAtmosphere())

# ──Corn plant────────────────────────────────────────────
maize = less.Object("maize", mesh=less.examples.asset_path("maize.obj"))
maize.set_property(less.Prospect(
    cab=45, car=10, canth=0, cbrown=0,
    cw=0.012, cm=0.006, N=1.55,
))

# ──Planting in rows───────────────────────────────────────────
row_spacing = 0.75
in_row_spacing = 0.40
margin = 0.5
rng = np.random.RandomState(42)

n_rows  = int((scene.size - 2 * margin) / row_spacing) + 1
n_plant = int((scene.size - 2 * margin) / in_row_spacing) + 1

xs = margin + np.arange(n_rows) * row_spacing
ys = margin + np.arange(n_plant) * in_row_spacing
gx, gy = np.meshgrid(xs, ys, indexing='ij')

px = gx.ravel() + rng.uniform(-0.04, 0.04, gx.size)
py = gy.ravel() + rng.uniform(-0.04, 0.04, gy.size)
n = len(px)

positions = np.column_stack([px, py, np.zeros(n)])
scales    = rng.uniform(0.90, 1.10, n)
rotations = rng.uniform(0, 360, n)

scene.add(maize, positions=positions, scales=scales, rotations=rotations)
print(f"Placed {n} maize plants ({n_rows} rows × {n_plant} plants per row)")
lai = scene.measure(less.LAIMeasurement())
print(f"Scene LAI = {lai:.2f}")

# ── Orthophoto RGB ─────────────────────────────────────────────
sensor_nadir = less.OpticalImager(
    less.Orthographic(image_size=512),
    bands=[650, 550, 450],
    quality=128,
)
image = scene.simulate(sensor_nadir)
image.save("08_maize_field_nadir.png")

# ──Perspective camera────────────────────────────────────────────
half = scene.size / 2
sensor_persp = less.OpticalImager(
    less.Perspective(
        resolution=1024, fov=35,
        position=(half, scene.size + 4, 6),
        target=(half, half, 1.2),
    ),
    bands=[650, 550, 450],
    quality=128,
)
image_persp = scene.simulate(sensor_persp)
image_persp.save("08_maize_field_perspective.png")

print("Tutorial 08 Complete!")
