    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.ArrayList;
    006    import java.util.List;
    007
    008    public 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         * Adds a AABB to the pool, or if there is an available AABB, updates an existing AABB entry to specified
    042         * coordinates
    043         */
    044        public AxisAlignedBB addOrModifyAABBInPool(double par1, double par3, double par5, double par7, double par9, double par11)
    045        {
    046            AxisAlignedBB var13;
    047
    048            if (this.nextPoolIndex >= this.listAABB.size())
    049            {
    050                var13 = new AxisAlignedBB(par1, par3, par5, par7, par9, par11);
    051                this.listAABB.add(var13);
    052            }
    053            else
    054            {
    055                var13 = (AxisAlignedBB)this.listAABB.get(this.nextPoolIndex);
    056                var13.setBounds(par1, par3, par5, par7, par9, par11);
    057            }
    058
    059            ++this.nextPoolIndex;
    060            return var13;
    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 var1 = Math.max(this.maxPoolIndex, this.listAABB.size() - this.numEntriesToRemove);
    077
    078                while (this.listAABB.size() > var1)
    079                {
    080                    this.listAABB.remove(var1);
    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    }