summaryrefslogtreecommitdiffstats
path: root/world/World.gd
diff options
context:
space:
mode:
Diffstat (limited to 'world/World.gd')
-rw-r--r--world/World.gd77
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()