# -*- coding: utf-8 -*-
"""Render a coloured PLY point cloud to PNG (2 angles)."""
import sys, os, numpy as np, matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt


def read_ply(path):
    lines = open(path).readlines()
    hdr = True; data = []
    for ln in lines:
        if hdr:
            if ln.startswith("element vertex"):
                nv = int(ln.split()[2])
            if ln.startswith("end_header"):
                hdr = False
        else:
            data.append([float(x) for x in ln.split()])
    a = np.array(data)
    return a[:, :3], a[:, 3:6]


def main():
    path = sys.argv[1]; outdir = sys.argv[2] if len(sys.argv) > 2 else os.path.dirname(path)
    os.makedirs(outdir, exist_ok=True)
    P, C = read_ply(path)
    print("points", len(P), "bbox", P.min(0).round(2), P.max(0).round(2))
    for az, elev, name in [(60, 20, "view1.png"), (-120, 30, "view2.png"), (200, 60, "view3.png")]:
        fig = plt.figure(figsize=(7, 7)); ax = fig.add_subplot(111, projection="3d")
        sel = np.random.choice(len(P), min(80000, len(P)), replace=False)
        ax.scatter(P[sel, 0], P[sel, 1], P[sel, 2], c=C[sel] / 255.0, s=0.3, marker=".")
        ax.set_xlim(-6, 6); ax.set_ylim(-6, 6); ax.set_zlim(-2, 4)
        ax.view_init(elev=elev, azim=az); ax.set_box_aspect((1, 1, 1))
        plt.tight_layout(); plt.savefig(os.path.join(outdir, name), dpi=110); plt.close()
    print("rendered to", outdir)


if __name__ == "__main__":
    main()
