After looking this up in countless places, I've got some base code down, but it simply crashes my Roblox Studio. So obviously it's not working.
After debugging to no avail, I decided to try and find an answer here. However, I did find out that the Noise Generators were fine, but the errors came in the script attempting to generate that noise into workspace.Terrain.
Here's my aim:
Generate Perlin Noise.
Apply octaves to that noise.
Use the resulting noise to generate terrain to workspace.Terrain.
However, that just won't happen.
Here is the numerous scripts attempting to do this:
NoiseGeneratorPerlin:
function noise(x, y, z) local X = math.floor(x % 255) local Y = math.floor(y % 255) local Z = math.floor(z % 255) x = x - math.floor(x) y = y - math.floor(y) z = z - math.floor(z) local u = fade(x) local v = fade(y) local w = fade(z) A = p[X ]+Y AA = p[A]+Z AB = p[A+1]+Z B = p[X+1]+Y BA = p[B]+Z BB = p[B+1]+Z return lerp(w, lerp(v, lerp(u, grad(p[AA ], x , y , z ), grad(p[BA ], x-1, y , z )), lerp(u, grad(p[AB ], x , y-1, z ), grad(p[BB ], x-1, y-1, z ))), lerp(v, lerp(u, grad(p[AA+1], x , y , z-1 ), grad(p[BA+1], x-1, y , z-1 )), lerp(u, grad(p[AB+1], x , y-1, z-1 ), grad(p[BB+1], x-1, y-1, z-1 ))) ) end function fade(t) return t * t * t * (t * (t * 6 - 15) + 10) end function lerp(t,a,b) return a + t * (b - a) end function grad(hash,x,y,z) local h = hash % 16 local u local v if (h<8) then u = x else u = y end if (h<4) then v = y elseif (h==12 or h==14) then v=x else v=z end local r if ((h%2) == 0) then r=u else r=-u end if ((h%4) == 0) then r=r+v else r=r-v end return r end p = {} local permutation = {151,160,137,91,90,15, 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 } for i=0,255 do p[i] = permutation[i+1] p[256+i] = permutation[i+1] end function script.GetNoise.OnInvoke(x,y,z,smoothness) return noise(x/smoothness,y/smoothness,z/smoothness) end
NoiseGeneratorPerlinOctaves:
function noise(x,y,z) return workspace.NoiseGeneratorPerlin.GetNoise:Invoke(x,y,z,25) end function fBm(x, y,z,octaves,lacunarity,gain) amplitude = 1.0 frequency = 1.0 sum = 0.0 for i = 0, octaves do sum = sum + (amplitude * noise(x * frequency, y * frequency, z * frequency)) amplitude = amplitude * gain frequency = frequency * lacunarity end return sum; end function script.GetNoise.OnInvoke(x,y,z,octaves) return fBm(x,y,z,octaves,2,0.5) end
and GenLayerTerrain:
function noise(x,y,z) return workspace.NoiseGeneratorPerlin.GetNoise:Invoke(x,y,z,20) end function generateVoxels(mapScale,mapHeight) local smoothness = math.random(20, 30) local xo = math.random(1000) local zo = math.random(1000) local t = workspace.Terrain for x = 1, mapScale do wait() for z = 1, mapScale do local height = noise(x+xo, z+zo, 0) --Find out the height for y = 1, (height*mapHeight)+10 do local density = noise(x+xo, y, z+zo) --Find out the density if density*10 > 0 then t:SetCell(x-(mapScale/2), y-(mapScale/2), z-(mapScale/2), 1, 0, 0) --Sets cell at position x, y, z end end end end end function script.GenerateRandom.OnInvoke(mapScale,mapHeight) math.randomseed(tick()) generateVoxels(mapScale,mapHeight) end function script.GenerateSeed.OnInvoke(mapScale,mapHeight,seed) math.randomseed(seed) generateVoxels(mapScale,mapHeight) end
Other information:
All of the BindableFunctions exist
I was using the Command bar to Invoke the BindableFunctions
I could not find any forms of "while true do" infinite loops.
Thanks for helping!