    001    package net.minecraft.world.gen;
    002
    003    import java.util.Random;
    004
    005    public class NoiseGeneratorPerlin extends NoiseGenerator
    006    {
    007        private int[] permutations;
    008        public double xCoord;
    009        public double yCoord;
    010        public double zCoord;
    011
    012        public NoiseGeneratorPerlin()
    013        {
    014            this(new Random());
    015        }
    016
    017        public NoiseGeneratorPerlin(Random par1Random)
    018        {
    019            this.permutations = new int[512];
    020            this.xCoord = par1Random.nextDouble() * 256.0D;
    021            this.yCoord = par1Random.nextDouble() * 256.0D;
    022            this.zCoord = par1Random.nextDouble() * 256.0D;
    023            int var2;
    024
    025            for (var2 = 0; var2 < 256; this.permutations[var2] = var2++)
    026            {
    027                ;
    028            }
    029
    030            for (var2 = 0; var2 < 256; ++var2)
    031            {
    032                int var3 = par1Random.nextInt(256 - var2) + var2;
    033                int var4 = this.permutations[var2];
    034                this.permutations[var2] = this.permutations[var3];
    035                this.permutations[var3] = var4;
    036                this.permutations[var2 + 256] = this.permutations[var2];
    037            }
    038        }
    039
    040        public final double lerp(double par1, double par3, double par5)
    041        {
    042            return par3 + par1 * (par5 - par3);
    043        }
    044
    045        public final double func_76309_a(int par1, double par2, double par4)
    046        {
    047            int var6 = par1 & 15;
    048            double var7 = (double)(1 - ((var6 & 8) >> 3)) * par2;
    049            double var9 = var6 < 4 ? 0.0D : (var6 != 12 && var6 != 14 ? par4 : par2);
    050            return ((var6 & 1) == 0 ? var7 : -var7) + ((var6 & 2) == 0 ? var9 : -var9);
    051        }
    052
    053        public final double grad(int par1, double par2, double par4, double par6)
    054        {
    055            int var8 = par1 & 15;
    056            double var9 = var8 < 8 ? par2 : par4;
    057            double var11 = var8 < 4 ? par4 : (var8 != 12 && var8 != 14 ? par6 : par2);
    058            return ((var8 & 1) == 0 ? var9 : -var9) + ((var8 & 2) == 0 ? var11 : -var11);
    059        }
    060
    061        /**
    062         * pars: noiseArray , xOffset , yOffset , zOffset , xSize , ySize , zSize , xScale, yScale , zScale , noiseScale.
    063         * noiseArray should be xSize*ySize*zSize in size
    064         */
    065        public void populateNoiseArray(double[] par1ArrayOfDouble, double par2, double par4, double par6, int par8, int par9, int par10, double par11, double par13, double par15, double par17)
    066        {
    067            int var19;
    068            int var22;
    069            double var31;
    070            double var35;
    071            double var38;
    072            int var37;
    073            double var42;
    074            int var40;
    075            int var41;
    076            int var10001;
    077            int var77;
    078
    079            if (par9 == 1)
    080            {
    081                boolean var66 = false;
    082                boolean var65 = false;
    083                boolean var21 = false;
    084                boolean var67 = false;
    085                double var72 = 0.0D;
    086                double var71 = 0.0D;
    087                var77 = 0;
    088                double var74 = 1.0D / par17;
    089
    090                for (int var30 = 0; var30 < par8; ++var30)
    091                {
    092                    var31 = par2 + (double)var30 * par11 + this.xCoord;
    093                    int var78 = (int)var31;
    094
    095                    if (var31 < (double)var78)
    096                    {
    097                        --var78;
    098                    }
    099
    100                    int var34 = var78 & 255;
    101                    var31 -= (double)var78;
    102                    var35 = var31 * var31 * var31 * (var31 * (var31 * 6.0D - 15.0D) + 10.0D);
    103
    104                    for (var37 = 0; var37 < par10; ++var37)
    105                    {
    106                        var38 = par6 + (double)var37 * par15 + this.zCoord;
    107                        var40 = (int)var38;
    108
    109                        if (var38 < (double)var40)
    110                        {
    111                            --var40;
    112                        }
    113
    114                        var41 = var40 & 255;
    115                        var38 -= (double)var40;
    116                        var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D);
    117                        var19 = this.permutations[var34] + 0;
    118                        int var64 = this.permutations[var19] + var41;
    119                        int var69 = this.permutations[var34 + 1] + 0;
    120                        var22 = this.permutations[var69] + var41;
    121                        var72 = this.lerp(var35, this.func_76309_a(this.permutations[var64], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38));
    122                        var71 = this.lerp(var35, this.grad(this.permutations[var64 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D));
    123                        double var79 = this.lerp(var42, var72, var71);
    124                        var10001 = var77++;
    125                        par1ArrayOfDouble[var10001] += var79 * var74;
    126                    }
    127                }
    128            }
    129            else
    130            {
    131                var19 = 0;
    132                double var20 = 1.0D / par17;
    133                var22 = -1;
    134                boolean var23 = false;
    135                boolean var24 = false;
    136                boolean var25 = false;
    137                boolean var26 = false;
    138                boolean var27 = false;
    139                boolean var28 = false;
    140                double var29 = 0.0D;
    141                var31 = 0.0D;
    142                double var33 = 0.0D;
    143                var35 = 0.0D;
    144
    145                for (var37 = 0; var37 < par8; ++var37)
    146                {
    147                    var38 = par2 + (double)var37 * par11 + this.xCoord;
    148                    var40 = (int)var38;
    149
    150                    if (var38 < (double)var40)
    151                    {
    152                        --var40;
    153                    }
    154
    155                    var41 = var40 & 255;
    156                    var38 -= (double)var40;
    157                    var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D);
    158
    159                    for (int var44 = 0; var44 < par10; ++var44)
    160                    {
    161                        double var45 = par6 + (double)var44 * par15 + this.zCoord;
    162                        int var47 = (int)var45;
    163
    164                        if (var45 < (double)var47)
    165                        {
    166                            --var47;
    167                        }
    168
    169                        int var48 = var47 & 255;
    170                        var45 -= (double)var47;
    171                        double var49 = var45 * var45 * var45 * (var45 * (var45 * 6.0D - 15.0D) + 10.0D);
    172
    173                        for (int var51 = 0; var51 < par9; ++var51)
    174                        {
    175                            double var52 = par4 + (double)var51 * par13 + this.yCoord;
    176                            int var54 = (int)var52;
    177
    178                            if (var52 < (double)var54)
    179                            {
    180                                --var54;
    181                            }
    182
    183                            int var55 = var54 & 255;
    184                            var52 -= (double)var54;
    185                            double var56 = var52 * var52 * var52 * (var52 * (var52 * 6.0D - 15.0D) + 10.0D);
    186
    187                            if (var51 == 0 || var55 != var22)
    188                            {
    189                                var22 = var55;
    190                                int var68 = this.permutations[var41] + var55;
    191                                int var73 = this.permutations[var68] + var48;
    192                                int var70 = this.permutations[var68 + 1] + var48;
    193                                int var76 = this.permutations[var41 + 1] + var55;
    194                                var77 = this.permutations[var76] + var48;
    195                                int var75 = this.permutations[var76 + 1] + var48;
    196                                var29 = this.lerp(var42, this.grad(this.permutations[var73], var38, var52, var45), this.grad(this.permutations[var77], var38 - 1.0D, var52, var45));
    197                                var31 = this.lerp(var42, this.grad(this.permutations[var70], var38, var52 - 1.0D, var45), this.grad(this.permutations[var75], var38 - 1.0D, var52 - 1.0D, var45));
    198                                var33 = this.lerp(var42, this.grad(this.permutations[var73 + 1], var38, var52, var45 - 1.0D), this.grad(this.permutations[var77 + 1], var38 - 1.0D, var52, var45 - 1.0D));
    199                                var35 = this.lerp(var42, this.grad(this.permutations[var70 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad(this.permutations[var75 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D));
    200                            }
    201
    202                            double var58 = this.lerp(var56, var29, var31);
    203                            double var60 = this.lerp(var56, var33, var35);
    204                            double var62 = this.lerp(var49, var58, var60);
    205                            var10001 = var19++;
    206                            par1ArrayOfDouble[var10001] += var62 * var20;
    207                        }
    208                    }
    209                }
    210            }
    211        }
    212    }