From 67d17074b266af5c1a9b48b3c93ed394cdb0cc73 Mon Sep 17 00:00:00 2001 From: Voyager Date: Mon, 27 Jul 2026 03:29:35 -0400 Subject: [PATCH] Add grass texture and soften world lighting --- .../environment/textures/grass_olive_tile.png | Bin 0 -> 554 bytes .../textures/grass_olive_tile.png.import | 41 ++++++++++++++++++ art/source/environment/textures/.gdignore | 0 .../environment/textures/grass_olive_tile.xcf | Bin 0 -> 3570 bytes world/materials/starter_island_grass.tres | 10 +++++ world/regions/starter_island_region.gd | 27 ++++++++++++ world/regions/starter_island_region.tscn | 2 + world/test_world.tscn | 22 ++++++++-- 8 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 art/exported/environment/textures/grass_olive_tile.png create mode 100644 art/exported/environment/textures/grass_olive_tile.png.import create mode 100644 art/source/environment/textures/.gdignore create mode 100644 art/source/environment/textures/grass_olive_tile.xcf create mode 100644 world/materials/starter_island_grass.tres diff --git a/art/exported/environment/textures/grass_olive_tile.png b/art/exported/environment/textures/grass_olive_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..affb5dca4e74e405919ba6175b6f70a8343433d2 GIT binary patch literal 554 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 VhHf7IHQ+jQ^Wr=sRB(=I_7A^ void: + _apply_grass_material() _build_terrain_collision() @@ -44,6 +49,28 @@ func has_terrain_collision() -> bool: return collision_shape != null and collision_shape.shape != null +func _apply_grass_material() -> void: + var visual_mesh: MeshInstance3D = ( + get_node_or_null(visual_mesh_path) as MeshInstance3D + ) + if visual_mesh == null or visual_mesh.mesh == null: + push_error("Starter island visual mesh is unavailable.") + return + if grass_material == null: + push_error("Starter island grass material is unavailable.") + return + if grass_surface_index >= visual_mesh.mesh.get_surface_count(): + push_error("Starter island grass surface index is invalid.") + return + if visual_mesh.mesh.surface_get_name(grass_surface_index) != "grass": + push_error("Starter island grass surface name does not match.") + return + visual_mesh.set_surface_override_material( + grass_surface_index, + grass_material + ) + + func _build_terrain_collision() -> void: var visual_mesh: MeshInstance3D = ( get_node_or_null(visual_mesh_path) as MeshInstance3D diff --git a/world/regions/starter_island_region.tscn b/world/regions/starter_island_region.tscn index f2b1d6e..ff2bd24 100644 --- a/world/regions/starter_island_region.tscn +++ b/world/regions/starter_island_region.tscn @@ -8,6 +8,7 @@ [ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="6_safe"] [ext_resource type="PackedScene" path="res://world/interactables/fishing_shop_world.tscn" id="7_shop"] [ext_resource type="PackedScene" path="res://world/interactables/pelican_buyer_world.tscn" id="8_pelican"] +[ext_resource type="Material" path="res://world/materials/starter_island_grass.tres" id="9_grass"] [sub_resource type="StandardMaterial3D" id="WaterMaterial"] transparency = 1 @@ -46,6 +47,7 @@ size = Vector3(11.5, 4.8, 8.5) [node name="StarterIslandRegion" type="Node3D"] script = ExtResource("1_region") +grass_material = ExtResource("9_grass") region_id = &"starter_island" [node name="Visuals" type="Node3D" parent="."] diff --git a/world/test_world.tscn b/world/test_world.tscn index b5d4f20..75bd759 100644 --- a/world/test_world.tscn +++ b/world/test_world.tscn @@ -6,10 +6,21 @@ [sub_resource type="Environment" id="Environment"] background_mode = 1 -background_color = Color(0.48, 0.74, 0.92, 1) +background_color = Color(0.58, 0.72, 0.82, 1) +background_energy_multiplier = 0.85 ambient_light_source = 3 -ambient_light_color = Color(0.72, 0.78, 0.84, 1) -ambient_light_energy = 0.72 +ambient_light_color = Color(0.78, 0.84, 0.92, 1) +ambient_light_energy = 0.95 +fog_enabled = true +fog_light_color = Color(0.62, 0.73, 0.8, 1) +fog_light_energy = 0.75 +fog_density = 0.0025 +fog_aerial_perspective = 0.2 +fog_sky_affect = 0.15 +adjustment_enabled = true +adjustment_brightness = 0.9 +adjustment_contrast = 0.89 +adjustment_saturation = 0.91 [sub_resource type="BoxShape3D" id="NorthSouthBoundsShape"] size = Vector3(120, 14, 2) @@ -30,8 +41,11 @@ environment = SubResource("Environment") [node name="Sun" type="DirectionalLight3D" parent="Environment"] rotation_degrees = Vector3(-54, -32, 0) -light_energy = 1.1 +light_color = Color(1, 0.94, 0.88, 1) +light_energy = 0.68 shadow_enabled = true +shadow_opacity = 0.58 +shadow_blur = 2.0 [node name="Regions" type="Node3D" parent="."]