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 }