Remise des chunks + charger les chunks proche de la caméra en priorité #52
Closed
eriwyn wants to merge 1 commits from entités into main
@ -0,0 +1,77 @@ |
|||||||
|
extends Spatial |
||||||
|
class_name Chunk |
||||||
|
|
||||||
|
var noise |
||||||
|
var should_remove = true |
||||||
|
var x |
||||||
|
var z |
||||||
|
var empty = true |
||||||
|
|
||||||
|
func _init(x, z): |
||||||
|
self.x = x |
||||||
|
self.z = z |
||||||
|
|
||||||
|
func _ready(): |
||||||
|
generate_chunk() |
||||||
|
pass |
||||||
|
func generate_chunk(): |
||||||
|
var file = File.new() |
||||||
|
file.open("res://world/materials/materials.json", File.READ) |
||||||
|
var materials = JSON.parse(file.get_as_text()).result |
||||||
|
|
||||||
|
var st = SurfaceTool.new() |
||||||
|
|
||||||
|
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)) |
||||||
|
|
||||||
|
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) |
||||||
|
|
||||||
|
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) |
||||||
Loading…
Reference in new issue