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 Vec3Pool
009 {
010 private final int truncateArrayResetThreshold;
011 private final int minimumSize;
012
013 /** items at and above nextFreeSpace are assumed to be available */
014 private final List vec3Cache = new ArrayList();
015 private int nextFreeSpace = 0;
016 private int maximumSizeSinceLastTruncation = 0;
017 private int resetCount = 0;
018
019 public Vec3Pool(int par1, int par2)
020 {
021 this.truncateArrayResetThreshold = par1;
022 this.minimumSize = par2;
023 }
024
025 /**
026 * extends the pool if all vecs are currently "out"
027 */
028 public Vec3 getVecFromPool(double par1, double par3, double par5)
029 {
030 Vec3 var7;
031
032 if (this.nextFreeSpace >= this.vec3Cache.size())
033 {
034 var7 = new Vec3(par1, par3, par5);
035 this.vec3Cache.add(var7);
036 }
037 else
038 {
039 var7 = (Vec3)this.vec3Cache.get(this.nextFreeSpace);
040 var7.setComponents(par1, par3, par5);
041 }
042
043 ++this.nextFreeSpace;
044 return var7;
045 }
046
047 /**
048 * Will truncate the array everyN clears to the maximum size observed since the last truncation.
049 */
050 public void clear()
051 {
052 if (this.nextFreeSpace > this.maximumSizeSinceLastTruncation)
053 {
054 this.maximumSizeSinceLastTruncation = this.nextFreeSpace;
055 }
056
057 if (this.resetCount++ == this.truncateArrayResetThreshold)
058 {
059 int var1 = Math.max(this.maximumSizeSinceLastTruncation, this.vec3Cache.size() - this.minimumSize);
060
061 while (this.vec3Cache.size() > var1)
062 {
063 this.vec3Cache.remove(var1);
064 }
065
066 this.maximumSizeSinceLastTruncation = 0;
067 this.resetCount = 0;
068 }
069
070 this.nextFreeSpace = 0;
071 }
072
073 @SideOnly(Side.CLIENT)
074 public void clearAndFreeCache()
075 {
076 this.nextFreeSpace = 0;
077 this.vec3Cache.clear();
078 }
079 }