public void processNode(int nodeSubPart, int nodeTriangleIndex) {
      meshInterface.getLockedReadOnlyVertexIndexBase(data, nodeSubPart);

      // int* gfxbase = (int*)(indexbase+nodeTriangleIndex*indexstride);
      ByteBuffer gfxbase_ptr = data.indexbase;
      int gfxbase_index = (nodeTriangleIndex * data.indexstride);
      assert (data.indicestype == ScalarType.PHY_INTEGER
          || data.indicestype == ScalarType.PHY_SHORT);

      Vector3f meshScaling = meshInterface.getScaling();
      for (int j = 2; j >= 0; j--) {
        int graphicsindex;
        if (data.indicestype == ScalarType.PHY_SHORT) {
          graphicsindex = gfxbase_ptr.getShort(gfxbase_index + j * 2) & 0xFFFF;
        } else {
          graphicsindex = gfxbase_ptr.getInt(gfxbase_index + j * 4);
        }

        // float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
        ByteBuffer graphicsbase_ptr = data.vertexbase;
        int graphicsbase_index = graphicsindex * data.stride;

        triangle[j].set(
            graphicsbase_ptr.getFloat(graphicsbase_index + 4 * 0) * meshScaling.x,
            graphicsbase_ptr.getFloat(graphicsbase_index + 4 * 1) * meshScaling.y,
            graphicsbase_ptr.getFloat(graphicsbase_index + 4 * 2) * meshScaling.z);
      }

      /* Perform ray vs. triangle collision here */
      callback.processTriangle(triangle, nodeSubPart, nodeTriangleIndex);
      meshInterface.unLockReadOnlyVertexBase(nodeSubPart);

      data.unref();
    }
Exemplo n.º 2
0
    public void processNode(int nodeSubPart, int nodeTriangleIndex) {
      VertexData data = meshInterface.getLockedReadOnlyVertexIndexBase(nodeSubPart);

      Vector3f meshScaling = meshInterface.getScaling(new Vector3f());

      data.getTriangle(nodeTriangleIndex * 3, meshScaling, triangle);

      /* Perform ray vs. triangle collision here */
      callback.processTriangle(triangle, nodeSubPart, nodeTriangleIndex);

      meshInterface.unLockReadOnlyVertexBase(nodeSubPart);
    }
  public BvhTriangleMeshShape(
      StridingMeshInterface meshInterface, boolean useQuantizedAabbCompression, boolean buildBvh) {
    super(meshInterface);
    this.bvh = null;
    this.useQuantizedAabbCompression = useQuantizedAabbCompression;
    this.ownsBvh = false;

    // construct bvh from meshInterface
    // #ifndef DISABLE_BVH

    Vector3f bvhAabbMin = new Vector3f(), bvhAabbMax = new Vector3f();
    meshInterface.calculateAabbBruteForce(bvhAabbMin, bvhAabbMax);

    if (buildBvh) {
      bvh = new OptimizedBvh();
      bvh.build(meshInterface, useQuantizedAabbCompression, bvhAabbMin, bvhAabbMax);
      ownsBvh = true;
    }

    // JAVA NOTE: moved from TriangleMeshShape
    recalcLocalAabb();
    // #endif //DISABLE_BVH
  }