From 52dc661e7ba8d827aae7f3f020d87cf99e2fdcc3 Mon Sep 17 00:00:00 2001 From: Floppyrj45 Date: Sun, 19 Apr 2026 18:09:47 +0200 Subject: [PATCH] feat(textures): atlas blocs tileable + UV mapping Chunk.gd (supprime vertex colors) Co-Authored-By: Claude Sonnet 4.6 --- assets/textures/block_atlas.png | Bin 0 -> 67769 bytes assets/textures/gen_atlas.py | 181 ++++++++++++++++++++++++++++++++ scripts/world/BlockDatabase.gd | 85 +++++++++++++-- scripts/world/Chunk.gd | 100 ++++++++++++------ 4 files changed, 325 insertions(+), 41 deletions(-) create mode 100644 assets/textures/block_atlas.png create mode 100644 assets/textures/gen_atlas.py diff --git a/assets/textures/block_atlas.png b/assets/textures/block_atlas.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee3aacced291c5578abb02f88abf64f40f62ae3 GIT binary patch literal 67769 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�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

`gFns6Y(2UftehqzLbCf`FCV5 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 Vector2: + if _BLOCKS.has(id): + return _BLOCKS[id]["atlas_uv"] + return Vector2(0.0, 0.0) + func is_solid(id: int) -> bool: if id == BlockType.AIR or id == BlockType.WATER or id == BlockType.KELP: return false @@ -100,3 +148,18 @@ func get_drops(id: int) -> Array: if _BLOCKS.has(id): return _BLOCKS[id]["drops"] return [] + +func is_emissive(id: int) -> bool: + if _BLOCKS.has(id): + return _BLOCKS[id].has("emission") + return false + +func get_emission_color(id: int) -> Color: + if _BLOCKS.has(id) and _BLOCKS[id].has("emission"): + return _BLOCKS[id]["emission"] + return Color(0.0, 0.0, 0.0) + +func get_emission_energy(id: int) -> float: + if _BLOCKS.has(id) and _BLOCKS[id].has("emission_energy"): + return _BLOCKS[id]["emission_energy"] + return 1.0 diff --git a/scripts/world/Chunk.gd b/scripts/world/Chunk.gd index 7a7c4c7..a286442 100644 --- a/scripts/world/Chunk.gd +++ b/scripts/world/Chunk.gd @@ -7,6 +7,16 @@ var _blocks: PackedInt32Array = PackedInt32Array() var _mesh_instance: MeshInstance3D = null var _static_body: StaticBody3D = null +static var shared_material: StandardMaterial3D = null + +static func _init_material() -> void: + if shared_material == null: + shared_material = StandardMaterial3D.new() + shared_material.albedo_texture = load("res://assets/textures/block_atlas.png") + shared_material.texture_filter = BaseMaterial3D.TEXTURE_FILTER_NEAREST_WITH_MIPMAPS + shared_material.vertex_color_use_as_albedo = false + shared_material.shading_mode = BaseMaterial3D.SHADING_MODE_PER_VERTEX + func _ready() -> void: if _blocks.size() == 0: _blocks.resize(4096) @@ -32,11 +42,16 @@ func generate_mesh() -> void: _static_body.queue_free() _static_body = null + _init_material() + var st: SurfaceTool = SurfaceTool.new() st.begin(Mesh.PRIMITIVE_TRIANGLES) var has_faces: bool = false + var tile_w: float = BlockDatabase.ATLAS_TILE_SIZE.x + var tile_h: float = BlockDatabase.ATLAS_TILE_SIZE.y + for x: int in range(CHUNK_SIZE): for y: int in range(CHUNK_SIZE): for z: int in range(CHUNK_SIZE): @@ -44,25 +59,25 @@ func generate_mesh() -> void: if not BlockDatabase.is_solid(block_id): continue - var color: Color = BlockDatabase.get_color(block_id) + var uv_tl: Vector2 = BlockDatabase.get_atlas_uv(block_id) if not _is_opaque_at(x, y + 1, z): - _add_face_top(st, x, y, z, color) + _add_face_top(st, x, y, z, uv_tl, tile_w, tile_h) has_faces = true if not _is_opaque_at(x, y - 1, z): - _add_face_bottom(st, x, y, z, color) + _add_face_bottom(st, x, y, z, uv_tl, tile_w, tile_h) has_faces = true if not _is_opaque_at(x + 1, y, z): - _add_face_right(st, x, y, z, color) + _add_face_right(st, x, y, z, uv_tl, tile_w, tile_h) has_faces = true if not _is_opaque_at(x - 1, y, z): - _add_face_left(st, x, y, z, color) + _add_face_left(st, x, y, z, uv_tl, tile_w, tile_h) has_faces = true if not _is_opaque_at(x, y, z + 1): - _add_face_front(st, x, y, z, color) + _add_face_front(st, x, y, z, uv_tl, tile_w, tile_h) has_faces = true if not _is_opaque_at(x, y, z - 1): - _add_face_back(st, x, y, z, color) + _add_face_back(st, x, y, z, uv_tl, tile_w, tile_h) has_faces = true if not has_faces: @@ -70,15 +85,11 @@ func generate_mesh() -> void: st.generate_normals() - var mat: StandardMaterial3D = StandardMaterial3D.new() - mat.vertex_color_use_as_albedo = true - mat.shading_mode = BaseMaterial3D.SHADING_MODE_PER_VERTEX - st.set_material(mat) - var mesh: ArrayMesh = st.commit() _mesh_instance = MeshInstance3D.new() _mesh_instance.mesh = mesh + _mesh_instance.material_override = shared_material add_child(_mesh_instance) var shape: ConcavePolygonShape3D = ConcavePolygonShape3D.new() @@ -96,80 +107,109 @@ func _is_opaque_at(x: int, y: int, z: int) -> bool: return false return BlockDatabase.is_solid(get_block(x, y, z)) -func _add_face_top(st: SurfaceTool, x: int, y: int, z: int, color: Color) -> void: +# UV layout for a quad: TL, TR, BR, BL +# Face vertices are added as two triangles: TL-TR-BR and TL-BR-BL + +func _add_face_top(st: SurfaceTool, x: int, y: int, z: int, uv_tl: Vector2, tw: float, th: float) -> void: var fx: float = float(x) var fy: float = float(y) var fz: float = float(z) - st.set_color(color) + # tri 1 + st.set_uv(uv_tl) st.add_vertex(Vector3(fx, fy + 1.0, fz)) + st.set_uv(uv_tl + Vector2(tw, 0.0)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz + 1.0)) - st.set_color(color) + # tri 2 + st.set_uv(uv_tl) st.add_vertex(Vector3(fx, fy + 1.0, fz)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz + 1.0)) + st.set_uv(uv_tl + Vector2(0.0, th)) st.add_vertex(Vector3(fx, fy + 1.0, fz + 1.0)) -func _add_face_bottom(st: SurfaceTool, x: int, y: int, z: int, color: Color) -> void: +func _add_face_bottom(st: SurfaceTool, x: int, y: int, z: int, uv_tl: Vector2, tw: float, th: float) -> void: var fx: float = float(x) var fy: float = float(y) var fz: float = float(z) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, 0.0)) st.add_vertex(Vector3(fx + 1.0, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx + 1.0, fy, fz)) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx + 1.0, fy, fz)) + st.set_uv(uv_tl + Vector2(0.0, th)) st.add_vertex(Vector3(fx, fy, fz)) -func _add_face_right(st: SurfaceTool, x: int, y: int, z: int, color: Color) -> void: +func _add_face_right(st: SurfaceTool, x: int, y: int, z: int, uv_tl: Vector2, tw: float, th: float) -> void: var fx: float = float(x) var fy: float = float(y) var fz: float = float(z) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx + 1.0, fy, fz)) + st.set_uv(uv_tl + Vector2(tw, 0.0)) st.add_vertex(Vector3(fx + 1.0, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz + 1.0)) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx + 1.0, fy, fz)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz + 1.0)) + st.set_uv(uv_tl + Vector2(0.0, th)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz)) -func _add_face_left(st: SurfaceTool, x: int, y: int, z: int, color: Color) -> void: +func _add_face_left(st: SurfaceTool, x: int, y: int, z: int, uv_tl: Vector2, tw: float, th: float) -> void: var fx: float = float(x) var fy: float = float(y) var fz: float = float(z) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, 0.0)) st.add_vertex(Vector3(fx, fy, fz)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx, fy + 1.0, fz)) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx, fy + 1.0, fz)) + st.set_uv(uv_tl + Vector2(0.0, th)) st.add_vertex(Vector3(fx, fy + 1.0, fz + 1.0)) -func _add_face_front(st: SurfaceTool, x: int, y: int, z: int, color: Color) -> void: +func _add_face_front(st: SurfaceTool, x: int, y: int, z: int, uv_tl: Vector2, tw: float, th: float) -> void: var fx: float = float(x) var fy: float = float(y) var fz: float = float(z) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx + 1.0, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, 0.0)) st.add_vertex(Vector3(fx, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx, fy + 1.0, fz + 1.0)) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx + 1.0, fy, fz + 1.0)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx, fy + 1.0, fz + 1.0)) + st.set_uv(uv_tl + Vector2(0.0, th)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz + 1.0)) -func _add_face_back(st: SurfaceTool, x: int, y: int, z: int, color: Color) -> void: +func _add_face_back(st: SurfaceTool, x: int, y: int, z: int, uv_tl: Vector2, tw: float, th: float) -> void: var fx: float = float(x) var fy: float = float(y) var fz: float = float(z) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx, fy, fz)) + st.set_uv(uv_tl + Vector2(tw, 0.0)) st.add_vertex(Vector3(fx + 1.0, fy, fz)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz)) - st.set_color(color) + st.set_uv(uv_tl) st.add_vertex(Vector3(fx, fy, fz)) + st.set_uv(uv_tl + Vector2(tw, th)) st.add_vertex(Vector3(fx + 1.0, fy + 1.0, fz)) + st.set_uv(uv_tl + Vector2(0.0, th)) st.add_vertex(Vector3(fx, fy + 1.0, fz))