    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    }