Example #1
0
  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);
  }