001    package net.minecraft.util;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.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    
101        public int getlistAABBsize()
102        {
103            return this.listAABB.size();
104        }
105    
106        public int getnextPoolIndex()
107        {
108            return this.nextPoolIndex;
109        }
110    }