    001package net.minecraft.util;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.util.ArrayList;
    006import java.util.List;
    007
    008public class AABBPool
    009{
    010    /**
    011     * Maximum number of times the pool can be "cleaned" before the list is shrunk
    012     */
    013    private final int maxNumCleans;
    014
    015    /**
    016     * Number of Pool entries to remove when cleanPool is called maxNumCleans times.
    017     */
    018    private final int numEntriesToRemove;
    019
    020    /** List of AABB stored in this Pool */
    021    private final List listAABB = new ArrayList();
    022
    023    /** Next index to use when adding a Pool Entry. */
    024    private int nextPoolIndex = 0;
    025
    026    /**
    027     * Largest index reached by this Pool (can be reset to 0 upon calling cleanPool)
    028     */
    029    private int maxPoolIndex = 0;
    030
    031    /** Number of times this Pool has been cleaned */
    032    private int numCleans = 0;
    033
    034    public AABBPool(int par1, int par2)
    035    {
    036        this.maxNumCleans = par1;
    037        this.numEntriesToRemove = par2;
    038    }
    039
    040    /**
    041     * Creates a new AABB, or reuses one that's no longer in use. Parameters: minX, minY, minZ, maxX, maxY, maxZ. AABBs
    042     * returned from this function should only be used for one frame or tick, as after that they will be reused.
    043     */
    044    public AxisAlignedBB getAABB(double par1, double par3, double par5, double par7, double par9, double par11)
    045    {
    046        AxisAlignedBB axisalignedbb;
    047
    048        if (this.nextPoolIndex >= this.listAABB.size())
    049        {
    050            axisalignedbb = new AxisAlignedBB(par1, par3, par5, par7, par9, par11);
    051            this.listAABB.add(axisalignedbb);
    052        }
    053        else
    054        {
    055            axisalignedbb = (AxisAlignedBB)this.listAABB.get(this.nextPoolIndex);
    056            axisalignedbb.setBounds(par1, par3, par5, par7, par9, par11);
    057        }
    058
    059        ++this.nextPoolIndex;
    060        return axisalignedbb;
    061    }
    062
    063    /**
    064     * Marks the pool as "empty", starting over when adding new entries. If this is called maxNumCleans times, the list
    065     * size is reduced
    066     */
    067    public void cleanPool()
    068    {
    069        if (this.nextPoolIndex > this.maxPoolIndex)
    070        {
    071            this.maxPoolIndex = this.nextPoolIndex;
    072        }
    073
    074        if (this.numCleans++ == this.maxNumCleans)
    075        {
    076            int i = Math.max(this.maxPoolIndex, this.listAABB.size() - this.numEntriesToRemove);
    077
    078            while (this.listAABB.size() > i)
    079            {
    080                this.listAABB.remove(i);
    081            }
    082
    083            this.maxPoolIndex = 0;
    084            this.numCleans = 0;
    085        }
    086
    087        this.nextPoolIndex = 0;
    088    }
    089
    090    @SideOnly(Side.CLIENT)
    091
    092    /**
    093     * Clears the AABBPool
    094     */
    095    public void clearPool()
    096    {
    097        this.nextPoolIndex = 0;
    098        this.listAABB.clear();
    099    }
    100
    101    public int getlistAABBsize()
    102    {
    103        return this.listAABB.size();
    104    }
    105
    106    public int getnextPoolIndex()
    107    {
    108        return this.nextPoolIndex;
    109    }
    110}