001 package net.minecraft.util; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 006 public class Vec3 007 { 008 public static final Vec3Pool vec3dPool = new Vec3Pool(-1, -1); 009 public final Vec3Pool myVec3LocalPool; 010 011 /** X coordinate of Vec3D */ 012 public double xCoord; 013 014 /** Y coordinate of Vec3D */ 015 public double yCoord; 016 017 /** Z coordinate of Vec3D */ 018 public double zCoord; 019 020 /** 021 * Static method for creating a new Vec3D given the three x,y,z values. This is only called from the other static 022 * method which creates and places it in the list. 023 */ 024 public static Vec3 createVectorHelper(double par0, double par2, double par4) 025 { 026 return new Vec3(vec3dPool, par0, par2, par4); 027 } 028 029 protected Vec3(Vec3Pool par1Vec3Pool, double par2, double par4, double par6) 030 { 031 if (par2 == -0.0D) 032 { 033 par2 = 0.0D; 034 } 035 036 if (par4 == -0.0D) 037 { 038 par4 = 0.0D; 039 } 040 041 if (par6 == -0.0D) 042 { 043 par6 = 0.0D; 044 } 045 046 this.xCoord = par2; 047 this.yCoord = par4; 048 this.zCoord = par6; 049 this.myVec3LocalPool = par1Vec3Pool; 050 } 051 052 /** 053 * Sets the x,y,z components of the vector as specified. 054 */ 055 protected Vec3 setComponents(double par1, double par3, double par5) 056 { 057 this.xCoord = par1; 058 this.yCoord = par3; 059 this.zCoord = par5; 060 return this; 061 } 062 063 @SideOnly(Side.CLIENT) 064 065 /** 066 * Returns a new vector with the result of the specified vector minus this. 067 */ 068 public Vec3 subtract(Vec3 par1Vec3) 069 { 070 return this.myVec3LocalPool.getVecFromPool(par1Vec3.xCoord - this.xCoord, par1Vec3.yCoord - this.yCoord, par1Vec3.zCoord - this.zCoord); 071 } 072 073 /** 074 * Normalizes the vector to a length of 1 (except if it is the zero vector) 075 */ 076 public Vec3 normalize() 077 { 078 double var1 = (double)MathHelper.sqrt_double(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord); 079 return var1 < 1.0E-4D ? this.myVec3LocalPool.getVecFromPool(0.0D, 0.0D, 0.0D) : this.myVec3LocalPool.getVecFromPool(this.xCoord / var1, this.yCoord / var1, this.zCoord / var1); 080 } 081 082 public double dotProduct(Vec3 par1Vec3) 083 { 084 return this.xCoord * par1Vec3.xCoord + this.yCoord * par1Vec3.yCoord + this.zCoord * par1Vec3.zCoord; 085 } 086 087 @SideOnly(Side.CLIENT) 088 089 /** 090 * Returns a new vector with the result of this vector x the specified vector. 091 */ 092 public Vec3 crossProduct(Vec3 par1Vec3) 093 { 094 return this.myVec3LocalPool.getVecFromPool(this.yCoord * par1Vec3.zCoord - this.zCoord * par1Vec3.yCoord, this.zCoord * par1Vec3.xCoord - this.xCoord * par1Vec3.zCoord, this.xCoord * par1Vec3.yCoord - this.yCoord * par1Vec3.xCoord); 095 } 096 097 /** 098 * Adds the specified x,y,z vector components to this vector and returns the resulting vector. Does not change this 099 * vector. 100 */ 101 public Vec3 addVector(double par1, double par3, double par5) 102 { 103 return this.myVec3LocalPool.getVecFromPool(this.xCoord + par1, this.yCoord + par3, this.zCoord + par5); 104 } 105 106 /** 107 * Euclidean distance between this and the specified vector, returned as double. 108 */ 109 public double distanceTo(Vec3 par1Vec3) 110 { 111 double var2 = par1Vec3.xCoord - this.xCoord; 112 double var4 = par1Vec3.yCoord - this.yCoord; 113 double var6 = par1Vec3.zCoord - this.zCoord; 114 return (double)MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6); 115 } 116 117 /** 118 * The square of the Euclidean distance between this and the specified vector. 119 */ 120 public double squareDistanceTo(Vec3 par1Vec3) 121 { 122 double var2 = par1Vec3.xCoord - this.xCoord; 123 double var4 = par1Vec3.yCoord - this.yCoord; 124 double var6 = par1Vec3.zCoord - this.zCoord; 125 return var2 * var2 + var4 * var4 + var6 * var6; 126 } 127 128 /** 129 * The square of the Euclidean distance between this and the vector of x,y,z components passed in. 130 */ 131 public double squareDistanceTo(double par1, double par3, double par5) 132 { 133 double var7 = par1 - this.xCoord; 134 double var9 = par3 - this.yCoord; 135 double var11 = par5 - this.zCoord; 136 return var7 * var7 + var9 * var9 + var11 * var11; 137 } 138 139 /** 140 * Returns the length of the vector. 141 */ 142 public double lengthVector() 143 { 144 return (double)MathHelper.sqrt_double(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord); 145 } 146 147 /** 148 * Returns a new vector with x value equal to the second parameter, along the line between this vector and the 149 * passed in vector, or null if not possible. 150 */ 151 public Vec3 getIntermediateWithXValue(Vec3 par1Vec3, double par2) 152 { 153 double var4 = par1Vec3.xCoord - this.xCoord; 154 double var6 = par1Vec3.yCoord - this.yCoord; 155 double var8 = par1Vec3.zCoord - this.zCoord; 156 157 if (var4 * var4 < 1.0000000116860974E-7D) 158 { 159 return null; 160 } 161 else 162 { 163 double var10 = (par2 - this.xCoord) / var4; 164 return var10 >= 0.0D && var10 <= 1.0D ? this.myVec3LocalPool.getVecFromPool(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null; 165 } 166 } 167 168 /** 169 * Returns a new vector with y value equal to the second parameter, along the line between this vector and the 170 * passed in vector, or null if not possible. 171 */ 172 public Vec3 getIntermediateWithYValue(Vec3 par1Vec3, double par2) 173 { 174 double var4 = par1Vec3.xCoord - this.xCoord; 175 double var6 = par1Vec3.yCoord - this.yCoord; 176 double var8 = par1Vec3.zCoord - this.zCoord; 177 178 if (var6 * var6 < 1.0000000116860974E-7D) 179 { 180 return null; 181 } 182 else 183 { 184 double var10 = (par2 - this.yCoord) / var6; 185 return var10 >= 0.0D && var10 <= 1.0D ? this.myVec3LocalPool.getVecFromPool(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null; 186 } 187 } 188 189 /** 190 * Returns a new vector with z value equal to the second parameter, along the line between this vector and the 191 * passed in vector, or null if not possible. 192 */ 193 public Vec3 getIntermediateWithZValue(Vec3 par1Vec3, double par2) 194 { 195 double var4 = par1Vec3.xCoord - this.xCoord; 196 double var6 = par1Vec3.yCoord - this.yCoord; 197 double var8 = par1Vec3.zCoord - this.zCoord; 198 199 if (var8 * var8 < 1.0000000116860974E-7D) 200 { 201 return null; 202 } 203 else 204 { 205 double var10 = (par2 - this.zCoord) / var8; 206 return var10 >= 0.0D && var10 <= 1.0D ? this.myVec3LocalPool.getVecFromPool(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null; 207 } 208 } 209 210 public String toString() 211 { 212 return "(" + this.xCoord + ", " + this.yCoord + ", " + this.zCoord + ")"; 213 } 214 215 /** 216 * Rotates the vector around the x axis by the specified angle. 217 */ 218 public void rotateAroundX(float par1) 219 { 220 float var2 = MathHelper.cos(par1); 221 float var3 = MathHelper.sin(par1); 222 double var4 = this.xCoord; 223 double var6 = this.yCoord * (double)var2 + this.zCoord * (double)var3; 224 double var8 = this.zCoord * (double)var2 - this.yCoord * (double)var3; 225 this.xCoord = var4; 226 this.yCoord = var6; 227 this.zCoord = var8; 228 } 229 230 /** 231 * Rotates the vector around the y axis by the specified angle. 232 */ 233 public void rotateAroundY(float par1) 234 { 235 float var2 = MathHelper.cos(par1); 236 float var3 = MathHelper.sin(par1); 237 double var4 = this.xCoord * (double)var2 + this.zCoord * (double)var3; 238 double var6 = this.yCoord; 239 double var8 = this.zCoord * (double)var2 - this.xCoord * (double)var3; 240 this.xCoord = var4; 241 this.yCoord = var6; 242 this.zCoord = var8; 243 } 244 245 @SideOnly(Side.CLIENT) 246 247 /** 248 * Rotates the vector around the z axis by the specified angle. 249 */ 250 public void rotateAroundZ(float par1) 251 { 252 float var2 = MathHelper.cos(par1); 253 float var3 = MathHelper.sin(par1); 254 double var4 = this.xCoord * (double)var2 + this.yCoord * (double)var3; 255 double var6 = this.yCoord * (double)var2 - this.xCoord * (double)var3; 256 double var8 = this.zCoord; 257 this.xCoord = var4; 258 this.yCoord = var6; 259 this.zCoord = var8; 260 } 261 }