private void subdivide(BVHNode parent, int imin, int imax, int geomsPerNode) { int inum = imax - imin; if (inum == 0) return; BVHNode node = new BVHNode(); node.imin = imin; node.imax = imax; bvhNodes.add(node); if (inum <= geomsPerNode) { // Leaf node.escape = bvhNodes.size(); for (int i = imin; i < imax; i++) { node.aabb.expand(normGeomList.get(i)._aabb); } if (parent != null) { parent.aabb.expand(node.aabb); } } else { // Split int isplit = imin + inum / 2; subdivide(node, imin, isplit, geomsPerNode); subdivide(node, isplit, imax, geomsPerNode); if (parent != null) { parent.aabb.expand(node.aabb); } node.escape = -bvhNodes.size(); } }
private void subdivide(BVHNode parent, int imin, int imax, int geomsPerNode) { int inum = imax - imin; if (inum == 0) return; BVHNode node = new BVHNode(); node.imin = imin; node.imax = imax; bvhNodes.add(node); if (inum <= geomsPerNode) { // Leaf node.escape = bvhNodes.size(); for (int i = imin; i < imax; i++) { node.aabb.expand(normGeomList.get(i)._aabb); } if (parent != null) { parent.aabb.expand(node.aabb); } } else { // Split int isplit = imin + inum / 2; subdivide(node, imin, isplit, geomsPerNode); subdivide(node, isplit, imax, geomsPerNode); if (parent != null) { parent.aabb.expand(node.aabb); } node.escape = -bvhNodes.size(); } }
@Override void computeAABB() { if (_first != null) { // int i; // double[] a = new double[6]; DAABB aabb = new DAABB(); aabb.set( dInfinity, -dInfinity, dInfinity, -dInfinity, dInfinity, -dInfinity); // a[0] = dInfinity; // a[1] = -dInfinity; // a[2] = dInfinity; // a[3] = -dInfinity; // a[4] = dInfinity; // a[5] = -dInfinity; for (DxGeom g=_first; g != null; g=g.getNext()) { g.recomputeAABB(); // for (i=0; i<6; i += 2) if (g._aabb.get(i) < a[i]) a[i] = g._aabb.get(i); // for (i=1; i<6; i += 2) if (g._aabb.get(i) > a[i]) a[i] = g._aabb.get(i); aabb.expand(g.getAABB()); } //memcpy(aabb,a,6*sizeof(double)); _aabb.set(aabb); } else { _aabb.setZero(); } }
@Override void computeAABB() { if (_first != null) { // int i; // double[] a = new double[6]; DAABB aabb = new DAABB(); aabb.set( dInfinity, -dInfinity, dInfinity, -dInfinity, dInfinity, -dInfinity); // a[0] = dInfinity; // a[1] = -dInfinity; // a[2] = dInfinity; // a[3] = -dInfinity; // a[4] = dInfinity; // a[5] = -dInfinity; for (DxGeom g=_first; g != null; g=g.getNext()) { g.recomputeAABB(); // for (i=0; i<6; i += 2) if (g._aabb.get(i) < a[i]) a[i] = g._aabb.get(i); // for (i=1; i<6; i += 2) if (g._aabb.get(i) > a[i]) a[i] = g._aabb.get(i); aabb.expand(g.getAABB()); } //memcpy(aabb,a,6*sizeof(double)); _aabb.set(aabb); } else { _aabb.setZero(); } }
@Override void computeAABB() { // this can, and should be optimized DVector3 point = new DVector3(); dMultiply0_331 (point, final_posr().R(), points,0); // _aabb.v[0] = point.v[0]+_final_posr.pos.v[0]; // _aabb.v[1] = point.v[0]+_final_posr.pos.v[0]; // _aabb.v[2] = point.v[1]+_final_posr.pos.v[1]; // _aabb.v[3] = point.v[1]+_final_posr.pos.v[1]; // _aabb.v[4] = point.v[2]+_final_posr.pos.v[2]; // _aabb.v[5] = point.v[2]+_final_posr.pos.v[2]; _aabb.setMin( final_posr().pos() ); _aabb.setMax( final_posr().pos() ); _aabb.shiftPos( point ); for(int i=3;i<(pointcount*3);i+=3) { dMultiply0_331 (point, final_posr().R(), points,i); // _aabb.v[0] = dMIN(_aabb.v[0],point.v[0]+_final_posr.pos.v[0]); // _aabb.v[1] = dMAX(_aabb.v[1],point.v[0]+_final_posr.pos.v[0]); // _aabb.v[2] = dMIN(_aabb.v[2],point.v[1]+_final_posr.pos.v[1]); // _aabb.v[3] = dMAX(_aabb.v[3],point.v[1]+_final_posr.pos.v[1]); // _aabb.v[4] = dMIN(_aabb.v[4],point.v[2]+_final_posr.pos.v[2]); // _aabb.v[5] = dMAX(_aabb.v[5],point.v[2]+_final_posr.pos.v[2]); DVector3 tmp = new DVector3(); tmp.eqSum( point, final_posr().pos() ); _aabb.expand( tmp ); } }
@Override void computeAABB() { // this can, and should be optimized DVector3 point = new DVector3(); dMultiply0_331 (point, final_posr().R(), points,0); // _aabb.v[0] = point.v[0]+_final_posr.pos.v[0]; // _aabb.v[1] = point.v[0]+_final_posr.pos.v[0]; // _aabb.v[2] = point.v[1]+_final_posr.pos.v[1]; // _aabb.v[3] = point.v[1]+_final_posr.pos.v[1]; // _aabb.v[4] = point.v[2]+_final_posr.pos.v[2]; // _aabb.v[5] = point.v[2]+_final_posr.pos.v[2]; _aabb.setMin( final_posr().pos() ); _aabb.setMax( final_posr().pos() ); _aabb.shiftPos( point ); for(int i=3;i<(pointcount*3);i+=3) { dMultiply0_331 (point, final_posr().R(), points,i); // _aabb.v[0] = dMIN(_aabb.v[0],point.v[0]+_final_posr.pos.v[0]); // _aabb.v[1] = dMAX(_aabb.v[1],point.v[0]+_final_posr.pos.v[0]); // _aabb.v[2] = dMIN(_aabb.v[2],point.v[1]+_final_posr.pos.v[1]); // _aabb.v[3] = dMAX(_aabb.v[3],point.v[1]+_final_posr.pos.v[1]); // _aabb.v[4] = dMIN(_aabb.v[4],point.v[2]+_final_posr.pos.v[2]); // _aabb.v[5] = dMAX(_aabb.v[5],point.v[2]+_final_posr.pos.v[2]); DVector3 tmp = new DVector3(); tmp.eqSum( point, final_posr().pos() ); _aabb.expand( tmp ); } }