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 }