Compare commits
25 Commits
biome_gen_
...
02311f2ac5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02311f2ac5 | ||
|
|
4408e0d933 | ||
|
|
7331b71877 | ||
|
|
4bd878d2a8 | ||
|
|
c2a6b991dd | ||
| c5232d1082 | |||
|
|
c796ea289d | ||
|
|
a18dc64a4f | ||
| c52b11388a | |||
| ce8a977541 | |||
| 8ceb6cb16b | |||
| bcf854fd74 | |||
| 10b437d236 | |||
| 9c41da14a6 | |||
| 2aa7d1f7d4 | |||
| 040ded5f0b | |||
| ddec91d515 | |||
| d8efa735dd | |||
|
|
9bc7f38d07 | ||
|
|
f4c8775a45 | ||
| 70d3dfe15c | |||
|
|
9827b98b3e | ||
|
|
977e8012aa | ||
| 72d06560b1 | |||
| 9d62d97422 |
13
.idea/.gitignore
generated
vendored
Normal file
13
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Rider ignored files
|
||||
/contentModel.xml
|
||||
/modules.xml
|
||||
/projectSettingsUpdater.xml
|
||||
/.idea.tgcc.iml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
4
.idea/encodings.xml
generated
Normal file
4
.idea/encodings.xml
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
|
||||
</project>
|
||||
8
.idea/indexLayout.xml
generated
Normal file
8
.idea/indexLayout.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="UserContentModel">
|
||||
<attachedFolders />
|
||||
<explicitIncludes />
|
||||
<explicitExcludes />
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
51
core/ai/agents/base/ai_base.gd
Normal file
51
core/ai/agents/base/ai_base.gd
Normal file
@@ -0,0 +1,51 @@
|
||||
extends CharacterBody3D
|
||||
|
||||
class_name AIBase
|
||||
|
||||
@export var speed: float = 4.0
|
||||
var _enable_state_machine: bool = true
|
||||
@export var enable_state_machine: bool:
|
||||
set(value):
|
||||
_enable_state_machine = value
|
||||
toggle_enable_state_machine()
|
||||
get:
|
||||
return _enable_state_machine
|
||||
|
||||
|
||||
@onready var patrol_radius_shape: CollisionShape3D = $%PatrolRadiusShape
|
||||
@onready var nav_agent: NavigationAgent3D = $%NavigationAgent3D
|
||||
@onready var state_machine: StateMachine = $%StateMachine
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
randomize()
|
||||
toggle_enable_state_machine()
|
||||
|
||||
func toggle_enable_state_machine() -> void:
|
||||
state_machine.enable = _enable_state_machine
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if !_enable_state_machine:
|
||||
return
|
||||
|
||||
state_machine.physics_process(delta)
|
||||
|
||||
if nav_agent.is_navigation_finished():
|
||||
velocity = Vector3.ZERO
|
||||
move_and_slide()
|
||||
return
|
||||
|
||||
var next_point = nav_agent.get_next_path_position()
|
||||
var direction = global_position.direction_to(next_point)
|
||||
|
||||
velocity.x = direction.x * speed
|
||||
velocity.z = direction.z * speed
|
||||
|
||||
move_and_slide()
|
||||
|
||||
func navigate_to_random_point() -> void:
|
||||
var nav_map_rid = get_world_3d().get_navigation_map()
|
||||
var patrol_radius = patrol_radius_shape.shape.radius
|
||||
var target_point_in_space = global_position + Vector3(randf_range(-1, 1), 0, randf_range(-1, 1)).normalized() * randf_range(0, patrol_radius)
|
||||
var closest_valid_point = NavigationServer3D.map_get_closest_point(nav_map_rid, target_point_in_space)
|
||||
nav_agent.target_position = closest_valid_point
|
||||
1
core/ai/agents/base/ai_base.gd.uid
Normal file
1
core/ai/agents/base/ai_base.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b30p1yqojbbbk
|
||||
44
core/ai/agents/base/ai_base.tscn
Normal file
44
core/ai/agents/base/ai_base.tscn
Normal file
@@ -0,0 +1,44 @@
|
||||
[gd_scene format=3 uid="uid://clx701xdwelgx"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://b30p1yqojbbbk" path="res://core/ai/agents/base/ai_base.gd" id="1_4d1nn"]
|
||||
[ext_resource type="Script" uid="uid://ps3vlu2qvmop" path="res://core/ai/framework/state_machine.gd" id="2_q1hg3"]
|
||||
[ext_resource type="Script" uid="uid://nga8qx56iwgu" path="res://core/ai/agents/base/idle_state.gd" id="3_26faq"]
|
||||
[ext_resource type="Script" uid="uid://bngfthvt04ivv" path="res://core/ai/agents/base/patrol_state.gd" id="4_lim44"]
|
||||
|
||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_mh3lg"]
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_mh3lg"]
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_lim44"]
|
||||
radius = 20.0
|
||||
|
||||
[node name="AiBase" type="CharacterBody3D" unique_id=1228675528]
|
||||
script = ExtResource("1_4d1nn")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=214482161]
|
||||
mesh = SubResource("CapsuleMesh_mh3lg")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=92811823]
|
||||
shape = SubResource("CapsuleShape3D_mh3lg")
|
||||
|
||||
[node name="NavigationAgent3D" type="NavigationAgent3D" parent="." unique_id=1370024449]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="StateMachine" type="Node" parent="." unique_id=1286404264 node_paths=PackedStringArray("initial_state")]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("2_q1hg3")
|
||||
initial_state = NodePath("IdleState")
|
||||
|
||||
[node name="IdleState" type="Node" parent="StateMachine" unique_id=763668255]
|
||||
script = ExtResource("3_26faq")
|
||||
state_id = &"idle"
|
||||
|
||||
[node name="PatrolState" type="Node" parent="StateMachine" unique_id=2054606629]
|
||||
script = ExtResource("4_lim44")
|
||||
state_id = &"patrol"
|
||||
|
||||
[node name="PatrolRadiusShape" type="CollisionShape3D" parent="." unique_id=1379515938]
|
||||
unique_name_in_owner = true
|
||||
shape = SubResource("SphereShape3D_lim44")
|
||||
disabled = true
|
||||
debug_color = Color(1, 1, 0, 1)
|
||||
26
core/ai/agents/base/idle_state.gd
Normal file
26
core/ai/agents/base/idle_state.gd
Normal file
@@ -0,0 +1,26 @@
|
||||
extends State
|
||||
|
||||
const PATROL_STATE_ID: StringName = &"patrol"
|
||||
|
||||
@export var wait_time: float = 3.0
|
||||
|
||||
var runtime_timer: Timer
|
||||
|
||||
func enter() -> void:
|
||||
runtime_timer = Timer.new()
|
||||
runtime_timer.name = "IdleTimer"
|
||||
add_child(runtime_timer)
|
||||
runtime_timer.one_shot = true
|
||||
runtime_timer.timeout.connect(_on_timer_timeout)
|
||||
runtime_timer.start(wait_time)
|
||||
|
||||
func exit() -> void:
|
||||
if runtime_timer:
|
||||
if runtime_timer.is_connected("timeout", _on_timer_timeout):
|
||||
runtime_timer.timeout.disconnect(_on_timer_timeout)
|
||||
|
||||
runtime_timer.queue_free()
|
||||
runtime_timer = null
|
||||
|
||||
func _on_timer_timeout() -> void:
|
||||
transitioned.emit(self, PATROL_STATE_ID)
|
||||
1
core/ai/agents/base/idle_state.gd.uid
Normal file
1
core/ai/agents/base/idle_state.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://nga8qx56iwgu
|
||||
12
core/ai/agents/base/patrol_state.gd
Normal file
12
core/ai/agents/base/patrol_state.gd
Normal file
@@ -0,0 +1,12 @@
|
||||
extends State
|
||||
|
||||
const IDLE_STATE_ID: StringName = &"idle"
|
||||
|
||||
@onready var agent: AIBase = owner
|
||||
|
||||
func enter() -> void:
|
||||
agent.navigate_to_random_point()
|
||||
|
||||
func physics_update(_delta) -> void:
|
||||
if agent.nav_agent.is_navigation_finished():
|
||||
transitioned.emit(self, IDLE_STATE_ID)
|
||||
1
core/ai/agents/base/patrol_state.gd.uid
Normal file
1
core/ai/agents/base/patrol_state.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bngfthvt04ivv
|
||||
20
core/ai/framework/state.gd
Normal file
20
core/ai/framework/state.gd
Normal file
@@ -0,0 +1,20 @@
|
||||
extends Node
|
||||
|
||||
class_name State
|
||||
|
||||
@export var state_id: StringName = &""
|
||||
|
||||
@warning_ignore("unused_signal")
|
||||
signal transitioned(state: State, new_state_id: StringName)
|
||||
|
||||
func enter() -> void:
|
||||
pass
|
||||
|
||||
func exit() -> void:
|
||||
pass
|
||||
|
||||
func update(_delta) -> void:
|
||||
pass
|
||||
|
||||
func physics_update(_delta) -> void:
|
||||
pass
|
||||
1
core/ai/framework/state.gd.uid
Normal file
1
core/ai/framework/state.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dpso7abi5ftyw
|
||||
61
core/ai/framework/state_machine.gd
Normal file
61
core/ai/framework/state_machine.gd
Normal file
@@ -0,0 +1,61 @@
|
||||
extends Node
|
||||
|
||||
class_name StateMachine
|
||||
|
||||
@export var initial_state: State
|
||||
|
||||
var current_state: State
|
||||
var states: Dictionary[StringName, State] = {}
|
||||
var is_initialized: bool = false
|
||||
var _enabled: bool = true
|
||||
var enable: bool:
|
||||
set(value):
|
||||
_enabled = value
|
||||
_set_enabled(value)
|
||||
get:
|
||||
return _enabled
|
||||
|
||||
func _ready() -> void:
|
||||
_initialize_states()
|
||||
_set_enabled(enable)
|
||||
|
||||
func _initialize_states() -> void:
|
||||
if is_initialized:
|
||||
return
|
||||
|
||||
for state in get_children():
|
||||
if state is State:
|
||||
states[state.state_id] = state
|
||||
state.transitioned.connect(_on_state_transition)
|
||||
|
||||
is_initialized = true
|
||||
|
||||
func _set_enabled(value: bool) -> void:
|
||||
_enabled = value
|
||||
|
||||
if not _enabled:
|
||||
return
|
||||
|
||||
_initialize_states()
|
||||
|
||||
if initial_state and current_state == null:
|
||||
current_state = initial_state
|
||||
current_state.enter()
|
||||
|
||||
func physics_process(delta) -> void:
|
||||
if current_state and _enabled:
|
||||
current_state.physics_update(delta)
|
||||
|
||||
func _on_state_transition(state: State, new_state_id: StringName) -> void:
|
||||
if state != current_state:
|
||||
return
|
||||
|
||||
var new_state = states.get(new_state_id)
|
||||
if not new_state:
|
||||
return
|
||||
|
||||
if current_state:
|
||||
current_state.exit()
|
||||
|
||||
current_state = new_state
|
||||
current_state.enter()
|
||||
1
core/ai/framework/state_machine.gd.uid
Normal file
1
core/ai/framework/state_machine.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ps3vlu2qvmop
|
||||
31
core/audio/audio_manager.gd
Normal file
31
core/audio/audio_manager.gd
Normal file
@@ -0,0 +1,31 @@
|
||||
extends Node
|
||||
|
||||
const MIN_VOLUME: float = 0.0
|
||||
const MAX_VOLUME: float = 1.0
|
||||
|
||||
func _ready() -> void:
|
||||
load_save_data()
|
||||
|
||||
func load_save_data() -> void:
|
||||
for bus_name in GameState.save_data.audio_bus_volumes:
|
||||
_apply_audio_bus_volume(bus_name, GameState.save_data.audio_bus_volumes[bus_name])
|
||||
|
||||
func set_audio_bus_volume(bus_name: StringName, linear_value: float) -> void:
|
||||
var normalized_bus_name := str(bus_name)
|
||||
var clamped_value := clampf(linear_value, MIN_VOLUME, MAX_VOLUME)
|
||||
|
||||
GameState.save_data.audio_bus_volumes[normalized_bus_name] = clamped_value
|
||||
_apply_audio_bus_volume(normalized_bus_name, clamped_value)
|
||||
GameState.save_game()
|
||||
|
||||
func get_audio_bus_volume(bus_name: StringName, default_value: float = 1.0) -> float:
|
||||
return float(GameState.save_data.audio_bus_volumes.get(str(bus_name), default_value))
|
||||
|
||||
func _apply_audio_bus_volume(bus_name: String, linear_value: float) -> void:
|
||||
var bus_index := AudioServer.get_bus_index(bus_name)
|
||||
if bus_index == -1:
|
||||
return
|
||||
|
||||
var clamped_value := clampf(linear_value, MIN_VOLUME, MAX_VOLUME)
|
||||
AudioServer.set_bus_volume_db(bus_index, linear_to_db(clamped_value))
|
||||
AudioServer.set_bus_mute(bus_index, is_zero_approx(clamped_value))
|
||||
1
core/audio/audio_manager.gd.uid
Normal file
1
core/audio/audio_manager.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dcttbbavtwtsg
|
||||
56
core/audio/settings/audio_option.gd
Normal file
56
core/audio/settings/audio_option.gd
Normal file
@@ -0,0 +1,56 @@
|
||||
extends VBoxContainer
|
||||
|
||||
class_name AudioOption
|
||||
|
||||
const MIN_VOLUME: float = 0.0
|
||||
const MAX_VOLUME: float = 1.0
|
||||
|
||||
@export var bus_name: StringName = &"Master"
|
||||
@export var label_text: String = "Master Volume"
|
||||
@export_range(0.0, 1.0, 0.01) var default_volume: float = 1.0
|
||||
|
||||
@onready var label: Label = $Label
|
||||
@onready var slider: HSlider = $HSlider
|
||||
|
||||
func _ready() -> void:
|
||||
slider.min_value = MIN_VOLUME
|
||||
slider.max_value = MAX_VOLUME
|
||||
slider.step = 0.01
|
||||
slider.value_changed.connect(_on_slider_value_changed)
|
||||
refresh()
|
||||
|
||||
func refresh() -> void:
|
||||
label.text = label_text
|
||||
|
||||
if not has_bus():
|
||||
slider.set_value_no_signal(default_volume)
|
||||
slider.editable = false
|
||||
label.text = "%s (bus missing)" % label_text
|
||||
return
|
||||
|
||||
slider.editable = true
|
||||
var saved_volume := AudioManager.get_audio_bus_volume(bus_name, default_volume)
|
||||
slider.set_value_no_signal(saved_volume)
|
||||
apply_current_value()
|
||||
|
||||
func reset_to_default() -> void:
|
||||
slider.value = default_volume
|
||||
|
||||
func apply_current_value() -> void:
|
||||
_set_bus_volume(slider.value)
|
||||
|
||||
func has_bus() -> bool:
|
||||
return get_bus_index() != -1
|
||||
|
||||
func get_bus_index() -> int:
|
||||
return AudioServer.get_bus_index(bus_name)
|
||||
|
||||
func _set_bus_volume(linear_value: float) -> void:
|
||||
if not has_bus():
|
||||
return
|
||||
|
||||
var clamped_value := clampf(linear_value, MIN_VOLUME, MAX_VOLUME)
|
||||
AudioManager.set_audio_bus_volume(bus_name, clamped_value)
|
||||
|
||||
func _on_slider_value_changed(value: float) -> void:
|
||||
_set_bus_volume(value)
|
||||
1
core/audio/settings/audio_option.gd.uid
Normal file
1
core/audio/settings/audio_option.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bnh1y560h55vc
|
||||
14
core/audio/settings/audio_option.tscn
Normal file
14
core/audio/settings/audio_option.tscn
Normal file
@@ -0,0 +1,14 @@
|
||||
[gd_scene format=3 uid="uid://cescrovsjlwke"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bnh1y560h55vc" path="res://core/audio/settings/audio_option.gd" id="1_orafl"]
|
||||
|
||||
[node name="AudioOption" type="VBoxContainer" unique_id=1509773712]
|
||||
custom_minimum_size = Vector2(300, 0)
|
||||
script = ExtResource("1_orafl")
|
||||
|
||||
[node name="Label" type="Label" parent="." unique_id=781845786]
|
||||
layout_mode = 2
|
||||
text = "Master Volume"
|
||||
|
||||
[node name="HSlider" type="HSlider" parent="." unique_id=1286896253]
|
||||
layout_mode = 2
|
||||
36
core/audio/settings/settings_menu.gd
Normal file
36
core/audio/settings/settings_menu.gd
Normal file
@@ -0,0 +1,36 @@
|
||||
extends Control
|
||||
|
||||
class_name SettingsMenu
|
||||
|
||||
@onready var audio_options_container: VBoxContainer = $%AudioOptionsContainer
|
||||
@onready var reset_button: Button = $%ResetToDefault_Button
|
||||
@onready var close_button: Button = $%Close_Button
|
||||
|
||||
func _ready() -> void:
|
||||
reset_button.pressed.connect(_on_reset_to_default_button_pressed)
|
||||
close_button.pressed.connect(_on_close_button_pressed)
|
||||
_refresh_audio_options()
|
||||
|
||||
func _get_audio_options() -> Array[AudioOption]:
|
||||
var audio_options: Array[AudioOption] = []
|
||||
|
||||
for child in audio_options_container.get_children():
|
||||
if child is AudioOption:
|
||||
audio_options.append(child)
|
||||
|
||||
return audio_options
|
||||
|
||||
func _refresh_audio_options() -> void:
|
||||
for audio_option in _get_audio_options():
|
||||
audio_option.refresh()
|
||||
|
||||
func _apply_current_audio_values() -> void:
|
||||
for audio_option in _get_audio_options():
|
||||
audio_option.apply_current_value()
|
||||
|
||||
func _on_reset_to_default_button_pressed() -> void:
|
||||
for audio_option in _get_audio_options():
|
||||
audio_option.reset_to_default()
|
||||
|
||||
func _on_close_button_pressed() -> void:
|
||||
visible = false
|
||||
1
core/audio/settings/settings_menu.gd.uid
Normal file
1
core/audio/settings/settings_menu.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cvr25q1blyxg
|
||||
74
core/audio/settings/settings_menu.tscn
Normal file
74
core/audio/settings/settings_menu.tscn
Normal file
@@ -0,0 +1,74 @@
|
||||
[gd_scene format=3 uid="uid://caqf471x0kttc"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cvr25q1blyxg" path="res://core/audio/settings/settings_menu.gd" id="1_4lekq"]
|
||||
[ext_resource type="PackedScene" uid="uid://cescrovsjlwke" path="res://core/audio/settings/audio_option.tscn" id="1_hwcco"]
|
||||
|
||||
[node name="SettingsMenu" type="Control" unique_id=1639777294]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_4lekq")
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="." unique_id=315821242]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -79.5
|
||||
offset_top = -110.0
|
||||
offset_right = 79.5
|
||||
offset_bottom = 110.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer" unique_id=648635784]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 0
|
||||
theme_override_constants/margin_left = 12
|
||||
theme_override_constants/margin_top = 12
|
||||
theme_override_constants/margin_right = 12
|
||||
theme_override_constants/margin_bottom = 12
|
||||
|
||||
[node name="AudioOptionsContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer" unique_id=824023653]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
theme_override_constants/separation = 12
|
||||
|
||||
[node name="MasterVolume_AudioOption" parent="PanelContainer/MarginContainer/AudioOptionsContainer" unique_id=1509773712 instance=ExtResource("1_hwcco")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="PanelContainer/MarginContainer/AudioOptionsContainer" unique_id=1053430754]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="MusicVolume_AudioOption" parent="PanelContainer/MarginContainer/AudioOptionsContainer" unique_id=690924616 instance=ExtResource("1_hwcco")]
|
||||
layout_mode = 2
|
||||
bus_name = &"Music"
|
||||
label_text = "Music Volume"
|
||||
|
||||
[node name="HSeparator2" type="HSeparator" parent="PanelContainer/MarginContainer/AudioOptionsContainer" unique_id=453716295]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="SFXVolume_AudioOption" parent="PanelContainer/MarginContainer/AudioOptionsContainer" unique_id=2096291127 instance=ExtResource("1_hwcco")]
|
||||
layout_mode = 2
|
||||
bus_name = &"SFX"
|
||||
label_text = "SFX Volume"
|
||||
|
||||
[node name="HSeparator3" type="HSeparator" parent="PanelContainer/MarginContainer/AudioOptionsContainer" unique_id=498553283]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ResetToDefault_Button" type="Button" parent="PanelContainer/MarginContainer/AudioOptionsContainer" unique_id=720420423]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 0
|
||||
text = "Reset To Default"
|
||||
|
||||
[node name="Close_Button" type="Button" parent="PanelContainer/MarginContainer/AudioOptionsContainer" unique_id=1137906684]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 0
|
||||
text = "Close"
|
||||
@@ -7,36 +7,50 @@ const CHUNK_TYPE_CURVED_TRACK: int = 2
|
||||
const CHUNK_GENERATION_STEPS_PER_FRAME: int = 2
|
||||
const CHUNK_CLEANUP_STEPS_PER_FRAME: int = 4
|
||||
const LAMPPOST_WIRE_STEPS_PER_FRAME: int = 1
|
||||
|
||||
const MAX_CHUNK_UNIQUENESS: int = 5
|
||||
const RAILWAY_SCENE_DIRECTORY: String = "res://tgcc/chunk/railway/scene"
|
||||
const RIVER_SIDE_ORDER: Array[String] = ["north", "est", "south", "west"]
|
||||
const RIVER_DIRECTIONS: Dictionary = {
|
||||
"north": Vector2(0.0, -1.0),
|
||||
"est": Vector2(1.0, 0.0),
|
||||
"south": Vector2(0.0, 1.0),
|
||||
"west": Vector2(-1.0, 0.0),
|
||||
}
|
||||
const RIVER_NEIGHBOUR_OFFSETS: Dictionary = {
|
||||
"north": Vector2i(0, -1),
|
||||
"est": Vector2i(1, 0),
|
||||
"south": Vector2i(0, 1),
|
||||
"west": Vector2i(-1, 0),
|
||||
}
|
||||
|
||||
@export_group("Rails")
|
||||
@export var rail_path: Path3D
|
||||
@export var rail_path: Path3D #rail path
|
||||
|
||||
@export_group("Biomes")
|
||||
@export var biome_list: Array[Biome]
|
||||
@export var biome_list: Array[Biome] #list of scenes for the biome
|
||||
|
||||
@export_group("Grid and Area")
|
||||
@export var chunk_size: float = 20.0
|
||||
@export var eye_line: int = 3
|
||||
@export var district_scale: float = 0.05
|
||||
@export var chunk_size: float = 20.0 #size of a cell; default 20 (global position is defined dividing x and z for this value)
|
||||
@export var eye_line: int = 3 #cells to be considerated around the train (e.g. 3 => a square of cells from -3 to 3 around train cell)
|
||||
@export var district_scale: float = 0.05 #noise value to distribuite biome; low values create large area, high values create biome with more variants
|
||||
|
||||
@export_group("Lamppost")
|
||||
@export var lamppost_wire_material: ShaderMaterial
|
||||
@export_range(0.01, 1.0) var wire_thickness: float = 0.05
|
||||
@export var lamppost_dist_factor: int = 10
|
||||
@export var lamppost_dist_factor: int = 10 #max distance of connections
|
||||
|
||||
var board: Dictionary = {}
|
||||
var last_pos_train: Vector2i = Vector2i(999999, 999999)
|
||||
var noise_generator: FastNoiseLite
|
||||
var altitude_generator: FastNoiseLite
|
||||
var wire_connections: Dictionary = {}
|
||||
var chunk_candidate_cache: Dictionary = {}
|
||||
var chunk_candidate_cache: Dictionary = {} #node cache (metadata)
|
||||
var pending_generation_cells: Array[Vector2i] = []
|
||||
var pending_cleanup_cells: Array[Vector2i] = []
|
||||
var pending_wire_cells: Array[Vector2i] = []
|
||||
var pending_wire_lookup: Dictionary = {}
|
||||
var pending_radar_update: bool = false
|
||||
var rail_chunk_catalogue: Dictionary = {}
|
||||
var rail_chunk_catalogue: Dictionary = {} #rails chunk list
|
||||
|
||||
var manual_biome: Biome = null
|
||||
|
||||
@@ -45,7 +59,8 @@ func _ready() -> void:
|
||||
|
||||
#connect events
|
||||
UIEvents.update_rail_chunks.connect(_update_rail_chunks)
|
||||
|
||||
|
||||
#noise generator for biome and altitute
|
||||
noise_generator = FastNoiseLite.new()
|
||||
noise_generator.noise_type = FastNoiseLite.TYPE_PERLIN
|
||||
noise_generator.seed = randi()
|
||||
@@ -56,8 +71,10 @@ func _ready() -> void:
|
||||
altitude_generator.seed = randi()
|
||||
altitude_generator.frequency = district_scale * 0.5
|
||||
|
||||
#fill cache with available chunk
|
||||
_warm_chunk_candidate_cache()
|
||||
_warm_rail_chunk_catalogue()
|
||||
#set unique pieces
|
||||
_update_set_pieces()
|
||||
|
||||
func _update_set_pieces() -> void:
|
||||
@@ -112,16 +129,13 @@ func _destroy_and_regenrate_world() -> void:
|
||||
var train_pos = rail_path.train_instance.global_position
|
||||
var current_pos = Vector2i(roundi(train_pos.x / chunk_size), roundi(train_pos.z / chunk_size))
|
||||
_refresh_world(current_pos)
|
||||
pending_radar_update = true
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
#based on constant values the queue are evalutated by frame and not all together
|
||||
_drain_cleanup_queue()
|
||||
_drain_generation_queue()
|
||||
_drain_wire_queue()
|
||||
|
||||
if pending_radar_update:
|
||||
pending_radar_update = false
|
||||
|
||||
func _physics_process(_delta: float) -> void:
|
||||
if rail_path == null or rail_path.train_instance == null: return
|
||||
|
||||
@@ -133,7 +147,6 @@ func _physics_process(_delta: float) -> void:
|
||||
if current_pos != last_pos_train:
|
||||
last_pos_train = current_pos
|
||||
_refresh_world(current_pos)
|
||||
pending_radar_update = true
|
||||
|
||||
func collect_all_chunkinfo(root: Node, list: Array[Node]) -> void:
|
||||
if root == null: return
|
||||
@@ -144,6 +157,15 @@ func collect_all_chunkinfo(root: Node, list: Array[Node]) -> void:
|
||||
for child in root.get_children():
|
||||
collect_all_chunkinfo(child, list)
|
||||
|
||||
func collect_all_propinfo(root: Node, list: Array[Node]) -> void:
|
||||
if root == null: return
|
||||
|
||||
if "available_props" in root:
|
||||
list.append(root)
|
||||
|
||||
for child in root.get_children():
|
||||
collect_all_propinfo(child, list)
|
||||
|
||||
func _warm_chunk_candidate_cache() -> void:
|
||||
var unique_scenes: Dictionary = {}
|
||||
|
||||
@@ -226,6 +248,7 @@ func _get_chunk_scene_metadata(scene: PackedScene) -> Dictionary:
|
||||
"info_path": info_path,
|
||||
"rotations": rotations,
|
||||
"has_lamppost": "have_lamppost" in info_node and info_node.have_lamppost,
|
||||
"uniqueness": _get_chunk_uniqueness_from_info(info_node),
|
||||
}
|
||||
preview_chunk.queue_free()
|
||||
chunk_candidate_cache[key] = metadata
|
||||
@@ -260,7 +283,6 @@ func _clear_pending_world_work() -> void:
|
||||
pending_cleanup_cells.clear()
|
||||
pending_wire_cells.clear()
|
||||
pending_wire_lookup.clear()
|
||||
pending_radar_update = false
|
||||
|
||||
func _collect_replaceable_rail_chunks(root: Node, result: Array[Node3D]) -> void:
|
||||
if root == null:
|
||||
@@ -457,6 +479,78 @@ func _get_procedural_biome_name(value: float) -> String:
|
||||
var index = clamp(int(normalized_value * biome_list.size()), 0, biome_list.size() - 1)
|
||||
return biome_list[index].name
|
||||
|
||||
func _get_chunk_uniqueness_from_info(info_node: Node) -> int:
|
||||
if info_node != null and "uniqueness" in info_node:
|
||||
return clampi(info_node.uniqueness, 0, MAX_CHUNK_UNIQUENESS)
|
||||
return 0
|
||||
|
||||
func _has_nearby_unique_chunk(grid_pos: Vector2i, uniqueness: int) -> bool:
|
||||
if uniqueness <= 0:
|
||||
return false
|
||||
|
||||
for nearby_pos in board.keys():
|
||||
var nearby_uniqueness = int(board[nearby_pos].get("uniqueness", 0))
|
||||
if nearby_uniqueness <= 0:
|
||||
continue
|
||||
|
||||
var min_distance = maxi(uniqueness, nearby_uniqueness)
|
||||
var dist_x = abs(nearby_pos.x - grid_pos.x)
|
||||
var dist_z = abs(nearby_pos.y - grid_pos.y)
|
||||
if dist_x <= min_distance and dist_z <= min_distance:
|
||||
return true
|
||||
return false
|
||||
|
||||
func _get_uniqueness_pick_weight(uniqueness: int) -> float:
|
||||
return 1.0 / pow(float(uniqueness + 1), 2.0)
|
||||
|
||||
func _pick_weighted_candidate(candidates: Array) -> Dictionary:
|
||||
var total_weight = 0.0
|
||||
for candidate in candidates:
|
||||
total_weight += candidate.weight
|
||||
|
||||
if total_weight <= 0.0:
|
||||
return candidates.pick_random()
|
||||
|
||||
var target_weight = randf() * total_weight
|
||||
var current_weight = 0.0
|
||||
for candidate in candidates:
|
||||
current_weight += candidate.weight
|
||||
if current_weight >= target_weight:
|
||||
return candidate
|
||||
return candidates.back()
|
||||
|
||||
func _pick_backup_scene(zone_catalogue: Array[PackedScene], grid_pos: Vector2i) -> PackedScene:
|
||||
for scene in zone_catalogue:
|
||||
var metadata = _get_chunk_scene_metadata(scene)
|
||||
var uniqueness = int(metadata.get("uniqueness", 0))
|
||||
if not _has_nearby_unique_chunk(grid_pos, uniqueness):
|
||||
return scene
|
||||
return zone_catalogue[0]
|
||||
|
||||
func _spawn_props_for_chunk(root: Node) -> void:
|
||||
var prop_markers: Array[Node] = []
|
||||
collect_all_propinfo(root, prop_markers)
|
||||
|
||||
for marker in prop_markers:
|
||||
_spawn_prop_for_marker(marker)
|
||||
|
||||
func _spawn_prop_for_marker(marker: Node) -> void:
|
||||
if marker.available_props.is_empty():
|
||||
return
|
||||
|
||||
var prop_scene = marker.available_props.pick_random()
|
||||
if prop_scene == null:
|
||||
return
|
||||
|
||||
var prop_instance = prop_scene.instantiate()
|
||||
var prop_node = prop_instance as Node3D
|
||||
if prop_node == null:
|
||||
prop_instance.queue_free()
|
||||
return
|
||||
|
||||
marker.add_child(prop_node)
|
||||
prop_node.transform = Transform3D.IDENTITY
|
||||
|
||||
func _register_cell_with_ray(grid_pos: Vector2i) -> bool:
|
||||
if board.has(grid_pos): return true
|
||||
|
||||
@@ -504,6 +598,7 @@ func _register_cell_with_ray(grid_pos: Vector2i) -> bool:
|
||||
var river_exit_found = {"north": false, "est": false, "south": false, "west": false}
|
||||
var height_found = {"north": 0, "est": 0, "south": 0, "west": 0}
|
||||
var have_lamppost = false
|
||||
var uniqueness = 0
|
||||
|
||||
#Get node info
|
||||
if right_info_node != null:
|
||||
@@ -517,6 +612,8 @@ func _register_cell_with_ray(grid_pos: Vector2i) -> bool:
|
||||
if "have_lamppost" in right_info_node:
|
||||
have_lamppost = right_info_node.have_lamppost
|
||||
|
||||
uniqueness = _get_chunk_uniqueness_from_info(right_info_node)
|
||||
|
||||
#Add piece to the grid
|
||||
board[grid_pos] = {
|
||||
"type": "obstacle",
|
||||
@@ -525,7 +622,8 @@ func _register_cell_with_ray(grid_pos: Vector2i) -> bool:
|
||||
"heights": height_found,
|
||||
"node": root_chunk,
|
||||
"info": right_info_node,
|
||||
"have_lamppost": have_lamppost
|
||||
"have_lamppost": have_lamppost,
|
||||
"uniqueness": uniqueness
|
||||
}
|
||||
|
||||
if have_lamppost:
|
||||
@@ -566,6 +664,9 @@ func _add_compatible_biome(grid_pos: Vector2i) -> void:
|
||||
var u_conn = data["connections"]
|
||||
var u_river_conn = data["river_connections"]
|
||||
var u_height = data["heights"]
|
||||
var uniqueness = int(metadata.get("uniqueness", 0))
|
||||
if _has_nearby_unique_chunk(grid_pos, uniqueness):
|
||||
continue
|
||||
|
||||
var match_conn_n = (req_conn_north == -1) or ((req_conn_north == 1) == u_conn["north"])
|
||||
var match_conn_e = (req_conn_est == -1) or ((req_conn_est == 1) == u_conn["est"])
|
||||
@@ -594,7 +695,14 @@ func _add_compatible_biome(grid_pos: Vector2i) -> void:
|
||||
if req_height_south == -1 and u_height["south"] == height_target: score += 1
|
||||
if req_height_west == -1 and u_height["west"] == height_target: score += 1
|
||||
|
||||
valid_candidates.append({"scene": scene, "rotation": rot, "data": data, "score": score})
|
||||
valid_candidates.append({
|
||||
"scene": scene,
|
||||
"rotation": rot,
|
||||
"data": data,
|
||||
"score": score,
|
||||
"weight": _get_uniqueness_pick_weight(uniqueness),
|
||||
"uniqueness": uniqueness
|
||||
})
|
||||
|
||||
if valid_candidates.size() > 0:
|
||||
var max_score = -1
|
||||
@@ -605,37 +713,46 @@ func _add_compatible_biome(grid_pos: Vector2i) -> void:
|
||||
for c in valid_candidates:
|
||||
if c.score == max_score: best_candidate.append(c)
|
||||
|
||||
var choise = best_candidate.pick_random()
|
||||
var choise = _pick_weighted_candidate(best_candidate)
|
||||
var new_chunk = choise.scene.instantiate()
|
||||
new_chunk.position = Vector3(grid_pos.x * chunk_size, 0, grid_pos.y * chunk_size)
|
||||
new_chunk.rotation.y = choise.rotation * (-PI / 2.0)
|
||||
add_child(new_chunk)
|
||||
_spawn_props_for_chunk(new_chunk)
|
||||
|
||||
var info_new = _get_cached_chunk_info(new_chunk, choise.scene)
|
||||
|
||||
var have_lamppost = false
|
||||
if info_new != null and "have_lamppost" in info_new:
|
||||
have_lamppost = info_new.have_lamppost
|
||||
|
||||
var river_flow_direction = _calculate_river_flow_direction(grid_pos, choise.data["river_connections"])
|
||||
_apply_river_flow_direction(new_chunk, river_flow_direction)
|
||||
|
||||
board[grid_pos] = {
|
||||
"type": "bioma",
|
||||
"exit": choise.data["connections"],
|
||||
"river_exit": choise.data["river_connections"],
|
||||
"river_flow_direction": river_flow_direction,
|
||||
"heights": choise.data["heights"],
|
||||
"node": new_chunk,
|
||||
"info": info_new,
|
||||
"have_lamppost": have_lamppost
|
||||
"have_lamppost": have_lamppost,
|
||||
"uniqueness": choise.uniqueness
|
||||
}
|
||||
|
||||
if have_lamppost:
|
||||
_queue_lamppost_wire_connection(grid_pos)
|
||||
|
||||
else:
|
||||
var backup = zone_catalogue[0].instantiate()
|
||||
var backup_scene = _pick_backup_scene(zone_catalogue, grid_pos)
|
||||
var backup = backup_scene.instantiate()
|
||||
backup.position = Vector3(grid_pos.x * chunk_size, 0, grid_pos.y * chunk_size)
|
||||
add_child(backup)
|
||||
_spawn_props_for_chunk(backup)
|
||||
|
||||
var info_backup = _get_cached_chunk_info(backup, zone_catalogue[0])
|
||||
var info_backup = _get_cached_chunk_info(backup, backup_scene)
|
||||
var backup_uniqueness = _get_chunk_uniqueness_from_info(info_backup)
|
||||
|
||||
var safe_heights = {
|
||||
"north": req_height_north if req_height_north != -1 else height_target,
|
||||
@@ -647,12 +764,110 @@ func _add_compatible_biome(grid_pos: Vector2i) -> void:
|
||||
"type": "biome",
|
||||
"exit": {"north":false, "est":false, "south":false, "west":false},
|
||||
"river_exit": {"north":false, "est":false, "south":false, "west":false},
|
||||
"river_flow_direction": Vector2.ZERO,
|
||||
"heights": safe_heights,
|
||||
"node": backup,
|
||||
"info": info_backup,
|
||||
"have_lamppost": false
|
||||
"have_lamppost": false,
|
||||
"uniqueness": backup_uniqueness
|
||||
}
|
||||
|
||||
func _calculate_river_flow_direction(grid_pos: Vector2i, river_connections: Dictionary) -> Vector2:
|
||||
var connected_sides: Array[String] = []
|
||||
for side in RIVER_SIDE_ORDER:
|
||||
if river_connections.has(side) and river_connections[side]:
|
||||
connected_sides.append(side)
|
||||
|
||||
if connected_sides.is_empty():
|
||||
return Vector2.ZERO
|
||||
|
||||
var neighbour_flow = _get_connected_neighbour_river_flow(grid_pos, connected_sides)
|
||||
if not neighbour_flow.is_zero_approx():
|
||||
var continued_flow = _continue_river_flow_from_neighbour(grid_pos, connected_sides, neighbour_flow)
|
||||
if not continued_flow.is_zero_approx():
|
||||
return continued_flow.normalized()
|
||||
|
||||
var default_flow = _get_default_river_flow(connected_sides)
|
||||
if default_flow.is_zero_approx():
|
||||
return Vector2.ZERO
|
||||
return default_flow.normalized()
|
||||
|
||||
func _get_connected_neighbour_river_flow(grid_pos: Vector2i, connected_sides: Array[String]) -> Vector2:
|
||||
for side in connected_sides:
|
||||
var neighbour_pos: Vector2i = grid_pos + RIVER_NEIGHBOUR_OFFSETS[side]
|
||||
if not board.has(neighbour_pos):
|
||||
continue
|
||||
var neighbour = board[neighbour_pos]
|
||||
if not neighbour.has("river_flow_direction"):
|
||||
continue
|
||||
var neighbour_flow: Vector2 = neighbour["river_flow_direction"]
|
||||
if not neighbour_flow.is_zero_approx():
|
||||
return neighbour_flow.normalized()
|
||||
return Vector2.ZERO
|
||||
|
||||
func _continue_river_flow_from_neighbour(grid_pos: Vector2i, connected_sides: Array[String], neighbour_flow: Vector2) -> Vector2:
|
||||
for side in connected_sides:
|
||||
var neighbour_pos: Vector2i = grid_pos + RIVER_NEIGHBOUR_OFFSETS[side]
|
||||
if not board.has(neighbour_pos):
|
||||
continue
|
||||
var neighbour = board[neighbour_pos]
|
||||
if not neighbour.has("river_flow_direction"):
|
||||
continue
|
||||
var side_direction: Vector2 = RIVER_DIRECTIONS[side]
|
||||
var neighbour_direction: Vector2 = neighbour["river_flow_direction"]
|
||||
if neighbour_direction.is_zero_approx():
|
||||
continue
|
||||
neighbour_direction = neighbour_direction.normalized()
|
||||
var other_sides = connected_sides.duplicate()
|
||||
other_sides.erase(side)
|
||||
if other_sides.is_empty():
|
||||
return neighbour_direction
|
||||
|
||||
var other_direction = _get_average_river_side_direction(other_sides)
|
||||
if neighbour_direction.dot(-side_direction) > 0.25:
|
||||
return other_direction - side_direction
|
||||
if neighbour_direction.dot(side_direction) > 0.25:
|
||||
return side_direction - other_direction
|
||||
|
||||
var default_flow = _get_default_river_flow(connected_sides)
|
||||
if default_flow.dot(neighbour_flow) < 0.0:
|
||||
return -default_flow
|
||||
return default_flow
|
||||
|
||||
func _get_default_river_flow(connected_sides: Array[String]) -> Vector2:
|
||||
if connected_sides.size() == 1:
|
||||
return RIVER_DIRECTIONS[connected_sides[0]]
|
||||
|
||||
if connected_sides.has("north") and connected_sides.has("south"):
|
||||
return Vector2(0.0, 1.0)
|
||||
if connected_sides.has("est") and connected_sides.has("west"):
|
||||
return Vector2(1.0, 0.0)
|
||||
|
||||
var start_direction: Vector2 = RIVER_DIRECTIONS[connected_sides[0]]
|
||||
var end_direction = _get_average_river_side_direction(connected_sides.slice(1))
|
||||
return end_direction - start_direction
|
||||
|
||||
func _get_average_river_side_direction(sides: Array[String]) -> Vector2:
|
||||
var direction := Vector2.ZERO
|
||||
for side in sides:
|
||||
direction += RIVER_DIRECTIONS[side]
|
||||
if direction.is_zero_approx():
|
||||
return Vector2.ZERO
|
||||
return direction / float(sides.size())
|
||||
|
||||
func _apply_river_flow_direction(root: Node, flow_direction: Vector2) -> void:
|
||||
if flow_direction.is_zero_approx():
|
||||
return
|
||||
_set_river_flow_direction_recursive(root, flow_direction.normalized())
|
||||
|
||||
func _set_river_flow_direction_recursive(node: Node, flow_direction: Vector2) -> void:
|
||||
if node is MeshInstance3D and node.name.begins_with("Water_F"):
|
||||
var mesh_instance := node as MeshInstance3D
|
||||
mesh_instance.set_instance_shader_parameter("river_flow_direction", flow_direction)
|
||||
|
||||
for child in node.get_children():
|
||||
_set_river_flow_direction_recursive(child, flow_direction)
|
||||
|
||||
func _needed_connection(near_pos: Vector2i, side_needed: String) -> int:
|
||||
if not board.has(near_pos):
|
||||
_register_cell_with_ray(near_pos)
|
||||
|
||||
@@ -5,6 +5,7 @@ class_name ChunkInfo
|
||||
|
||||
@export_group("Set Piece Rules (Unique pieces)")
|
||||
@export var exclusive_biome: String = "" # Es: "Forest"
|
||||
@export_range(0, 5, 1) var uniqueness: int = 0 #0=common; 5=unique
|
||||
|
||||
@export_group("Base exit")
|
||||
@export var north: bool = false
|
||||
|
||||
4
core/biome_generator/prop_info.gd
Normal file
4
core/biome_generator/prop_info.gd
Normal file
@@ -0,0 +1,4 @@
|
||||
extends Marker3D
|
||||
class_name PropInfo
|
||||
|
||||
@export var available_props: Array[PackedScene]
|
||||
1
core/biome_generator/prop_info.gd.uid
Normal file
1
core/biome_generator/prop_info.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dg6ngy4pmtsyc
|
||||
@@ -32,6 +32,7 @@ render_priority = 0
|
||||
shader = ExtResource("2_r4tfj")
|
||||
shader_parameter/use_red_as_alpha = true
|
||||
shader_parameter/fog_color = Color(0.8, 0.85, 0.9, 0.5)
|
||||
shader_parameter/fog_density = 0.25
|
||||
shader_parameter/scroll_speed = Vector2(0.05, 0.01)
|
||||
shader_parameter/texture_scale = Vector2(1, 1)
|
||||
shader_parameter/edge_softness_y = 0.2
|
||||
@@ -66,12 +67,12 @@ grad_intensity_morning = 0.05
|
||||
grad_intensity_afternoon = 0.1
|
||||
grad_intensity_night = 0.5
|
||||
fog_color_morning = Color(0.7490196, 0.8509804, 0.9490196, 1)
|
||||
fog_color_afternoon = Color(0.9647059, 0.5882353, 0.7607843, 1)
|
||||
fog_color_night = Color(0.14901961, 0.101960786, 0.2509804, 1)
|
||||
fog_color_afternoon = Color(0.9823975, 0.8034449, 0.8778439, 1)
|
||||
fog_color_night = Color(0.38409987, 0.28720453, 0.5907528, 1)
|
||||
fog_density_morning = 0.01
|
||||
fog_density_afternoon = 0.02
|
||||
glow_morning = 0.4
|
||||
glow_night = 0.6
|
||||
glow_night = 0.8
|
||||
material_fog = SubResource("ShaderMaterial_b5atu")
|
||||
material_drops = SubResource("StandardMaterial3D_r4tfj")
|
||||
material_clouds = SubResource("ShaderMaterial_ruhh7")
|
||||
@@ -80,7 +81,7 @@ lightning_min = 2
|
||||
lightning_max = 4
|
||||
lightning_scale_min = 2.0
|
||||
lightning_scale_max = 5.0
|
||||
godray_max_rain = 60
|
||||
godray_max_rain = 30
|
||||
godray_spawn_radius = 100.0
|
||||
godray_spawn_offset = Vector3(20, 80, 20)
|
||||
godray_rotation_degrees = Vector3(50, 30, 0)
|
||||
@@ -261,6 +262,7 @@ shader = ExtResource("2_r4tfj")
|
||||
shader_parameter/fog_noise = ExtResource("11_tuauy")
|
||||
shader_parameter/use_red_as_alpha = true
|
||||
shader_parameter/fog_color = Color(0.8, 0.8509804, 0.9019608, 0.2509804)
|
||||
shader_parameter/fog_density = 0.25
|
||||
shader_parameter/scroll_speed = Vector2(0, 0.01)
|
||||
shader_parameter/texture_scale = Vector2(1, 1)
|
||||
shader_parameter/edge_softness_y = 0.16400000779
|
||||
|
||||
@@ -3,7 +3,6 @@ extends Node3D
|
||||
|
||||
const NOISE_TEXTURE: Texture2D = preload("res://core/daynight/noise.tres")
|
||||
const WEATHER_SHADER: Material = preload("res://core/daynight/weather_overlay.tres")
|
||||
const WEATHER_PLAIN_SHADER: Material = preload("res://core/daynight/weather_plain_shader.tres")
|
||||
const DYNAMIC_ENVIRONMENT_UPDATES_PER_FRAME: int = 2 #how many update of the environment (apply materials) will be done per frame
|
||||
|
||||
@export var environment_config: EnvironmentConfig
|
||||
@@ -134,7 +133,7 @@ func _apply_dynamic_environment_materials(node: Node) -> void:
|
||||
_apply_weather_overlay_to_node(node, WEATHER_SHADER)
|
||||
|
||||
if node.is_in_group("weather_vegetables_node"):
|
||||
_apply_weather_overlay_to_node(node, WEATHER_PLAIN_SHADER)
|
||||
_clear_weather_overlay_from_node(node)
|
||||
|
||||
func ApplyWindNoiseToMaterials():
|
||||
for node in get_tree().get_nodes_in_group("wind_node"):
|
||||
@@ -160,15 +159,54 @@ func ApplyWeatherShaderToMaterials():
|
||||
_apply_weather_overlay_to_node(node, WEATHER_SHADER)
|
||||
|
||||
for node in get_tree().get_nodes_in_group("weather_vegetables_node"):
|
||||
_apply_weather_overlay_to_node(node, WEATHER_PLAIN_SHADER)
|
||||
_clear_weather_overlay_from_node(node)
|
||||
|
||||
func _apply_weather_overlay_to_node(node: Node, material: Material) -> void:
|
||||
if node.is_in_group("weather_vegetables_node"):
|
||||
_clear_weather_overlay_from_node(node)
|
||||
return
|
||||
|
||||
if node is GeometryInstance3D:
|
||||
node.material_overlay = material
|
||||
if _geometry_uses_alpha_texture(node):
|
||||
node.material_overlay = null
|
||||
else:
|
||||
node.material_overlay = material
|
||||
|
||||
for child in node.get_children():
|
||||
_apply_weather_overlay_to_node(child, material)
|
||||
|
||||
func _clear_weather_overlay_from_node(node: Node) -> void:
|
||||
if node is GeometryInstance3D:
|
||||
node.material_overlay = null
|
||||
|
||||
for child in node.get_children():
|
||||
_clear_weather_overlay_from_node(child)
|
||||
|
||||
func _geometry_uses_alpha_texture(node: GeometryInstance3D) -> bool:
|
||||
var material_override := node.material_override as ShaderMaterial
|
||||
if _shader_material_uses_alpha_texture(material_override):
|
||||
return true
|
||||
|
||||
if node is MeshInstance3D:
|
||||
for surface_index in node.get_surface_override_material_count():
|
||||
var surface_material := node.get_surface_override_material(surface_index) as ShaderMaterial
|
||||
if _shader_material_uses_alpha_texture(surface_material):
|
||||
return true
|
||||
|
||||
if node.mesh:
|
||||
for surface_index in node.mesh.get_surface_count():
|
||||
var mesh_material := node.mesh.surface_get_material(surface_index) as ShaderMaterial
|
||||
if _shader_material_uses_alpha_texture(mesh_material):
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
func _shader_material_uses_alpha_texture(material: ShaderMaterial) -> bool:
|
||||
if material == null or material.shader == null:
|
||||
return false
|
||||
|
||||
return material.shader.code.find("alpha_texture") != -1
|
||||
|
||||
func select_day_time(normalized_time: float) -> void:
|
||||
#set show_day_time_debug = true to show debug on screen
|
||||
#normalized_time is a value between 0 and 1; the time of the day is calculate as "normalized_time" * 1440; day_time is the step to pass from sunrise, to day, to sunset, to night
|
||||
|
||||
@@ -67,7 +67,6 @@ void fragment() {
|
||||
float is_center = step(center_sharpness, internal_n);
|
||||
|
||||
ALBEDO = shadow_color;
|
||||
|
||||
ALPHA = mix(opacity_edge, opacity_center, is_center) * final_fade;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ uniform bool use_red_as_alpha = true;
|
||||
|
||||
group_uniforms Settings;
|
||||
uniform vec4 fog_color : source_color = vec4(0.8, 0.85, 0.9, 0.5);
|
||||
uniform float fog_density : hint_range(0.0, 1.0) = 0.25;
|
||||
uniform vec2 scroll_speed = vec2(0.05, 0.01);
|
||||
uniform vec2 texture_scale = vec2(1.0, 1.0);
|
||||
|
||||
@@ -36,5 +37,5 @@ void fragment() {
|
||||
vec3 dark_fog = tinted_fog * 0.5;
|
||||
ALBEDO = mix(tinted_fog, dark_fog, night_intensity);
|
||||
|
||||
ALPHA = fog_color.a * noise_alpha * edge_mask;
|
||||
}
|
||||
ALPHA = fog_color.a * fog_density * noise_alpha * edge_mask;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,12 @@ global uniform float global_wind_speed;
|
||||
global uniform float global_wind_strength;
|
||||
global uniform vec2 global_wind_direction;
|
||||
//global uniform sampler2D global_wind_noise : filter_linear_mipmap;
|
||||
global uniform float global_snow_start_time;
|
||||
global uniform float global_snow_accumulation_speed;
|
||||
global uniform float global_snow_melt_time;
|
||||
global uniform float global_snow_melt_speed;
|
||||
global uniform float global_snow_start_time = -1.0;
|
||||
global uniform float global_snow_accumulation_speed = 0.005;
|
||||
global uniform float global_snow_melt_time = -1.0;
|
||||
global uniform float global_snow_melt_speed = 0.1;
|
||||
global uniform float global_snow_amount = 0.0;
|
||||
global uniform float global_rain_intensity;
|
||||
|
||||
// --- PARAMETRI ESTETICI ---
|
||||
uniform bool billboard_enabled = true;
|
||||
@@ -31,6 +33,7 @@ uniform vec4 variance_color : source_color = vec4(0.3, 0.5, 0.2, 1.0); // Colore
|
||||
uniform float variance_intensity : hint_range(0.0, 1.0) = 0.4; // Quanto si vedono le chiazze
|
||||
|
||||
uniform vec4 snow_color : source_color = vec4(0.85, 0.9, 0.95, 1.0);
|
||||
uniform float snow_visibility : hint_range(0.0, 1.0) = 1.0;
|
||||
|
||||
// --- CONTROLLO GRADIENTE E RANDOM ---
|
||||
uniform float height_min = 0.0;
|
||||
@@ -41,6 +44,7 @@ uniform float light_steps : hint_range(1.0, 10.0) = 4.0;
|
||||
uniform float random_mix : hint_range(0.0, 1.0) = 0.3;
|
||||
|
||||
uniform float cast_shadow_strength : hint_range(0.0, 1.0) = 0.6;
|
||||
uniform float wetness_darkening : hint_range(0.0, 0.5) = 0.25;
|
||||
|
||||
varying vec3 v_final_color;
|
||||
varying float v_shade_factor;
|
||||
@@ -52,6 +56,21 @@ float hash(vec3 p) {
|
||||
return fract((p.x + p.y) * p.z);
|
||||
}
|
||||
|
||||
float get_snow_progress() {
|
||||
float snow_progress = clamp(global_snow_amount, 0.0, 1.0);
|
||||
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
float timed_progress = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
snow_progress = max(snow_progress, timed_progress);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_progress = min(snow_progress, 1.0 - melt);
|
||||
}
|
||||
|
||||
return snow_progress;
|
||||
}
|
||||
|
||||
void vertex() {
|
||||
vec3 instance_pos = MODEL_MATRIX[3].xyz;
|
||||
v_world_pos = instance_pos; // Salviamo la posizione dell'istanza
|
||||
@@ -113,17 +132,10 @@ void fragment() {
|
||||
// Applichiamo la variazione al colore finale dell'erba
|
||||
vec3 varied_grass_color = mix(v_final_color, variance_color.rgb, noise_sample * variance_intensity);
|
||||
|
||||
float snow_amount = 0.0;
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
snow_amount = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_amount *= (1.0 - melt);
|
||||
}
|
||||
float snow_amount = smoothstep(0.0, 1.0, get_snow_progress());
|
||||
|
||||
float top_mask = 1.0 - shifted_uv.y;
|
||||
float snow_mask = smoothstep(1.0 - snow_amount, 1.2 - snow_amount, top_mask);
|
||||
float snow_mask = smoothstep(0.65, 1.0, top_mask) * snow_amount * snow_visibility;
|
||||
snow_mask *= step(0.01, snow_amount);
|
||||
|
||||
vec3 dark_snow = snow_color.rgb * (1.0 - shadow_intensity);
|
||||
@@ -131,12 +143,15 @@ void fragment() {
|
||||
|
||||
// Mescoliamo il colore variato con la neve
|
||||
vec3 final_albedo = mix(varied_grass_color, shaded_snow, snow_mask);
|
||||
float rain_int = clamp(global_rain_intensity, 0.0, 1.0);
|
||||
final_albedo *= mix(1.0, 1.0 - wetness_darkening, rain_int);
|
||||
float final_roughness = mix(0.02, 0.005, rain_int);
|
||||
|
||||
ALBEDO = final_albedo;
|
||||
ALPHA = tex.r * opacity;
|
||||
ALPHA_SCISSOR_THRESHOLD = 0.5;
|
||||
|
||||
ROUGHNESS = 0.02;
|
||||
ROUGHNESS = final_roughness;
|
||||
}
|
||||
|
||||
void light() {
|
||||
|
||||
@@ -2,9 +2,10 @@ shader_type spatial;
|
||||
render_mode blend_mix, cull_back, depth_draw_opaque;
|
||||
|
||||
global uniform float global_snow_start_time = -1.0;
|
||||
global uniform float global_snow_accumulation_speed = 0.1;
|
||||
global uniform float global_snow_accumulation_speed = 0.005;
|
||||
global uniform float global_snow_melt_time = -1.0;
|
||||
global uniform float global_snow_melt_speed = 0.1;
|
||||
global uniform float global_snow_amount = 0.0;
|
||||
global uniform vec4 global_snow_color = vec4(0.92, 0.96, 1.0, 1.0);
|
||||
|
||||
uniform float max_height : hint_range(0.02, 1.0) = 0.2;
|
||||
@@ -51,17 +52,18 @@ float fbm(vec2 p) {
|
||||
}
|
||||
|
||||
float get_snow_amount() {
|
||||
float snow_amount = 0.0;
|
||||
float snow_amount = clamp(global_snow_amount, 0.0, 1.0);
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
snow_amount = clamp(
|
||||
float timed_amount = clamp(
|
||||
(TIME - global_snow_start_time) * global_snow_accumulation_speed,
|
||||
0.0,
|
||||
1.0
|
||||
);
|
||||
snow_amount = max(snow_amount, timed_amount);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_amount *= (1.0 - melt);
|
||||
snow_amount = min(snow_amount, 1.0 - melt);
|
||||
}
|
||||
return snow_amount;
|
||||
}
|
||||
|
||||
@@ -6,12 +6,12 @@ global uniform vec2 global_wind_direction;
|
||||
global uniform float global_wind_scale;
|
||||
global uniform float global_wind_strength;
|
||||
global uniform float global_wind_fade;
|
||||
/*
|
||||
global uniform float global_snow_start_time;
|
||||
global uniform float global_snow_accumulation_speed;
|
||||
global uniform float global_snow_melt_time;
|
||||
global uniform float global_snow_melt_speed;
|
||||
global uniform vec4 global_snow_color;*/
|
||||
global uniform float global_snow_start_time = -1.0;
|
||||
global uniform float global_snow_accumulation_speed = 0.005;
|
||||
global uniform float global_snow_melt_time = -1.0;
|
||||
global uniform float global_snow_melt_speed = 0.1;
|
||||
global uniform float global_snow_amount = 0.0;
|
||||
global uniform vec4 global_snow_color;
|
||||
global uniform float global_rain_intensity;
|
||||
|
||||
uniform sampler2D wind_noise : filter_linear_mipmap;
|
||||
@@ -31,6 +31,7 @@ uniform float light_steps : hint_range(1.0, 10.0) = 4.0;
|
||||
uniform float random_mix : hint_range(0.0, 1.0) = 0.3;
|
||||
uniform float cast_shadow_strength : hint_range(0.0, 1.0) = 0.6;
|
||||
uniform float wetness_darkening : hint_range(0.0, 0.5) = 0.25;
|
||||
uniform float snow_visibility : hint_range(0.0, 1.0) = 1.0;
|
||||
|
||||
varying vec3 v_final_color;
|
||||
varying float v_shade_factor;
|
||||
@@ -41,6 +42,21 @@ float hash(vec3 p) {
|
||||
return fract((p.x + p.y) * p.z);
|
||||
}
|
||||
|
||||
float get_snow_progress() {
|
||||
float snow_progress = clamp(global_snow_amount, 0.0, 1.0);
|
||||
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
float timed_progress = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
snow_progress = max(snow_progress, timed_progress);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_progress = min(snow_progress, 1.0 - melt);
|
||||
}
|
||||
|
||||
return snow_progress;
|
||||
}
|
||||
|
||||
void vertex() {
|
||||
vec3 instance_pos = MODEL_MATRIX[3].xyz;
|
||||
|
||||
@@ -88,24 +104,16 @@ void fragment() {
|
||||
vec2 shifted_uv = UV + texture_offset;
|
||||
vec4 tex = texture(alpha_texture, shifted_uv);
|
||||
|
||||
//// Snow accumulation
|
||||
//float snow_amount = 0.0;
|
||||
//if (global_snow_start_time >= 0.0) {
|
||||
//snow_amount = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
//}
|
||||
//if (global_snow_melt_time >= 0.0) {
|
||||
//float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
//snow_amount *= (1.0 - melt);
|
||||
//}
|
||||
//
|
||||
//float top_mask = 1.0 - shifted_uv.y;
|
||||
//float snow_mask = smoothstep(1.0 - snow_amount, 1.2 - snow_amount, top_mask);
|
||||
//snow_mask *= step(0.01, snow_amount);
|
||||
// Snow accumulation
|
||||
float snow_amount = pow(get_snow_progress(), 0.55);
|
||||
|
||||
//vec3 dark_snow = global_snow_color.rgb * (1.0 - shadow_intensity);
|
||||
//vec3 shaded_snow = mix(dark_snow, global_snow_color.rgb, v_shade_factor);
|
||||
//vec3 final_albedo = mix(v_final_color, shaded_snow, snow_mask);
|
||||
vec3 final_albedo = v_final_color;
|
||||
float top_mask = 1.0 - shifted_uv.y;
|
||||
float snow_mask = smoothstep(1.0 - snow_amount * 1.35, 1.08 - snow_amount * 1.35, top_mask) * snow_visibility;
|
||||
snow_mask *= step(0.01, snow_amount);
|
||||
|
||||
vec3 dark_snow = global_snow_color.rgb * (1.0 - shadow_intensity);
|
||||
vec3 shaded_snow = mix(dark_snow, global_snow_color.rgb, v_shade_factor);
|
||||
vec3 final_albedo = mix(v_final_color, shaded_snow, snow_mask);
|
||||
|
||||
// Rain wetness: darken and make shinier
|
||||
float rain_int = clamp(global_rain_intensity, 0.0, 1.0);
|
||||
|
||||
@@ -3,6 +3,12 @@ render_mode blend_mix, depth_draw_always;
|
||||
|
||||
global uniform float global_rain_intensity;
|
||||
global uniform vec4 global_water_color = vec4(0.285, 0.534, 0.487, 1.0);
|
||||
global uniform float global_snow_start_time = -1.0;
|
||||
global uniform float global_snow_accumulation_speed = 0.005;
|
||||
global uniform float global_snow_melt_time = -1.0;
|
||||
global uniform float global_snow_melt_speed = 0.1;
|
||||
global uniform float global_snow_amount = 0.0;
|
||||
global uniform vec4 global_snow_color = vec4(0.92, 0.96, 1.0, 1.0);
|
||||
|
||||
//Water color
|
||||
uniform vec4 deep_water_color : source_color = vec4(0.0, 0.1, 0.2, 1.0);
|
||||
@@ -29,6 +35,21 @@ uniform sampler2D depth_texture : hint_depth_texture, filter_linear_mipmap;
|
||||
varying vec2 world_pos_xz;
|
||||
varying vec2 local_uv;
|
||||
|
||||
float get_snow_progress() {
|
||||
float snow_progress = clamp(global_snow_amount, 0.0, 1.0);
|
||||
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
float timed_progress = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
snow_progress = max(snow_progress, timed_progress);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_progress = min(snow_progress, 1.0 - melt);
|
||||
}
|
||||
|
||||
return snow_progress;
|
||||
}
|
||||
|
||||
void vertex() {
|
||||
world_pos_xz = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xz;
|
||||
local_uv = UV;
|
||||
@@ -82,8 +103,15 @@ void fragment() {
|
||||
float is_sky = step(ref_depth_raw, 0.00001); // Protezione anti-cielo
|
||||
reflection_mask *= (1.0 - is_sky);
|
||||
|
||||
vec3 final_rgb = mix(base_water.rgb, screen_ref, reflection_strength * reflection_mask);
|
||||
float snow_progress = get_snow_progress();
|
||||
float active_snowfall = step(0.0, global_snow_start_time) * (1.0 - step(0.0, global_snow_melt_time));
|
||||
float reflection_snow_damping = max(smoothstep(0.0, 0.08, snow_progress), active_snowfall * 0.75);
|
||||
float effective_reflection_strength = reflection_strength * (1.0 - reflection_snow_damping * 0.85);
|
||||
|
||||
vec3 final_rgb = mix(base_water.rgb, screen_ref, effective_reflection_strength * reflection_mask);
|
||||
final_rgb = mix(final_rgb, ripple_color.rgb, ring * ripple_color.a);
|
||||
float water_snow_amount = smoothstep(0.15, 1.0, snow_progress) * 0.18;
|
||||
final_rgb = mix(final_rgb, global_snow_color.rgb, water_snow_amount);
|
||||
|
||||
ALBEDO = final_rgb;
|
||||
|
||||
|
||||
241
core/daynight/water_river.gdshader
Normal file
241
core/daynight/water_river.gdshader
Normal file
@@ -0,0 +1,241 @@
|
||||
#define USE_CAUSTICS 1
|
||||
#define USE_REFRACTION 1
|
||||
#define USE_DISPLACEMENT 1
|
||||
#define USE_STYLIZED_LIGHTING 0
|
||||
#define USE_UNSHADED 0
|
||||
|
||||
shader_type spatial;
|
||||
#if USE_UNSHADED
|
||||
render_mode unshaded, depth_draw_never;
|
||||
#else
|
||||
render_mode depth_draw_never;
|
||||
#endif
|
||||
|
||||
uniform sampler2D DEPTH_TEXTURE: hint_depth_texture;
|
||||
|
||||
group_uniforms Color;
|
||||
uniform vec4 surface_color : source_color = vec4(0.2,1.0,0.8,1.0);
|
||||
uniform vec4 depth_color : source_color = vec4(0.08,0.2,0.4,1.0);
|
||||
uniform vec4 foam_color : source_color = vec4(1.0);
|
||||
uniform float depth_size = 12.0;
|
||||
|
||||
group_uniforms Roughness;
|
||||
uniform float surface_roughness : hint_range(0.0, 1.0, 0.01) = 0.05;
|
||||
uniform float foam_roughness : hint_range(0.0, 1.0, 0.01) = 0.05;
|
||||
|
||||
#if USE_CAUSTICS
|
||||
group_uniforms Caustics;
|
||||
uniform sampler2D caustics_texture;
|
||||
uniform float caustics_strength = 2.0;
|
||||
uniform vec2 caustics_scale = vec2(0.5);
|
||||
#endif
|
||||
|
||||
group_uniforms Wave;
|
||||
uniform sampler2D wave_texture;
|
||||
uniform float wave_softness : hint_range(0.0, 10.0, 0.1) = 3.0;
|
||||
uniform vec2 wave_scale = vec2(0.2);
|
||||
uniform vec2 wave_layer_scale = vec2(1.5);
|
||||
uniform float wave_highlight : hint_range(0.0, 1.0, 0.05) = 0.5;
|
||||
|
||||
group_uniforms Wave.Motion;
|
||||
uniform vec2 wave_velocity = vec2(0.02);
|
||||
instance uniform vec2 river_flow_direction = vec2(0.0, 0.0);
|
||||
|
||||
group_uniforms Foam;
|
||||
uniform sampler2D foam_texture;
|
||||
uniform float edge_foam_depth_size = 1.0;
|
||||
uniform float wave_foam_amount : hint_range(0.0, 1.0, 0.01) = 0.8;
|
||||
uniform float foam_start : hint_range(0.0, 1.0, 0.05) = 0.15;
|
||||
uniform float foam_end : hint_range(0.0, 1.0, 0.05) = 0.3;
|
||||
uniform float foam_exponent = 2.0;
|
||||
|
||||
#if USE_REFRACTION
|
||||
group_uniforms Refraction;
|
||||
uniform float refraction_amount = 0.5;
|
||||
uniform float refraction_exponent = 0.5;
|
||||
#endif
|
||||
|
||||
#if USE_DISPLACEMENT
|
||||
group_uniforms Displacement;
|
||||
uniform float displacement_amount = 0.3;
|
||||
#endif
|
||||
|
||||
#if USE_STYLIZED_LIGHTING && !USE_UNSHADED
|
||||
group_uniforms Lighting;
|
||||
uniform float diffuse_steps = 12.0;
|
||||
uniform float diffuse_smoothness : hint_range(0.0, 1.0, 0.01) = 0.2;
|
||||
uniform float specular_steps = 12.0;
|
||||
uniform float specular_smoothness : hint_range(0.0, 1.0, 0.01) = 0.2;
|
||||
#endif
|
||||
|
||||
uniform sampler2D screen_texture : hint_screen_texture;
|
||||
varying vec3 world_pos;
|
||||
varying vec2 world_wave_velocity;
|
||||
|
||||
#if USE_CAUSTICS
|
||||
vec3 sample_caustics(vec2 uv){
|
||||
vec2 caustics_uv = uv * caustics_scale;
|
||||
return vec3(
|
||||
texture(caustics_texture, caustics_uv).r,
|
||||
texture(caustics_texture, caustics_uv+vec2(0.02,0.02)).r,
|
||||
texture(caustics_texture, caustics_uv+vec2(0.03,0.01)).r
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
vec4 sample_world_dpos(vec2 screen_uv, mat4 inv_proj_mat, mat4 inv_view_mat){
|
||||
vec4 clip_pos = vec4(screen_uv * 2.0 - 1.0, texture(DEPTH_TEXTURE, screen_uv).r, 1.0);
|
||||
vec4 view_pos = inv_proj_mat * clip_pos;
|
||||
view_pos /= view_pos.w;
|
||||
vec4 world_dpos = inv_view_mat * view_pos;
|
||||
return world_dpos;
|
||||
}
|
||||
|
||||
vec4 sample_wave(sampler2D tex, vec2 uv, vec2 velocity, float lod){
|
||||
vec2 base_uv = uv * wave_scale;
|
||||
vec2 wave_uv1 = (base_uv * wave_layer_scale) + (TIME * -velocity);
|
||||
float wave1 = textureLod(tex, wave_uv1, lod).r;
|
||||
|
||||
vec2 wave_uv2 = base_uv + (TIME * velocity);
|
||||
vec4 wave2 = textureLod(tex, wave_uv2 - (wave1 * 0.1), lod);
|
||||
|
||||
return wave2;
|
||||
}
|
||||
|
||||
vec3 sample_wave_normal(vec2 uv, vec2 velocity, float center_wave) {
|
||||
vec2 normal_offset = vec2(0.25, 0.0);
|
||||
float wave_x = sample_wave(wave_texture, uv + normal_offset.xy, velocity, wave_softness).r;
|
||||
float wave_z = sample_wave(wave_texture, uv + normal_offset.yx, velocity, wave_softness).r;
|
||||
vec2 slope = vec2(center_wave - wave_x, center_wave - wave_z) * 0.35;
|
||||
return normalize(vec3(slope, 1.0)) * 0.5 + 0.5;
|
||||
}
|
||||
|
||||
vec2 get_world_wave_velocity(mat4 model_matrix) {
|
||||
float velocity_length = length(wave_velocity);
|
||||
if (velocity_length <= 0.0001) {
|
||||
return vec2(0.0);
|
||||
}
|
||||
|
||||
float flow_direction_length = length(river_flow_direction);
|
||||
if (flow_direction_length > 0.0001) {
|
||||
return (river_flow_direction / flow_direction_length) * velocity_length;
|
||||
}
|
||||
|
||||
vec3 world_direction_3d = (model_matrix * vec4(0.0, 1.0, 0.0, 0.0)).xyz;
|
||||
vec2 world_direction = world_direction_3d.xz;
|
||||
float world_direction_length = length(world_direction);
|
||||
if (world_direction_length <= 0.0001) {
|
||||
return wave_velocity;
|
||||
}
|
||||
|
||||
return (world_direction / world_direction_length) * velocity_length;
|
||||
}
|
||||
|
||||
void vertex(){
|
||||
world_pos = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||||
world_wave_velocity = get_world_wave_velocity(MODEL_MATRIX);
|
||||
|
||||
#if USE_DISPLACEMENT
|
||||
float wave = sample_wave(wave_texture, world_pos.xz, world_wave_velocity, wave_softness).r;
|
||||
VERTEX.y += wave*displacement_amount;
|
||||
#endif
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
float wave = sample_wave(wave_texture, world_pos.xz, world_wave_velocity, wave_softness).r;
|
||||
wave = smoothstep(0.0,1.0,wave);
|
||||
|
||||
vec2 screen_uv = SCREEN_UV;
|
||||
|
||||
// Refraction
|
||||
#if USE_REFRACTION
|
||||
screen_uv += ((pow(wave, refraction_exponent)*2.0 - 0.5) * 0.01 * refraction_amount);
|
||||
|
||||
vec4 world_dpos = sample_world_dpos(screen_uv, INV_PROJECTION_MATRIX, INV_VIEW_MATRIX);
|
||||
|
||||
float pre_depth = pow(clamp((world_dpos.y - world_pos.y + depth_size)/depth_size, 0.0, 1.0), 4.0);
|
||||
screen_uv = mix(screen_uv, SCREEN_UV, pre_depth);
|
||||
if(world_dpos.y - world_pos.y > 0.0){
|
||||
screen_uv = SCREEN_UV;
|
||||
}
|
||||
#else
|
||||
vec4 world_dpos = sample_world_dpos(screen_uv, INV_PROJECTION_MATRIX, INV_VIEW_MATRIX);
|
||||
#endif
|
||||
|
||||
world_dpos = sample_world_dpos(screen_uv, INV_PROJECTION_MATRIX, INV_VIEW_MATRIX);
|
||||
|
||||
vec2 surface_uv = world_dpos.xz * 0.2;
|
||||
|
||||
float depth = pow(clamp((world_dpos.y - world_pos.y + depth_size)/depth_size, 0.0, 1.0), 4.0);
|
||||
|
||||
// Caustics
|
||||
#if USE_CAUSTICS
|
||||
vec3 caustics1 = sample_caustics(surface_uv + (TIME * -world_wave_velocity));
|
||||
vec3 caustics2 = sample_caustics((surface_uv + (caustics1.r*0.05)) + (TIME * (world_wave_velocity*0.5)));
|
||||
vec3 caustics = caustics2 * (1.0 - depth);
|
||||
#endif
|
||||
|
||||
// Edge Foam
|
||||
float edge_foam_depth = clamp((world_dpos.y - world_pos.y + edge_foam_depth_size)/edge_foam_depth_size, 0.0, 1.0);
|
||||
|
||||
// Wave Foam
|
||||
float wave_foam = wave;
|
||||
float foam = max(edge_foam_depth, wave_foam * wave_foam_amount);
|
||||
|
||||
float foam_shape = 1.0 - texture(foam_texture, world_pos.xz* 0.5).r;
|
||||
foam = clamp((foam - foam_start) / (foam_end - foam_start), 0.0, 1.0);
|
||||
foam = clamp((foam - foam_shape) / (1.0 - foam_shape), 0.0, 1.0);
|
||||
foam = pow(foam, foam_exponent);
|
||||
|
||||
vec3 flat_color = mix(depth_color, surface_color, depth).rgb;
|
||||
|
||||
vec4 screen = texture(screen_texture, screen_uv);
|
||||
vec3 color = screen.rgb;
|
||||
#if USE_CAUSTICS
|
||||
color += vec3(pow(caustics * caustics_strength, vec3(2.0)));
|
||||
#endif
|
||||
color = mix(flat_color, color, 0.4 * depth);
|
||||
color = mix(color, surface_color.rgb, wave * wave_highlight);
|
||||
color = mix(color, foam_color.rgb, foam);
|
||||
|
||||
#if !USE_UNSHADED
|
||||
vec3 wave_normal_map = sample_wave_normal(world_pos.xz, world_wave_velocity, wave);
|
||||
NORMAL_MAP = wave_normal_map;
|
||||
#endif
|
||||
|
||||
ROUGHNESS = mix(surface_roughness, foam_roughness, foam);
|
||||
|
||||
ALBEDO = color;
|
||||
}
|
||||
|
||||
#if USE_STYLIZED_LIGHTING && !USE_UNSHADED
|
||||
void light(){
|
||||
float ndotl = dot(NORMAL, LIGHT) * ATTENUATION;
|
||||
//ndotl = smoothstep(0.0,1.0-ROUGHNESS,ndotl);
|
||||
float light = ndotl;
|
||||
|
||||
float light_mult = light * diffuse_steps;
|
||||
float light_step_base = floor(light_mult);
|
||||
float light_factor = light_mult - light_step_base;
|
||||
|
||||
light_factor = smoothstep(0.5 - diffuse_smoothness * 0.5, 0.5 + diffuse_smoothness * 0.5, light_factor);
|
||||
light = (light_step_base + light_factor) / diffuse_steps;
|
||||
|
||||
DIFFUSE_LIGHT += (LIGHT_COLOR+ALBEDO) * light / PI;
|
||||
|
||||
float roughness = mix(0.01, 0.99, ROUGHNESS);
|
||||
vec3 h = normalize(VIEW + LIGHT);
|
||||
float ndoth = clamp(dot(NORMAL, h), 0.0, 1.0) * ATTENUATION;
|
||||
float specular = clamp(pow(ndoth, 16.0/(roughness)), 0.1, 0.99);
|
||||
specular = mix(pow(specular, 2.0-roughness),0.00,pow(roughness, 0.1));
|
||||
|
||||
float specular_mult = specular * specular_steps;
|
||||
float specular_step_base = floor(specular_mult);
|
||||
float specular_factor = specular_mult - specular_step_base;
|
||||
|
||||
specular_factor = smoothstep(0.5 - specular_smoothness * 0.5, 0.5 + specular_smoothness * 0.5, specular_factor);
|
||||
specular = (specular_step_base + specular_factor) / specular_steps;
|
||||
|
||||
SPECULAR_LIGHT += (LIGHT_COLOR + ALBEDO) * specular;
|
||||
}
|
||||
#endif
|
||||
1
core/daynight/water_river.gdshader.uid
Normal file
1
core/daynight/water_river.gdshader.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cb12c2j8rfu6a
|
||||
@@ -34,12 +34,15 @@ var rain_tween: Tween
|
||||
var rain_audio_tween: Tween
|
||||
var puddle_tween: Tween
|
||||
var puddle_amount: float = 0.0
|
||||
var clouds_tween: Tween
|
||||
|
||||
var snow_tween: Tween
|
||||
var snow_weather_tween: Tween
|
||||
var snow_particles_tween: Tween
|
||||
var is_snowing: bool = false
|
||||
var is_snow_accumulated: bool = false
|
||||
var actual_snow_amount: float = 0.0
|
||||
var snow_weather_amount: float = 0.0
|
||||
|
||||
var is_storm: bool = false
|
||||
var cold_tween: Tween
|
||||
@@ -188,10 +191,10 @@ func _process(delta: float) -> void:
|
||||
var final_fog_density = lerp(base_fog_density, base_fog_density * 4.0, clamp(rain_intensity, 0.0, 1.0))
|
||||
var final_water_color = base_water_color.darkened(clamp(environment_config.water_darkening_rain, 0.0, 1.0) * clamp(rain_intensity, 0.0, 1.0))
|
||||
|
||||
final_tint = final_tint.lerp(final_tint * environment_config.snow_mode_color, actual_snow_amount)
|
||||
final_sky_top = final_sky_top.lerp(final_sky_top * environment_config.snow_mode_color, actual_snow_amount)
|
||||
final_sky_horizon = final_sky_horizon.lerp(final_sky_horizon * environment_config.snow_mode_color, actual_snow_amount)
|
||||
final_fog_color = final_fog_color.lerp(final_fog_color * environment_config.snow_mode_color, actual_snow_amount)
|
||||
final_tint = final_tint.lerp(final_tint * environment_config.snow_mode_color, snow_weather_amount)
|
||||
final_sky_top = final_sky_top.lerp(final_sky_top * environment_config.snow_mode_color, snow_weather_amount)
|
||||
final_sky_horizon = final_sky_horizon.lerp(final_sky_horizon * environment_config.snow_mode_color, snow_weather_amount)
|
||||
final_fog_color = final_fog_color.lerp(final_fog_color * environment_config.snow_mode_color, snow_weather_amount)
|
||||
|
||||
#Shader parameters for global trunk_shader
|
||||
var final_grad_top = base_grad_top.lerp(base_grad_top * weather_color, clamp(rain_intensity, 0.0, 1.0))
|
||||
@@ -205,8 +208,8 @@ func _process(delta: float) -> void:
|
||||
var night_val = clamp(day_time - 2.0, 0.0, 1.0)
|
||||
|
||||
#Snow exposure compensation
|
||||
var snow_light_attenuation = lerp(1.0, 0.55, actual_snow_amount * (1.0 - night_val))
|
||||
var snow_glow_attenuation = lerp(1.0, 0.5, actual_snow_amount)
|
||||
var snow_light_attenuation = lerp(1.0, 0.55, snow_weather_amount * (1.0 - night_val))
|
||||
var snow_glow_attenuation = lerp(1.0, 0.5, snow_weather_amount)
|
||||
var final_bloom = lerp(base_bloom, base_bloom * 0.5, rain_intensity) * snow_glow_attenuation
|
||||
|
||||
# We calculate the final exposure by applying snow damping directly to the camera exposure
|
||||
@@ -247,15 +250,36 @@ func _process(delta: float) -> void:
|
||||
sky_mat.set_shader_parameter("sun_color", final_tint)
|
||||
sky_mat.set_shader_parameter("night_intensity", night_val)
|
||||
|
||||
var cloud_density_amount: float = maxf(clamp(rain_intensity, 0.0, 1.0), clamp(snow_weather_amount, 0.0, 1.0))
|
||||
var current_cloud_density: float = lerp(environment_config.base_cloud_density, environment_config.rain_cloud_density, cloud_density_amount)
|
||||
|
||||
if environment_config.material_clouds:
|
||||
var current_density = lerp(0.4, 1.0, rain_intensity)
|
||||
environment_config.material_clouds.set_shader_parameter("cloud_density", current_density)
|
||||
var current_sharpness = lerp(0.14, 0.0, rain_intensity)
|
||||
environment_config.material_clouds.set_shader_parameter("cloud_density", current_cloud_density)
|
||||
var current_sharpness = lerp(0.14, 0.0, cloud_density_amount)
|
||||
environment_config.material_clouds.set_shader_parameter("center_sharpness", current_sharpness)
|
||||
|
||||
var env_shadow_mat = environment_shadows.get_surface_override_material(0) if environment_shadows else null
|
||||
if env_shadow_mat:
|
||||
env_shadow_mat.set_shader_parameter("cloud_density", current_cloud_density)
|
||||
|
||||
if environment_config.material_fog:
|
||||
environment_config.material_fog.set_shader_parameter("fog_color", final_fog_color)
|
||||
environment_config.material_fog.set_shader_parameter("fog_density", clamp(final_fog_density * 25.0, 0.0, 1.0))
|
||||
environment_config.material_fog.set_shader_parameter("night_intensity", night_val)
|
||||
environment_config.material_fog.set_shader_parameter("sun_color", final_tint)
|
||||
|
||||
if fog:
|
||||
for child in fog.get_children():
|
||||
var fog_mesh := child as MeshInstance3D
|
||||
if fog_mesh == null:
|
||||
continue
|
||||
var fog_material := fog_mesh.get_surface_override_material(0) as ShaderMaterial
|
||||
if fog_material == null:
|
||||
continue
|
||||
fog_material.set_shader_parameter("fog_color", final_fog_color)
|
||||
fog_material.set_shader_parameter("fog_density", clamp(final_fog_density * 25.0, 0.0, 1.0))
|
||||
fog_material.set_shader_parameter("night_intensity", night_val)
|
||||
fog_material.set_shader_parameter("sun_color", final_tint)
|
||||
|
||||
func create_sound_players():
|
||||
rain_audio_player = AudioStreamPlayer.new()
|
||||
@@ -666,7 +690,7 @@ func toggle_rain(value: bool):
|
||||
|
||||
if puddle_tween and puddle_tween.is_valid():
|
||||
puddle_tween.kill()
|
||||
|
||||
|
||||
if is_raining:
|
||||
particles_rain.amount_ratio = 0.0
|
||||
particles_rain.emitting = true
|
||||
@@ -786,8 +810,23 @@ func toggle_snow(value: bool):
|
||||
var target_snow_amount: float = 1.0 if is_snowing else 0.0
|
||||
if snow_tween and snow_tween.is_valid():
|
||||
snow_tween.kill()
|
||||
if snow_weather_tween and snow_weather_tween.is_valid():
|
||||
snow_weather_tween.kill()
|
||||
var snow_amount_transition_duration: float = _get_snow_amount_transition_duration(is_snowing)
|
||||
snow_tween = create_tween()
|
||||
snow_tween.tween_method(init_snow_amount, actual_snow_amount, target_snow_amount, environment_config.snow_transaction_time)
|
||||
snow_tween.tween_method(
|
||||
init_snow_amount,
|
||||
actual_snow_amount,
|
||||
target_snow_amount,
|
||||
snow_amount_transition_duration
|
||||
)
|
||||
snow_weather_tween = create_tween()
|
||||
snow_weather_tween.tween_method(
|
||||
init_snow_weather_amount,
|
||||
snow_weather_amount,
|
||||
target_snow_amount,
|
||||
environment_config.snow_fade_time
|
||||
)
|
||||
_emit_weather_event_label()
|
||||
|
||||
func _emit_weather_event_label() -> void:
|
||||
@@ -811,6 +850,7 @@ func _emit_weather_event_label() -> void:
|
||||
#disable snow and set default values and shader
|
||||
func init_snow(value: float = 0.0):
|
||||
actual_snow_amount = value
|
||||
snow_weather_amount = value
|
||||
RenderingServer.global_shader_parameter_set("global_snow_amount", value)
|
||||
|
||||
if particles_snow:
|
||||
@@ -835,6 +875,9 @@ func init_snow_amount(value: float):
|
||||
actual_snow_amount = value
|
||||
RenderingServer.global_shader_parameter_set("global_snow_amount", value)
|
||||
|
||||
func init_snow_weather_amount(value: float):
|
||||
snow_weather_amount = value
|
||||
|
||||
func start_snow_accumulation() -> void:
|
||||
RenderingServer.global_shader_parameter_set("global_snow_melt_time", -1.0)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_start_time", Time.get_ticks_msec() / 1000.0)
|
||||
@@ -843,6 +886,18 @@ func start_snow_melt() -> void:
|
||||
RenderingServer.global_shader_parameter_set("global_snow_melt_time", Time.get_ticks_msec() / 1000.0)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_melt_speed", environment_config.snow_melt_speed)
|
||||
|
||||
func _get_snow_amount_transition_duration(is_accumulating: bool) -> float:
|
||||
if environment_config == null:
|
||||
return 0.0
|
||||
|
||||
var speed: float = environment_config.snow_melt_speed
|
||||
if is_accumulating:
|
||||
speed = environment_config.snow_accumulation_speed
|
||||
if speed <= 0.0:
|
||||
return environment_config.snow_transaction_time
|
||||
|
||||
return 1.0 / speed
|
||||
|
||||
#endregion
|
||||
|
||||
#region Post-Process
|
||||
|
||||
@@ -3,7 +3,7 @@ render_mode blend_mix, depth_draw_never;
|
||||
|
||||
//Snow globals
|
||||
global uniform float global_snow_start_time = -1.0;
|
||||
global uniform float global_snow_accumulation_speed = 0.1;
|
||||
global uniform float global_snow_accumulation_speed = 0.005;
|
||||
global uniform float global_snow_melt_time = -1.0;
|
||||
global uniform float global_snow_melt_speed = 0.1;
|
||||
global uniform float global_snow_amount = 0.0;
|
||||
@@ -72,18 +72,15 @@ float fbm(vec2 p) {
|
||||
}
|
||||
|
||||
float get_snow_progress() {
|
||||
bool has_snow_timeline = global_snow_start_time >= 0.0 || global_snow_melt_time >= 0.0;
|
||||
float snow_progress = clamp(global_snow_amount, 0.0, 1.0);
|
||||
|
||||
if (has_snow_timeline) {
|
||||
snow_progress = 0.0;
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
snow_progress = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_progress *= (1.0 - melt);
|
||||
}
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
float timed_progress = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
snow_progress = max(snow_progress, timed_progress);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_progress = min(snow_progress, 1.0 - melt);
|
||||
}
|
||||
|
||||
return snow_progress;
|
||||
@@ -130,12 +127,13 @@ void fragment() {
|
||||
float snow_edge = smoothstep(
|
||||
global_snow_threshold - snow_edge_softness,
|
||||
global_snow_threshold + snow_edge_softness,
|
||||
facing_up + (noise_val - 0.5) * 0.4
|
||||
facing_up
|
||||
);
|
||||
float flat_accumulation = smoothstep(0.0, 0.35, v_snow_cap_mask) * snow_accumulation;
|
||||
float snow_coverage = smoothstep(0.0, 0.6, noise_val + snow_progress - 0.4 + flat_accumulation * 0.25);
|
||||
float snow_factor = max(snow_edge * snow_coverage * snow_progress, flat_accumulation);
|
||||
float snow_opacity = smoothstep(0.04, 0.28, snow_factor);
|
||||
float snow_variation = mix(0.75, 1.15, noise_val);
|
||||
float snow_coverage = clamp(snow_progress * snow_variation + flat_accumulation * 0.25, 0.0, 1.0);
|
||||
float snow_factor = max(snow_edge * snow_coverage, flat_accumulation);
|
||||
float snow_opacity = clamp(snow_factor, 0.0, 1.0);
|
||||
snow_opacity = max(snow_opacity, flat_accumulation * 0.9);
|
||||
|
||||
float shade = mix(-snow_color_variation, snow_color_variation, noise_val);
|
||||
|
||||
@@ -2,10 +2,11 @@ shader_type spatial;
|
||||
render_mode blend_mix, depth_draw_never, cull_disabled;
|
||||
|
||||
// Snow globals
|
||||
global uniform float global_snow_start_time;
|
||||
global uniform float global_snow_accumulation_speed;
|
||||
global uniform float global_snow_melt_time;
|
||||
global uniform float global_snow_melt_speed;
|
||||
global uniform float global_snow_start_time = -1.0;
|
||||
global uniform float global_snow_accumulation_speed = 0.005;
|
||||
global uniform float global_snow_melt_time = -1.0;
|
||||
global uniform float global_snow_melt_speed = 0.1;
|
||||
global uniform float global_snow_amount = 0.0;
|
||||
global uniform vec4 global_snow_color;
|
||||
uniform float snow_edge_softness : hint_range(0.01, 0.5) = 0.15;
|
||||
uniform float snow_color_variation : hint_range(0.0, 0.15) = 0.05;
|
||||
@@ -34,6 +35,21 @@ float ripple_ring(vec2 uv, float time_offset) {
|
||||
return ring * fade;
|
||||
}
|
||||
|
||||
float get_snow_progress() {
|
||||
float snow_progress = clamp(global_snow_amount, 0.0, 1.0);
|
||||
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
float timed_progress = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
snow_progress = max(snow_progress, timed_progress);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_progress = min(snow_progress, 1.0 - melt);
|
||||
}
|
||||
|
||||
return snow_progress;
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
vec3 world_pos = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||||
|
||||
@@ -41,18 +57,10 @@ void fragment() {
|
||||
float facing_up = 1.0;
|
||||
|
||||
// Snow accumulation
|
||||
float snow_amount = 0.0;
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
snow_amount = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_amount *= (1.0 - melt);
|
||||
}
|
||||
float snow_amount = get_snow_progress();
|
||||
|
||||
// UV-based snow mask: accumulates from the top of the quad
|
||||
float top_mask = 1.0 - UV.y;
|
||||
float snow_mask = smoothstep(1.0 - snow_amount, 1.0 - snow_amount + snow_edge_softness, top_mask);
|
||||
// Plain surfaces fade in uniformly to avoid patchy strip-like accumulation.
|
||||
float snow_mask = smoothstep(0.0, 1.0, snow_amount);
|
||||
snow_mask *= step(0.01, snow_amount);
|
||||
|
||||
// Snow color with slight variation
|
||||
|
||||
@@ -98,6 +98,7 @@ extends Resource
|
||||
@export var material_fog: ShaderMaterial #Fog overlay shader material
|
||||
@export var material_drops: StandardMaterial3D #Rain drops material (albedo tinted by sky)
|
||||
@export var material_clouds: ShaderMaterial #Cloud layer shader material
|
||||
@export var base_cloud_density: float = 0.4 #default cloud density
|
||||
|
||||
#Rain weather settings
|
||||
@export_group("Rain")
|
||||
@@ -106,6 +107,7 @@ extends Resource
|
||||
@export var rain_audio_volume_db: float = -10.0 #Target rain loop volume in decibels
|
||||
@export var puddle_form_time: float = 15.0 #Seconds for puddles to fully form
|
||||
@export var puddle_dry_time: float = 20.0 #Seconds for puddles to fully dry after rain stops
|
||||
@export var rain_cloud_density: float = 1.0 #the cloud density when is rainy
|
||||
|
||||
#Storm settings (applied on top of rain when storm is active)
|
||||
@export_group("Storm")
|
||||
@@ -136,7 +138,7 @@ extends Resource
|
||||
|
||||
#Train start settings
|
||||
@export_group("Train Start")
|
||||
@export var train_start_from_random_position: bool = false #When enabled the train starts from a random offset on the rail curve instead of a stop
|
||||
@export var train_start_from_random_position: bool = true #When enabled the train starts from a random offset on the rail curve instead of a stop
|
||||
@export_range(0, 64, 1, "or_greater") var train_start_stop_index: int = 1 #Stop index used for the train start when random start is disabled
|
||||
|
||||
#Snow settings
|
||||
@@ -145,7 +147,7 @@ extends Resource
|
||||
@export var snow_transaction_time: float = 10.0 #Seconds for snow shader to fully transition in/out
|
||||
@export var snow_fade_time: float = 5.0 #Seconds for snow particles to fade in/out
|
||||
@export var snow_threshold: float = 0.4 #Normal Y threshold for snow accumulation on surfaces
|
||||
@export var snow_accumulation_speed: float = 0.014 #Accumulation speed: 0.1 -> 10s, 0.05 -> 20s, 0.02 -> 50s, 0.012 -> ~83s
|
||||
@export var snow_accumulation_speed: float = 0.005 #Accumulation speed: 0.005 -> ~200s, 0.01 -> 100s, 0.02 -> 50s
|
||||
@export var snow_melt_speed: float = 0.05 #Speed at which accumulated snow melts away
|
||||
@export var show_snow_accumulation_volume: bool = true #Enables vertex snow buildup; when false snow only changes surface color
|
||||
@export var snow_max_accumulation: float = 0.25 #Maximum accumulated snow factor applied to coverage and thickness
|
||||
|
||||
32
core/game_state/game_state.gd
Normal file
32
core/game_state/game_state.gd
Normal file
@@ -0,0 +1,32 @@
|
||||
extends Node
|
||||
|
||||
const SAVE_PATH: String = "user://savegame.json"
|
||||
|
||||
var save_data: SaveGameData = SaveGameData.new()
|
||||
var is_loaded: bool = false
|
||||
|
||||
func _ready() -> void:
|
||||
load_game()
|
||||
|
||||
func save_game() -> void:
|
||||
var save_file = FileAccess.open(SAVE_PATH, FileAccess.WRITE)
|
||||
var json_string = JSON.stringify(save_data.to_dictionary())
|
||||
save_file.store_line(json_string)
|
||||
|
||||
func load_game() -> void:
|
||||
if not FileAccess.file_exists(SAVE_PATH):
|
||||
save_data = SaveGameData.new()
|
||||
is_loaded = true
|
||||
return
|
||||
|
||||
var file = FileAccess.open(SAVE_PATH, FileAccess.READ)
|
||||
var json_string = file.get_as_text()
|
||||
|
||||
var json = JSON.new()
|
||||
var parse_result = json.parse(json_string)
|
||||
|
||||
save_data = SaveGameData.new()
|
||||
if parse_result == OK and json.data is Dictionary:
|
||||
save_data = SaveGameData.from_dictionary(json.data)
|
||||
|
||||
is_loaded = true
|
||||
1
core/game_state/game_state.gd.uid
Normal file
1
core/game_state/game_state.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b17g2w2g101o6
|
||||
34
core/game_state/save_game_data.gd
Normal file
34
core/game_state/save_game_data.gd
Normal file
@@ -0,0 +1,34 @@
|
||||
class_name SaveGameData
|
||||
extends Resource
|
||||
|
||||
var unlocked_collectibles_ids: Array[StringName] = []
|
||||
var saved_photos: Array[String] = []
|
||||
var audio_bus_volumes: Dictionary[String, float] = {}
|
||||
|
||||
func to_dictionary() -> Dictionary:
|
||||
var serialized_collectible_ids: Array[String] = []
|
||||
for collectible_id in unlocked_collectibles_ids:
|
||||
serialized_collectible_ids.append(str(collectible_id))
|
||||
|
||||
return {
|
||||
"unlocked_collectibles_ids": serialized_collectible_ids,
|
||||
"saved_photos": saved_photos,
|
||||
"audio_bus_volumes": audio_bus_volumes,
|
||||
}
|
||||
|
||||
static func from_dictionary(data: Dictionary) -> SaveGameData:
|
||||
var save_game_data := SaveGameData.new()
|
||||
|
||||
if data.has("unlocked_collectibles_ids"):
|
||||
for collectible_id in data["unlocked_collectibles_ids"]:
|
||||
save_game_data.unlocked_collectibles_ids.append(StringName(str(collectible_id)))
|
||||
|
||||
if data.has("saved_photos"):
|
||||
for photo_path in data["saved_photos"]:
|
||||
save_game_data.saved_photos.append(str(photo_path))
|
||||
|
||||
if data.has("audio_bus_volumes") and data["audio_bus_volumes"] is Dictionary:
|
||||
for bus_name in data["audio_bus_volumes"]:
|
||||
save_game_data.audio_bus_volumes[str(bus_name)] = float(data["audio_bus_volumes"][bus_name])
|
||||
|
||||
return save_game_data
|
||||
1
core/game_state/save_game_data.gd.uid
Normal file
1
core/game_state/save_game_data.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bxmvs842r82vl
|
||||
4
core/photo_mode/data/collectible_library.gd
Normal file
4
core/photo_mode/data/collectible_library.gd
Normal file
@@ -0,0 +1,4 @@
|
||||
class_name CollectibleLibrary
|
||||
extends Resource
|
||||
|
||||
@export var collectibles: Array[CollectibleResource]
|
||||
1
core/photo_mode/data/collectible_library.gd.uid
Normal file
1
core/photo_mode/data/collectible_library.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://hhuufh87skq5
|
||||
31
core/photo_mode/data/collectible_library.tres
Normal file
31
core/photo_mode/data/collectible_library.tres
Normal file
@@ -0,0 +1,31 @@
|
||||
[gd_resource type="Resource" script_class="CollectibleLibrary" format=3 uid="uid://c6pkpvsvimafb"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bj34o0org55ei" path="res://core/photo_mode/data/collectible_resource.gd" id="1_3cgvf"]
|
||||
[ext_resource type="Script" uid="uid://hhuufh87skq5" path="res://core/photo_mode/data/collectible_library.gd" id="2_ggu10"]
|
||||
[ext_resource type="Texture2D" uid="uid://cx8d233y32kmu" path="res://icon.svg" id="2_pxmdy"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_3cgvf"]
|
||||
script = ExtResource("1_3cgvf")
|
||||
id = &"cane"
|
||||
title = "Cane"
|
||||
image = ExtResource("2_pxmdy")
|
||||
metadata/_custom_type_script = "uid://bj34o0org55ei"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ggu10"]
|
||||
script = ExtResource("1_3cgvf")
|
||||
id = &"gatto"
|
||||
title = "Gatto"
|
||||
image = ExtResource("2_pxmdy")
|
||||
metadata/_custom_type_script = "uid://bj34o0org55ei"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_pxmdy"]
|
||||
script = ExtResource("1_3cgvf")
|
||||
id = &"farfalla"
|
||||
title = "Farfalla"
|
||||
image = ExtResource("2_pxmdy")
|
||||
metadata/_custom_type_script = "uid://bj34o0org55ei"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_ggu10")
|
||||
collectibles = Array[ExtResource("1_3cgvf")]([SubResource("Resource_3cgvf"), SubResource("Resource_ggu10"), SubResource("Resource_pxmdy")])
|
||||
metadata/_custom_type_script = "uid://hhuufh87skq5"
|
||||
6
core/photo_mode/data/collectible_resource.gd
Normal file
6
core/photo_mode/data/collectible_resource.gd
Normal file
@@ -0,0 +1,6 @@
|
||||
class_name CollectibleResource
|
||||
extends Resource
|
||||
|
||||
@export var id: StringName
|
||||
@export var title: String
|
||||
@export var image: Texture2D
|
||||
1
core/photo_mode/data/collectible_resource.gd.uid
Normal file
1
core/photo_mode/data/collectible_resource.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bj34o0org55ei
|
||||
60
core/photo_mode/managers/collection_manager.gd
Normal file
60
core/photo_mode/managers/collection_manager.gd
Normal file
@@ -0,0 +1,60 @@
|
||||
extends Node
|
||||
|
||||
signal on_collectible_unlocked(collectible_id: StringName)
|
||||
signal on_photo_saved(filePath: String)
|
||||
|
||||
var collectibles_library: CollectibleLibrary = preload("res://core/photo_mode/data/collectible_library.tres")
|
||||
|
||||
var unlocked_collectibles_ids: Array[StringName] = []
|
||||
var saved_photos: Array[String] = []
|
||||
|
||||
func _ready() -> void:
|
||||
load_save_data()
|
||||
|
||||
func unlock_collectible(collectible_id: StringName) -> void:
|
||||
if not collectible_id in unlocked_collectibles_ids:
|
||||
var new_collectible = get_collectible_by_id(collectible_id)
|
||||
if new_collectible:
|
||||
unlocked_collectibles_ids.append(collectible_id)
|
||||
sync_save_data()
|
||||
on_collectible_unlocked.emit(collectible_id)
|
||||
|
||||
func get_collectible_by_id(id: StringName) -> CollectibleResource:
|
||||
for collectible in collectibles_library.collectibles:
|
||||
if collectible.id == id:
|
||||
return collectible
|
||||
return null
|
||||
|
||||
func get_all_collectibles() -> Array[CollectibleResource]:
|
||||
return collectibles_library.collectibles
|
||||
|
||||
func get_unlocked_collectible_ids() -> Array[StringName]:
|
||||
return unlocked_collectibles_ids
|
||||
|
||||
func save_photo_to_disk_async() -> void:
|
||||
await RenderingServer.frame_post_draw
|
||||
var image = get_viewport().get_texture().get_image()
|
||||
|
||||
if not DirAccess.dir_exists_absolute("user://photos"):
|
||||
DirAccess.make_dir_absolute("user://photos")
|
||||
|
||||
var timestamp = str(Time.get_unix_time_from_system())
|
||||
var file_path = "user://photos/photo_" + timestamp + ".png"
|
||||
image.save_png(file_path)
|
||||
|
||||
saved_photos.append(file_path)
|
||||
sync_save_data()
|
||||
on_photo_saved.emit(file_path)
|
||||
|
||||
func sync_save_data() -> void:
|
||||
GameState.save_data.unlocked_collectibles_ids = unlocked_collectibles_ids.duplicate()
|
||||
GameState.save_data.saved_photos = saved_photos.duplicate()
|
||||
|
||||
func load_save_data() -> void:
|
||||
unlocked_collectibles_ids = GameState.save_data.unlocked_collectibles_ids.duplicate()
|
||||
saved_photos = GameState.save_data.saved_photos.duplicate()
|
||||
|
||||
if unlocked_collectibles_ids.is_empty() and saved_photos.is_empty():
|
||||
unlocked_collectibles_ids.append(&"cane")
|
||||
|
||||
sync_save_data()
|
||||
1
core/photo_mode/managers/collection_manager.gd.uid
Normal file
1
core/photo_mode/managers/collection_manager.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c3kq1qddpm8tf
|
||||
6
core/photo_mode/runtime/collectible.gd
Normal file
6
core/photo_mode/runtime/collectible.gd
Normal file
@@ -0,0 +1,6 @@
|
||||
extends Area3D
|
||||
|
||||
@export var collectible_data: CollectibleResource
|
||||
|
||||
func _ready() -> void:
|
||||
add_to_group("collectible")
|
||||
1
core/photo_mode/runtime/collectible.gd.uid
Normal file
1
core/photo_mode/runtime/collectible.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://62d14boivr3g
|
||||
11
core/photo_mode/runtime/collectible.tscn
Normal file
11
core/photo_mode/runtime/collectible.tscn
Normal file
@@ -0,0 +1,11 @@
|
||||
[gd_scene format=3 uid="uid://bmkxt6btcx8qr"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://62d14boivr3g" path="res://core/photo_mode/runtime/collectible.gd" id="1_xse8c"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_xse8c"]
|
||||
|
||||
[node name="Collectible" type="Area3D" unique_id=1229019813]
|
||||
script = ExtResource("1_xse8c")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1479480920]
|
||||
shape = SubResource("BoxShape3D_xse8c")
|
||||
94
core/photo_mode/runtime/photo_mode_controller.gd
Normal file
94
core/photo_mode/runtime/photo_mode_controller.gd
Normal file
@@ -0,0 +1,94 @@
|
||||
extends Node3D
|
||||
|
||||
@export_group("Speed")
|
||||
@export var pan_speed: float = 5.0
|
||||
@export var rotation_speed: float = 0.003
|
||||
|
||||
@export_group("Bounds")
|
||||
@export var movement_bounds: AABB
|
||||
|
||||
@export_group("Ref")
|
||||
@export var rotation_target: Node3D
|
||||
|
||||
@onready var camera: Camera3D = $%Camera3D
|
||||
|
||||
var total_yaw: float = 0.0
|
||||
var total_pitch: float = 0.0
|
||||
var orbit_distance: float = 0.0
|
||||
var current_pan: Vector2 = Vector2.ZERO
|
||||
var is_active: bool = false
|
||||
|
||||
func _ready() -> void:
|
||||
total_yaw = global_rotation.y
|
||||
total_pitch = global_rotation.x
|
||||
|
||||
if rotation_target:
|
||||
orbit_distance = global_position.distance_to(rotation_target.global_position)
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if event.is_action_pressed("toggle_photo_mode"):
|
||||
is_active = !is_active
|
||||
|
||||
get_tree().paused = is_active
|
||||
|
||||
if !is_active:
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
||||
else:
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
||||
|
||||
if event is InputEventMouseMotion and is_active:
|
||||
total_yaw -= event.relative.x * rotation_speed
|
||||
|
||||
if event.is_action_pressed("take_photo"):
|
||||
take_photo_async()
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if not rotation_target:
|
||||
return
|
||||
|
||||
|
||||
var pan_input = Input.get_vector("photo_pan_left", "photo_pan_right", "photo_pan_up", "photo_pan_down")
|
||||
var rot_basis = Basis.from_euler(Vector3(total_pitch, total_yaw, 0))
|
||||
|
||||
if pan_input != Vector2.ZERO and is_active:
|
||||
current_pan.x += pan_input.x * pan_speed * delta
|
||||
current_pan.y += -pan_input.y * pan_speed * delta
|
||||
|
||||
if movement_bounds.size != Vector3.ZERO:
|
||||
current_pan.x = clampf(current_pan.x, movement_bounds.position.x, movement_bounds.position.x + movement_bounds.size.x)
|
||||
current_pan.y = clampf(current_pan.y, movement_bounds.position.y, movement_bounds.position.y + movement_bounds.size.y)
|
||||
|
||||
var right_dir = rot_basis.x.normalized()
|
||||
var up_dir = rot_basis.y.normalized()
|
||||
|
||||
var final_pan_offset = (right_dir * current_pan.x) + (up_dir * current_pan.y)
|
||||
|
||||
var orbit_pos = rotation_target.global_position + (rot_basis * Vector3(0, 0, orbit_distance))
|
||||
|
||||
global_position = orbit_pos + final_pan_offset
|
||||
global_basis = rot_basis
|
||||
|
||||
func take_photo_async() -> void:
|
||||
if !is_active:
|
||||
return
|
||||
|
||||
var targets = get_tree().get_nodes_in_group("collectible")
|
||||
var space_state = get_world_3d().direct_space_state
|
||||
|
||||
await CollectionManager.save_photo_to_disk_async()
|
||||
|
||||
for target in targets:
|
||||
if not target.collectible_data:
|
||||
continue
|
||||
|
||||
if camera.is_position_in_frustum(target.global_position):
|
||||
var query = PhysicsRayQueryParameters3D.create(camera.global_position, target.global_position)
|
||||
query.collide_with_areas = true
|
||||
query.collide_with_bodies = true
|
||||
|
||||
var result = space_state.intersect_ray(query)
|
||||
|
||||
if result and result.collider == target:
|
||||
CollectionManager.unlock_collectible(target.collectible_data.id)
|
||||
|
||||
GameState.save_game()
|
||||
1
core/photo_mode/runtime/photo_mode_controller.gd.uid
Normal file
1
core/photo_mode/runtime/photo_mode_controller.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://d7ln6iru6mq6
|
||||
10
core/photo_mode/runtime/photo_mode_controller.tscn
Normal file
10
core/photo_mode/runtime/photo_mode_controller.tscn
Normal file
@@ -0,0 +1,10 @@
|
||||
[gd_scene format=3 uid="uid://vni5kjalum6d"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d7ln6iru6mq6" path="res://core/photo_mode/runtime/photo_mode_controller.gd" id="1_uhpya"]
|
||||
|
||||
[node name="PhotoModeController" type="Node3D" unique_id=695158870]
|
||||
process_mode = 3
|
||||
script = ExtResource("1_uhpya")
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="." unique_id=1369039645]
|
||||
unique_name_in_owner = true
|
||||
34
core/photo_mode/ui/collectible_gallery.gd
Normal file
34
core/photo_mode/ui/collectible_gallery.gd
Normal file
@@ -0,0 +1,34 @@
|
||||
extends Control
|
||||
|
||||
@export var collectible_ui_scene: PackedScene
|
||||
|
||||
@onready var grid_container: GridContainer = $%CollectibleGrid
|
||||
|
||||
func _ready() -> void:
|
||||
CollectionManager.on_collectible_unlocked.connect(_unlock_collectible)
|
||||
setup()
|
||||
|
||||
func setup() -> void:
|
||||
var unlocked_collectible_ids = CollectionManager.get_unlocked_collectible_ids()
|
||||
var collectibles = CollectionManager.get_all_collectibles()
|
||||
|
||||
for child in grid_container.get_children():
|
||||
child.queue_free()
|
||||
|
||||
for collectible in collectibles:
|
||||
_add_collectible(collectible)
|
||||
if unlocked_collectible_ids.has(collectible.id):
|
||||
_unlock_collectible(collectible.id)
|
||||
|
||||
func on_collectible_unlocked(collectible_id: StringName) -> void:
|
||||
_unlock_collectible(collectible_id)
|
||||
|
||||
func _add_collectible(collectible: CollectibleResource) -> void:
|
||||
var collectible_ui: CollectibleUI = collectible_ui_scene.instantiate()
|
||||
collectible_ui.setup(collectible)
|
||||
grid_container.add_child(collectible_ui)
|
||||
|
||||
func _unlock_collectible(collectible_id: StringName) -> void:
|
||||
for collectible_ui in grid_container.get_children():
|
||||
if collectible_ui.collectible_resource.id == collectible_id:
|
||||
collectible_ui.unlock()
|
||||
1
core/photo_mode/ui/collectible_gallery.gd.uid
Normal file
1
core/photo_mode/ui/collectible_gallery.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dq3qtcrdnikl7
|
||||
50
core/photo_mode/ui/collectible_gallery.tscn
Normal file
50
core/photo_mode/ui/collectible_gallery.tscn
Normal file
@@ -0,0 +1,50 @@
|
||||
[gd_scene format=3 uid="uid://bvw086glfpcba"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dq3qtcrdnikl7" path="res://core/photo_mode/ui/collectible_gallery.gd" id="1_67tug"]
|
||||
[ext_resource type="PackedScene" uid="uid://dp7dvfauh5rpx" path="res://core/photo_mode/ui/collectible_ui.tscn" id="2_or234"]
|
||||
|
||||
[node name="CollectibleGallery" type="Control" unique_id=354419843]
|
||||
layout_mode = 3
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_67tug")
|
||||
collectible_ui_scene = ExtResource("2_or234")
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="." unique_id=640179265]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -350.0
|
||||
offset_top = -350.0
|
||||
offset_right = 350.0
|
||||
offset_bottom = 350.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer" unique_id=125147979]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 12
|
||||
theme_override_constants/margin_top = 12
|
||||
theme_override_constants/margin_right = 12
|
||||
theme_override_constants/margin_bottom = 12
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/MarginContainer" unique_id=348576028]
|
||||
layout_mode = 2
|
||||
draw_focus_border = true
|
||||
|
||||
[node name="CollectibleGrid" type="GridContainer" parent="PanelContainer/MarginContainer/ScrollContainer" unique_id=1187865988]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 6
|
||||
size_flags_vertical = 2
|
||||
theme_override_constants/h_separation = 12
|
||||
theme_override_constants/v_separation = 12
|
||||
columns = 3
|
||||
22
core/photo_mode/ui/collectible_ui.gd
Normal file
22
core/photo_mode/ui/collectible_ui.gd
Normal file
@@ -0,0 +1,22 @@
|
||||
extends Control
|
||||
|
||||
class_name CollectibleUI
|
||||
|
||||
@onready var label: Label = $%CollectibleName
|
||||
@onready var texture_rect: TextureRect = $%CollectibleTexture
|
||||
var collectible_resource: CollectibleResource
|
||||
|
||||
func setup(collectible: CollectibleResource) -> void:
|
||||
collectible_resource = collectible
|
||||
if !label:
|
||||
label = $%CollectibleName
|
||||
label.text = collectible_resource.title
|
||||
if collectible.image:
|
||||
if !texture_rect:
|
||||
texture_rect = $%CollectibleTexture
|
||||
texture_rect.texture = collectible_resource.image
|
||||
|
||||
func unlock() -> void:
|
||||
if !texture_rect:
|
||||
texture_rect = $%CollectibleTexture
|
||||
texture_rect.set_modulate(Color(1,1,1,1))
|
||||
1
core/photo_mode/ui/collectible_ui.gd.uid
Normal file
1
core/photo_mode/ui/collectible_ui.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dxh8e1n16qjpp
|
||||
49
core/photo_mode/ui/collectible_ui.tscn
Normal file
49
core/photo_mode/ui/collectible_ui.tscn
Normal file
@@ -0,0 +1,49 @@
|
||||
[gd_scene format=3 uid="uid://dp7dvfauh5rpx"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dxh8e1n16qjpp" path="res://core/photo_mode/ui/collectible_ui.gd" id="1_tu5nx"]
|
||||
[ext_resource type="Texture2D" uid="uid://cx8d233y32kmu" path="res://icon.svg" id="1_x3wje"]
|
||||
|
||||
[node name="CollectibleUI" type="Control" unique_id=201865221]
|
||||
custom_minimum_size = Vector2(200, 200)
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
||||
offset_right = 200.0
|
||||
offset_bottom = 200.0
|
||||
script = ExtResource("1_tu5nx")
|
||||
|
||||
[node name="Panel" type="PanelContainer" parent="." unique_id=1372516531]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="Panel" unique_id=1141643525]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 12
|
||||
theme_override_constants/margin_top = 12
|
||||
theme_override_constants/margin_right = 12
|
||||
theme_override_constants/margin_bottom = 12
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="Panel/MarginContainer" unique_id=1841409877]
|
||||
layout_mode = 2
|
||||
alignment = 1
|
||||
|
||||
[node name="CollectibleName" type="Label" parent="Panel/MarginContainer/VBoxContainer" unique_id=117774359]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 0
|
||||
text = "Collectible"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="Panel/MarginContainer/VBoxContainer" unique_id=1345822244]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="CollectibleTexture" type="TextureRect" parent="Panel/MarginContainer/VBoxContainer" unique_id=506844785]
|
||||
unique_name_in_owner = true
|
||||
modulate = Color(0.16206557, 0.1620656, 0.16206557, 1)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("1_x3wje")
|
||||
stretch_mode = 3
|
||||
11
core/photo_mode/ui/photo.gd
Normal file
11
core/photo_mode/ui/photo.gd
Normal file
@@ -0,0 +1,11 @@
|
||||
extends Control
|
||||
|
||||
class_name Photo
|
||||
|
||||
@onready var texture_rect: TextureRect = $%PhotoTexture
|
||||
|
||||
func setup(texture: Texture) -> void:
|
||||
if texture:
|
||||
if !texture_rect:
|
||||
texture_rect = $%PhotoTexture
|
||||
texture_rect.texture = texture
|
||||
1
core/photo_mode/ui/photo.gd.uid
Normal file
1
core/photo_mode/ui/photo.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dsey5dvc11vpq
|
||||
38
core/photo_mode/ui/photo.tscn
Normal file
38
core/photo_mode/ui/photo.tscn
Normal file
@@ -0,0 +1,38 @@
|
||||
[gd_scene format=3 uid="uid://cvus62qkop3qi"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dsey5dvc11vpq" path="res://core/photo_mode/ui/photo.gd" id="1_u0arp"]
|
||||
|
||||
[node name="Photo" type="Control" unique_id=201865221]
|
||||
custom_minimum_size = Vector2(200, 200)
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
||||
offset_right = 200.0
|
||||
offset_bottom = 200.0
|
||||
script = ExtResource("1_u0arp")
|
||||
|
||||
[node name="ColorRect" type="ColorRect" parent="." unique_id=1208008621]
|
||||
layout_mode = 0
|
||||
offset_right = 200.0
|
||||
offset_bottom = 200.0
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="ColorRect" unique_id=1141643525]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme_override_constants/margin_left = 12
|
||||
theme_override_constants/margin_top = 12
|
||||
theme_override_constants/margin_right = 12
|
||||
theme_override_constants/margin_bottom = 12
|
||||
|
||||
[node name="Panel" type="PanelContainer" parent="ColorRect/MarginContainer" unique_id=1372516531]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="PhotoTexture" type="TextureRect" parent="ColorRect/MarginContainer/Panel" unique_id=506844785]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
expand_mode = 1
|
||||
stretch_mode = 6
|
||||
27
core/photo_mode/ui/photo_gallery.gd
Normal file
27
core/photo_mode/ui/photo_gallery.gd
Normal file
@@ -0,0 +1,27 @@
|
||||
extends Control
|
||||
|
||||
@export var photo_scene: PackedScene
|
||||
|
||||
@onready var grid_container: GridContainer = $%PhotoGrid
|
||||
|
||||
func _ready() -> void:
|
||||
CollectionManager.on_photo_saved.connect(_create_photo_thumbnail)
|
||||
load_gallery()
|
||||
|
||||
func load_gallery() -> void:
|
||||
for child in grid_container.get_children():
|
||||
child.queue_free()
|
||||
|
||||
var saved_photos = CollectionManager.saved_photos
|
||||
|
||||
for file_path in saved_photos:
|
||||
if FileAccess.file_exists(file_path):
|
||||
_create_photo_thumbnail(file_path)
|
||||
|
||||
func _create_photo_thumbnail(file_path: String) -> void:
|
||||
var image = Image.load_from_file(file_path)
|
||||
if image:
|
||||
var photo: Photo = photo_scene.instantiate()
|
||||
var texture = ImageTexture.create_from_image(image)
|
||||
photo.setup(texture)
|
||||
grid_container.add_child(photo)
|
||||
1
core/photo_mode/ui/photo_gallery.gd.uid
Normal file
1
core/photo_mode/ui/photo_gallery.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://k4iqrlkbjppl
|
||||
50
core/photo_mode/ui/photo_gallery.tscn
Normal file
50
core/photo_mode/ui/photo_gallery.tscn
Normal file
@@ -0,0 +1,50 @@
|
||||
[gd_scene format=3 uid="uid://b6r787sik5yil"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://k4iqrlkbjppl" path="res://core/photo_mode/ui/photo_gallery.gd" id="1_bp5uf"]
|
||||
[ext_resource type="PackedScene" uid="uid://cvus62qkop3qi" path="res://core/photo_mode/ui/photo.tscn" id="2_45wok"]
|
||||
|
||||
[node name="PhotoGallery" type="Control" unique_id=354419843]
|
||||
layout_mode = 3
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_bp5uf")
|
||||
photo_scene = ExtResource("2_45wok")
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="." unique_id=640179265]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -350.0
|
||||
offset_top = -350.0
|
||||
offset_right = 350.0
|
||||
offset_bottom = 350.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer" unique_id=125147979]
|
||||
layout_mode = 2
|
||||
theme_override_constants/margin_left = 12
|
||||
theme_override_constants/margin_top = 12
|
||||
theme_override_constants/margin_right = 12
|
||||
theme_override_constants/margin_bottom = 12
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/MarginContainer" unique_id=348576028]
|
||||
layout_mode = 2
|
||||
draw_focus_border = true
|
||||
|
||||
[node name="PhotoGrid" type="GridContainer" parent="PanelContainer/MarginContainer/ScrollContainer" unique_id=1187865988]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 6
|
||||
size_flags_vertical = 2
|
||||
theme_override_constants/h_separation = 12
|
||||
theme_override_constants/v_separation = 12
|
||||
columns = 3
|
||||
31
core/radio/radio.gd
Normal file
31
core/radio/radio.gd
Normal file
@@ -0,0 +1,31 @@
|
||||
extends AudioStreamPlayer
|
||||
|
||||
class_name Radio
|
||||
|
||||
@export var playlist: Array[AudioStream] = []
|
||||
var current_track_index: int = 0
|
||||
|
||||
func _ready():
|
||||
finished.connect(next_track)
|
||||
|
||||
func play_track(index: int = current_track_index):
|
||||
if playlist.is_empty():
|
||||
return
|
||||
|
||||
current_track_index = posmod(index, playlist.size())
|
||||
stream = playlist[current_track_index]
|
||||
play()
|
||||
stream_paused = false
|
||||
|
||||
func next_track():
|
||||
play_track(current_track_index + 1)
|
||||
|
||||
func prev_track():
|
||||
play_track(current_track_index - 1)
|
||||
|
||||
func toggle_pause():
|
||||
stream_paused = !stream_paused
|
||||
|
||||
func stop_radio():
|
||||
stop()
|
||||
stream_paused = false
|
||||
1
core/radio/radio.gd.uid
Normal file
1
core/radio/radio.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bwrgh6xlvhqch
|
||||
7
core/radio/radio.tscn
Normal file
7
core/radio/radio.tscn
Normal file
@@ -0,0 +1,7 @@
|
||||
[gd_scene format=3 uid="uid://cpeyt1dgrtglc"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bwrgh6xlvhqch" path="res://core/radio/radio.gd" id="1_2akjj"]
|
||||
|
||||
[node name="Radio" type="AudioStreamPlayer" unique_id=1234112225]
|
||||
bus = &"Music"
|
||||
script = ExtResource("1_2akjj")
|
||||
15
default_bus_layout.tres
Normal file
15
default_bus_layout.tres
Normal file
@@ -0,0 +1,15 @@
|
||||
[gd_resource type="AudioBusLayout" format=3 uid="uid://cqvx62pwvvboj"]
|
||||
|
||||
[resource]
|
||||
bus/1/name = &"Music"
|
||||
bus/1/solo = false
|
||||
bus/1/mute = false
|
||||
bus/1/bypass_fx = false
|
||||
bus/1/volume_db = 0.0
|
||||
bus/1/send = &"Master"
|
||||
bus/2/name = &"SFX"
|
||||
bus/2/solo = false
|
||||
bus/2/mute = false
|
||||
bus/2/bypass_fx = false
|
||||
bus/2/volume_db = 0.0
|
||||
bus/2/send = &"Master"
|
||||
92
docs/gyms/ai/gym_ai.tscn
Normal file
92
docs/gyms/ai/gym_ai.tscn
Normal file
@@ -0,0 +1,92 @@
|
||||
[gd_scene format=3 uid="uid://dqvrhiqgkd3w1"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://clx701xdwelgx" path="res://core/ai/agents/base/ai_base.tscn" id="1_a2xtd"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_optuv"]
|
||||
vertices = PackedVector3Array(10.984741, 0.25012434, -1.0140381, 11.234741, 0.25012434, 0.23596191, 19.484741, 0.25012434, 0.23596191, 19.484741, 0.25012434, -19.514038, 9.234741, 0.25012434, -1.0140381, -19.515259, 0.25012434, -19.514038, -19.515259, 0.25012434, -0.014038086, 8.984741, 0.25012434, -0.014038086, 10.984741, 0.25012434, 1.2359619, 19.484741, 0.25012434, 19.235962, 9.234741, 0.25012434, 1.2359619, -19.515259, 0.25012434, 19.235962)
|
||||
polygons = [PackedInt32Array(1, 0, 2), PackedInt32Array(2, 0, 3), PackedInt32Array(6, 5, 4), PackedInt32Array(4, 5, 3), PackedInt32Array(3, 0, 4), PackedInt32Array(4, 7, 6), PackedInt32Array(1, 2, 8), PackedInt32Array(8, 2, 9), PackedInt32Array(6, 10, 11), PackedInt32Array(11, 10, 9), PackedInt32Array(10, 8, 9), PackedInt32Array(6, 7, 10)]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_optuv"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_xtjak"]
|
||||
size = Vector3(1.9942131, 0.09710693, 1.984024)
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_lmjyn"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_lmjyn"]
|
||||
|
||||
[sub_resource type="Environment" id="Environment_lmjyn"]
|
||||
|
||||
[node name="GymAI" type="Node3D" unique_id=868339787]
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="." unique_id=774907858]
|
||||
navigation_mesh = SubResource("NavigationMesh_optuv")
|
||||
|
||||
[node name="Floor" type="MeshInstance3D" parent="NavigationRegion3D" unique_id=1976415311]
|
||||
transform = Transform3D(20, 0, 0, 0, 20, 0, 0, 0, 20, 0, -0.83473957, 0)
|
||||
mesh = SubResource("PlaneMesh_optuv")
|
||||
|
||||
[node name="StaticBody3D" type="StaticBody3D" parent="NavigationRegion3D/Floor" unique_id=2007477719]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="NavigationRegion3D/Floor/StaticBody3D" unique_id=1446628130]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0036563873, -0.009703338, -0.00868988)
|
||||
shape = SubResource("BoxShape3D_xtjak")
|
||||
|
||||
[node name="Obstacle" type="MeshInstance3D" parent="NavigationRegion3D" unique_id=710701082]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.148018, 0.06508446, 0)
|
||||
mesh = SubResource("BoxMesh_lmjyn")
|
||||
|
||||
[node name="StaticBody3D" type="StaticBody3D" parent="NavigationRegion3D/Obstacle" unique_id=67152580]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="NavigationRegion3D/Obstacle/StaticBody3D" unique_id=1663742898]
|
||||
shape = SubResource("BoxShape3D_lmjyn")
|
||||
|
||||
[node name="AIBase" parent="." unique_id=1228675528 instance=ExtResource("1_a2xtd")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.48246834, 0.21202153, 0.11262059)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="." unique_id=1148396057]
|
||||
transform = Transform3D(-2.0613477e-08, 0.8818225, -0.47158146, 3.854569e-08, 0.47158146, 0.8818225, 1, -3.5527137e-15, -4.371139e-08, -18.21907, 28.71355, 0)
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1772424900]
|
||||
environment = SubResource("Environment_lmjyn")
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=269230449]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.17952333, 0.98375374, 0, -0.98375374, 0.17952333, 0, 18.920979, 0)
|
||||
|
||||
[node name="Control" type="Control" parent="." unique_id=1072240389]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="Control" unique_id=1647272132]
|
||||
layout_mode = 0
|
||||
offset_left = 50.0
|
||||
offset_top = 50.0
|
||||
offset_right = 400.0
|
||||
offset_bottom = 827.0
|
||||
|
||||
[node name="Label" type="Label" parent="Control/PanelContainer" unique_id=272421245]
|
||||
custom_minimum_size = Vector2(1, 1)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 1
|
||||
text = "System Logic:
|
||||
- The NPC uses a finite state machine to switch between behaviors.
|
||||
- State logic runs during physics updates, while movement is handled by the agent through NavigationAgent3D.
|
||||
|
||||
AI States:
|
||||
- IdleState: The agent waits in place for the duration defined by wait_time.
|
||||
- PatrolState: The agent selects a valid random destination and moves toward it.
|
||||
|
||||
Core Components:
|
||||
- NavigationAgent3D: Calculates the path and reports when the destination has been reached.
|
||||
- PatrolRadiusShape: Defines the random movement area used when choosing the next patrol point.
|
||||
- StateMachine: Initializes the available states and handles transitions between them.
|
||||
|
||||
Parameters:
|
||||
- Speed: Movement speed of the agent.
|
||||
- Wait Time: Delay in seconds on the IdleState node.
|
||||
- Area Radius: Radius of the SphereShape3D used by PatrolRadiusShape."
|
||||
autowrap_mode = 2
|
||||
7
docs/gyms/photo_mode/gym_photo_mode.gd
Normal file
7
docs/gyms/photo_mode/gym_photo_mode.gd
Normal file
@@ -0,0 +1,7 @@
|
||||
extends Node3D
|
||||
|
||||
@onready var gallery: Control = $%Gallery
|
||||
|
||||
|
||||
func _on_button_gallery_pressed() -> void:
|
||||
gallery.visible = !gallery.visible
|
||||
1
docs/gyms/photo_mode/gym_photo_mode.gd.uid
Normal file
1
docs/gyms/photo_mode/gym_photo_mode.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://7oglx4br38d5
|
||||
138
docs/gyms/photo_mode/gym_photo_mode.tscn
Normal file
138
docs/gyms/photo_mode/gym_photo_mode.tscn
Normal file
@@ -0,0 +1,138 @@
|
||||
[gd_scene format=3 uid="uid://bwc8slnbu7dmn"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://7oglx4br38d5" path="res://docs/gyms/photo_mode/gym_photo_mode.gd" id="1_cl1h5"]
|
||||
[ext_resource type="PackedScene" uid="uid://vni5kjalum6d" path="res://core/photo_mode/runtime/photo_mode_controller.tscn" id="2_q5kgc"]
|
||||
[ext_resource type="PackedScene" uid="uid://bmkxt6btcx8qr" path="res://core/photo_mode/runtime/collectible.tscn" id="3_734hf"]
|
||||
[ext_resource type="Texture2D" uid="uid://c3grftlmap4q5" path="res://tgcc/chunk/prop/tree/leaf1_alpha.png" id="4_00joj"]
|
||||
[ext_resource type="Script" uid="uid://bj34o0org55ei" path="res://core/photo_mode/data/collectible_resource.gd" id="5_crfij"]
|
||||
[ext_resource type="PackedScene" uid="uid://bvw086glfpcba" path="res://core/photo_mode/ui/collectible_gallery.tscn" id="6_6aab5"]
|
||||
[ext_resource type="PackedScene" uid="uid://b6r787sik5yil" path="res://core/photo_mode/ui/photo_gallery.tscn" id="7_tb1ii"]
|
||||
|
||||
[sub_resource type="Environment" id="Environment_48mla"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_hh1ka"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_ynvi2"]
|
||||
size = Vector3(1.9942131, 0.09710693, 1.984024)
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ynvi2"]
|
||||
script = ExtResource("5_crfij")
|
||||
id = &"gatto"
|
||||
title = "Gatto"
|
||||
image = ExtResource("4_00joj")
|
||||
metadata/_custom_type_script = "uid://bj34o0org55ei"
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_hh1ka"]
|
||||
|
||||
[node name="GymPhotoMode" type="Node3D" unique_id=1314600330]
|
||||
script = ExtResource("1_cl1h5")
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=213183287]
|
||||
environment = SubResource("Environment_48mla")
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1274975837]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.17952333, 0.98375374, 0, -0.98375374, 0.17952333, 0, 18.920979, 0)
|
||||
|
||||
[node name="Floor" type="MeshInstance3D" parent="." unique_id=958865480]
|
||||
transform = Transform3D(20, 0, 0, 0, 20, 0, 0, 0, 20, 0, -0.83473957, 0)
|
||||
mesh = SubResource("PlaneMesh_hh1ka")
|
||||
|
||||
[node name="StaticBody3D" type="StaticBody3D" parent="Floor" unique_id=2096983240]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor/StaticBody3D" unique_id=188185045]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0036563873, -0.009703338, -0.00868988)
|
||||
shape = SubResource("BoxShape3D_ynvi2")
|
||||
|
||||
[node name="PhotoModeController" parent="." unique_id=695158870 node_paths=PackedStringArray("rotation_target") instance=ExtResource("2_q5kgc")]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.49999994, 0.8660254, 0, -0.8660254, 0.49999994, 0, 30, 20)
|
||||
movement_bounds = AABB(-5, -5, -5, 10, 10, 10)
|
||||
rotation_target = NodePath("../Node3D")
|
||||
|
||||
[node name="Node3D" type="Node3D" parent="." unique_id=570786250]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0)
|
||||
|
||||
[node name="Node3D2" type="Node3D" parent="." unique_id=15037296]
|
||||
|
||||
[node name="Collectible" parent="Node3D2" unique_id=1229019813 instance=ExtResource("3_734hf")]
|
||||
collectible_data = SubResource("Resource_ynvi2")
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Node3D2" unique_id=553040412]
|
||||
mesh = SubResource("BoxMesh_hh1ka")
|
||||
|
||||
[node name="Control" type="Control" parent="." unique_id=1802496396]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="ButtonGallery" type="Button" parent="Control" unique_id=539195532]
|
||||
layout_mode = 0
|
||||
offset_left = 50.0
|
||||
offset_top = 50.0
|
||||
offset_right = 163.0
|
||||
offset_bottom = 81.0
|
||||
text = "Menu"
|
||||
|
||||
[node name="Gallery" type="HSplitContainer" parent="Control" unique_id=1388833682]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = 420.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="CollectibleGallery" parent="Control/Gallery" unique_id=354419843 instance=ExtResource("6_6aab5")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="PhotoGallery" parent="Control/Gallery" unique_id=263414560 instance=ExtResource("7_tb1ii")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="Control" unique_id=2015953740]
|
||||
layout_mode = 0
|
||||
offset_left = 50.0
|
||||
offset_top = 150.0
|
||||
offset_right = 400.0
|
||||
offset_bottom = 927.0
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="Control/PanelContainer" unique_id=1474258594]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Control/PanelContainer/ScrollContainer" unique_id=1982569320]
|
||||
custom_minimum_size = Vector2(1, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "System Logic:
|
||||
- The system allows players to toggle a free camera mode to photograph and collect museum items.
|
||||
- Game Pause: Activating the mode pauses the SceneTree, freezing the world while allowing the camera to remain functional.
|
||||
- Taking a photo saves the captured image to disk and checks which collectibles are visible and unobstructed before unlocking them.
|
||||
- CollectionManager acts as a global singleton that tracks unlocked collectibles, saved photos, and the data used by the UI.
|
||||
|
||||
Photo Mode Actions:
|
||||
- Toggle Mode(P): Switches between normal gameplay and the photo camera, capturing or releasing the mouse, and toggles the global pause state.
|
||||
- Rotate(Mouse): The camera orbits around the configured target while photo mode is active.
|
||||
- Pan(Input Actions): The camera can be moved horizontally and vertically within the configured bounds.
|
||||
- Capture(F): Saves the current frame and performs frustum and raycast checks against collectibles in view.
|
||||
|
||||
Core Components:
|
||||
- PhotoModeController: Manages camera inputs, movement logic, and the photo-taking process.
|
||||
- Collectible: An Area3D node placed on objects to make them identifiable by the camera.
|
||||
- CollectionManager: Handles the logic for unlocking items and provides data to the UI.
|
||||
- CollectibleGallery: Displays all collectibles and visually highlights the unlocked ones.
|
||||
- PhotoGallery: Displays the photos saved by the player during the session.
|
||||
|
||||
Parameters:
|
||||
- Pan & Rotation Speed: Defines how fast the camera moves and rotates.
|
||||
- Movement Bounds: An AABB that restricts the camera's panning area.
|
||||
- Collectible Data: Resource files containing the ID, title, and image for each item.
|
||||
- Library: A central list of all CollectibleResources registered in the game."
|
||||
autowrap_mode = 2
|
||||
|
||||
[connection signal="pressed" from="Control/ButtonGallery" to="." method="_on_button_gallery_pressed"]
|
||||
35
docs/gyms/radio/gym_radio.gd
Normal file
35
docs/gyms/radio/gym_radio.gd
Normal file
@@ -0,0 +1,35 @@
|
||||
extends Node3D
|
||||
|
||||
@onready var radio: Radio = $%Radio
|
||||
@onready var button_pause_resume: Button = $%Button_Pause_Resume
|
||||
@onready var settings_menu: SettingsMenu = $%SettingsMenu
|
||||
|
||||
func _on_button_play_pressed() -> void:
|
||||
if !radio.playing:
|
||||
radio.play_track()
|
||||
|
||||
|
||||
func _on_button_pause_pressed() -> void:
|
||||
radio.toggle_pause()
|
||||
if !button_pause_resume:
|
||||
button_pause_resume = $%Button_Pause_Resume
|
||||
if radio.stream_paused:
|
||||
button_pause_resume.text = "Resume"
|
||||
else:
|
||||
button_pause_resume.text = "Pause"
|
||||
|
||||
|
||||
func _on_button_stop_pressed() -> void:
|
||||
radio.stop_radio()
|
||||
|
||||
|
||||
func _on_button_next_pressed() -> void:
|
||||
radio.next_track()
|
||||
|
||||
|
||||
func _on_button_previous_pressed() -> void:
|
||||
radio.prev_track()
|
||||
|
||||
|
||||
func _on_button_settings_menu_pressed() -> void:
|
||||
settings_menu.visible = !settings_menu.visible
|
||||
1
docs/gyms/radio/gym_radio.gd.uid
Normal file
1
docs/gyms/radio/gym_radio.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ew4b78u5tkiu
|
||||
104
docs/gyms/radio/gym_radio.tscn
Normal file
104
docs/gyms/radio/gym_radio.tscn
Normal file
@@ -0,0 +1,104 @@
|
||||
[gd_scene format=3 uid="uid://bdkdhn1oallke"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://cpeyt1dgrtglc" path="res://core/radio/radio.tscn" id="1_8yomj"]
|
||||
[ext_resource type="Script" uid="uid://ew4b78u5tkiu" path="res://docs/gyms/radio/gym_radio.gd" id="1_h5r8c"]
|
||||
[ext_resource type="AudioStream" uid="uid://70cc8she43re" path="res://docs/gyms/radio/lofi_01.ogg" id="3_ltpvc"]
|
||||
[ext_resource type="PackedScene" uid="uid://caqf471x0kttc" path="res://core/audio/settings/settings_menu.tscn" id="4_8pw2j"]
|
||||
|
||||
[node name="GymRadio" type="Node3D" unique_id=204859062]
|
||||
script = ExtResource("1_h5r8c")
|
||||
|
||||
[node name="Radio" parent="." unique_id=1234112225 instance=ExtResource("1_8yomj")]
|
||||
unique_name_in_owner = true
|
||||
playlist = Array[AudioStream]([ExtResource("3_ltpvc")])
|
||||
|
||||
[node name="Control" type="Control" parent="." unique_id=1232082176]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="SettingsMenu" parent="Control" unique_id=1639777294 instance=ExtResource("4_8pw2j")]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
|
||||
[node name="VBoxContainer2" type="VBoxContainer" parent="Control" unique_id=2092627240]
|
||||
layout_mode = 1
|
||||
anchors_preset = 9
|
||||
anchor_bottom = 1.0
|
||||
offset_right = 229.0
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="Control/VBoxContainer2" unique_id=2097365775]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Button_Play" type="Button" parent="Control/VBoxContainer2/VBoxContainer" unique_id=1422696340]
|
||||
layout_mode = 2
|
||||
text = "Play"
|
||||
|
||||
[node name="Button_Pause_Resume" type="Button" parent="Control/VBoxContainer2/VBoxContainer" unique_id=2016690081]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Pause"
|
||||
|
||||
[node name="Button_Stop" type="Button" parent="Control/VBoxContainer2/VBoxContainer" unique_id=61861870]
|
||||
layout_mode = 2
|
||||
text = "Stop"
|
||||
|
||||
[node name="Button_Next" type="Button" parent="Control/VBoxContainer2/VBoxContainer" unique_id=957606385]
|
||||
layout_mode = 2
|
||||
text = "Next"
|
||||
|
||||
[node name="Button_Previous" type="Button" parent="Control/VBoxContainer2/VBoxContainer" unique_id=929072518]
|
||||
layout_mode = 2
|
||||
text = "Previous"
|
||||
|
||||
[node name="Button_SettingsMenu" type="Button" parent="Control/VBoxContainer2/VBoxContainer" unique_id=431867154]
|
||||
layout_mode = 2
|
||||
text = "SettingsMenu"
|
||||
|
||||
[node name="PanelContainer" type="PanelContainer" parent="Control/VBoxContainer2" unique_id=1558442050]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="Control/VBoxContainer2/PanelContainer" unique_id=7789304]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Control/VBoxContainer2/PanelContainer/ScrollContainer" unique_id=2043293564]
|
||||
custom_minimum_size = Vector2(1, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 1
|
||||
text = "System Logic:
|
||||
- The system is an extension of AudioStreamPlayer designed to manage sequential audio playback.
|
||||
- It automatically triggers the next track in the sequence when the current one finishes via the finished signal.
|
||||
|
||||
Core Functionality:
|
||||
- Playlist Management: Stores a list of AudioStream resources and tracks the current song index.
|
||||
- Track Navigation: Allows cycling forward and backward through the playlist with index wrapping (loops back to start/end).
|
||||
- Playback Control: Supports jumping to specific tracks, toggling the pause state, and stopping the stream.
|
||||
- Audio Settings: If the Music bus exists, the Settings menu can be used to test and adjust playback volume.
|
||||
|
||||
Key Methods:
|
||||
- play_track: Loads a specific stream from the playlist and begins playback.
|
||||
- next_track / prev_track: Increments or decrements the index to navigate the playlist.
|
||||
- toggle_pause: Resumes or pauses the current stream without resetting its position.
|
||||
|
||||
Adjustable Parameters:
|
||||
- Playlist: An Array in the inspector where you can assign one or more AudioStream resources."
|
||||
autowrap_mode = 2
|
||||
|
||||
[connection signal="pressed" from="Control/VBoxContainer2/VBoxContainer/Button_Play" to="." method="_on_button_play_pressed"]
|
||||
[connection signal="pressed" from="Control/VBoxContainer2/VBoxContainer/Button_Pause_Resume" to="." method="_on_button_pause_pressed"]
|
||||
[connection signal="pressed" from="Control/VBoxContainer2/VBoxContainer/Button_Stop" to="." method="_on_button_stop_pressed"]
|
||||
[connection signal="pressed" from="Control/VBoxContainer2/VBoxContainer/Button_Next" to="." method="_on_button_next_pressed"]
|
||||
[connection signal="pressed" from="Control/VBoxContainer2/VBoxContainer/Button_Previous" to="." method="_on_button_previous_pressed"]
|
||||
[connection signal="pressed" from="Control/VBoxContainer2/VBoxContainer/Button_SettingsMenu" to="." method="_on_button_settings_menu_pressed"]
|
||||
BIN
docs/gyms/radio/lofi_01.ogg
Normal file
BIN
docs/gyms/radio/lofi_01.ogg
Normal file
Binary file not shown.
19
docs/gyms/radio/lofi_01.ogg.import
Normal file
19
docs/gyms/radio/lofi_01.ogg.import
Normal file
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://70cc8she43re"
|
||||
path="res://.godot/imported/lofi_01.ogg-0aacd597266806080412021811923091.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/gyms/radio/lofi_01.ogg"
|
||||
dest_files=["res://.godot/imported/lofi_01.ogg-0aacd597266806080412021811923091.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
@@ -9,7 +9,6 @@
|
||||
[ext_resource type="PackedScene" uid="uid://crlk31ecl480n" path="res://tgcc/chunk/countryside/scene/chunk_country_corner_03.tscn" id="7_4elh6"]
|
||||
[ext_resource type="PackedScene" uid="uid://b8blm6bwintf7" path="res://tgcc/chunk/countryside/scene/chunk_country_empty_01.tscn" id="7_xgfli"]
|
||||
[ext_resource type="PackedScene" uid="uid://brpp7fe5noq8v" path="res://tgcc/chunk/countryside/scene/chunk_country_cross_3_01.tscn" id="8_hvd8d"]
|
||||
[ext_resource type="PackedScene" uid="uid://cjv1e8pc6gde1" path="res://tgcc/chunk/countryside/scene/chunk_country_corner_01.tscn" id="8_nurqm"]
|
||||
[ext_resource type="PackedScene" uid="uid://cu2chsjh8wuvp" path="res://tgcc/chunk/countryside/scene/chunk_country_straight_02.tscn" id="9_51cxd"]
|
||||
[ext_resource type="PackedScene" uid="uid://dqoai3665vb0a" path="res://tgcc/chunk/countryside/scene/chunk_country_corner_02.tscn" id="9_q6kbb"]
|
||||
[ext_resource type="PackedScene" uid="uid://cjv1e8pc6gde1" path="res://tgcc/chunk/countryside/scene/chunk_country_corner_01.tscn" id="10_ufarv"]
|
||||
@@ -28,13 +27,26 @@
|
||||
[ext_resource type="AudioStream" uid="uid://creenugno7hm" path="res://core/daynight/sounds/thunder_4.mp3" id="18_lfsx4"]
|
||||
[ext_resource type="PackedScene" uid="uid://pxmcy0lhne5d" path="res://tgcc/chunk/countryside/scene/chunk_country_straight_03.tscn" id="19_ne4de"]
|
||||
[ext_resource type="AudioStream" uid="uid://bm6dq4jwsbxf6" path="res://core/daynight/sounds/thunder_5.mp3" id="19_niwdr"]
|
||||
[ext_resource type="PackedScene" uid="uid://bs3dkwcc8w2uk" path="res://tgcc/chunk/river/scene/chunk_r_l_1.tscn" id="20_q6kbb"]
|
||||
[ext_resource type="PackedScene" uid="uid://bs3dkwcc8w2uk" path="res://tgcc/chunk/river/scene/chunk_river_curve_1.tscn" id="20_q6kbb"]
|
||||
[ext_resource type="AudioStream" uid="uid://byuxpukhy72n8" path="res://core/daynight/sounds/rain_1.mp3" id="20_quqod"]
|
||||
[ext_resource type="PackedScene" uid="uid://1c1ion0qnho4" path="res://tgcc/map/map_1/map_1.tscn" id="20_xkcqp"]
|
||||
[ext_resource type="PackedScene" uid="uid://btipd6wev016d" path="res://tgcc/chunk/river/scene/chunk_r_r_1.tscn" id="21_81wux"]
|
||||
[ext_resource type="PackedScene" uid="uid://btipd6wev016d" path="res://tgcc/chunk/river/scene/chunk_river_straight_1.tscn" id="21_81wux"]
|
||||
[ext_resource type="AudioStream" uid="uid://h5yhjn1x3f4j" path="res://core/daynight/sounds/rain_2.mp3" id="21_appab"]
|
||||
[ext_resource type="PackedScene" uid="uid://deaxxlxdipqvx" path="res://tgcc/chunk/river/scene/chunk_river_end_1.tscn" id="21_ky1rt"]
|
||||
[ext_resource type="PackedScene" uid="uid://ct3084nflycla" path="res://tgcc/chunk/river/scene/chunk_river_mix1_1.tscn" id="22_5g563"]
|
||||
[ext_resource type="AudioStream" uid="uid://elrjw0smm0cj" path="res://core/daynight/sounds/rain_3.mp3" id="22_yime3"]
|
||||
[ext_resource type="Script" uid="uid://cx2tlvxhvatj5" path="res://docs/museums/daynight/control.gd" id="23_ou3jn"]
|
||||
[ext_resource type="PackedScene" uid="uid://bhvmmw8d8vns5" path="res://tgcc/chunk/river/scene/chunk_river_mix2_1.tscn" id="23_tbmwr"]
|
||||
[ext_resource type="PackedScene" uid="uid://cqe4t842io22i" path="res://tgcc/chunk/river/scene/chunk_river_cross_1.tscn" id="24_ne4de"]
|
||||
[ext_resource type="PackedScene" uid="uid://rjvefmcd4bpo" path="res://tgcc/chunk/river/scene/chunk_river_mix3_1.tscn" id="25_5g563"]
|
||||
[ext_resource type="PackedScene" uid="uid://c6vpwol3k384y" path="res://tgcc/chunk/river/scene/chunk_river_mix4_1.tscn" id="26_7ykwn"]
|
||||
[ext_resource type="PackedScene" uid="uid://cd3iyj71hkgcr" path="res://tgcc/chunk/river/scene/chunk_river_mix5_1.tscn" id="27_d1gyr"]
|
||||
[ext_resource type="PackedScene" uid="uid://bh8kbw07bsu6n" path="res://tgcc/chunk/river/scene/chunk_river_mix6_1.tscn" id="28_3ldqx"]
|
||||
[ext_resource type="PackedScene" uid="uid://ce6qvpb27fdpo" path="res://tgcc/chunk/river/scene/chunk_river_curve_2.tscn" id="29_d1gyr"]
|
||||
[ext_resource type="PackedScene" uid="uid://7063xk3bwboc" path="res://tgcc/chunk/river/scene/chunk_river_straight_4.tscn" id="30_3ldqx"]
|
||||
[ext_resource type="PackedScene" uid="uid://ccgd3uy68r88h" path="res://tgcc/chunk/river/scene/chunk_river_curve_3.tscn" id="31_dsw5k"]
|
||||
[ext_resource type="PackedScene" uid="uid://mpgyaho52lii" path="res://tgcc/chunk/river/scene/chunk_river_straight_5.tscn" id="32_03yl6"]
|
||||
[ext_resource type="PackedScene" uid="uid://q26mkh3cupic" path="res://tgcc/chunk/river/scene/chunk_river_cross_2.tscn" id="33_rlemp"]
|
||||
|
||||
[sub_resource type="FastNoiseLite" id="FastNoiseLite_wjpfq"]
|
||||
fractal_lacunarity = 1.915
|
||||
@@ -114,7 +126,7 @@ compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_q52t
|
||||
[sub_resource type="Resource" id="Resource_3qrd0"]
|
||||
script = ExtResource("6_s3jnv")
|
||||
name = "countryside"
|
||||
available_chunks = Array[PackedScene]([ExtResource("7_xgfli"), ExtResource("8_nurqm"), ExtResource("9_q6kbb"), ExtResource("7_4elh6"), ExtResource("8_hvd8d"), ExtResource("12_81wux"), ExtResource("13_1ugwu"), ExtResource("10_ufarv"), ExtResource("15_ky1rt"), ExtResource("16_5g563"), ExtResource("17_tbmwr"), ExtResource("9_51cxd"), ExtResource("19_ne4de"), ExtResource("20_q6kbb"), ExtResource("21_81wux")])
|
||||
available_chunks = Array[PackedScene]([ExtResource("7_xgfli"), ExtResource("10_ufarv"), ExtResource("9_q6kbb"), ExtResource("7_4elh6"), ExtResource("8_hvd8d"), ExtResource("12_81wux"), ExtResource("13_1ugwu"), ExtResource("10_ufarv"), ExtResource("15_ky1rt"), ExtResource("16_5g563"), ExtResource("17_tbmwr"), ExtResource("9_51cxd"), ExtResource("19_ne4de"), ExtResource("20_q6kbb"), ExtResource("21_81wux"), ExtResource("21_ky1rt"), ExtResource("22_5g563"), ExtResource("23_tbmwr"), ExtResource("24_ne4de"), ExtResource("25_5g563"), ExtResource("26_7ykwn"), ExtResource("27_d1gyr"), ExtResource("28_3ldqx"), ExtResource("29_d1gyr"), ExtResource("30_3ldqx"), ExtResource("31_dsw5k"), ExtResource("32_03yl6"), ExtResource("33_rlemp")])
|
||||
metadata/_custom_type_script = "uid://wv6kcqkibium"
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_pypsn"]
|
||||
|
||||
@@ -1,156 +1,8 @@
|
||||
[gd_scene format=3 uid="uid://0kgjaqijaqku"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://core/daynight/trunk_shader.gdshader" id="2_0y2rr"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_m6haf"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("2_0y2rr")
|
||||
shader_parameter/albedo_color = Color(0.08235294, 0.105882354, 0.10980392, 1)
|
||||
shader_parameter/use_texture = true
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 10.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_duyun"]
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_w0ibq"]
|
||||
size = Vector3(0.2, 0.2, 2)
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_fttrp"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("2_0y2rr")
|
||||
shader_parameter/albedo_color = Color(0.08061289, 0.10506997, 0.11154168, 1)
|
||||
shader_parameter/use_texture = true
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 10.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_hb1ej"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_pp4r2"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("2_0y2rr")
|
||||
shader_parameter/albedo_color = Color(0.2584173, 0.19781098, 0.10103748, 1)
|
||||
shader_parameter/use_texture = true
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 10.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_pur2n"]
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_ysg1u"]
|
||||
size = Vector3(2.5, 0.15, 0.5)
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_x2uev"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("2_0y2rr")
|
||||
shader_parameter/albedo_color = Color(0.25882354, 0.19607843, 0.101960786, 1)
|
||||
shader_parameter/use_texture = true
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 10.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_qv8m2"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_5u2u8"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("2_0y2rr")
|
||||
shader_parameter/albedo_color = Color(0.22494644, 0.08867701, 0.01631488, 1)
|
||||
shader_parameter/use_texture = false
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 10.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_m6haf"]
|
||||
size = Vector3(3.705, 0.2, 1.92)
|
||||
[ext_resource type="PackedScene" uid="uid://dtee3qewqnqpm" path="res://tgcc/train/rail.tscn" id="2_u53q0"]
|
||||
|
||||
[node name="rails" type="Node3D" unique_id=1464572050 groups=["weather_node", "wind_node"]]
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1040579890]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.7, 0.214, 0)
|
||||
material_override = SubResource("ShaderMaterial_m6haf")
|
||||
material_overlay = SubResource("ShaderMaterial_duyun")
|
||||
mesh = SubResource("BoxMesh_w0ibq")
|
||||
|
||||
[node name="MeshInstance3D2" type="MeshInstance3D" parent="." unique_id=1870708237]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.7, 0.214, 0)
|
||||
material_override = SubResource("ShaderMaterial_fttrp")
|
||||
material_overlay = SubResource("ShaderMaterial_hb1ej")
|
||||
mesh = SubResource("BoxMesh_w0ibq")
|
||||
|
||||
[node name="MeshInstance3D3" type="MeshInstance3D" parent="." unique_id=170245195]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0.5)
|
||||
material_override = SubResource("ShaderMaterial_pp4r2")
|
||||
material_overlay = SubResource("ShaderMaterial_pur2n")
|
||||
mesh = SubResource("BoxMesh_ysg1u")
|
||||
|
||||
[node name="MeshInstance3D4" type="MeshInstance3D" parent="." unique_id=1389288735]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, -0.5)
|
||||
material_override = SubResource("ShaderMaterial_x2uev")
|
||||
material_overlay = SubResource("ShaderMaterial_qv8m2")
|
||||
mesh = SubResource("BoxMesh_ysg1u")
|
||||
|
||||
[node name="MeshInstance3D5" type="MeshInstance3D" parent="." unique_id=1376217081]
|
||||
visible = false
|
||||
material_override = SubResource("ShaderMaterial_5u2u8")
|
||||
mesh = SubResource("BoxMesh_m6haf")
|
||||
[node name="rail" parent="." unique_id=651719760 instance=ExtResource("2_u53q0")]
|
||||
transform = Transform3D(1.53, 0, 0, 0, 1.53, 0, 0, 0, 1.53, 0, 0, 0)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://cl2ast2tk7ifw" path="res://tgcc/chunk/railway/scene/chunk_railway_curve.tscn" id="14_ttcft"]
|
||||
[ext_resource type="PackedScene" uid="uid://cewdxvcpqb53f" path="res://tgcc/chunk/railway/scene/chunk_railway_station_doubleside.tscn" id="15_oi62p"]
|
||||
[ext_resource type="PackedScene" uid="uid://bup6gwlxos0w2" path="res://tgcc/chunk/railway/scene/chunk_railway_station_hero.tscn" id="16_birpm"]
|
||||
[ext_resource type="PackedScene" uid="uid://bup6gwlxos0w2" path="res://tgcc/chunk/railway/hero/chunk_railway_station_hero.tscn" id="16_birpm"]
|
||||
[ext_resource type="PackedScene" uid="uid://d3pcshw2bioic" path="res://tgcc/chunk/railway/scene/chunk_railway_station_oneside.tscn" id="17_esgqd"]
|
||||
[ext_resource type="PackedScene" uid="uid://bqxpqhla2kogq" path="res://tgcc/chunk/railway/scene/chunk_railway_straight.tscn" id="18_5ivsh"]
|
||||
[ext_resource type="PackedScene" uid="uid://c3ub6rj0tlt6q" path="res://tgcc/chunk/railway/scene/chunk_railway_straight_2.tscn" id="19_yd4l5"]
|
||||
|
||||
@@ -19,6 +19,9 @@ config/icon="uid://bfar1kk3pgq8f"
|
||||
[autoload]
|
||||
|
||||
UIEvents="*uid://dehu28iq27mbn"
|
||||
GameState="*uid://b17g2w2g101o6"
|
||||
CollectionManager="*uid://c3kq1qddpm8tf"
|
||||
AudioManager="*uid://dcttbbavtwtsg"
|
||||
|
||||
[display]
|
||||
|
||||
@@ -34,6 +37,39 @@ weather_vegetables_node=""
|
||||
wind_node="Materials to apply wind"
|
||||
weather_node=""
|
||||
|
||||
[input]
|
||||
|
||||
photo_pan_left={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":65,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
photo_pan_right={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
photo_pan_up={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
photo_pan_down={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
take_photo={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":102,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
toggle_photo_mode={
|
||||
"deadzone": 0.2,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":80,"key_label":0,"unicode":112,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
|
||||
[physics]
|
||||
|
||||
3d/physics_engine="Jolt Physics"
|
||||
|
||||
@@ -4,9 +4,14 @@
|
||||
[ext_resource type="Script" uid="uid://dg2h4kbqe8j3m" path="res://core/biome_generator/chunk_info.gd" id="2_4d433"]
|
||||
[ext_resource type="Material" uid="uid://blqelpjvdv23j" path="res://tgcc/chunk/material/grassflat_chunk.tres" id="2_ewqv4"]
|
||||
[ext_resource type="Material" uid="uid://4xhpd6lust7w" path="res://tgcc/chunk/material/path_chunk.tres" id="3_4d433"]
|
||||
[ext_resource type="Script" uid="uid://dg6ngy4pmtsyc" path="res://core/biome_generator/prop_info.gd" id="3_ckjyx"]
|
||||
[ext_resource type="Material" uid="uid://ce0bdk3mx2xao" path="res://tgcc/chunk/material/water_chunk.tres" id="4_r06ll"]
|
||||
[ext_resource type="PackedScene" uid="uid://be1px5nxfr4hs" path="res://tgcc/chunk/prop/scarecrow/scarecrow.tscn" id="4_vtfy7"]
|
||||
[ext_resource type="PackedScene" uid="uid://chhdorj82bkus" path="res://tgcc/chunk/prop/scarecrow/scarecrow2.tscn" id="5_mm7rq"]
|
||||
[ext_resource type="Material" uid="uid://fnjxocmx16b7" path="res://tgcc/chunk/prop/grass/grass_chunk.tres" id="5_sddh0"]
|
||||
[ext_resource type="PackedScene" uid="uid://dn2b3f3nr6btn" path="res://tgcc/chunk/prop/scarecrow/scarecrow3.tscn" id="6_bpm3x"]
|
||||
[ext_resource type="Material" uid="uid://jygb1hcokks5" path="res://tgcc/chunk/prop/grass/grass_bank.tres" id="6_ckjyx"]
|
||||
[ext_resource type="PackedScene" uid="uid://cn2n7ehlt6hya" path="res://tgcc/chunk/prop/empty.tscn" id="7_mm7rq"]
|
||||
[ext_resource type="Material" uid="uid://bjrb33qwp1p43" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds.tres" id="7_y2fk3"]
|
||||
[ext_resource type="Material" uid="uid://0x17mj2v807r" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds2.tres" id="8_vtfy7"]
|
||||
[ext_resource type="PackedScene" uid="uid://bgb4pfflokl5s" path="res://tgcc/chunk/prop/pylon/pylon.tscn" id="10_r06ll"]
|
||||
@@ -52,22 +57,32 @@ have_lamppost = true
|
||||
connection_left = [NodePath("PaloLuce/sx")]
|
||||
connection_right = [NodePath("PaloLuce/dx")]
|
||||
|
||||
[node name="Argini_001" parent="." index="0" unique_id=439223507]
|
||||
[node name="Prop1" type="Marker3D" parent="." index="0" unique_id=1846012620]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 5.7180157, 0.35683155, -5.504174)
|
||||
script = ExtResource("3_ckjyx")
|
||||
available_props = Array[PackedScene]([ExtResource("4_vtfy7"), ExtResource("5_mm7rq"), ExtResource("6_bpm3x"), ExtResource("7_mm7rq")])
|
||||
|
||||
[node name="Prop2" type="Marker3D" parent="." index="1" unique_id=210098136]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -5.9134417, 0.35683155, 5.9683104)
|
||||
script = ExtResource("3_ckjyx")
|
||||
available_props = Array[PackedScene]([ExtResource("4_vtfy7"), ExtResource("5_mm7rq"), ExtResource("6_bpm3x"), ExtResource("7_mm7rq")])
|
||||
|
||||
[node name="Argini_001" parent="." index="2" unique_id=439223507]
|
||||
surface_material_override/0 = ExtResource("2_ewqv4")
|
||||
|
||||
[node name="Chunk_005" parent="." index="1" unique_id=1955568282]
|
||||
[node name="Chunk_005" parent="." index="3" unique_id=1955568282]
|
||||
surface_material_override/0 = ExtResource("2_ewqv4")
|
||||
|
||||
[node name="Chunk_036" parent="." index="2" unique_id=1808067169 groups=["weather_node"]]
|
||||
[node name="Chunk_036" parent="." index="4" unique_id=1808067169 groups=["weather_node"]]
|
||||
surface_material_override/0 = ExtResource("3_4d433")
|
||||
|
||||
[node name="Chunk_037" parent="." index="3" unique_id=1338393481 groups=["weather_node"]]
|
||||
[node name="Chunk_037" parent="." index="5" unique_id=1338393481 groups=["weather_node"]]
|
||||
surface_material_override/0 = ExtResource("3_4d433")
|
||||
|
||||
[node name="Water_003" parent="." index="4" unique_id=1175879696]
|
||||
[node name="Water_003" parent="." index="6" unique_id=1175879696]
|
||||
surface_material_override/0 = ExtResource("4_r06ll")
|
||||
|
||||
[node name="grass" type="Node3D" parent="." index="5" unique_id=924191951 groups=["weather_vegetables_node", "wind_node"]]
|
||||
[node name="grass" type="Node3D" parent="." index="7" unique_id=924191951 groups=["weather_vegetables_node", "wind_node"]]
|
||||
|
||||
[node name="grass_plane" type="MeshInstance3D" parent="grass" index="0" unique_id=1701437548]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0, 0)
|
||||
@@ -98,7 +113,7 @@ material_override = ExtResource("8_vtfy7")
|
||||
cast_shadow = 0
|
||||
multimesh = SubResource("MultiMesh_sddh0")
|
||||
|
||||
[node name="rice" type="Node3D" parent="." index="6" unique_id=318026795 groups=["weather_vegetables_node", "wind_node"]]
|
||||
[node name="rice" type="Node3D" parent="." index="8" unique_id=318026795 groups=["weather_vegetables_node", "wind_node"]]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -86.08408, 0, 0)
|
||||
|
||||
[node name="rice_plane61" type="MeshInstance3D" parent="rice" index="0" unique_id=1796062490]
|
||||
@@ -911,7 +926,7 @@ cast_shadow = 0
|
||||
mesh = SubResource("PlaneMesh_oviqx")
|
||||
surface_material_override/0 = ExtResource("7_y2fk3")
|
||||
|
||||
[node name="PaloLuce" parent="." index="7" unique_id=1607500596 instance=ExtResource("10_r06ll")]
|
||||
[node name="PaloLuce" parent="." index="9" unique_id=1607500596 instance=ExtResource("10_r06ll")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.4629593, 0, -1.4456635)
|
||||
|
||||
[editable path="PaloLuce"]
|
||||
|
||||
@@ -10,6 +10,11 @@
|
||||
[ext_resource type="Material" uid="uid://bjrb33qwp1p43" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds.tres" id="7_sun4k"]
|
||||
[ext_resource type="Material" uid="uid://0x17mj2v807r" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds2.tres" id="8_xu1ds"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="10_x1bjv"]
|
||||
[ext_resource type="Script" uid="uid://dg6ngy4pmtsyc" path="res://core/biome_generator/prop_info.gd" id="11_wt3n1"]
|
||||
[ext_resource type="PackedScene" uid="uid://be1px5nxfr4hs" path="res://tgcc/chunk/prop/scarecrow/scarecrow.tscn" id="12_wjqm7"]
|
||||
[ext_resource type="PackedScene" uid="uid://chhdorj82bkus" path="res://tgcc/chunk/prop/scarecrow/scarecrow2.tscn" id="13_newgk"]
|
||||
[ext_resource type="PackedScene" uid="uid://dn2b3f3nr6btn" path="res://tgcc/chunk/prop/scarecrow/scarecrow3.tscn" id="14_lgi3t"]
|
||||
[ext_resource type="PackedScene" uid="uid://cn2n7ehlt6hya" path="res://tgcc/chunk/prop/empty.tscn" id="15_8pj4d"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_wt3n1"]
|
||||
size = Vector2(0.5, 0.5)
|
||||
@@ -955,3 +960,13 @@ transform = Transform3D(-0.99579215, -0.09164066, -8.742278e-08, -0.09164066, 0.
|
||||
|
||||
[node name="Bambù99" parent="Bambu" index="102" unique_id=1720440871 instance=ExtResource("10_x1bjv")]
|
||||
transform = Transform3D(-0.99390334, -0.110254735, -8.742278e-08, -0.110254735, 0.99390334, 0, 8.688979e-08, 9.638775e-09, -1, -35.707153, 0.16506004, -4.648711)
|
||||
|
||||
[node name="Prop1" type="Marker3D" parent="." index="7" unique_id=308396303]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -5.899247, 0.35683155, 5.9334393)
|
||||
script = ExtResource("11_wt3n1")
|
||||
available_props = Array[PackedScene]([ExtResource("12_wjqm7"), ExtResource("13_newgk"), ExtResource("14_lgi3t"), ExtResource("15_8pj4d")])
|
||||
|
||||
[node name="Prop2" type="Marker3D" parent="." index="8" unique_id=1683081972]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -0.00079250336, 0.35683155, -5.8335304)
|
||||
script = ExtResource("11_wt3n1")
|
||||
available_props = Array[PackedScene]([ExtResource("12_wjqm7"), ExtResource("13_newgk"), ExtResource("14_lgi3t"), ExtResource("15_8pj4d")])
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
[ext_resource type="Material" uid="uid://4xhpd6lust7w" path="res://tgcc/chunk/material/path_chunk.tres" id="11_5yfr5"]
|
||||
[ext_resource type="Material" uid="uid://baot4vy3fqrdw" path="res://tgcc/chunk/prop/flower/bush.tres" id="11_sjr85"]
|
||||
[ext_resource type="Material" uid="uid://f5uoreickew7" path="res://tgcc/chunk/prop/flower/flower.tres" id="12_5yfr5"]
|
||||
[ext_resource type="PackedScene" uid="uid://d12t04rs47jq3" path="res://tgcc/chunk/prop/tree/tree_01.tscn" id="18_fqrww"]
|
||||
[ext_resource type="PackedScene" uid="uid://d12t04rs47jq3" path="res://tgcc/chunk/prop/tree/tree_01/tree_01.tscn" id="18_fqrww"]
|
||||
[ext_resource type="Shader" uid="uid://cs0xl7pc6e26h" path="res://core/daynight/tree_leaves.gdshader" id="19_s7klq"]
|
||||
[ext_resource type="PackedScene" uid="uid://bgb4pfflokl5s" path="res://tgcc/chunk/prop/pylon/pylon.tscn" id="20_fqrww"]
|
||||
[ext_resource type="Texture2D" uid="uid://c3grftlmap4q5" path="res://tgcc/chunk/prop/tree/leaf1_alpha.png" id="20_q66oc"]
|
||||
[ext_resource type="PackedScene" uid="uid://5ap10ax3lnr7" path="res://tgcc/chunk/prop/vending machine/vending_machine_1.tscn" id="21_s7klq"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_fqrww"]
|
||||
size = Vector2(0.5, 0.5)
|
||||
@@ -73,6 +74,7 @@ shader_parameter/light_steps = 10.0
|
||||
shader_parameter/random_mix = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.0
|
||||
shader_parameter/wetness_darkening = 0.25
|
||||
shader_parameter/snow_visibility = 1.0
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_5yfr5"]
|
||||
offsets = PackedFloat32Array(1, 1)
|
||||
@@ -503,7 +505,10 @@ omni_range = 10.0
|
||||
omni_attenuation = 2.0
|
||||
|
||||
[node name="PaloLuce" parent="." index="23" unique_id=1607500596 instance=ExtResource("20_fqrww")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.92608833, 0, -0.97701275)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.9962759, 0, -1.8516524)
|
||||
|
||||
[node name="VendingMachine_1" parent="." index="24" unique_id=1157270784 instance=ExtResource("21_s7klq")]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.91498923, 0, -0.5683732)
|
||||
|
||||
[editable path="TreeTest3"]
|
||||
[editable path="TreeTest4"]
|
||||
|
||||
@@ -12,6 +12,15 @@
|
||||
[ext_resource type="Material" uid="uid://0x17mj2v807r" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds2.tres" id="9_52lxu"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="11_s0twx"]
|
||||
[ext_resource type="PackedScene" uid="uid://dluogg3j2kcgs" path="res://tgcc/chunk/prop/Tori/tori.tscn" id="12_on7te"]
|
||||
[ext_resource type="Script" uid="uid://dg6ngy4pmtsyc" path="res://core/biome_generator/prop_info.gd" id="13_3qh3w"]
|
||||
[ext_resource type="PackedScene" uid="uid://be1px5nxfr4hs" path="res://tgcc/chunk/prop/scarecrow/scarecrow.tscn" id="13_fspb5"]
|
||||
[ext_resource type="PackedScene" uid="uid://chhdorj82bkus" path="res://tgcc/chunk/prop/scarecrow/scarecrow2.tscn" id="15_yg7g5"]
|
||||
[ext_resource type="PackedScene" uid="uid://dn2b3f3nr6btn" path="res://tgcc/chunk/prop/scarecrow/scarecrow3.tscn" id="16_x3b0m"]
|
||||
[ext_resource type="PackedScene" uid="uid://cn2n7ehlt6hya" path="res://tgcc/chunk/prop/empty.tscn" id="17_fo87f"]
|
||||
[ext_resource type="PackedScene" uid="uid://dho6nfkjoyqls" path="res://tgcc/chunk/prop/sign/scene/sign_2.tscn" id="18_aebao"]
|
||||
[ext_resource type="PackedScene" uid="uid://blev8k57qnb6v" path="res://tgcc/chunk/prop/sign/scene/sign_1.tscn" id="19_13g36"]
|
||||
[ext_resource type="PackedScene" uid="uid://swbs2s3libd3" path="res://tgcc/chunk/prop/sign/scene/sign_3.tscn" id="20_le1e5"]
|
||||
[ext_resource type="PackedScene" uid="uid://b5fhktgyjcxhn" path="res://tgcc/chunk/prop/sign/scene/sign_4.tscn" id="21_f427r"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_piek1"]
|
||||
size = Vector2(0.5, 0.5)
|
||||
@@ -900,3 +909,28 @@ transform = Transform3D(-4.371139e-08, 0.013473534, -0.9999092, 0, 0.9999092, 0.
|
||||
|
||||
[node name="Tori" parent="." index="8" unique_id=426190097 instance=ExtResource("12_on7te")]
|
||||
transform = Transform3D(-2.6226832e-08, 0, -0.59999996, 0, 0.59999996, 0, 0.59999996, 0, -2.6226832e-08, 8.541672, 0, 0)
|
||||
|
||||
[node name="Prop2" type="Marker3D" parent="." index="9" unique_id=778261734]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -6.009877, 0.35683155, 0.043001175)
|
||||
script = ExtResource("13_3qh3w")
|
||||
available_props = Array[PackedScene]([ExtResource("13_fspb5"), ExtResource("15_yg7g5"), ExtResource("16_x3b0m"), ExtResource("17_fo87f")])
|
||||
|
||||
[node name="Prop3" type="Marker3D" parent="." index="10" unique_id=820130140]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 5.9794493, 0.7136631, -5.921642)
|
||||
script = ExtResource("13_3qh3w")
|
||||
available_props = Array[PackedScene]([ExtResource("13_fspb5"), ExtResource("15_yg7g5"), ExtResource("16_x3b0m"), ExtResource("17_fo87f")])
|
||||
|
||||
[node name="Prop4" type="Marker3D" parent="." index="11" unique_id=632231780]
|
||||
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 5.927927, 1.0704947, 6.158152)
|
||||
script = ExtResource("13_3qh3w")
|
||||
available_props = Array[PackedScene]([ExtResource("13_fspb5"), ExtResource("15_yg7g5"), ExtResource("16_x3b0m"), ExtResource("17_fo87f")])
|
||||
|
||||
[node name="Prop6" type="Marker3D" parent="." index="12" unique_id=871422935]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1217992, 0.042618692, 9.309157)
|
||||
script = ExtResource("13_3qh3w")
|
||||
available_props = Array[PackedScene]([ExtResource("17_fo87f"), ExtResource("19_13g36"), ExtResource("18_aebao"), ExtResource("21_f427r"), ExtResource("20_le1e5")])
|
||||
|
||||
[node name="Prop7" type="Marker3D" parent="." index="13" unique_id=1199373586]
|
||||
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 1.663, 0, -1.181)
|
||||
script = ExtResource("13_3qh3w")
|
||||
available_props = Array[PackedScene]([ExtResource("17_fo87f"), ExtResource("19_13g36"), ExtResource("18_aebao"), ExtResource("21_f427r"), ExtResource("20_le1e5")])
|
||||
|
||||
@@ -17,6 +17,17 @@
|
||||
[ext_resource type="Material" uid="uid://baot4vy3fqrdw" path="res://tgcc/chunk/prop/flower/bush.tres" id="10_uvq4s"]
|
||||
[ext_resource type="Material" uid="uid://f5uoreickew7" path="res://tgcc/chunk/prop/flower/flower.tres" id="11_w75rp"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="17_rr5ye"]
|
||||
[ext_resource type="PackedScene" uid="uid://5ap10ax3lnr7" path="res://tgcc/chunk/prop/vending machine/vending_machine_1.tscn" id="18_18gw6"]
|
||||
[ext_resource type="Script" uid="uid://dg6ngy4pmtsyc" path="res://core/biome_generator/prop_info.gd" id="19_mw0dk"]
|
||||
[ext_resource type="PackedScene" uid="uid://cn2n7ehlt6hya" path="res://tgcc/chunk/prop/empty.tscn" id="20_qayvj"]
|
||||
[ext_resource type="PackedScene" uid="uid://blev8k57qnb6v" path="res://tgcc/chunk/prop/sign/scene/sign_1.tscn" id="21_6iw0h"]
|
||||
[ext_resource type="PackedScene" uid="uid://dho6nfkjoyqls" path="res://tgcc/chunk/prop/sign/scene/sign_2.tscn" id="22_e3wev"]
|
||||
[ext_resource type="PackedScene" uid="uid://b5fhktgyjcxhn" path="res://tgcc/chunk/prop/sign/scene/sign_4.tscn" id="23_xydfo"]
|
||||
[ext_resource type="PackedScene" uid="uid://swbs2s3libd3" path="res://tgcc/chunk/prop/sign/scene/sign_3.tscn" id="24_1bb53"]
|
||||
[ext_resource type="PackedScene" uid="uid://be1px5nxfr4hs" path="res://tgcc/chunk/prop/scarecrow/scarecrow.tscn" id="25_e3wev"]
|
||||
[ext_resource type="PackedScene" uid="uid://chhdorj82bkus" path="res://tgcc/chunk/prop/scarecrow/scarecrow2.tscn" id="26_xydfo"]
|
||||
[ext_resource type="PackedScene" uid="uid://dn2b3f3nr6btn" path="res://tgcc/chunk/prop/scarecrow/scarecrow3.tscn" id="27_1bb53"]
|
||||
[ext_resource type="PackedScene" uid="uid://co2r77xcdktu1" path="res://tgcc/chunk/prop/windhousedecoration/wind_decoration.tscn" id="28_xydfo"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_kiycf"]
|
||||
size = Vector2(0.5, 0.5)
|
||||
@@ -774,3 +785,22 @@ transform = Transform3D(0.99893546, 0.04613013, 0, -0.046085197, 0.9979625, 0.04
|
||||
|
||||
[node name="Bambù59" parent="Bambu" index="29" unique_id=510984514 instance=ExtResource("17_rr5ye")]
|
||||
transform = Transform3D(0.99893546, 0.04613013, 0, -0.046085197, 0.9979625, 0.044125047, 0.002035494, -0.044078074, 0.999026, 5.1329484, 4.7683716e-07, 4.9982896)
|
||||
|
||||
[node name="VendingMachine_1" parent="." index="18" unique_id=1157270784 instance=ExtResource("18_18gw6")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.6109447, 0, 1.013597)
|
||||
|
||||
[node name="Prop7" type="Marker3D" parent="." index="19" unique_id=228771879]
|
||||
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 1.7960589, 0.042618692, -0.8912107)
|
||||
script = ExtResource("19_mw0dk")
|
||||
available_props = Array[PackedScene]([ExtResource("20_qayvj"), ExtResource("21_6iw0h"), ExtResource("22_e3wev"), ExtResource("23_xydfo"), ExtResource("24_1bb53")])
|
||||
|
||||
[node name="Prop2" type="Marker3D" parent="." index="20" unique_id=1453317700]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -6.009877, 0.35683155, 0.043001175)
|
||||
script = ExtResource("19_mw0dk")
|
||||
available_props = Array[PackedScene]([ExtResource("25_e3wev"), ExtResource("26_xydfo"), ExtResource("27_1bb53"), ExtResource("20_qayvj")])
|
||||
|
||||
[node name="WindDecoration" parent="." index="21" unique_id=2146740679 instance=ExtResource("28_xydfo")]
|
||||
transform = Transform3D(1.9905398, 0.19395185, 0.011580614, -0.19368553, 1.9901968, -0.04003887, -0.015406657, 0.03872799, 1.9995658, 4.4318647, 2.1423423, -3.9336014)
|
||||
|
||||
[node name="WindDecoration2" parent="." index="22" unique_id=1273410990 instance=ExtResource("28_xydfo")]
|
||||
transform = Transform3D(1.999275, -0.053754073, 0.003284915, 0.05310862, 1.9881506, 0.21080151, -0.008931173, -0.21063784, 1.9888572, 4.7311583, 2.1197329, -3.9115348)
|
||||
|
||||
@@ -20,8 +20,17 @@
|
||||
[ext_resource type="Material" uid="uid://bjrb33qwp1p43" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds.tres" id="15_eqqqg"]
|
||||
[ext_resource type="Material" uid="uid://0x17mj2v807r" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds2.tres" id="16_gwwx4"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="20_nekti"]
|
||||
[ext_resource type="PackedScene" uid="uid://d12t04rs47jq3" path="res://tgcc/chunk/prop/tree/tree_01.tscn" id="21_jphge"]
|
||||
[ext_resource type="PackedScene" uid="uid://d12t04rs47jq3" path="res://tgcc/chunk/prop/tree/tree_01/tree_01.tscn" id="21_jphge"]
|
||||
[ext_resource type="PackedScene" uid="uid://dluogg3j2kcgs" path="res://tgcc/chunk/prop/Tori/tori.tscn" id="22_jphge"]
|
||||
[ext_resource type="PackedScene" uid="uid://5ap10ax3lnr7" path="res://tgcc/chunk/prop/vending machine/vending_machine_1.tscn" id="23_aj7x1"]
|
||||
[ext_resource type="PackedScene" uid="uid://l3inky72a783" path="res://tgcc/chunk/prop/well/stone/well_stone.tscn" id="24_ufr67"]
|
||||
[ext_resource type="Script" uid="uid://dg6ngy4pmtsyc" path="res://core/biome_generator/prop_info.gd" id="25_8sefc"]
|
||||
[ext_resource type="PackedScene" uid="uid://cn2n7ehlt6hya" path="res://tgcc/chunk/prop/empty.tscn" id="26_dvfkd"]
|
||||
[ext_resource type="PackedScene" uid="uid://blev8k57qnb6v" path="res://tgcc/chunk/prop/sign/scene/sign_1.tscn" id="27_ap8sf"]
|
||||
[ext_resource type="PackedScene" uid="uid://dho6nfkjoyqls" path="res://tgcc/chunk/prop/sign/scene/sign_2.tscn" id="28_mtqws"]
|
||||
[ext_resource type="PackedScene" uid="uid://b5fhktgyjcxhn" path="res://tgcc/chunk/prop/sign/scene/sign_4.tscn" id="29_kujqa"]
|
||||
[ext_resource type="PackedScene" uid="uid://swbs2s3libd3" path="res://tgcc/chunk/prop/sign/scene/sign_3.tscn" id="30_jwe44"]
|
||||
[ext_resource type="PackedScene" uid="uid://e08y0isvh5xs" path="res://tgcc/chunk/prop/tenda noren/tenda1.tscn" id="31_dvfkd"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_en6je"]
|
||||
render_priority = 0
|
||||
@@ -81,6 +90,7 @@ shader_parameter/light_steps = 10.0
|
||||
shader_parameter/random_mix = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.0
|
||||
shader_parameter/wetness_darkening = 0.25
|
||||
shader_parameter/snow_visibility = 1.0
|
||||
|
||||
[sub_resource type="MultiMesh" id="MultiMesh_eqqqg"]
|
||||
transform_format = 1
|
||||
@@ -134,6 +144,28 @@ shader_parameter/light_steps = 10.0
|
||||
shader_parameter/random_mix = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.0
|
||||
shader_parameter/wetness_darkening = 0.25
|
||||
shader_parameter/snow_visibility = 1.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_ufr67"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("6_badpr")
|
||||
shader_parameter/albedo_color = Color(0.14418072, 0.1760445, 0.47109693, 1)
|
||||
shader_parameter/use_texture = true
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 10.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
|
||||
[node name="chunk_country_cross3_03" unique_id=643218732 instance=ExtResource("1_udhcw")]
|
||||
script = ExtResource("2_cu4ct")
|
||||
@@ -152,6 +184,12 @@ surface_material_override/0 = ExtResource("5_dwl4p")
|
||||
[node name="Cortile_003" parent="." index="2" unique_id=1183773984 groups=["weather_node"]]
|
||||
surface_material_override/0 = ExtResource("5_dwl4p")
|
||||
|
||||
[node name="Cube_041" parent="." index="3" unique_id=2123223496]
|
||||
visible = false
|
||||
|
||||
[node name="Cube_042" parent="." index="4" unique_id=1973044231]
|
||||
visible = false
|
||||
|
||||
[node name="Cylinder_007" parent="." index="5" unique_id=1954949661]
|
||||
surface_material_override/0 = SubResource("ShaderMaterial_en6je")
|
||||
|
||||
@@ -510,5 +548,36 @@ material_override = SubResource("ShaderMaterial_aj7x1")
|
||||
[node name="Tori" parent="." index="22" unique_id=426190097 instance=ExtResource("22_jphge")]
|
||||
transform = Transform3D(4.5298744e-08, 0, -0.6, 0, 0.6, 0, 0.6, 0, 4.5298744e-08, 8.327267, 0, 0)
|
||||
|
||||
[node name="VendingMachine_1" parent="." index="23" unique_id=595764774 instance=ExtResource("23_aj7x1")]
|
||||
transform = Transform3D(0.785, 0, 0, 0, 0.785, 0, 0, 0, 0.785, -2.9157195, 0, 4.0503273)
|
||||
|
||||
[node name="Cartello" parent="VendingMachine_1" index="0" unique_id=83833849]
|
||||
visible = false
|
||||
|
||||
[node name="VendingMachine_2" parent="." index="24" unique_id=200256890 instance=ExtResource("23_aj7x1")]
|
||||
transform = Transform3D(0.785, 0, 0, 0, 0.785, 0, 0, 0, 0.785, -2.9157195, 0, 2.9496164)
|
||||
|
||||
[node name="Cartello" parent="VendingMachine_2" index="0" unique_id=83833849]
|
||||
visible = false
|
||||
|
||||
[node name="Vending machine" parent="VendingMachine_2" index="2" unique_id=989971963]
|
||||
surface_material_override/1 = SubResource("ShaderMaterial_ufr67")
|
||||
|
||||
[node name="well_stone" parent="." index="25" unique_id=2044144917 instance=ExtResource("24_ufr67")]
|
||||
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -7.960206, 0, -7.837294)
|
||||
|
||||
[node name="Prop7" type="Marker3D" parent="." index="26" unique_id=1712576644]
|
||||
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 1.7960589, 0.042618692, -0.8912107)
|
||||
script = ExtResource("25_8sefc")
|
||||
available_props = Array[PackedScene]([ExtResource("26_dvfkd"), ExtResource("27_ap8sf"), ExtResource("28_mtqws"), ExtResource("29_kujqa"), ExtResource("30_jwe44")])
|
||||
|
||||
[node name="Tenda" parent="." index="27" unique_id=1345812366 instance=ExtResource("31_dvfkd")]
|
||||
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.3930097, 0.71891594, -1.0331697)
|
||||
|
||||
[node name="Tenda2" parent="." index="28" unique_id=1021665362 instance=ExtResource("31_dvfkd")]
|
||||
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.3930097, 0.71891594, -3.0399761)
|
||||
|
||||
[editable path="TreeTest5"]
|
||||
[editable path="TreeTest6"]
|
||||
[editable path="VendingMachine_1"]
|
||||
[editable path="VendingMachine_2"]
|
||||
|
||||
@@ -14,6 +14,13 @@
|
||||
[ext_resource type="Material" uid="uid://0x17mj2v807r" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds2.tres" id="11_an7hd"]
|
||||
[ext_resource type="Material" uid="uid://baot4vy3fqrdw" path="res://tgcc/chunk/prop/flower/bush.tres" id="12_k6uxv"]
|
||||
[ext_resource type="Material" uid="uid://f5uoreickew7" path="res://tgcc/chunk/prop/flower/flower.tres" id="13_24u1s"]
|
||||
[ext_resource type="PackedScene" uid="uid://5ap10ax3lnr7" path="res://tgcc/chunk/prop/vending machine/vending_machine_1.tscn" id="15_an7hd"]
|
||||
[ext_resource type="Script" uid="uid://dg6ngy4pmtsyc" path="res://core/biome_generator/prop_info.gd" id="16_8x1q3"]
|
||||
[ext_resource type="PackedScene" uid="uid://cn2n7ehlt6hya" path="res://tgcc/chunk/prop/empty.tscn" id="17_jc462"]
|
||||
[ext_resource type="PackedScene" uid="uid://blev8k57qnb6v" path="res://tgcc/chunk/prop/sign/scene/sign_1.tscn" id="18_e8hed"]
|
||||
[ext_resource type="PackedScene" uid="uid://dho6nfkjoyqls" path="res://tgcc/chunk/prop/sign/scene/sign_2.tscn" id="19_3vlla"]
|
||||
[ext_resource type="PackedScene" uid="uid://b5fhktgyjcxhn" path="res://tgcc/chunk/prop/sign/scene/sign_4.tscn" id="20_qj7ai"]
|
||||
[ext_resource type="PackedScene" uid="uid://swbs2s3libd3" path="res://tgcc/chunk/prop/sign/scene/sign_3.tscn" id="21_jjc32"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_8pfxb"]
|
||||
size = Vector2(0.5, 0.5)
|
||||
@@ -114,7 +121,7 @@ surface_material_override/1 = ExtResource("6_b82gs")
|
||||
surface_material_override/0 = ExtResource("6_b82gs")
|
||||
surface_material_override/1 = ExtResource("5_wbwk3")
|
||||
|
||||
[node name="MSH_Staccioanta_1_017" parent="." index="10" unique_id=845283196]
|
||||
[node name="MSH_Staccioanta_1_017" parent="." index="10" unique_id=1757093874 groups=["weather_node"]]
|
||||
surface_material_override/0 = ExtResource("7_be1u8")
|
||||
|
||||
[node name="PaliLuci_001" parent="." index="11" unique_id=239883314]
|
||||
@@ -475,3 +482,19 @@ shadow_enabled = true
|
||||
shadow_opacity = 0.96
|
||||
omni_range = 10.0
|
||||
omni_attenuation = 2.0
|
||||
|
||||
[node name="VendingMachine_1" parent="." index="16" unique_id=1157270784 instance=ExtResource("15_an7hd")]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.384242, 0, 5.3458323)
|
||||
|
||||
[node name="VendingMachine_2" parent="." index="17" unique_id=2140135902 instance=ExtResource("15_an7hd")]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.384242, 0, 6.6892433)
|
||||
|
||||
[node name="Prop7" type="Marker3D" parent="." index="18" unique_id=704248250]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.0779345, 0.042618692, 1.6671067)
|
||||
script = ExtResource("16_8x1q3")
|
||||
available_props = Array[PackedScene]([ExtResource("17_jc462"), ExtResource("18_e8hed"), ExtResource("19_3vlla"), ExtResource("20_qj7ai"), ExtResource("21_jjc32")])
|
||||
|
||||
[node name="Prop8" type="Marker3D" parent="." index="19" unique_id=572971113]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -1.4561574, 0.042618692, -1.8439876)
|
||||
script = ExtResource("16_8x1q3")
|
||||
available_props = Array[PackedScene]([ExtResource("17_jc462"), ExtResource("18_e8hed"), ExtResource("19_3vlla"), ExtResource("20_qj7ai"), ExtResource("21_jjc32")])
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
[ext_resource type="Material" uid="uid://baot4vy3fqrdw" path="res://tgcc/chunk/prop/flower/bush.tres" id="15_eoxu8"]
|
||||
[ext_resource type="Material" uid="uid://f5uoreickew7" path="res://tgcc/chunk/prop/flower/flower.tres" id="16_ubhkt"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="18_0ehik"]
|
||||
[ext_resource type="PackedScene" uid="uid://5ap10ax3lnr7" path="res://tgcc/chunk/prop/vending machine/vending_machine_1.tscn" id="19_j41gr"]
|
||||
[ext_resource type="PackedScene" uid="uid://cff8d3fy3cd6b" path="res://tgcc/chunk/prop/well/wood/well_wood.tscn" id="20_eoxu8"]
|
||||
[ext_resource type="PackedScene" uid="uid://e08y0isvh5xs" path="res://tgcc/chunk/prop/tenda noren/tenda1.tscn" id="21_ubhkt"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_7tu84"]
|
||||
size = Vector2(0.5, 0.5)
|
||||
@@ -748,3 +751,18 @@ transform = Transform3D(0.99579215, 0.09164066, 0, -0.09164066, 0.99579215, 0, 0
|
||||
|
||||
[node name="Bambù50" parent="Bambu" index="16" unique_id=1800416036 instance=ExtResource("18_0ehik")]
|
||||
transform = Transform3D(0.99390334, 0.110254735, 0, -0.110254735, 0.99390334, 0, 0, 0, 1, -38.629272, 0.32301903, 5.7615194)
|
||||
|
||||
[node name="VendingMachine_1" parent="." index="21" unique_id=1157270784 instance=ExtResource("19_j41gr")]
|
||||
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 1.6880364, 0, -1.0264239)
|
||||
|
||||
[node name="VendingMachine_2" parent="." index="22" unique_id=100646015 instance=ExtResource("19_j41gr")]
|
||||
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 1.6880364, 0, 0.12624216)
|
||||
|
||||
[node name="well_wood" parent="." index="23" unique_id=2128929413 instance=ExtResource("20_eoxu8")]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -3.5676882, 0, -3.665926)
|
||||
|
||||
[node name="Tenda" parent="." index="24" unique_id=1345812366 instance=ExtResource("21_ubhkt")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.7619095, 1.1459794, 8.959272)
|
||||
|
||||
[node name="Tenda2" parent="." index="25" unique_id=319841493 instance=ExtResource("21_ubhkt")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.7519994, 1.1459794, 8.959272)
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
[ext_resource type="Material" uid="uid://f5uoreickew7" path="res://tgcc/chunk/prop/flower/flower.tres" id="11_7l6eg"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="13_i5qpy"]
|
||||
[ext_resource type="PackedScene" uid="uid://bgb4pfflokl5s" path="res://tgcc/chunk/prop/pylon/pylon.tscn" id="14_15guu"]
|
||||
[ext_resource type="PackedScene" uid="uid://l3inky72a783" path="res://tgcc/chunk/prop/well/stone/well_stone.tscn" id="15_qv1gu"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_xdgj3"]
|
||||
size = Vector2(0.5, 0.5)
|
||||
@@ -785,4 +786,7 @@ transform = Transform3D(0.99390334, 0.110254735, 0, -0.110254735, 0.99390334, 0,
|
||||
[node name="PaloLuce" parent="." index="11" unique_id=1607500596 instance=ExtResource("14_15guu")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.5209084, 0, -0.26294994)
|
||||
|
||||
[node name="well_stone" parent="." index="12" unique_id=2044144917 instance=ExtResource("15_qv1gu")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.16394329, 0.10199118, -7.7422237)
|
||||
|
||||
[editable path="PaloLuce"]
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
[ext_resource type="Material" uid="uid://baot4vy3fqrdw" path="res://tgcc/chunk/prop/flower/bush.tres" id="15_eoqtk"]
|
||||
[ext_resource type="Material" uid="uid://f5uoreickew7" path="res://tgcc/chunk/prop/flower/flower.tres" id="16_d4do4"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="17_lb2j0"]
|
||||
[ext_resource type="PackedScene" uid="uid://5ap10ax3lnr7" path="res://tgcc/chunk/prop/vending machine/vending_machine_1.tscn" id="18_x237o"]
|
||||
[ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://core/daynight/trunk_shader.gdshader" id="19_cl3bn"]
|
||||
[ext_resource type="PackedScene" uid="uid://e08y0isvh5xs" path="res://tgcc/chunk/prop/tenda noren/tenda1.tscn" id="20_eoqtk"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_g6h4y"]
|
||||
size = Vector2(0.5, 0.5)
|
||||
@@ -60,6 +63,48 @@ gradient = SubResource("Gradient_n2ly8")
|
||||
fill = 2
|
||||
fill_from = Vector2(0.5, 0.5)
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_cl3bn"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("19_cl3bn")
|
||||
shader_parameter/albedo_color = Color(0.023529412, 0.23529412, 0.36078432, 1)
|
||||
shader_parameter/use_texture = true
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 10.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_eoqtk"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("19_cl3bn")
|
||||
shader_parameter/albedo_color = Color(0.024344679, 0.23358715, 0.3590951, 1)
|
||||
shader_parameter/use_texture = true
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 10.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
|
||||
[node name="chunk_country_straight_01" unique_id=926368352 instance=ExtResource("1_37ch6")]
|
||||
script = ExtResource("2_n2ly8")
|
||||
north = true
|
||||
@@ -523,3 +568,24 @@ transform = Transform3D(0.99579215, 0.09164066, 0, -0.09164066, 0.99579215, 0, 0
|
||||
|
||||
[node name="Bambù14" parent="Bambu" index="32" unique_id=136590564 instance=ExtResource("17_lb2j0")]
|
||||
transform = Transform3D(0.99390334, 0.110254735, 0, -0.110254735, 0.99390334, 0, 0, 0, 1, -7.7769127, 0.32301903, 5.6648054)
|
||||
|
||||
[node name="VendingMachine_1" parent="." index="20" unique_id=1157270784 instance=ExtResource("18_x237o")]
|
||||
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 1.4071379, -4.7683716e-07, 7.076941)
|
||||
|
||||
[node name="VendingMachine_2" parent="." index="21" unique_id=1783997867 instance=ExtResource("18_x237o")]
|
||||
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 1.4071379, -4.7683716e-07, 8.278086)
|
||||
|
||||
[node name="Cartello" parent="VendingMachine_2" index="0" unique_id=83833849]
|
||||
visible = false
|
||||
|
||||
[node name="CartelloUp" parent="VendingMachine_2" index="1" unique_id=237539239]
|
||||
surface_material_override/1 = SubResource("ShaderMaterial_cl3bn")
|
||||
|
||||
[node name="Vending machine" parent="VendingMachine_2" index="2" unique_id=989971963]
|
||||
surface_material_override/1 = SubResource("ShaderMaterial_eoqtk")
|
||||
|
||||
[node name="Tenda" parent="." index="22" unique_id=1345812366 instance=ExtResource("20_eoqtk")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.6964254, 1.0923817, -4.089067)
|
||||
|
||||
[editable path="VendingMachine_1"]
|
||||
[editable path="VendingMachine_2"]
|
||||
|
||||
@@ -21,6 +21,14 @@
|
||||
[ext_resource type="Material" uid="uid://f5uoreickew7" path="res://tgcc/chunk/prop/flower/flower.tres" id="18_ujo6s"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="20_rrmel"]
|
||||
[ext_resource type="PackedScene" uid="uid://bgb4pfflokl5s" path="res://tgcc/chunk/prop/pylon/pylon.tscn" id="21_527eb"]
|
||||
[ext_resource type="PackedScene" uid="uid://5ap10ax3lnr7" path="res://tgcc/chunk/prop/vending machine/vending_machine_1.tscn" id="22_tsii7"]
|
||||
[ext_resource type="PackedScene" uid="uid://cff8d3fy3cd6b" path="res://tgcc/chunk/prop/well/wood/well_wood.tscn" id="23_5fhuo"]
|
||||
[ext_resource type="Script" uid="uid://dg6ngy4pmtsyc" path="res://core/biome_generator/prop_info.gd" id="24_vmqe2"]
|
||||
[ext_resource type="PackedScene" uid="uid://be1px5nxfr4hs" path="res://tgcc/chunk/prop/scarecrow/scarecrow.tscn" id="25_g8i5r"]
|
||||
[ext_resource type="PackedScene" uid="uid://chhdorj82bkus" path="res://tgcc/chunk/prop/scarecrow/scarecrow2.tscn" id="26_tmdaq"]
|
||||
[ext_resource type="PackedScene" uid="uid://dn2b3f3nr6btn" path="res://tgcc/chunk/prop/scarecrow/scarecrow3.tscn" id="27_w64vi"]
|
||||
[ext_resource type="PackedScene" uid="uid://cn2n7ehlt6hya" path="res://tgcc/chunk/prop/empty.tscn" id="28_1wvnd"]
|
||||
[ext_resource type="PackedScene" uid="uid://e08y0isvh5xs" path="res://tgcc/chunk/prop/tenda noren/tenda1.tscn" id="29_g8i5r"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_q2s76"]
|
||||
render_priority = 0
|
||||
@@ -171,7 +179,7 @@ surface_material_override/0 = ExtResource("2_t65ww")
|
||||
[node name="Bags" parent="." index="1" unique_id=885374680]
|
||||
surface_material_override/0 = SubResource("ShaderMaterial_q2s76")
|
||||
|
||||
[node name="Cart" parent="." index="2" unique_id=884973125]
|
||||
[node name="Cart" parent="." index="2" unique_id=1431553734 groups=["weather_node"]]
|
||||
surface_material_override/0 = ExtResource("11_iulsg")
|
||||
surface_material_override/1 = SubResource("ShaderMaterial_mqw0y")
|
||||
surface_material_override/2 = SubResource("ShaderMaterial_dxwao")
|
||||
@@ -212,7 +220,7 @@ surface_material_override/1 = ExtResource("7_q2s76")
|
||||
[node name="Water_006" parent="." index="12" unique_id=2064105008]
|
||||
surface_material_override/0 = ExtResource("10_r4bww")
|
||||
|
||||
[node name="WoodPile" parent="." index="13" unique_id=1088104699]
|
||||
[node name="WoodPile" parent="." index="13" unique_id=1512653267]
|
||||
surface_material_override/0 = ExtResource("11_iulsg")
|
||||
surface_material_override/1 = ExtResource("12_ytk0o")
|
||||
surface_material_override/2 = SubResource("ShaderMaterial_ytk0o")
|
||||
@@ -768,4 +776,23 @@ transform = Transform3D(-0.42840073, -0.10062032, -0.8979694, 0.015782116, 0.992
|
||||
[node name="PaloLuce" parent="." index="20" unique_id=1607500596 instance=ExtResource("21_527eb")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3137894, 0, 1.503645)
|
||||
|
||||
[node name="VendingMachine_1" parent="." index="21" unique_id=1157270784 instance=ExtResource("22_tsii7")]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.674514, 0, 1.5681319)
|
||||
|
||||
[node name="well_wood" parent="." index="22" unique_id=2128929413 instance=ExtResource("23_5fhuo")]
|
||||
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 5.7742014, 0, 1.0249029)
|
||||
|
||||
[node name="Prop2" type="Marker3D" parent="." index="23" unique_id=1220014029]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 5.8930645, 0.35683155, -5.7293277)
|
||||
script = ExtResource("24_vmqe2")
|
||||
available_props = Array[PackedScene]([ExtResource("25_g8i5r"), ExtResource("26_tmdaq"), ExtResource("27_w64vi"), ExtResource("28_1wvnd")])
|
||||
|
||||
[node name="Prop2" type="Marker3D" parent="Prop2" index="0" unique_id=1596157579]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 11.625584, 0.35683155, 0.003191471)
|
||||
script = ExtResource("24_vmqe2")
|
||||
available_props = Array[PackedScene]([ExtResource("25_g8i5r"), ExtResource("26_tmdaq"), ExtResource("27_w64vi"), ExtResource("28_1wvnd")])
|
||||
|
||||
[node name="Tenda" parent="." index="24" unique_id=1345812366 instance=ExtResource("29_g8i5r")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8348045, 1.0869424, -1.5693097)
|
||||
|
||||
[editable path="PaloLuce"]
|
||||
|
||||
@@ -11,6 +11,13 @@
|
||||
[ext_resource type="Material" uid="uid://bjrb33qwp1p43" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds.tres" id="8_mds5d"]
|
||||
[ext_resource type="Material" uid="uid://0x17mj2v807r" path="res://tgcc/chunk/prop/grass/grass_chunk_weeds2.tres" id="9_5s0jh"]
|
||||
[ext_resource type="PackedScene" uid="uid://c7hdw2g6sbygr" path="res://tgcc/chunk/prop/tree/bambù/bambù.tscn" id="11_7lasv"]
|
||||
[ext_resource type="Script" uid="uid://dg6ngy4pmtsyc" path="res://core/biome_generator/prop_info.gd" id="12_keqgb"]
|
||||
[ext_resource type="PackedScene" uid="uid://l3inky72a783" path="res://tgcc/chunk/prop/well/stone/well_stone.tscn" id="12_kkc6w"]
|
||||
[ext_resource type="PackedScene" uid="uid://cn2n7ehlt6hya" path="res://tgcc/chunk/prop/empty.tscn" id="13_45od3"]
|
||||
[ext_resource type="PackedScene" uid="uid://cff8d3fy3cd6b" path="res://tgcc/chunk/prop/well/wood/well_wood.tscn" id="15_2hsar"]
|
||||
[ext_resource type="PackedScene" uid="uid://be1px5nxfr4hs" path="res://tgcc/chunk/prop/scarecrow/scarecrow.tscn" id="16_gable"]
|
||||
[ext_resource type="PackedScene" uid="uid://chhdorj82bkus" path="res://tgcc/chunk/prop/scarecrow/scarecrow2.tscn" id="17_a0gn5"]
|
||||
[ext_resource type="PackedScene" uid="uid://dn2b3f3nr6btn" path="res://tgcc/chunk/prop/scarecrow/scarecrow3.tscn" id="18_e3c12"]
|
||||
|
||||
[sub_resource type="PlaneMesh" id="PlaneMesh_uf7g8"]
|
||||
size = Vector2(1, 1)
|
||||
@@ -862,3 +869,18 @@ transform = Transform3D(-0.99722904, 0.034301233, -0.06601266, 0.034376215, 0.99
|
||||
|
||||
[node name="Bambù20" parent="rice" index="135" unique_id=790042848 instance=ExtResource("11_7lasv")]
|
||||
transform = Transform3D(-0.92917824, 0.06943477, 0.363052, 0.08790589, 0.9955283, 0.0345845, -0.3590272, 0.06404955, -0.9311271, -1.6899307, 0, 3.5738397)
|
||||
|
||||
[node name="Prop1" type="Marker3D" parent="." index="7" unique_id=362853951]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8943415, 0.35683155, 0.043001175)
|
||||
script = ExtResource("12_keqgb")
|
||||
available_props = Array[PackedScene]([ExtResource("13_45od3"), ExtResource("12_kkc6w"), ExtResource("15_2hsar")])
|
||||
|
||||
[node name="Prop2" type="Marker3D" parent="." index="8" unique_id=1556303512]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -6.009877, 0.35683155, 0.043001175)
|
||||
script = ExtResource("12_keqgb")
|
||||
available_props = Array[PackedScene]([ExtResource("16_gable"), ExtResource("17_a0gn5"), ExtResource("18_e3c12"), ExtResource("13_45od3")])
|
||||
|
||||
[node name="Prop3" type="Marker3D" parent="." index="9" unique_id=1117362414]
|
||||
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 6.1461954, 0.35683155, 0.043001175)
|
||||
script = ExtResource("12_keqgb")
|
||||
available_props = Array[PackedScene]([ExtResource("16_gable"), ExtResource("17_a0gn5"), ExtResource("18_e3c12"), ExtResource("13_45od3")])
|
||||
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user