Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import division
- from simplex import SimplexNoise
- from volume import Volume
- from time import time
- from math import sqrt
- AIR = 0
- ROCK = 1
- GEMS = 2
- DIRT = 3
- GRASS = 4
- LAVA = 5
- def simplex_noise(simplex, octaves, x, y, z, w=False):
- value = 0.0
- for i in range(octaves):
- value += simplex.noise3(
- x * pow(2, i),
- y * pow(2, i),
- z * pow(2, i),
- w
- )
- # print value
- return value
- def neighbors(size, data, x, y, z):
- if data[x - 1, y, z]: return True
- if data[x + 1, y, z]: return True
- if data[x, y - 1, z]: return True
- if data[x, y + 1, z]: return True
- if data[x, y, z - 1]: return True
- if data[x, y, z + 1]: return True
- return False
- def floating_rock(size, data):
- sp = SimplexNoise()
- noise = sp.noise3
- for x in range(size):
- print '%s%%' % (int(round((x / size) * 100))),
- for y in range(size):
- for z in range(size):
- xf = x / size
- yf = y / size
- zf = z / size
- if zf <= 0.8:
- plateau_falloff = 1.0
- elif 0.8 < zf and zf < 0.9:
- plateau_falloff = 1.0 - (zf - 0.8) * 10.0
- else:
- plateau_falloff = 0.0
- center_falloff = 0.1 / (
- pow((xf - 0.5) * 1.5, 2) +
- pow((yf - 0.5) * 1.5, 2) +
- pow((zf - 1.0) * 0.8, 2)
- )
- # caves = pow(simplex_noise(sp, 1, xf * 5, yf * 5, zf * 5, True), 3)
- caves = simplex_noise(sp, 1, xf * 5, yf * 5, zf * 5, True)
- density = simplex_noise(sp, 5, xf, yf, zf * 0.5, True) * center_falloff * plateau_falloff
- density *= pow(
- noise(
- (xf + 1.0) * 3.0,
- (yf + 1.0) * 3.0,
- (zf + 1.0) * 3.0,
- True
- ) + 0.4, 1.8
- )
- if caves < 0.5:
- density = 0.0
- data[x, y, z] = ROCK if density > 3.1 else AIR
- def cake_dirt(size, data):
- for x in range(size):
- for y in range(size):
- for z in range(size):
- value = data[x, y, z]
- ontop = data[x, y, z + 1]
- if value == ROCK and ontop == AIR:
- data[x, y, z] = DIRT
- def add_gems(size, data, sp=None):
- if sp == None:
- sp = SimplexNoise()
- for x in range(size):
- for y in range(size):
- for z in range(size):
- xf, yf, zf = x / size, y / size, z / size
- value = data[x, y, z]
- if value == ROCK:
- if simplex_noise(sp, 3, xf*10+3, yf*10+3, zf*10+3)>3.65:
- data[x, y, z] = GEMS
- def add_lava(size, data, sp=None):
- if sp == None:
- sp = SimplexNoise()
- for x in range(size):
- for y in range(size):
- for z in range(size):
- xf, yf, zf = x / size, y / size, z / size
- value = data[x, y, z]
- distance = sqrt(
- pow(xf - 0.5, 2) + \
- pow(yf - 0.5, 2) + \
- pow(zf - 0.7, 2)
- )
- if value == ROCK:
- n = simplex_noise(sp, 3, xf*10+4, yf*10+4, zf*10+4)
- if n > 3.2 and distance < 0.1:
- data[x, y, z] = LAVA
- def delete_solitary(size, data):
- for x in range(size):
- for y in range(size):
- for z in range(size):
- value = data[x, y, z]
- if not neighbors(size, data, x, y, z):
- data[x, y, z] = AIR
- def generate(size=10):
- # init
- print 'generating'
- volume = Volume(size)
- octaves = map(float, range(0, 5))
- start = time()
- # generate
- print ' +- floating_rock',
- floating_rock(size, volume)
- print 'done'
- print ' +- add_lava',
- add_lava(size, volume)
- print 'done'
- print ' +- cake_dirt',
- cake_dirt(size, volume)
- print 'done'
- print ' +- add_gems',
- add_gems(size, volume)
- print 'done'
- print ' +- delete_solitary',
- delete_solitary(size, volume)
- print 'done'
- # done
- # print 'generating volume: %06.3fs' % (time() - start)
- return volume
Add Comment
Please, Sign In to add comment