Added support for Qubicle Model files.

This commit is contained in:
Chicken-Bomes committed 2014-01-28 16:54:30 +10:00
1 parent 477b77e7e1
commit 7450370d99
7 files changed
+1006 -13

No files matched your search

+77 -4
View File
@@ -1,9 +1,6 @@
package codechicken.lib.render;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -702,6 +699,82 @@ public class CCModel
return model;
}
private static <T> int addIndex(List<T> list, T elem)
{
int i = list.indexOf(elem)+1;
if(i == 0) {
list.add(elem);
i = list.size();
}
return i;
}
private static String clean(double d) {
return d == (int) d ? Integer.toString((int)d) : Double.toString(d);
}
public static void exportObj(Map<String, CCModel> models, PrintWriter p)
{
List<Vector3> verts = new ArrayList<Vector3>();
List<UV> uvs = new ArrayList<UV>();
List<Vector3> normals = new ArrayList<Vector3>();
List<int[]> polys = new ArrayList<int[]>();
for(Map.Entry<String, CCModel> e : models.entrySet()) {
p.println("g "+e.getKey());
CCModel m = e.getValue();
int vStart = verts.size();
int uStart = uvs.size();
int nStart = normals.size();
boolean hasNormals = m.normals != null;
polys.clear();
for(int i = 0; i < m.verts.length; i++) {
int[] ia = new int[hasNormals ? 3 : 2];
ia[0] = addIndex(verts, m.verts[i].vec);
ia[1] = addIndex(uvs, m.verts[i].uv);
if(hasNormals)
ia[2] = addIndex(normals, m.normals[i]);
polys.add(ia);
}
if(vStart < verts.size()) {
p.println();
for(int i = vStart; i < verts.size(); i++) {
Vector3 v = verts.get(i);
p.format("v %s %s %s\n", clean(v.x), clean(v.y), clean(v.z));
}
}
if(uStart < uvs.size()) {
p.println();
for(int i = uStart; i < uvs.size(); i++) {
UV uv = uvs.get(i);
p.format("vt %s %s\n", clean(uv.u), clean(uv.v));
}
}
if(nStart < normals.size()) {
p.println();
for(int i = nStart; i < normals.size(); i++) {
Vector3 n = normals.get(i);
p.format("vn %s %s %s\n", clean(n.x), clean(n.y), clean(n.z));
}
}
p.println();
for(int i = 0; i < polys.size(); i++) {
if(i%m.vp == 0)
p.format("f");
int[] ia = polys.get(i);
if(hasNormals)
p.format(" %d/%d/%d", ia[0], ia[1], ia[2]);
else
p.format(" %d/%d", ia[0], ia[1]);
if(i%m.vp == m.vp-1)
p.println();
}
}
}
/**
* Brings the UV coordinates of each face closer to the center UV by d.
* Useful for fixing texture seams