private void optimizeTexCoords() {
int total = 0, duplicates = 0, check = 0;
Map<Point2D, Integer> pp = new HashMap<>();
ObservableIntegerArray reindex = FXCollections.observableIntegerArray();
ObservableFloatArray newTexCoords = FXCollections.observableFloatArray();
for (MeshView meshView : meshViews) {
TriangleMesh mesh = (TriangleMesh) meshView.getMesh();
ObservableFloatArray texcoords = mesh.getTexCoords();
int texcoordElementSize = mesh.getTexCoordElementSize();
int os = texcoords.size() / texcoordElementSize;
pp.clear();
newTexCoords.clear();
newTexCoords.ensureCapacity(texcoords.size());
reindex.clear();
reindex.resize(os);
for (int i = 0, oi = 0, ni = 0; i < texcoords.size(); i += texcoordElementSize, oi++) {
float x = texcoords.get(i);
float y = texcoords.get(i + 1);
Point2D p = new Point2D(x, y);
Integer index = pp.get(p);
if (index == null) {
pp.put(p, ni);
reindex.set(oi, ni);
newTexCoords.addAll(x, y);
ni++;
} else {
reindex.set(oi, index);
}
}
int ns = newTexCoords.size() / texcoordElementSize;
int d = os - ns;
duplicates += d;
total += os;
texcoords.setAll(newTexCoords);
texcoords.trimToSize();
ObservableIntegerArray faces = mesh.getFaces();
for (int i = 1; i < faces.size(); i += 2) {
faces.set(i, reindex.get(faces.get(i)));
}
// System.out.printf("There are %d (%.2f%%) duplicate texcoords out of %d total for mesh '%s'.\n",
// d, 100d * d / os, os, meshView.getId());
check += mesh.getTexCoords().size() / texcoordElementSize;
}
System.out.printf("There are %d (%.2f%%) duplicate texcoords out of %d total.\n",
duplicates, 100d * duplicates / total, total);
System.out.printf("Now we have %d texcoords.\n", check);
}
Optimizer.java 文件源码
java
阅读 28
收藏 0
点赞 0
评论 0
项目:FX3DAndroid
作者:
评论列表
文章目录