// Building:
//
// 1. In ldni.cc, make the following change:
//    - auto surface_point = cellPoint(points, normals, origin, origin + delta);
//    + auto surface_point = origin + delta / 2; // Cell centers - "blocky" mesh
//
// 2. g++ -o lego lego.cc -lldni -lgeom -lomp

#include <iostream>

#include <ldni.hh>

using namespace Geometry;

Vector3D diagonal(const TriMesh &mesh) {
  Point3D boxmin, boxmax;
  const auto &points = mesh.points();
  boxmin = boxmax = points[0];
  for (const auto &p : points)
    for (int i = 0; i < 3; ++i) {
      boxmin[i] = std::min(boxmin[i], p[i]);
      boxmax[i] = std::max(boxmax[i], p[i]);
    }
  return boxmax - boxmin;
}

int main(int argc, char **argv) {
  if (argc != 3) {
    std::cerr << "Usage:" << argv[0] << " <model.obj> <height>" << std::endl;
    return 1;
  }

  LDNI ldni;
  size_t z = std::atoi(argv[2]);
  auto input_mesh = TriMesh::readOBJ(argv[1]);
  auto d = diagonal(input_mesh);
  size_t x = d[0] / d[2] * z * 48 / 79;
  size_t y = d[1] / d[2] * z * 48 / 79;
  std::cerr << "Resolution: " << x << 'x' << y << 'x' << z << std::endl;
  ldni = mesh2ldni(input_mesh, { x, y, z });
  auto output_mesh = ldni2mesh(ldni);
  output_mesh.writeOBJ("/tmp/lego.obj");
  std::cerr << "Mesh file written (/tmp/lego.obj)." << std::endl;
}
