diff --git a/engine/src/tools/jme3tools/optimize/GeometryBatchFactory.java b/engine/src/tools/jme3tools/optimize/GeometryBatchFactory.java index 00bfa67ca..ae6ad8c57 100644 --- a/engine/src/tools/jme3tools/optimize/GeometryBatchFactory.java +++ b/engine/src/tools/jme3tools/optimize/GeometryBatchFactory.java @@ -61,6 +61,29 @@ public class GeometryBatchFactory { outBuf.put(offset + i * 3 + 2, norm.z); } } + + private static void doTransformTangents(FloatBuffer inBuf, int offset, FloatBuffer outBuf, Matrix4f transform) { + Vector3f tan = new Vector3f(); + float handedness = 0; + // offset is given in element units + // convert to be in component units + offset *= 4; + + for (int i = 0; i < inBuf.capacity() / 4; i++) { + tan.x = inBuf.get(i * 4 + 0); + tan.y = inBuf.get(i * 4 + 1); + tan.z = inBuf.get(i * 4 + 2); + handedness = inBuf.get(i * 4 + 3); + + transform.multNormal(tan, tan); + + outBuf.put(offset + i * 4 + 0, tan.x); + outBuf.put(offset + i * 4 + 1, tan.y); + outBuf.put(offset + i * 4 + 2, tan.z); + outBuf.put(offset + i * 4 + 3, handedness); + + } + } /** * Merges all geometries in the collection into @@ -181,10 +204,14 @@ public class GeometryBatchFactory { FloatBuffer inPos = (FloatBuffer) inBuf.getDataReadOnly(); FloatBuffer outPos = (FloatBuffer) outBuf.getData(); doTransformVerts(inPos, globalVertIndex, outPos, worldMatrix); - } else if (Type.Normal.ordinal() == bufType || Type.Tangent.ordinal() == bufType) { + } else if (Type.Normal.ordinal() == bufType) { FloatBuffer inPos = (FloatBuffer) inBuf.getDataReadOnly(); FloatBuffer outPos = (FloatBuffer) outBuf.getData(); doTransformNorms(inPos, globalVertIndex, outPos, worldMatrix); + }else if(Type.Tangent.ordinal() == bufType){ + FloatBuffer inPos = (FloatBuffer) inBuf.getDataReadOnly(); + FloatBuffer outPos = (FloatBuffer) outBuf.getData(); + doTransformTangents(inPos, globalVertIndex, outPos, worldMatrix); } else { inBuf.copyElements(0, outBuf, globalVertIndex, geomVertCount); }