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}