public final int intersectBrute( Ray r, Matrix4f worldMatrix, BIHTree tree, float sceneMin, float sceneMax, CollisionResults results) { float tHit = Float.POSITIVE_INFINITY; TempVars vars = TempVars.get(); Vector3f v1 = vars.vect1, v2 = vars.vect2, v3 = vars.vect3; int cols = 0; ArrayList<BIHStackData> stack = vars.bihStack; stack.clear(); // stack.add(new BIHStackData(this, 0, 0)); vars.addStackData(this, 0f, 0f); stackloop: while (stack.size() > 0) { BIHStackData data = stack.remove(stack.size() - 1); BIHNode node = data.node; leafloop: while (node.axis != 3) { // while node is not a leaf BIHNode nearNode, farNode; nearNode = node.left; farNode = node.right; // stack.add(new BIHStackData(farNode, 0, 0)); vars.addStackData(farNode, 0f, 0f); node = nearNode; } // a leaf for (int i = node.leftIndex; i <= node.rightIndex; i++) { tree.getTriangle(i, v1, v2, v3); if (worldMatrix != null) { worldMatrix.mult(v1, v1); worldMatrix.mult(v2, v2); worldMatrix.mult(v3, v3); } float t = r.intersects(v1, v2, v3); if (t < tHit) { tHit = t; vars.vect4.set(r.direction).multLocal(tHit).addLocal(r.origin); CollisionResult cr = results.addReusedCollision(vars.vect4.x, vars.vect4.y, vars.vect4.z, tHit); cr.setTriangleIndex(tree.getTriangleIndex(i)); results.addCollision(cr); cols++; } } } vars.release(); return cols; }