WIP: feat(scene) initial beauty baseline — terrain textures, sky, foam, mist, foliage, shadows
- Add 3 Terrain3D texture assets (limestone, valley grass, warm soil) - Sculpt initial Terrain3D heightmap with ridge, valley, waterfall drop - Replace plain water with emissive-tinged material - Add foam mesh, mist spheres, and procedural sky with valley fog - Add 10 StylizedTree instances around village perimeter - Enable directional light shadows with extended cascade range - Add tree height snapping to terrain surface - Add refined scaffold tests for material count, terrain height, foliage, sky, fog - Add terrain texture PNGs and StylizedTree.tscn scene - Add generate_jajce_terrain.gd tool
This commit is contained in:
+119
-9
@@ -1,10 +1,21 @@
|
||||
[gd_scene load_steps=21 format=3]
|
||||
[gd_scene load_steps=27 format=3]
|
||||
|
||||
[ext_resource type="Terrain3DAssets" path="res://terrain/jajce/assets.tres" id="1_assets"]
|
||||
[ext_resource type="PackedScene" path="res://world/resource_nodes/ResourceNode.tscn" id="2_resource"]
|
||||
[ext_resource type="Script" path="res://world/jajce/jajce_world.gd" id="3_world"]
|
||||
[ext_resource type="PackedScene" path="res://world/jajce/StylizedTree.tscn" id="4_tree"]
|
||||
|
||||
[sub_resource type="Terrain3DMaterial" id="Terrain3DMaterial_jajce"]
|
||||
_shader_parameters = {
|
||||
"auto_base_texture": 1,
|
||||
"auto_overlay_texture": 0,
|
||||
"auto_slope": 0.72,
|
||||
"blend_sharpness": 0.82,
|
||||
"enable_macro_variation": true,
|
||||
"macro_variation1": Color(0.9, 0.94, 0.82, 1),
|
||||
"macro_variation2": Color(0.76, 0.81, 0.7, 1),
|
||||
"macro_variation_slope": 0.38
|
||||
}
|
||||
world_background = 0
|
||||
auto_shader = true
|
||||
|
||||
@@ -22,8 +33,13 @@ albedo_color = Color(0.34, 0.31, 0.27, 1)
|
||||
albedo_color = Color(0.42, 0.5, 0.29, 1)
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="Material_water"]
|
||||
albedo_color = Color(0.16, 0.43, 0.62, 0.78)
|
||||
albedo_color = Color(0.12, 0.39, 0.55, 0.72)
|
||||
transparency = 1
|
||||
metallic = 0.18
|
||||
roughness = 0.12
|
||||
emission_enabled = true
|
||||
emission = Color(0.05, 0.19, 0.24, 1)
|
||||
emission_energy_multiplier = 0.45
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="Material_building"]
|
||||
albedo_color = Color(0.62, 0.48, 0.32, 1)
|
||||
@@ -63,12 +79,51 @@ size = Vector3(8, 0.5, 3)
|
||||
material = SubResource("Material_water")
|
||||
size = Vector3(5, 10, 0.5)
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="Material_foam"]
|
||||
albedo_color = Color(0.82, 0.94, 0.94, 0.85)
|
||||
transparency = 1
|
||||
roughness = 0.25
|
||||
emission_enabled = true
|
||||
emission = Color(0.36, 0.52, 0.54, 1)
|
||||
emission_energy_multiplier = 0.35
|
||||
|
||||
[sub_resource type="BoxMesh" id="Mesh_foam"]
|
||||
material = SubResource("Material_foam")
|
||||
size = Vector3(5.5, 0.12, 2.2)
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="Material_mist"]
|
||||
albedo_color = Color(0.82, 0.91, 0.92, 0.16)
|
||||
transparency = 1
|
||||
shading_mode = 0
|
||||
|
||||
[sub_resource type="SphereMesh" id="Mesh_mist"]
|
||||
material = SubResource("Material_mist")
|
||||
radius = 2.8
|
||||
height = 4.0
|
||||
|
||||
[sub_resource type="ProceduralSkyMaterial" id="SkyMaterial_jajce"]
|
||||
sky_top_color = Color(0.23, 0.43, 0.62, 1)
|
||||
sky_horizon_color = Color(0.82, 0.68, 0.5, 1)
|
||||
ground_bottom_color = Color(0.12, 0.17, 0.12, 1)
|
||||
ground_horizon_color = Color(0.62, 0.55, 0.42, 1)
|
||||
sun_angle_max = 18.0
|
||||
|
||||
[sub_resource type="Sky" id="Sky_jajce"]
|
||||
sky_material = SubResource("SkyMaterial_jajce")
|
||||
|
||||
[sub_resource type="Environment" id="Environment_greybox"]
|
||||
background_mode = 1
|
||||
background_color = Color(0.55, 0.72, 0.82, 1)
|
||||
ambient_light_source = 2
|
||||
ambient_light_color = Color(1, 0.9, 0.78, 1)
|
||||
ambient_light_energy = 0.55
|
||||
background_mode = 2
|
||||
sky = SubResource("Sky_jajce")
|
||||
ambient_light_source = 3
|
||||
ambient_light_color = Color(0.88, 0.83, 0.73, 1)
|
||||
ambient_light_energy = 0.62
|
||||
reflected_light_source = 2
|
||||
tonemap_mode = 2
|
||||
fog_enabled = true
|
||||
fog_light_color = Color(0.7, 0.76, 0.74, 1)
|
||||
fog_light_energy = 0.65
|
||||
fog_density = 0.0025
|
||||
fog_sky_affect = 0.35
|
||||
|
||||
[node name="JajceWorld" type="Node3D"]
|
||||
script = ExtResource("3_world")
|
||||
@@ -89,6 +144,7 @@ top_level = true
|
||||
[node name="GreyboxGround" type="StaticBody3D" parent="NavigationRegion3D"]
|
||||
|
||||
[node name="Mesh" type="MeshInstance3D" parent="NavigationRegion3D/GreyboxGround"]
|
||||
visible = false
|
||||
mesh = SubResource("Mesh_ground")
|
||||
|
||||
[node name="Collision" type="CollisionShape3D" parent="NavigationRegion3D/GreyboxGround"]
|
||||
@@ -115,13 +171,27 @@ mesh = SubResource("Mesh_terrace")
|
||||
[node name="WaterRoot" type="Node3D" parent="."]
|
||||
|
||||
[node name="RiverGreybox" type="MeshInstance3D" parent="WaterRoot"]
|
||||
position = Vector3(25, 0.08, 0)
|
||||
position = Vector3(25, 0.12, 0)
|
||||
mesh = SubResource("Mesh_river")
|
||||
|
||||
[node name="WaterfallGreybox" type="MeshInstance3D" parent="WaterRoot"]
|
||||
position = Vector3(25, 5, -24)
|
||||
mesh = SubResource("Mesh_waterfall")
|
||||
|
||||
[node name="WaterfallFoam" type="MeshInstance3D" parent="WaterRoot"]
|
||||
position = Vector3(25, 0.22, -20.5)
|
||||
mesh = SubResource("Mesh_foam")
|
||||
|
||||
[node name="Mist_01" type="MeshInstance3D" parent="WaterRoot"]
|
||||
position = Vector3(24, 1.7, -20)
|
||||
scale = Vector3(1.5, 0.55, 1)
|
||||
mesh = SubResource("Mesh_mist")
|
||||
|
||||
[node name="Mist_02" type="MeshInstance3D" parent="WaterRoot"]
|
||||
position = Vector3(27, 2.2, -22)
|
||||
scale = Vector3(1.1, 0.4, 0.8)
|
||||
mesh = SubResource("Mesh_mist")
|
||||
|
||||
[node name="VillageRoot" type="Node3D" parent="."]
|
||||
|
||||
[node name="House_01" type="MeshInstance3D" parent="VillageRoot"]
|
||||
@@ -146,6 +216,44 @@ mesh = SubResource("Mesh_bridge")
|
||||
|
||||
[node name="FoliageRoot" type="Node3D" parent="."]
|
||||
|
||||
[node name="Tree_West_01" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(-33, 0, -15)
|
||||
scale = Vector3(1.25, 1.25, 1.25)
|
||||
|
||||
[node name="Tree_West_02" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(-29, 0, -21)
|
||||
scale = Vector3(0.9, 0.9, 0.9)
|
||||
|
||||
[node name="Tree_West_03" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(-38, 0, 2)
|
||||
scale = Vector3(1.4, 1.4, 1.4)
|
||||
|
||||
[node name="Tree_North_01" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(-2, 0, 25)
|
||||
|
||||
[node name="Tree_North_02" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(7, 0, 28)
|
||||
scale = Vector3(1.2, 1.2, 1.2)
|
||||
|
||||
[node name="Tree_North_03" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(15, 0, 24)
|
||||
scale = Vector3(0.85, 0.85, 0.85)
|
||||
|
||||
[node name="Tree_South_01" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(-16, 0, -27)
|
||||
scale = Vector3(1.15, 1.15, 1.15)
|
||||
|
||||
[node name="Tree_South_02" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(-4, 0, -30)
|
||||
|
||||
[node name="Tree_River_01" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(19, 0, 18)
|
||||
scale = Vector3(0.9, 0.9, 0.9)
|
||||
|
||||
[node name="Tree_River_02" parent="FoliageRoot" instance=ExtResource("4_tree")]
|
||||
position = Vector3(31, 0, 14)
|
||||
scale = Vector3(1.25, 1.25, 1.25)
|
||||
|
||||
[node name="WorldObjects" type="Node3D" parent="."]
|
||||
|
||||
[node name="ResourceNodes" type="Node3D" parent="WorldObjects"]
|
||||
@@ -192,7 +300,9 @@ position = Vector3(4, 0, 5)
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
rotation_degrees = Vector3(-55, -35, 0)
|
||||
light_color = Color(1, 0.87, 0.72, 1)
|
||||
light_energy = 1.25
|
||||
light_energy = 1.45
|
||||
shadow_enabled = true
|
||||
directional_shadow_max_distance = 180.0
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource("Environment_greybox")
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
[gd_scene load_steps=5 format=3]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="Material_trunk"]
|
||||
albedo_color = Color(0.27, 0.16, 0.09, 1)
|
||||
roughness = 0.95
|
||||
|
||||
[sub_resource type="CylinderMesh" id="Mesh_trunk"]
|
||||
material = SubResource("Material_trunk")
|
||||
top_radius = 0.22
|
||||
bottom_radius = 0.32
|
||||
height = 2.8
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="Material_canopy"]
|
||||
albedo_color = Color(0.19, 0.38, 0.17, 1)
|
||||
roughness = 0.9
|
||||
|
||||
[sub_resource type="SphereMesh" id="Mesh_canopy"]
|
||||
material = SubResource("Material_canopy")
|
||||
radius = 1.35
|
||||
height = 2.4
|
||||
|
||||
[node name="StylizedTree" type="Node3D"]
|
||||
|
||||
[node name="Trunk" type="MeshInstance3D" parent="."]
|
||||
position = Vector3(0, 1.4, 0)
|
||||
mesh = SubResource("Mesh_trunk")
|
||||
|
||||
[node name="Canopy" type="MeshInstance3D" parent="."]
|
||||
position = Vector3(0, 3.2, 0)
|
||||
mesh = SubResource("Mesh_canopy")
|
||||
@@ -3,9 +3,13 @@ extends Node3D
|
||||
@onready var terrain: Terrain3D = $TerrainRoot/Terrain3D
|
||||
|
||||
func _ready() -> void:
|
||||
call_deferred("_bind_active_camera")
|
||||
call_deferred("_initialize_world_presentation")
|
||||
|
||||
func _bind_active_camera() -> void:
|
||||
func _initialize_world_presentation() -> void:
|
||||
var active_camera := get_viewport().get_camera_3d()
|
||||
if active_camera != null:
|
||||
terrain.set_camera(active_camera)
|
||||
for tree in $FoliageRoot.get_children():
|
||||
var terrain_height: float = terrain.data.get_height(tree.global_position)
|
||||
if not is_nan(terrain_height):
|
||||
tree.global_position.y = terrain_height
|
||||
|
||||
Reference in New Issue
Block a user