    001    package net.minecraft.util;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.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    }