Guest User

Untitled

a guest
Oct 16th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.35 KB | None | 0 0
  1. from __future__ import division
  2. from simplex import SimplexNoise
  3. from volume import Volume
  4. from time import time
  5. from math import sqrt
  6.  
  7. AIR = 0
  8. ROCK = 1
  9. GEMS = 2
  10. DIRT = 3
  11. GRASS = 4
  12. LAVA = 5
  13.  
  14. def simplex_noise(simplex, octaves, x, y, z, w=False):
  15. value = 0.0
  16.  
  17. for i in range(octaves):
  18. value += simplex.noise3(
  19. x * pow(2, i),
  20. y * pow(2, i),
  21. z * pow(2, i),
  22. w
  23. )
  24.  
  25. # print value
  26. return value
  27.  
  28. def neighbors(size, data, x, y, z):
  29. if data[x - 1, y, z]: return True
  30. if data[x + 1, y, z]: return True
  31. if data[x, y - 1, z]: return True
  32. if data[x, y + 1, z]: return True
  33. if data[x, y, z - 1]: return True
  34. if data[x, y, z + 1]: return True
  35. return False
  36.  
  37. def floating_rock(size, data):
  38. sp = SimplexNoise()
  39. noise = sp.noise3
  40.  
  41. for x in range(size):
  42. print '%s%%' % (int(round((x / size) * 100))),
  43. for y in range(size):
  44. for z in range(size):
  45. xf = x / size
  46. yf = y / size
  47. zf = z / size
  48.  
  49. if zf <= 0.8:
  50. plateau_falloff = 1.0
  51. elif 0.8 < zf and zf < 0.9:
  52. plateau_falloff = 1.0 - (zf - 0.8) * 10.0
  53. else:
  54. plateau_falloff = 0.0
  55.  
  56. center_falloff = 0.1 / (
  57. pow((xf - 0.5) * 1.5, 2) +
  58. pow((yf - 0.5) * 1.5, 2) +
  59. pow((zf - 1.0) * 0.8, 2)
  60. )
  61.  
  62. # caves = pow(simplex_noise(sp, 1, xf * 5, yf * 5, zf * 5, True), 3)
  63. caves = simplex_noise(sp, 1, xf * 5, yf * 5, zf * 5, True)
  64. density = simplex_noise(sp, 5, xf, yf, zf * 0.5, True) * center_falloff * plateau_falloff
  65.  
  66. density *= pow(
  67. noise(
  68. (xf + 1.0) * 3.0,
  69. (yf + 1.0) * 3.0,
  70. (zf + 1.0) * 3.0,
  71. True
  72. ) + 0.4, 1.8
  73. )
  74.  
  75. if caves < 0.5:
  76. density = 0.0
  77.  
  78. data[x, y, z] = ROCK if density > 3.1 else AIR
  79.  
  80. def cake_dirt(size, data):
  81. for x in range(size):
  82. for y in range(size):
  83. for z in range(size):
  84. value = data[x, y, z]
  85. ontop = data[x, y, z + 1]
  86. if value == ROCK and ontop == AIR:
  87. data[x, y, z] = DIRT
  88.  
  89. def add_gems(size, data, sp=None):
  90. if sp == None:
  91. sp = SimplexNoise()
  92.  
  93. for x in range(size):
  94. for y in range(size):
  95. for z in range(size):
  96. xf, yf, zf = x / size, y / size, z / size
  97. value = data[x, y, z]
  98. if value == ROCK:
  99. if simplex_noise(sp, 3, xf*10+3, yf*10+3, zf*10+3)>3.65:
  100. data[x, y, z] = GEMS
  101.  
  102. def add_lava(size, data, sp=None):
  103. if sp == None:
  104. sp = SimplexNoise()
  105.  
  106. for x in range(size):
  107. for y in range(size):
  108. for z in range(size):
  109. xf, yf, zf = x / size, y / size, z / size
  110. value = data[x, y, z]
  111.  
  112. distance = sqrt(
  113. pow(xf - 0.5, 2) + \
  114. pow(yf - 0.5, 2) + \
  115. pow(zf - 0.7, 2)
  116. )
  117.  
  118. if value == ROCK:
  119. n = simplex_noise(sp, 3, xf*10+4, yf*10+4, zf*10+4)
  120. if n > 3.2 and distance < 0.1:
  121. data[x, y, z] = LAVA
  122.  
  123. def delete_solitary(size, data):
  124. for x in range(size):
  125. for y in range(size):
  126. for z in range(size):
  127. value = data[x, y, z]
  128. if not neighbors(size, data, x, y, z):
  129. data[x, y, z] = AIR
  130.  
  131. def generate(size=10):
  132. # init
  133. print 'generating'
  134. volume = Volume(size)
  135. octaves = map(float, range(0, 5))
  136. start = time()
  137.  
  138. # generate
  139. print ' +- floating_rock',
  140. floating_rock(size, volume)
  141. print 'done'
  142. print ' +- add_lava',
  143. add_lava(size, volume)
  144. print 'done'
  145. print ' +- cake_dirt',
  146. cake_dirt(size, volume)
  147. print 'done'
  148. print ' +- add_gems',
  149. add_gems(size, volume)
  150. print 'done'
  151. print ' +- delete_solitary',
  152. delete_solitary(size, volume)
  153. print 'done'
  154.  
  155. # done
  156. # print 'generating volume: %06.3fs' % (time() - start)
  157. return volume
Add Comment
Please, Sign In to add comment