public void construct(){ root = new Octnode(bbox, allTris); root.subdivide(minTrisPerNode); root.collectTriangles(geoms); }
public void createFastOctnodes(List<Geometry> globalGeomList){ root.createFastOctnode(globalGeomList); }
public void generateFastOctnodeLinks(){ root.generateFastOctnodeLinks(null, null, 0); }
boxForChild[i] = getChildBound(i); trisForChild[i] = new ArrayList<Triangle>(); for (int i = 0; i < 8; i++){ BoundingBox childBox = boxForChild[i]; float cost = getAdditionCost(childBox, t); if (cost < lowestCost){ lowestCost = cost; expandBoxToContainTri(boxForChild[lowestIndex], t); }else{ keepTris.add(t); for (int i = 0; i < 8; i++){ if (trisForChild[i].size() > 0){ children[i] = new Octnode(boxForChild[i], trisForChild[i]); children[i].subdivide(depth + 1, minTrisPerNode);
public void generateRenderSet(Set<Geometry> renderSet, Camera cam){ // generateRenderSetNoCheck(renderSet, cam); bbox.setCheckPlane(0); cam.setPlaneState(0); Camera.FrustumIntersect result = cam.contains(bbox); if (result != Camera.FrustumIntersect.Outside){ if (geoms != null){ renderSet.addAll(Arrays.asList(geoms)); } for (int i = 0; i < 8; i++){ if (children[i] != null){ if (result == Camera.FrustumIntersect.Inside){ children[i].generateRenderSetNoCheck(renderSet, cam); }else{ children[i].generateRenderSet(renderSet, cam); } } } } }
public void intersect(Ray r, float farPlane, Geometry[] geoms, CollisionResults results){ boundResults.clear(); bbox.collideWith(r, boundResults); if (boundResults.size() > 0){ float tMin = boundResults.getClosestCollision().getDistance(); float tMax = boundResults.getFarthestCollision().getDistance(); tMin = Math.max(tMin, 0); tMax = Math.min(tMax, farPlane); root.intersectWhere(r, geoms, tMin, tMax, results); } } }
public void generateRenderSet(Set<Geometry> renderSet, Camera cam){ root.generateRenderSet(renderSet, cam); }
private void generateRenderSetNoCheck(Set<Geometry> renderSet, Camera cam){ if (geoms != null){ renderSet.addAll(Arrays.asList(geoms)); } for (int i = 0; i < 8; i++){ if (children[i] != null){ children[i].generateRenderSetNoCheck(renderSet, cam); } } }
public void collectTriangles(Geometry[] inGeoms){ if (tris.size() > 0){ List<Geometry> geomsList = TriangleCollector.gatherTris(inGeoms, tris); geoms = new Geometry[geomsList.size()]; geomsList.toArray(geoms); }else{ geoms = null; } for (int i = 0; i < 8; i++){ if (children[i] != null){ children[i].collectTriangles(inGeoms); } } }
public final void intersectWhere(Ray r, Geometry[] geoms, float sceneMin, float sceneMax, CollisionResults results){ for (OCTTriangle t : tris){ float d = r.intersects(t.get1(), t.get2(), t.get3()); if (Float.isInfinite(d)) continue; Vector3f contactPoint = new Vector3f(r.getDirection()).multLocal(d).addLocal(r.getOrigin()); CollisionResult result = new CollisionResult(geoms[t.getGeometryIndex()], contactPoint, d, t.getTriangleIndex()); results.addCollision(result); } for (int i = 0; i < 8; i++){ Octnode child = children[i]; if (child == null) continue; if (child.bbox.intersects(r)){ child.intersectWhere(r, geoms, sceneMin, sceneMax, results); } } }
public void generateFastOctnodeLinks(Octnode parent, Octnode nextSibling, int side){ fastNode.setSide(side); fastNode.next = nextSibling != null ? nextSibling.fastNode : null; // We set the next sibling property by going in reverse order Octnode prev = null; for (int i = 7; i >= 0; i--){ if (children[i] != null){ children[i].generateFastOctnodeLinks(this, prev, i); prev = children[i]; } } fastNode.child = prev != null ? prev.fastNode : null; }
public void createFastOctnode(List<Geometry> globalGeomList){ fastNode = new FastOctnode(); if (geoms != null){ Collection<Geometry> geomsColl = Arrays.asList(geoms); List<Geometry> myOptimizedList = GeometryBatchFactory.makeBatches(geomsColl); int startIndex = globalGeomList.size(); globalGeomList.addAll(myOptimizedList); fastNode.setOffset(startIndex); fastNode.length = myOptimizedList.size(); }else{ fastNode.setOffset(0); fastNode.length = 0; } for (int i = 0; i < 8; i++){ if (children[i] != null){ children[i].createFastOctnode(globalGeomList); } } }