|
|
@@ -67,11 +67,13 @@ public class TangentBinormalGenerator {
|
|
|
private static class VertexInfo {
|
|
|
public final Vector3f position;
|
|
|
public final Vector3f normal;
|
|
|
+ public final Vector2f texCoord;
|
|
|
public final ArrayList<Integer> indices = new ArrayList<Integer>();
|
|
|
|
|
|
- public VertexInfo(Vector3f position, Vector3f normal) {
|
|
|
+ public VertexInfo(Vector3f position, Vector3f normal, Vector2f texCoord) {
|
|
|
this.position = position;
|
|
|
this.normal = normal;
|
|
|
+ this.texCoord = texCoord;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -387,27 +389,37 @@ public class TangentBinormalGenerator {
|
|
|
(FastMath.abs(u.z - v.z) < tolerance);
|
|
|
}
|
|
|
|
|
|
+ private static boolean approxEqual(Vector2f u, Vector2f v) {
|
|
|
+ float tolerance = 1E-4f;
|
|
|
+ return (FastMath.abs(u.x - v.x) < tolerance) &&
|
|
|
+ (FastMath.abs(u.y - v.y) < tolerance);
|
|
|
+ }
|
|
|
+
|
|
|
private static ArrayList<VertexInfo> linkVertices(Mesh mesh) {
|
|
|
ArrayList<VertexInfo> vertexMap = new ArrayList<VertexInfo>();
|
|
|
|
|
|
- FloatBuffer vertexBuffer = (FloatBuffer) mesh.getBuffer(Type.Position).getData();
|
|
|
- FloatBuffer normalBuffer = (FloatBuffer) mesh.getBuffer(Type.Normal).getData();
|
|
|
+ FloatBuffer vertexBuffer = mesh.getFloatBuffer(Type.Position);
|
|
|
+ FloatBuffer normalBuffer = mesh.getFloatBuffer(Type.Normal);
|
|
|
+ FloatBuffer texcoordBuffer = mesh.getFloatBuffer(Type.TexCoord);
|
|
|
|
|
|
Vector3f position = new Vector3f();
|
|
|
Vector3f normal = new Vector3f();
|
|
|
+ Vector2f texCoord = new Vector2f();
|
|
|
|
|
|
final int size = vertexBuffer.capacity() / 3;
|
|
|
for (int i = 0; i < size; i++) {
|
|
|
|
|
|
populateFromBuffer(position, vertexBuffer, i);
|
|
|
populateFromBuffer(normal, normalBuffer, i);
|
|
|
+ populateFromBuffer(texCoord, texcoordBuffer, i);
|
|
|
|
|
|
boolean found = false;
|
|
|
|
|
|
for (int j = 0; j < vertexMap.size(); j++) {
|
|
|
VertexInfo vertexInfo = vertexMap.get(j);
|
|
|
if (approxEqual(vertexInfo.position, position) &&
|
|
|
- approxEqual(vertexInfo.normal, normal))
|
|
|
+ approxEqual(vertexInfo.normal, normal) &&
|
|
|
+ approxEqual(vertexInfo.texCoord, texCoord))
|
|
|
{
|
|
|
vertexInfo.indices.add(i);
|
|
|
found = true;
|
|
|
@@ -416,7 +428,7 @@ public class TangentBinormalGenerator {
|
|
|
}
|
|
|
|
|
|
if (!found) {
|
|
|
- VertexInfo vertexInfo = new VertexInfo(position.clone(), normal.clone());
|
|
|
+ VertexInfo vertexInfo = new VertexInfo(position.clone(), normal.clone(), texCoord.clone());
|
|
|
vertexInfo.indices.add(i);
|
|
|
vertexMap.add(vertexInfo);
|
|
|
}
|