/*
** 2011 April 5
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
*/
package info.ata4.bspsrc.util;
import info.ata4.bsplib.struct.BspData;
import info.ata4.bsplib.struct.DLeaf;
/**
* BSP tree iterator to find the leaf brush/face index minima/maxima.
*
* Original class name: unmap.Treelimit
*
* @author Nico Bergemann <barracuda415 at yahoo.de>
*/
public class BspTreeStats {
private BspData bsp;
private int bmin; //min brush
private int bmax; //max brush
private int fmin; //min face
private int fmax; //max face
private int nmax; //max node
public BspTreeStats(BspData bsp) {
this.bsp = bsp;
reset();
}
public final void reset() {
bmin = Integer.MAX_VALUE;
bmax = -1;
fmin = Integer.MAX_VALUE;
fmax = -1;
nmax = -1;
}
public void walk(int inode) {
// if positive, inode is a node index
// if negative, the value (-1 - child) is the index into the leaf array
if (inode < 0) {
int ileaf = -1 - inode;
DLeaf l = bsp.leaves.get(ileaf);
// scan leaf faces
for (int i = 0; i < l.numleafface; i++) {
int iface = bsp.leafFaces.get(l.fstleafface + i);
fmax = Math.max(fmax, iface);
fmin = Math.min(fmin, iface);
}
// scan leaf brushes
for (int i = 0; i < l.numleafbrush; i++) {
int ibrush = bsp.leafBrushes.get(l.fstleafbrush + i);
bmax = Math.max(bmax, ibrush);
bmin = Math.min(bmin, ibrush);
}
} else {
nmax = Math.max(nmax, inode);
// continue with child nodes
walk(bsp.nodes.get(inode).children[0]);
walk(bsp.nodes.get(inode).children[1]);
}
}
public int getMinBrushLeaf() {
return bmin;
}
public int getMaxBrushLeaf() {
return bmax;
}
public int getMinFaceLeaf() {
return fmin;
}
public int getMaxFaceLeaf() {
return fmax;
}
public int getMaxNode() {
return nmax;
}
}