public void generateNormalsTangentsBinormals() { this.mTangentsBinormals = FloatBuffer.allocate(this.mVertices.capacity() / D3DMesh.nbFloatPerVertex * 6); int trianglecount = this.mIndices.capacity() / 3; this.mIndices.position(0); D3DVector normal = new D3DVector(); D3DVector tangent = new D3DVector(); D3DVector binormal = new D3DVector(); D3DVector2f texCoords0 = new D3DVector2f(); D3DVector2f texCoords1 = new D3DVector2f(); D3DVector2f texCoords2 = new D3DVector2f(); D3DVector vm1 = new D3DVector(); D3DVector vm2 = new D3DVector(); D3DVector2f t1 = new D3DVector2f(); D3DVector2f t2 = new D3DVector2f(); D3DVector v0 = new D3DVector(); D3DVector v1 = new D3DVector(); D3DVector v2 = new D3DVector(); float coef; for (int i = 0; i < trianglecount; i++) { int a, b, c; a = this.mIndices.get(); b = this.mIndices.get(); c = this.mIndices.get(); v0.setFromVertice(this.mVertices, a); v1.setFromVertice(this.mVertices, b); v2.setFromVertice(this.mVertices, c); texCoords0.setFromTexCoords(this.mVertices, a); texCoords1.setFromTexCoords(this.mVertices, b); texCoords2.setFromTexCoords(this.mVertices, c); D3DVector.sub(vm1, v1, v0); D3DVector.sub(vm2, v2, v0); D3DVector2f.sub(t1, texCoords1, texCoords0); D3DVector2f.sub(t2, texCoords2, texCoords0); vm1.normalize(); vm2.normalize(); t1.normalize(); t2.normalize(); coef = 1 / (t1.getX() * t2.getY() - t2.getX() * t1.getY()); tangent.set(0, coef * (vm1.get(0) * t2.getY() + vm2.get(0) * -t1.getY())); tangent.set(1, coef * (vm1.get(1) * t2.getY() + vm2.get(1) * -t1.getY())); tangent.set(2, coef * (vm1.get(2) * t2.getY() + vm2.get(2) * -t1.getY())); tangent.normalize(); normal.setFromNormal(this.mVertices, a); D3DVector.cross(binormal, normal, tangent); binormal.normalize(); addTangent( a, getTangent(a, 0) + tangent.get(0), getTangent(a, 1) + tangent.get(1), getTangent(a, 2) + tangent.get(2)); addBinormal( a, getBinormal(a, 0) + binormal.get(0), getBinormal(a, 1) + binormal.get(1), getBinormal(a, 2) + binormal.get(2)); D3DVector.sub(vm1, v2, v1); D3DVector.sub(vm2, v0, v1); D3DVector2f.sub(t1, texCoords2, texCoords1); D3DVector2f.sub(t2, texCoords0, texCoords1); vm1.normalize(); vm2.normalize(); t1.normalize(); t2.normalize(); coef = 1 / (t1.getX() * t2.getY() - t2.getX() * t1.getY()); tangent.set(0, coef * (vm1.get(0) * t2.getY() + vm2.get(0) * -t1.getY())); tangent.set(1, coef * (vm1.get(1) * t2.getY() + vm2.get(1) * -t1.getY())); tangent.set(2, coef * (vm1.get(2) * t2.getY() + vm2.get(2) * -t1.getY())); tangent.normalize(); normal.setFromNormal(this.mVertices, b); D3DVector.cross(binormal, normal, tangent); binormal.normalize(); addTangent( b, getTangent(b, 0) + tangent.get(0), getTangent(b, 1) + tangent.get(1), getTangent(b, 2) + tangent.get(2)); addBinormal( b, getBinormal(b, 0) + binormal.get(0), getBinormal(b, 1) + binormal.get(1), getBinormal(b, 2) + binormal.get(2)); D3DVector.sub(vm1, v0, v2); D3DVector.sub(vm2, v1, v2); D3DVector2f.sub(t1, texCoords0, texCoords2); D3DVector2f.sub(t2, texCoords1, texCoords2); vm1.normalize(); vm2.normalize(); t1.normalize(); t2.normalize(); coef = 1 / (t1.getX() * t2.getY() - t2.getX() * t1.getY()); tangent.set(0, coef * (vm1.get(0) * t2.getY() + vm2.get(0) * -t1.getY())); tangent.set(1, coef * (vm1.get(1) * t2.getY() + vm2.get(1) * -t1.getY())); tangent.set(2, coef * (vm1.get(2) * t2.getY() + vm2.get(2) * -t1.getY())); tangent.normalize(); normal.setFromNormal(this.mVertices, c); D3DVector.cross(binormal, normal, tangent); binormal.normalize(); addTangent( c, getTangent(c, 0) + tangent.get(0), getTangent(c, 1) + tangent.get(1), getTangent(c, 2) + tangent.get(2)); addBinormal( c, getBinormal(c, 0) + binormal.get(0), getBinormal(c, 1) + binormal.get(1), getBinormal(c, 2) + binormal.get(2)); } D3DVector tmp = new D3DVector(); for (int i = 0; i < this.mTangentsBinormals.capacity() / 6; i++) { tmp.set(0, this.mTangentsBinormals.get(i * 6)); tmp.set(1, this.mTangentsBinormals.get(i * 6 + 1)); tmp.set(2, this.mTangentsBinormals.get(i * 6 + 2)); tmp.normalize(); this.mTangentsBinormals.put(i * 6 + 0, tmp.get(0)); this.mTangentsBinormals.put(i * 6 + 1, tmp.get(1)); this.mTangentsBinormals.put(i * 6 + 2, tmp.get(2)); tmp.set(0, this.mTangentsBinormals.get(i * 6 + 3)); tmp.set(1, this.mTangentsBinormals.get(i * 6 + 4)); tmp.set(2, this.mTangentsBinormals.get(i * 6 + 5)); tmp.normalize(); this.mTangentsBinormals.put(i * 6 + 3, tmp.get(0)); this.mTangentsBinormals.put(i * 6 + 4, tmp.get(1)); this.mTangentsBinormals.put(i * 6 + 5, tmp.get(2)); } mergeTangents(); this.mIndices.position(0); this.mTangentsBinormals.position(0); }