// Path: objConverter/src/geometry/Model.java
// public class Model
// {
//   public ArrayList<Triangle> faces;
//   public String              material;
// 
//   public Model(String t)
//   {
//     faces = new ArrayList<Triangle>();
//     material = t;
//   }
//   
//   public boolean isDynamic()
//   {
//     return material.contains("$");
//   }
//   
//   public AABB getAABB()
//   {
//     Point3D min = new Point3D(99999, 99999, 99999);
//     Point3D max = new Point3D(-99999, -99999, -99999);
//     for (Triangle t : faces)
//     {
//       if (min.x > t.a.v.x)
//         min.x = t.a.v.x;
//       if (min.y > t.a.v.y)
//         min.y = t.a.v.y;
//       if (min.z > t.a.v.z)
//         min.z = t.a.v.z;
//       if (max.x < t.a.v.x)
//         max.x = t.a.v.x;
//       if (max.y < t.a.v.y)
//         max.y = t.a.v.y;
//       if (max.z < t.a.v.z)
//         max.z = t.a.v.z;
// 
//       if (min.x > t.b.v.x)
//         min.x = t.b.v.x;
//       if (min.y > t.b.v.y)
//         min.y = t.b.v.y;
//       if (min.z > t.b.v.z)
//         min.z = t.b.v.z;
//       if (max.x < t.b.v.x)
//         max.x = t.b.v.x;
//       if (max.y < t.b.v.y)
//         max.y = t.b.v.y;
//       if (max.z < t.b.v.z)
//         max.z = t.b.v.z;
// 
//       if (min.x > t.c.v.x)
//         min.x = t.c.v.x;
//       if (min.y > t.c.v.y)
//         min.y = t.c.v.y;
//       if (min.z > t.c.v.z)
//         min.z = t.c.v.z;
//       if (max.x < t.c.v.x)
//         max.x = t.c.v.x;
//       if (max.y < t.c.v.y)
//         max.y = t.c.v.y;
//       if (max.z < t.c.v.z)
//         max.z = t.c.v.z;
//     }
//     return new AABB(min, max);
//   }
// }


import geometry.Model;
import java.io.File;
import java.util.ArrayList;
import java.util.Map;
    }

    if (!ObjLoader.exists(args[0]))
    {
      System.err.println("Input file doesn't exist");
      return;
    }

    // get path of output directory
    String path = "";
    try
    {
      path = args[1].substring(0, args[1].lastIndexOf('/'));
      // backup old directory
      new File(path).renameTo(new File("backup-" + System.currentTimeMillis()));
    } catch (Exception e)
    {
      System.err.println("Do not put output file into converter directory");
      return;
    }
    // create output directory
    new File(path).mkdirs();

    // process
    long timestamp = System.currentTimeMillis();
    // load data
    ObjLoader obj = new ObjLoader(path);
    obj.loadObj(args[0]);
    obj.parseObj(args[0]);
    // subdivide data
// Path: objConverter/src/geometry/Model.java
// public class Model
// {
//   public ArrayList<Triangle> faces;
//   public String              material;
// 
//   public Model(String t)
//   {
//     faces = new ArrayList<Triangle>();
//     material = t;
//   }
//   
//   public boolean isDynamic()
//   {
//     return material.contains("$");
//   }
//   
//   public AABB getAABB()
//   {
//     Point3D min = new Point3D(99999, 99999, 99999);
//     Point3D max = new Point3D(-99999, -99999, -99999);
//     for (Triangle t : faces)
//     {
//       if (min.x > t.a.v.x)
//         min.x = t.a.v.x;
//       if (min.y > t.a.v.y)
//         min.y = t.a.v.y;
//       if (min.z > t.a.v.z)
//         min.z = t.a.v.z;
//       if (max.x < t.a.v.x)
//         max.x = t.a.v.x;
//       if (max.y < t.a.v.y)
//         max.y = t.a.v.y;
//       if (max.z < t.a.v.z)
//         max.z = t.a.v.z;
// 
//       if (min.x > t.b.v.x)
//         min.x = t.b.v.x;
//       if (min.y > t.b.v.y)
//         min.y = t.b.v.y;
//       if (min.z > t.b.v.z)
//         min.z = t.b.v.z;
//       if (max.x < t.b.v.x)
//         max.x = t.b.v.x;
//       if (max.y < t.b.v.y)
//         max.y = t.b.v.y;
//       if (max.z < t.b.v.z)
//         max.z = t.b.v.z;
// 
//       if (min.x > t.c.v.x)
//         min.x = t.c.v.x;
//       if (min.y > t.c.v.y)
//         min.y = t.c.v.y;
//       if (min.z > t.c.v.z)
//         min.z = t.c.v.z;
//       if (max.x < t.c.v.x)
//         max.x = t.c.v.x;
//       if (max.y < t.c.v.y)
//         max.y = t.c.v.y;
//       if (max.z < t.c.v.z)
//         max.z = t.c.v.z;
//     }
//     return new AABB(min, max);
//   }
// }


// Path: objConverter/src/ObjConverter.java
import geometry.Model;
import java.io.File;
import java.util.ArrayList;
import java.util.Map;

    }

    if (!ObjLoader.exists(args[0]))
    {
      System.err.println("Input file doesn't exist");
      return;
    }

    // get path of output directory
    String path = "";
    try
    {
      path = args[1].substring(0, args[1].lastIndexOf('/'));
      // backup old directory
      new File(path).renameTo(new File("backup-" + System.currentTimeMillis()));
    } catch (Exception e)
    {
      System.err.println("Do not put output file into converter directory");
      return;
    }
    // create output directory
    new File(path).mkdirs();

    // process
    long timestamp = System.currentTimeMillis();
    // load data
    ObjLoader obj = new ObjLoader(path);
    obj.loadObj(args[0]);
    obj.parseObj(args[0]);
    // subdivide data
    Map<String, ArrayList<Model> > models = new Subdivider().subdivide(obj.getModels());