mirror of
https://github.com/GTNewHorizons/CodeChickenCore.git
synced 2026-11-11 15:57:42 +00:00
Added support for Qubicle Model files.
This commit is contained in:
1 parent
477b77e7e1
commit
7450370d99
7 files changed
+1006
-13
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user