"""Ejercicio de Pieza a pieza. Blender 4.5 LTS. Licencia MIT: licencia-ejercicio.txt.

Crea una escena nueva con cuatro capas, cámara y luz. No borra escenas existentes,
no descarga nada, no guarda archivos y no inicia renders automáticamente.
"""
import bpy
from mathutils import Vector

NAME = "PAP_Ejercicio_Despiece"
if bpy.data.scenes.get(NAME):
    raise RuntimeError("El ejercicio ya existe. Ábrelo en el selector de escenas.")

scene = bpy.data.scenes.new(NAME)
if bpy.context.window:
    bpy.context.window.scene = scene
scene.render.engine = "CYCLES"
scene.cycles.samples = 16
scene.render.resolution_x = 1080
scene.render.resolution_y = 1920
scene.render.resolution_percentage = 50
scene.render.fps = 30
scene.frame_start = 1
scene.frame_end = 90
scene.render.image_settings.file_format = "PNG"
scene.render.image_settings.color_mode = "RGBA"
scene.render.film_transparent = True
scene.render.filepath = "//fotogramas-despiece/"

world = bpy.data.worlds.new(NAME + "_Mundo")
world.use_nodes = True
world.node_tree.nodes["Background"].inputs["Color"].default_value = (0.18, 0.23, 0.16, 1)
world.node_tree.nodes["Background"].inputs["Strength"].default_value = 0.5
scene.world = world

vertices = [(-1, -0.7, -0.12), (1, -0.7, -0.12), (1, 0.7, -0.12), (-1, 0.7, -0.12),
            (-1, -0.7, 0.12), (1, -0.7, 0.12), (1, 0.7, 0.12), (-1, 0.7, 0.12)]
faces = [(0, 3, 2, 1), (4, 5, 6, 7), (0, 1, 5, 4), (1, 2, 6, 5), (2, 3, 7, 6), (3, 0, 4, 7)]
colors = [(0.13, 0.28, 0.23, 1), (0.59, 0.40, 0.18, 1), (0.52, 0.59, 0.42, 1), (0.79, 0.82, 0.69, 1)]
for index, color in enumerate(colors):
    mesh = bpy.data.meshes.new(f"PAP_Capa_{index + 1}_Malla")
    mesh.from_pydata(vertices, [], faces)
    mesh.update()
    obj = bpy.data.objects.new(f"PAP_Capa_{index + 1}", mesh)
    scene.collection.objects.link(obj)
    material = bpy.data.materials.new(f"PAP_Acabado_{index + 1}")
    material.use_nodes = True
    bsdf = material.node_tree.nodes["Principled BSDF"]
    bsdf.inputs["Base Color"].default_value = color
    bsdf.inputs["Roughness"].default_value = 0.38
    obj.data.materials.append(material)
    bevel = obj.modifiers.new("Bordes suaves", "BEVEL")
    bevel.width = 0.045
    bevel.segments = 3
    obj.location = (0, 0, 0.15 + index * 0.26)
    obj.keyframe_insert(data_path="location", frame=1)
    obj.location.z += index * 0.7
    obj.keyframe_insert(data_path="location", frame=90)

camera_data = bpy.data.cameras.new(NAME + "_Camara")
camera = bpy.data.objects.new(NAME + "_Camara", camera_data)
scene.collection.objects.link(camera)
camera.location = (6, -8, 6)
camera.rotation_euler = (Vector((0, 0, 1.4)) - camera.location).to_track_quat("-Z", "Y").to_euler()
camera.data.type = "ORTHO"
camera.data.ortho_scale = 6.8
scene.camera = camera

light_data = bpy.data.lights.new(NAME + "_Luz", "AREA")
light = bpy.data.objects.new(NAME + "_Luz", light_data)
scene.collection.objects.link(light)
light.location = (2, -4, 7)
light.rotation_euler = (Vector((0, 0, 1)) - light.location).to_track_quat("-Z", "Y").to_euler()
light_data.energy = 650
light_data.shape = "DISK"
light_data.size = 5

scene.timeline_markers.new("Montado", frame=1)
scene.timeline_markers.new("Separado", frame=90)
scene.view_layers[0].update()
scene.frame_set(1)
print("Ejercicio listo: 4 capas, fotogramas 1–90, 30 fps. Guarda una copia antes de renderizar.")
