diff options
Diffstat (limited to 'world/World.gd')
-rw-r--r-- | world/World.gd | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/world/World.gd b/world/World.gd new file mode 100644 index 0000000..af2ba6a --- /dev/null +++ b/world/World.gd @@ -0,0 +1,77 @@ +extends Spatial + +export(NodePath) var traveler = null +onready var _traveler = get_node(traveler) +export var acceleration = 10.0 + +onready var lod_distance = $"ChunkRenderDistance" +onready var lod_mid = $"ChunkRenderMid" +onready var lod_close = $"ChunkRenderClose" + +onready var chunk_render_distance = lod_distance.get_node("Radius").shape.radius + +onready var chunk_half_size = $"Chunks/Chunk/Size".shape.radius +onready var chunk_size = chunk_half_size * 2.0 + +func _ready(): + ChunkLoader.world = self + ChunkGen.chunk_half_size = self.chunk_half_size + +func _on_ChunkRenderDistance_area_entered(area:Area): + if area.lod < area.LOD.DISTANCE: + area.lod = area.LOD.DISTANCE + area.lod_update() + +func _on_ChunkRenderMid_area_entered(area:Area): + if area.lod < area.LOD.MID: + area.lod = area.LOD.MID + area.lod_update() + +func _on_ChunkRenderClose_area_entered(area:Area): + if area.lod < area.LOD.CLOSE: + area.lod = area.LOD.CLOSE + area.lod_update() + +func _on_ChunkRenderDistance_area_exited(area:Area): + area.queue_free() + +func _on_ChunkRenderMid_area_exited(area:Area): + area.lod = area.LOD.DISTANCE + area.lod_update() + +func _on_ChunkRenderClose_area_exited(area:Area): + area.lod = area.LOD.MID + area.lod_update() + +func travel(direction:Vector3): + var heading = _traveler.global_transform.basis + heading = Basis(Vector3.UP*heading.get_euler().y) + direction = -direction + direction = heading * direction + direction = direction.normalized() + $"Chunks".add_central_force(direction*acceleration) + +func _physics_process(_state): + chunk_process() + var stick = Input.get_axis("ship_down","ship_up") + if stick != 0.0: + self.travel(Vector3.FORWARD*stick) + +func v2_coords(coords:Vector3): + return Vector2(coords.x,coords.z) + +func chunk_coords(coords:Vector2): + return coords.snapped(Vector2(chunk_size,chunk_size)) + +func chunk_process(): + var gen_center = -v2_coords($"Chunks".transform.origin) + var gen_radius = chunk_render_distance + var gen_radius_rounded = stepify(gen_radius, chunk_size) + for x in range(-gen_radius_rounded, gen_radius_rounded+chunk_size, chunk_size): + for y in range(-gen_radius_rounded, gen_radius_rounded+chunk_size, chunk_size): + var gen_coords = Vector2(x,y) + if gen_coords.length() > gen_radius: + continue + var coords = chunk_coords(gen_coords + gen_center) + ChunkLoader.add_chunk(coords) + ChunkLoader.chunk_update() |