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