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):
var centers = []
for idx in _data["find_point"][int(vect[0] / 64.0) * 32 + int(vect[1] / 64.0)]:
# print(idx)
centers.append(get_center(idx))
return centers

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

@ -1,8 +1,8 @@
extends Spatial
var rng = RandomNumberGenerator.new()
var chunk_size = 16
var chunk_amount = 16
var chunk_size = 32
var chunk_amount = 4
var chunks = {}
var unready_chunks = {}
var thread
@ -47,9 +47,12 @@ func load_chunk(array):
var x = array[1]
var z = array[2]
# print(x)
# print(z)
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)
@ -74,9 +77,9 @@ func _process(delta):
func update_chunks():
var camera_translation = $CamBase/Camera.translation
# print(camera_translation)
# print(camera_translation)
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 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 x
var z
var empty = true
func _init(x, z):
self.x = x
@ -12,7 +13,7 @@ func _init(x, z):
func _ready():
generate_chunk()
pass
func generate_chunk():
var file = File.new()
file.open("res://world/materials/materials.json", File.READ)
@ -22,8 +23,13 @@ func generate_chunk():
st.begin(Mesh.PRIMITIVE_TRIANGLES)
var factor = Vector3(1, 120, 1)
# print(x)
# print(z)
for center in Global.terrain.get_chunk(Vector2(x, z)):
# print(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 top_uv = Vector2(0, 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)
Global.loading.increment_step()
st.generate_normals()
st.index()
if not empty:
st.generate_normals()
st.index()
var mi = MeshInstance.new()
mi.mesh = st.commit()
var material = load("res://world/materials/world.material")
mi.set_surface_material(0, material)
mi.create_trimesh_collision()
mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON
add_child(mi)
var mi = MeshInstance.new()
mi.mesh = st.commit()
var material = load("res://world/materials/world.material")
mi.set_surface_material(0, material)
mi.create_trimesh_collision()
mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON
add_child(mi)

@ -176,7 +176,7 @@ fov = 55.0
depth_threshold = 0.001
depth_multiplier = 999.0
zoom_sensibility = 1.436
height = 6.596
height = 5.0
[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 )

Loading…
Cancel
Save