génération des chunks

pull/47/head
Valentin Stark 3 years ago
parent bad548dbd5
commit bc449574ae
  1. 1
      utils/terrain/Terrain.gd
  2. 77
      utils/world_generation/WorldGeneration.gd
  3. 13
      world/World3d.gd
  4. 27
      world/chunk.gd
  5. 2
      world/game.tscn

@ -853,5 +853,6 @@ func get_voronoi_cells_as_polygon():
func get_chunk(vect): func get_chunk(vect):
var centers = [] var centers = []
for idx in _data["find_point"][int(vect[0] / 64.0) * 32 + int(vect[1] / 64.0)]: for idx in _data["find_point"][int(vect[0] / 64.0) * 32 + int(vect[1] / 64.0)]:
# print(idx)
centers.append(get_center(idx)) centers.append(get_center(idx))
return centers return centers

@ -4,7 +4,7 @@ class_name WorldGeneration
export(int) var width = 2048 export(int) var width = 2048
export(int) var height = 2048 export(int) var height = 2048
export(int) var spacing = 40 export(int) var spacing = 5
export(int, 1, 9) var octaves = 5 export(int, 1, 9) var octaves = 5
export(int, 1, 30) var wavelength = 8 export(int, 1, 30) var wavelength = 8
export(int) var border_width = 200 export(int) var border_width = 200
@ -289,41 +289,46 @@ func create_mesh():
st.begin(Mesh.PRIMITIVE_TRIANGLES) st.begin(Mesh.PRIMITIVE_TRIANGLES)
var factor = Vector3(1, 120, 1) var factor = Vector3(1, 120, 1)
for center in Global.terrain.get_centers(): # for center in Global.terrain.get_centers():
if not center.get_data("water"): for i in range(1, 2048):
var material_id = materials[center.get_data("material")] for j in range(1, 2048):
var top_uv = Vector2(0, float(material_id) / (materials.size()-1)) for center in Global.terrain.get_chunk(Vector2(i, j)):
var border_uv = Vector2(1, float(material_id) / (materials.size()-1)) # print(center.get_data("water"))
if not center.get_data("water"):
for edge in center.borders(): # print(center.get_data("material"))
if edge.end_center().get_elevation() < edge.start_center().get_elevation(): var material_id = materials[center.get_data("material")]
var top = edge.start_center().get_elevation() var top_uv = Vector2(0, float(material_id) / (materials.size()-1))
# if edge.start_center().get_data("ocean"): var border_uv = Vector2(1, float(material_id) / (materials.size()-1))
# top = -1.0
var bottom = edge.end_center().get_elevation() for edge in center.borders():
if edge.end_center().get_data("ocean"): if edge.end_center().get_elevation() < edge.start_center().get_elevation():
bottom = 0.0 var top = edge.start_center().get_elevation()
st.add_uv(border_uv) # if edge.start_center().get_data("ocean"):
st.add_vertex(Vector3(edge.start_corner().point3d().x, bottom, edge.start_corner().point3d().z) * factor) # top = -1.0
st.add_vertex(Vector3(edge.end_corner().point3d().x, top, edge.end_corner().point3d().z) * factor) var bottom = edge.end_center().get_elevation()
st.add_vertex(Vector3(edge.start_corner().point3d().x, top, edge.start_corner().point3d().z) * factor) if edge.end_center().get_data("ocean"):
bottom = 0.0
st.add_vertex(Vector3(edge.start_corner().point3d().x, bottom, edge.start_corner().point3d().z) * factor) st.add_uv(border_uv)
st.add_vertex(Vector3(edge.end_corner().point3d().x, bottom, edge.end_corner().point3d().z) * factor) st.add_vertex(Vector3(edge.start_corner().point3d().x, bottom, edge.start_corner().point3d().z) * factor)
st.add_vertex(Vector3(edge.end_corner().point3d().x, top, edge.end_corner().point3d().z) * factor) st.add_vertex(Vector3(edge.end_corner().point3d().x, top, edge.end_corner().point3d().z) * factor)
st.add_vertex(Vector3(edge.start_corner().point3d().x, top, edge.start_corner().point3d().z) * factor)
for corner_count in center.corners().size():
var current_corner = center.corners()[corner_count] st.add_vertex(Vector3(edge.start_corner().point3d().x, bottom, edge.start_corner().point3d().z) * factor)
var next_corner st.add_vertex(Vector3(edge.end_corner().point3d().x, bottom, edge.end_corner().point3d().z) * factor)
if corner_count < center.corners().size() - 1: st.add_vertex(Vector3(edge.end_corner().point3d().x, top, edge.end_corner().point3d().z) * factor)
next_corner = center.corners()[corner_count+1]
else: for corner_count in center.corners().size():
next_corner = center.corners()[0] var current_corner = center.corners()[corner_count]
var next_corner
st.add_uv(Vector2(top_uv)) if corner_count < center.corners().size() - 1:
st.add_vertex(Vector3(current_corner.point2d().x, center.get_elevation(), current_corner.point2d().y) * factor) next_corner = center.corners()[corner_count+1]
st.add_vertex(Vector3(next_corner.point2d().x, center.get_elevation(), next_corner.point2d().y) * factor) else:
st.add_vertex(Vector3(center.point2d().x, center.get_elevation(), center.point2d().y) * factor) next_corner = center.corners()[0]
st.add_uv(Vector2(top_uv))
st.add_vertex(Vector3(current_corner.point2d().x, center.get_elevation(), current_corner.point2d().y) * factor)
st.add_vertex(Vector3(next_corner.point2d().x, center.get_elevation(), next_corner.point2d().y) * factor)
st.add_vertex(Vector3(center.point2d().x, center.get_elevation(), center.point2d().y) * factor)
Global.loading.increment_step() Global.loading.increment_step()
st.generate_normals() st.generate_normals()

@ -1,8 +1,8 @@
extends Spatial extends Spatial
var rng = RandomNumberGenerator.new() var rng = RandomNumberGenerator.new()
var chunk_size = 16 var chunk_size = 32
var chunk_amount = 16 var chunk_amount = 4
var chunks = {} var chunks = {}
var unready_chunks = {} var unready_chunks = {}
var thread var thread
@ -46,10 +46,13 @@ func load_chunk(array):
var thread = array[0] var thread = array[0]
var x = array[1] var x = array[1]
var z = array[2] var z = array[2]
# print(x)
# print(z)
var chunk = Chunk.new(x * chunk_size, z * chunk_size) var chunk = Chunk.new(x * chunk_size, z * chunk_size)
chunk.translation = Vector3(x * chunk_size, 0, z * chunk_size) # chunk.translation = Vector3(x * chunk_size, 0, z * chunk_size)
call_deferred("load_done", chunk, thread) call_deferred("load_done", chunk, thread)
@ -74,9 +77,9 @@ func _process(delta):
func update_chunks(): func update_chunks():
var camera_translation = $CamBase/Camera.translation var camera_translation = $CamBase/Camera.translation
# print(camera_translation) # print(camera_translation)
var c_x = int(camera_translation.x) / chunk_size var c_x = int(camera_translation.x) / chunk_size
var c_z = int(camera_translation.z) / chunk_size var c_z = int(camera_translation.y) / chunk_size * -1
for x in range(c_x - chunk_amount * 0.5, c_x + chunk_amount * 0.53): for x in range(c_x - chunk_amount * 0.5, c_x + chunk_amount * 0.53):
for z in range(c_z - chunk_amount * 0.5, c_z + chunk_amount * 0.53): for z in range(c_z - chunk_amount * 0.5, c_z + chunk_amount * 0.53):

@ -5,6 +5,7 @@ var noise
var should_remove = true var should_remove = true
var x var x
var z var z
var empty = true
func _init(x, z): func _init(x, z):
self.x = x self.x = x
@ -12,7 +13,7 @@ func _init(x, z):
func _ready(): func _ready():
generate_chunk() generate_chunk()
pass
func generate_chunk(): func generate_chunk():
var file = File.new() var file = File.new()
file.open("res://world/materials/materials.json", File.READ) file.open("res://world/materials/materials.json", File.READ)
@ -22,8 +23,13 @@ func generate_chunk():
st.begin(Mesh.PRIMITIVE_TRIANGLES) st.begin(Mesh.PRIMITIVE_TRIANGLES)
var factor = Vector3(1, 120, 1) var factor = Vector3(1, 120, 1)
# print(x)
# print(z)
for center in Global.terrain.get_chunk(Vector2(x, z)): for center in Global.terrain.get_chunk(Vector2(x, z)):
# print(center.get_data("water"))
if not center.get_data("water"): if not center.get_data("water"):
empty = false
# print(center.get_data("material"))
var material_id = materials[center.get_data("material")] var material_id = materials[center.get_data("material")]
var top_uv = Vector2(0, float(material_id) / (materials.size()-1)) var top_uv = Vector2(0, float(material_id) / (materials.size()-1))
var border_uv = Vector2(1, float(material_id) / (materials.size()-1)) var border_uv = Vector2(1, float(material_id) / (materials.size()-1))
@ -59,13 +65,14 @@ func generate_chunk():
st.add_vertex(Vector3(center.point2d().x, center.get_elevation(), center.point2d().y) * factor) st.add_vertex(Vector3(center.point2d().x, center.get_elevation(), center.point2d().y) * factor)
Global.loading.increment_step() Global.loading.increment_step()
st.generate_normals() if not empty:
st.index() st.generate_normals()
st.index()
var mi = MeshInstance.new() var mi = MeshInstance.new()
mi.mesh = st.commit() mi.mesh = st.commit()
var material = load("res://world/materials/world.material") var material = load("res://world/materials/world.material")
mi.set_surface_material(0, material) mi.set_surface_material(0, material)
mi.create_trimesh_collision() mi.create_trimesh_collision()
mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON
add_child(mi) add_child(mi)

@ -176,7 +176,7 @@ fov = 55.0
depth_threshold = 0.001 depth_threshold = 0.001
depth_multiplier = 999.0 depth_multiplier = 999.0
zoom_sensibility = 1.436 zoom_sensibility = 1.436
height = 6.596 height = 5.0
[node name="DirectionalLight" type="DirectionalLight" parent="World3d"] [node name="DirectionalLight" type="DirectionalLight" parent="World3d"]
transform = Transform( 0.971628, 0.168947, -0.16552, 0, 0.699825, 0.714314, 0.236516, -0.694047, 0.67997, 0, 1.41623, 14.8745 ) transform = Transform( 0.971628, 0.168947, -0.16552, 0, 0.699825, 0.714314, 0.236516, -0.694047, 0.67997, 0, 1.41623, 14.8745 )

Loading…
Cancel
Save