feat: stream chunks in-game, render 3D catalog props, and ground chunk coordinates
checkpoint / checkpoint (push) Successful in 5m54s

This commit is contained in:
2026-09-16 21:31:33 +00:00
parent e54ff6eeb2
commit d2b62c5d25
5 changed files with 412 additions and 56 deletions
+27 -8
View File
@@ -263,9 +263,9 @@ func _build_chunk_collision(parent: Node3D, coord: Vector3i, data: ChunkDataDeco
var body := StaticBody3D.new()
body.name = "chunk_%d_%d_%d" % [coord.x, coord.y, coord.z]
var chunk_origin := Vector3(
coord.x * Chunk.CHUNK_SIZE_X,
coord.y * Chunk.CHUNK_SIZE_Y,
coord.z * Chunk.CHUNK_SIZE_Z
float(coord.x * Chunk.CHUNK_SIZE_X),
float(coord.z * Chunk.CHUNK_SIZE_Z),
float(coord.y * Chunk.CHUNK_SIZE_Y)
)
for layer in data.tile_layers:
@@ -282,20 +282,39 @@ func _build_chunk_collision(parent: Node3D, coord: Vector3i, data: ChunkDataDeco
var box := BoxShape3D.new()
box.size = Vector3.ONE
shape.shape = box
shape.position = chunk_origin + Vector3(x + 0.5, y + 0.5, z + 0.5)
shape.position = chunk_origin + Vector3(x + 0.5, z + 0.5, y + 0.5)
body.add_child(shape)
_collision_shapes_built += 1
for obj in data.objects:
if obj.dynamic:
continue # dynamic templates are spawnable entities, not static geometry
if bool(obj.properties.get("walkable", true)):
if obj.type == "spawn_point" or bool(obj.properties.get("walkable", false)):
continue
var shape := CollisionShape3D.new()
var box := BoxShape3D.new()
box.size = obj.scale
shape.shape = box
shape.position = obj.position
var aid := str(obj.asset_id).to_lower()
var cat_id := str(obj.properties.get("catalog_id", "")).to_lower()
if "lamp" in aid or "lamp" in cat_id:
box.size = Vector3(0.5, 3.2, 0.5)
shape.shape = box
shape.position = chunk_origin + Vector3(obj.position.x, obj.position.z + 1.6, obj.position.y)
elif "tree" in aid or "tree" in cat_id:
box.size = Vector3(0.8, 4.0, 0.8)
shape.shape = box
shape.position = chunk_origin + Vector3(obj.position.x, obj.position.z + 2.0, obj.position.y)
elif "chest" in aid or "chest" in cat_id:
box.size = Vector3(1.0, 0.8, 0.6)
shape.shape = box
shape.position = chunk_origin + Vector3(obj.position.x, obj.position.z + 0.4, obj.position.y)
elif "rock" in aid or "rock" in cat_id:
box.size = Vector3(1.2, 1.0, 1.2)
shape.shape = box
shape.position = chunk_origin + Vector3(obj.position.x, obj.position.z + 0.5, obj.position.y)
else:
box.size = Vector3(obj.scale.x, obj.scale.z, obj.scale.y)
shape.shape = box
shape.position = chunk_origin + Vector3(obj.position.x, obj.position.z + obj.scale.y * 0.5, obj.position.y)
body.add_child(shape)
_collision_shapes_built += 1