{ "name": "Perlin Noise 2D", "id": "RtREWXYigJ2RPQNqw", "sources": { "main": "/*\n Adapted from https://github.com/josephg/noisejs/blob/master/perlin.js\n \n This code was placed in the public domain by its original author,\n Stefan Gustavson. You may use it as you see fit, but attribution is appreciated.\n*/\n\n\nwidth = 8\nheight = pixelCount / width\npixels = array(width)\nfor (i = 0; i < width; i++) pixels[i] = array(height)\n\nscale = min(width, height) / 3\nscale *= 0.8 // Make this larger for finer grained noise\nspeed = 1 // Speed of travel through noise\nseed = 31 // Perlin seed\n\nexport function beforeRender(delta) {\n t1 = triangle(time(.1))\n tx = sin(PI2 * time(10 / 65.536))\n ty = cos(PI2 * time(10 / 65.536)) \n \n for (x = 0; x < width; x++) {\n for (y = 0; y < height; y++) {\n pixels[x][y] = abs(\n perlin2(\n (x / width - tx * speed) * scale, \n (y / height - ty * speed) * scale\n )\n )\n }\n }\n}\n\nexport function render2D(index, x, y) {\n v = // abs(perlin2(x, y)) // Not buffering? This hangs the board somehow\n v = pixels[x * width][y * height]\n hsv(t1 + v / 4, 1, v * v)\n}\n\nexport function render(index) {\n v = abs(perlin2((index / pixelCount - tx * speed) * scale, 0))\n hsv(t1 + v / 4, 1, v * v)\n}\n\n\n// 2D Perlin Noise\nvar grad3 = array(12)\nfor (i = 0; i <12; i++) { grad3[i] = array(3) }\n\nvar gradIndex = 0\nfunction grad(x, y, z) {\n grad3[gradIndex][0] = x\n grad3[gradIndex][0] = y\n grad3[gradIndex][0] = z\n gradIndex++\n}\n\ngrad(1,1,0); grad(-1,1,0); grad(1,-1,0); grad(-1,-1,0)\ngrad(1,0,1); grad(-1,0,1); grad(1,0,-1); grad(-1,0,-1)\ngrad(0,1,1); grad(0,-1,1); grad(0,1,-1); grad(0,-1,-1)\n\nvar p = array(256)\np[0] = 151; p[1] = 160; p[2] = 137; p[3] = 91; p[4] = 90; p[5] = 15; p[6] = 131; p[7] = 13; p[8] = 201; p[9] = 95; p[10] = 96; p[11] = 53; p[12] = 194; p[13] = 233; p[14] = 7; p[15] = 225; p[16] = 140; p[17] = 36; p[18] = 103; p[19] = 30; p[20] = 69; p[21] = 142; p[22] = 8; p[23] = 99; p[24] = 37; p[25] = 240; p[26] = 21; p[27] = 10; p[28] = 23; p[29] = 190; p[30] = 6; p[31] = 148\np[32] = 247; p[33] = 120; p[34] = 234; p[35] = 75; p[36] = 0; p[37] = 26; p[38] = 197; p[39] = 62; p[40] = 94; p[41] = 252; p[42] = 219; p[43] = 203; p[44] = 117; p[45] = 35; p[46] = 11; p[47] = 32; p[48] = 57; p[49] = 177; p[50] = 33; p[51] = 88; p[52] = 237; p[53] = 149; p[54] = 56; p[55] = 87; p[56] = 174; p[57] = 20; p[58] = 125; p[59] = 136; p[60] = 171; p[61] = 168; p[62] = 68; p[63] = 175\np[64] = 74; p[65] = 165; p[66] = 71; p[67] = 134; p[68] = 139; p[69] = 48; p[70] = 27; p[71] = 166; p[72] = 77; p[73] = 146; p[74] = 158; p[75] = 231; p[76] = 83; p[77] = 111; p[78] = 229; p[79] = 122; p[80] = 60; p[81] = 211; p[82] = 133; p[83] = 230; p[84] = 220; p[85] = 105; p[86] = 92; p[87] = 41; p[88] = 55; p[89] = 46; p[90] = 245; p[91] = 40; p[92] = 244; p[93] = 102; p[94] = 143; p[95] = 54\np[96] = 65; p[97] = 25; p[98] = 63; p[99] = 161; p[100] = 1; p[101] = 216; p[102] = 80; p[103] = 73; p[104] = 209; p[105] = 76; p[106] = 132; p[107] = 187; p[108] = 208; p[109] = 89; p[110] = 18; p[111] = 169; p[112] = 200; p[113] = 196; p[114] = 135; p[115] = 130; p[116] = 116; p[117] = 188; p[118] = 159; p[119] = 86; p[120] = 164; p[121] = 100; p[122] = 109; p[123] = 198; p[124] = 173; p[125] = 186; p[126] = 3; p[127] = 64\np[128] = 52; p[129] = 217; p[130] = 226; p[131] = 250; p[132] = 124; p[133] = 123; p[134] = 5; p[135] = 202; p[136] = 38; p[137] = 147; p[138] = 118; p[139] = 126; p[140] = 255; p[141] = 82; p[142] = 85; p[143] = 212; p[144] = 207; p[145] = 206; p[146] = 59; p[147] = 227; p[148] = 47; p[149] = 16; p[150] = 58; p[151] = 17; p[152] = 182; p[153] = 189; p[154] = 28; p[155] = 42; p[156] = 223; p[157] = 183; p[158] = 170; p[159] = 213\np[160] = 119; p[161] = 248; p[162] = 152; p[163] = 2; p[164] = 44; p[165] = 154; p[166] = 163; p[167] = 70; p[168] = 221; p[169] = 153; p[170] = 101; p[171] = 155; p[172] = 167; p[173] = 43; p[174] = 172; p[175] = 9; p[176] = 129; p[177] = 22; p[178] = 39; p[179] = 253; p[180] = 19; p[181] = 98; p[182] = 108; p[183] = 110; p[184] = 79; p[185] = 113; p[186] = 224; p[187] = 232; p[188] = 178; p[189] = 185; p[190] = 112; p[191] = 104\np[192] = 218; p[193] = 246; p[194] = 97; p[195] = 228; p[196] = 251; p[197] = 34; p[198] = 242; p[199] = 193; p[200] = 238; p[201] = 210; p[202] = 144; p[203] = 12; p[204] = 191; p[205] = 179; p[206] = 162; p[207] = 241; p[208] = 81; p[209] = 51; p[210] = 145; p[211] = 235; p[212] = 249; p[213] = 14; p[214] = 239; p[215] = 107; p[216] = 49; p[217] = 192; p[218] = 214; p[219] = 31; p[220] = 181; p[221] = 199; p[222] = 106; p[223] = 157\np[224] = 184; p[225] = 84; p[226] = 204; p[227] = 176; p[228] = 115; p[229] = 121; p[230] = 50; p[231] = 45; p[232] = 127; p[233] = 4; p[234] = 150; p[235] = 254; p[236] = 138; p[237] = 236; p[238] = 205; p[239] = 93; p[240] = 222; p[241] = 114; p[242] = 67; p[243] = 29; p[244] = 24; p[245] = 72; p[246] = 243; p[247] = 141; p[248] = 128; p[249] = 195; p[250] = 78; p[251] = 66; p[252] = 215; p[253] = 61; p[254] = 156; p[255] = 180\n\nvar perm = array(512)\nvar gradP = array(512)\n\n\nfunction perlinSeed(seed) {\n if (seed > 0 && seed < 1) {\n // Scale the seed out\n seed *= 32768\n }\n\n seed = floor(seed)\n if(seed < 256) {\n seed |= seed << 8\n }\n \n for(i = 0; i < 256; i++) {\n var perlinv\n if (i & 1) {\n perlinv = p[i] ^ (seed & 255);\n } else {\n perlinv = p[i] ^ ((seed>>8) & 255)\n }\n\n perm[i] = perm[i + 256] = perlinv\n gradP[i] = gradP[i + 256] = grad3[perlinv % 12]\n }\n }\nperlinSeed(seed)\n\nfunction dot2(gradElement, x, y) {\n return gradElement[0] * x + gradElement[1] * y\n}\n\nfunction fade(t) {\n return t * t * t * (t * (t * 6 - 15) + 10)\n}\n\nfunction lerp(a, b, t) {\n return (1 - t) * a + t * b\n}\n\nfunction perlin2(x, y) {\n // Find unit grid cell containing point\n var X = floor(x)\n var Y = floor(y)\n // Get relative xy coordinates of point within that cell\n x = x - X; y = y - Y\n // Wrap the integer cells at 255 (smaller integer period can be introduced here)\n X = X & 255; Y = Y & 255\n\n // Calculate noise contributions from each of the four corners\n var n00 = dot2(gradP[X + perm[Y]], x, y)\n var n01 = dot2(gradP[X + perm[Y + 1]], x, y - 1)\n var n10 = dot2(gradP[X + 1 + perm[Y]], x - 1, y)\n var n11 = dot2(gradP[X + 1 + perm[Y + 1]], x - 1, y - 1)\n\n // Compute the fade curve value for x\n var u = fade(x)\n\n // Interpolate the four results\n return lerp(\n lerp(n00, n10, u),\n lerp(n01, n11, u),\n fade(y)\n )\n}" }, "preview": "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" }