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 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 if (this.func_82589_e())
031 {
032 return new Vec3(this, par1, par3, par5);
033 }
034 else
035 {
036 Vec3 var7;
037
038 if (this.nextFreeSpace >= this.vec3Cache.size())
039 {
040 var7 = new Vec3(this, par1, par3, par5);
041 this.vec3Cache.add(var7);
042 }
043 else
044 {
045 var7 = (Vec3)this.vec3Cache.get(this.nextFreeSpace);
046 var7.setComponents(par1, par3, par5);
047 }
048
049 ++this.nextFreeSpace;
050 return var7;
051 }
052 }
053
054 /**
055 * Will truncate the array everyN clears to the maximum size observed since the last truncation.
056 */
057 public void clear()
058 {
059 if (!this.func_82589_e())
060 {
061 if (this.nextFreeSpace > this.maximumSizeSinceLastTruncation)
062 {
063 this.maximumSizeSinceLastTruncation = this.nextFreeSpace;
064 }
065
066 if (this.resetCount++ == this.truncateArrayResetThreshold)
067 {
068 int var1 = Math.max(this.maximumSizeSinceLastTruncation, this.vec3Cache.size() - this.minimumSize);
069
070 while (this.vec3Cache.size() > var1)
071 {
072 this.vec3Cache.remove(var1);
073 }
074
075 this.maximumSizeSinceLastTruncation = 0;
076 this.resetCount = 0;
077 }
078
079 this.nextFreeSpace = 0;
080 }
081 }
082
083 @SideOnly(Side.CLIENT)
084 public void clearAndFreeCache()
085 {
086 if (!this.func_82589_e())
087 {
088 this.nextFreeSpace = 0;
089 this.vec3Cache.clear();
090 }
091 }
092
093 public int getPoolSize()
094 {
095 return this.vec3Cache.size();
096 }
097
098 public int func_82590_d()
099 {
100 return this.nextFreeSpace;
101 }
102
103 private boolean func_82589_e()
104 {
105 return this.minimumSize < 0 || this.truncateArrayResetThreshold < 0;
106 }
107 }