Compare commits
5 Commits
48ba1761e0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2358dc8b53 | |||
| 185b1b4744 | |||
| e86da0c2bc | |||
| 5341fdd3f5 | |||
|
|
d58c31ac65 |
@@ -212,6 +212,17 @@ func _physics_process(_delta: float) -> void:
|
|||||||
last_pos_train = current_pos
|
last_pos_train = current_pos
|
||||||
_refresh_world(current_pos)
|
_refresh_world(current_pos)
|
||||||
|
|
||||||
|
func generate_initial_world_now() -> void:
|
||||||
|
if rail_path == null or rail_path.train_instance == null:
|
||||||
|
return
|
||||||
|
|
||||||
|
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))
|
||||||
|
last_pos_train = current_pos
|
||||||
|
_rebuild_generation_queue(current_pos)
|
||||||
|
_drain_generation_queue_now()
|
||||||
|
_drain_wire_queue_now()
|
||||||
|
|
||||||
func collect_all_chunkinfo(root: Node, list: Array[Node]) -> void:
|
func collect_all_chunkinfo(root: Node, list: Array[Node]) -> void:
|
||||||
if root == null: return
|
if root == null: return
|
||||||
|
|
||||||
@@ -535,6 +546,20 @@ func _drain_generation_queue() -> void:
|
|||||||
pending_generation_cells.clear()
|
pending_generation_cells.clear()
|
||||||
pending_generation_cursor = 0
|
pending_generation_cursor = 0
|
||||||
|
|
||||||
|
func _drain_generation_queue_now() -> void:
|
||||||
|
while pending_generation_cursor < pending_generation_cells.size():
|
||||||
|
var grid_pos: Vector2i = pending_generation_cells[pending_generation_cursor]
|
||||||
|
pending_generation_cursor += 1
|
||||||
|
if board.has(grid_pos):
|
||||||
|
continue
|
||||||
|
|
||||||
|
var is_obstacle = _register_cell_with_ray(grid_pos)
|
||||||
|
if not is_obstacle:
|
||||||
|
_add_compatible_biome(grid_pos)
|
||||||
|
|
||||||
|
pending_generation_cells.clear()
|
||||||
|
pending_generation_cursor = 0
|
||||||
|
|
||||||
func _drain_cleanup_queue() -> void:
|
func _drain_cleanup_queue() -> void:
|
||||||
var processed: int = 0
|
var processed: int = 0
|
||||||
var start_usec: int = Time.get_ticks_usec()
|
var start_usec: int = Time.get_ticks_usec()
|
||||||
@@ -595,6 +620,22 @@ func _drain_wire_queue() -> void:
|
|||||||
pending_wire_cells.clear()
|
pending_wire_cells.clear()
|
||||||
pending_wire_cursor = 0
|
pending_wire_cursor = 0
|
||||||
|
|
||||||
|
func _drain_wire_queue_now() -> void:
|
||||||
|
while pending_wire_cursor < pending_wire_cells.size():
|
||||||
|
var grid_pos: Vector2i = pending_wire_cells[pending_wire_cursor]
|
||||||
|
pending_wire_cursor += 1
|
||||||
|
pending_wire_lookup.erase(grid_pos)
|
||||||
|
|
||||||
|
if not board.has(grid_pos):
|
||||||
|
continue
|
||||||
|
if not board[grid_pos].get("have_lamppost", false):
|
||||||
|
continue
|
||||||
|
|
||||||
|
_connect_lamppost_wires(grid_pos)
|
||||||
|
|
||||||
|
pending_wire_cells.clear()
|
||||||
|
pending_wire_cursor = 0
|
||||||
|
|
||||||
func _generate_pieces_around_train(center: Vector2i) -> void:
|
func _generate_pieces_around_train(center: Vector2i) -> void:
|
||||||
for x in range(-eye_line, eye_line + 1):
|
for x in range(-eye_line, eye_line + 1):
|
||||||
for z in range(-eye_line, eye_line + 1):
|
for z in range(-eye_line, eye_line + 1):
|
||||||
|
|||||||
@@ -50,10 +50,14 @@ enum TrainFacingDirection { KEEP_PATH_DIRECTION, LOCOMOTIVE_LEFT, LOCOMOTIVE_RIG
|
|||||||
@export_enum("keep_path_direction", "locomotive_left", "locomotive_right") var train_facing_direction: int = TrainFacingDirection.KEEP_PATH_DIRECTION
|
@export_enum("keep_path_direction", "locomotive_left", "locomotive_right") var train_facing_direction: int = TrainFacingDirection.KEEP_PATH_DIRECTION
|
||||||
|
|
||||||
@export_group("Rails Bulding")
|
@export_group("Rails Bulding")
|
||||||
|
##if true builds visible rail pieces along the Path3D
|
||||||
|
@export var build_track_visuals: bool = true
|
||||||
##distance between sleepers of the rails
|
##distance between sleepers of the rails
|
||||||
@export var sleepers_distance: float = 1.0
|
@export var sleepers_distance: float = 1.0
|
||||||
##nodel for the sleeper of the rail
|
##nodel for the sleeper of the rail
|
||||||
@export var sleepers_model: PackedScene
|
@export var sleepers_model: PackedScene
|
||||||
|
##if true add procedural rail bars even when sleepers_model is assigned
|
||||||
|
@export var add_procedural_rails_to_sleepers_model: bool = false
|
||||||
|
|
||||||
@export_group("Manual Controls")
|
@export_group("Manual Controls")
|
||||||
##max speed
|
##max speed
|
||||||
@@ -115,7 +119,8 @@ func _ready() -> void:
|
|||||||
_initial_is_inmotion = is_inmotion
|
_initial_is_inmotion = is_inmotion
|
||||||
|
|
||||||
if curve != null and curve.get_baked_length() > 0:
|
if curve != null and curve.get_baked_length() > 0:
|
||||||
build_rails()
|
if build_track_visuals:
|
||||||
|
build_rails()
|
||||||
build_train()
|
build_train()
|
||||||
_plan_stops()
|
_plan_stops()
|
||||||
_apply_initial_train_start()
|
_apply_initial_train_start()
|
||||||
@@ -258,6 +263,7 @@ func build_rails() -> void:
|
|||||||
|
|
||||||
var total_length = curve.get_baked_length()
|
var total_length = curve.get_baked_length()
|
||||||
var piece_number = int(total_length / sleepers_distance)
|
var piece_number = int(total_length / sleepers_distance)
|
||||||
|
var should_add_procedural_rails: bool = sleepers_model == null or add_procedural_rails_to_sleepers_model
|
||||||
|
|
||||||
for i in range(piece_number):
|
for i in range(piece_number):
|
||||||
var distance = i * sleepers_distance
|
var distance = i * sleepers_distance
|
||||||
@@ -289,17 +295,18 @@ func build_rails() -> void:
|
|||||||
sleeper.material_override = mat_wood
|
sleeper.material_override = mat_wood
|
||||||
rail_piece.add_child(sleeper)
|
rail_piece.add_child(sleeper)
|
||||||
|
|
||||||
var rail_sx = MeshInstance3D.new()
|
if should_add_procedural_rails:
|
||||||
rail_sx.mesh = mesh_rail
|
var rail_sx = MeshInstance3D.new()
|
||||||
rail_sx.material_override = mat_iron
|
rail_sx.mesh = mesh_rail
|
||||||
rail_sx.position = Vector3(-rail_distance / 2.0, 0.1, 0)
|
rail_sx.material_override = mat_iron
|
||||||
rail_piece.add_child(rail_sx)
|
rail_sx.position = Vector3(-rail_distance / 2.0, 0.1, 0)
|
||||||
|
rail_piece.add_child(rail_sx)
|
||||||
var rail_dx = MeshInstance3D.new()
|
|
||||||
rail_dx.mesh = mesh_rail
|
var rail_dx = MeshInstance3D.new()
|
||||||
rail_dx.material_override = mat_iron
|
rail_dx.mesh = mesh_rail
|
||||||
rail_dx.position = Vector3(rail_distance / 2.0, 0.1, 0)
|
rail_dx.material_override = mat_iron
|
||||||
rail_piece.add_child(rail_dx)
|
rail_dx.position = Vector3(rail_distance / 2.0, 0.1, 0)
|
||||||
|
rail_piece.add_child(rail_dx)
|
||||||
|
|
||||||
func _plan_stops() -> void:
|
func _plan_stops() -> void:
|
||||||
stop_offset.clear()
|
stop_offset.clear()
|
||||||
|
|||||||
@@ -4,6 +4,15 @@ extends Node3D
|
|||||||
const NOISE_TEXTURE: Texture2D = preload("res://core/daynight/noise.tres")
|
const NOISE_TEXTURE: Texture2D = preload("res://core/daynight/noise.tres")
|
||||||
const WEATHER_SHADER: Material = preload("res://core/daynight/weather_overlay.tres")
|
const WEATHER_SHADER: Material = preload("res://core/daynight/weather_overlay.tres")
|
||||||
const DYNAMIC_ENVIRONMENT_UPDATES_PER_FRAME: int = 32 #how many update of the environment (apply materials) will be done per frame
|
const DYNAMIC_ENVIRONMENT_UPDATES_PER_FRAME: int = 32 #how many update of the environment (apply materials) will be done per frame
|
||||||
|
const FORCE_WEATHER_MATERIAL_PATH_PARTS: PackedStringArray = [
|
||||||
|
"/chunk/material/field.tres",
|
||||||
|
"/chunk/material/grassflat_chunk.tres",
|
||||||
|
"/chunk/material/path_chunk.tres",
|
||||||
|
"/chunk/material/railway_chunk.tres",
|
||||||
|
"/chunk/material/terrain.tres",
|
||||||
|
"/chunk/prop/house/house.tres",
|
||||||
|
"/chunk/prop/house/house_emissiv.tres",
|
||||||
|
]
|
||||||
|
|
||||||
@export var environment_config: EnvironmentConfig
|
@export var environment_config: EnvironmentConfig
|
||||||
|
|
||||||
@@ -157,9 +166,17 @@ func _restore_keyboard_action_events() -> void:
|
|||||||
_blocked_keyboard_events_by_action.clear()
|
_blocked_keyboard_events_by_action.clear()
|
||||||
|
|
||||||
func _on_tree_node_added(node: Node) -> void:
|
func _on_tree_node_added(node: Node) -> void:
|
||||||
if node.is_in_group("wind_node") or node.is_in_group("weather_node") or node.is_in_group("weather_vegetables_node"):
|
if _should_queue_dynamic_environment_node(node):
|
||||||
_queue_dynamic_environment_node(node)
|
_queue_dynamic_environment_node(node)
|
||||||
|
|
||||||
|
func _should_queue_dynamic_environment_node(node: Node) -> bool:
|
||||||
|
if node.is_in_group("wind_node"):
|
||||||
|
return true
|
||||||
|
if node.is_in_group("weather_vegetables_node"):
|
||||||
|
return true
|
||||||
|
|
||||||
|
return node is Node3D
|
||||||
|
|
||||||
func _queue_dynamic_environment_node(node: Node) -> void:
|
func _queue_dynamic_environment_node(node: Node) -> void:
|
||||||
if not is_instance_valid(node):
|
if not is_instance_valid(node):
|
||||||
return
|
return
|
||||||
@@ -205,7 +222,7 @@ func _apply_dynamic_environment_materials(node: Node) -> void:
|
|||||||
if node.is_in_group("wind_node"):
|
if node.is_in_group("wind_node"):
|
||||||
_apply_wind_noise_to_node(node, NOISE_TEXTURE)
|
_apply_wind_noise_to_node(node, NOISE_TEXTURE)
|
||||||
|
|
||||||
if node.is_in_group("weather_node") or node.is_in_group("weather_vegetables_node"):
|
if node is Node3D:
|
||||||
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
||||||
|
|
||||||
if _should_ignore_weather_overlay(node):
|
if _should_ignore_weather_overlay(node):
|
||||||
@@ -231,11 +248,9 @@ func _apply_wind_noise_to_node(node: Node, noise_tex: Texture2D) -> void:
|
|||||||
_apply_wind_noise_to_node(child, noise_tex)
|
_apply_wind_noise_to_node(child, noise_tex)
|
||||||
|
|
||||||
func ApplyWeatherShaderToMaterials():
|
func ApplyWeatherShaderToMaterials():
|
||||||
for node in get_tree().get_nodes_in_group("weather_node"):
|
var current_scene := get_tree().current_scene
|
||||||
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
if current_scene != null:
|
||||||
|
_apply_weather_overlay_to_node(current_scene, _get_weather_overlay_material(current_scene))
|
||||||
for node in get_tree().get_nodes_in_group("weather_vegetables_node"):
|
|
||||||
_apply_weather_overlay_to_node(node, _get_weather_overlay_material(node))
|
|
||||||
|
|
||||||
func _get_weather_overlay_material(node: Node) -> Material:
|
func _get_weather_overlay_material(node: Node) -> Material:
|
||||||
if not node.is_in_group("weather_overlay_no_noise"):
|
if not node.is_in_group("weather_overlay_no_noise"):
|
||||||
@@ -255,13 +270,21 @@ func _apply_weather_overlay_to_node(node: Node, material: Material) -> void:
|
|||||||
return
|
return
|
||||||
|
|
||||||
if node is GeometryInstance3D:
|
if node is GeometryInstance3D:
|
||||||
if _should_clear_weather_overlay(node) or _geometry_uses_alpha_texture(node):
|
if _geometry_should_never_receive_weather_overlay(node):
|
||||||
|
node.material_overlay = null
|
||||||
|
elif _should_clear_weather_overlay(node) and not _geometry_forces_weather_overlay(node):
|
||||||
|
node.material_overlay = null
|
||||||
|
elif _geometry_uses_alpha_texture(node) or _geometry_should_skip_weather_overlay(node):
|
||||||
node.material_overlay = null
|
node.material_overlay = null
|
||||||
else:
|
else:
|
||||||
node.material_overlay = material
|
node.material_overlay = material
|
||||||
|
|
||||||
|
var child_material := _get_weather_overlay_material(node)
|
||||||
|
if child_material == WEATHER_SHADER and material == weather_shader_no_noise:
|
||||||
|
child_material = material
|
||||||
|
|
||||||
for child in node.get_children():
|
for child in node.get_children():
|
||||||
_apply_weather_overlay_to_node(child, material)
|
_apply_weather_overlay_to_node(child, child_material)
|
||||||
|
|
||||||
func _clear_weather_overlay_from_node(node: Node) -> void:
|
func _clear_weather_overlay_from_node(node: Node) -> void:
|
||||||
if node is GeometryInstance3D:
|
if node is GeometryInstance3D:
|
||||||
@@ -289,11 +312,99 @@ func _geometry_uses_alpha_texture(node: GeometryInstance3D) -> bool:
|
|||||||
|
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
func _geometry_should_never_receive_weather_overlay(node: GeometryInstance3D) -> bool:
|
||||||
|
if node is GPUParticles3D:
|
||||||
|
return true
|
||||||
|
|
||||||
|
var node_name := String(node.name).to_lower()
|
||||||
|
return node_name.contains("cloud") or node_name.contains("fog") or node_name.contains("godray")
|
||||||
|
|
||||||
|
func _geometry_should_skip_weather_overlay(node: GeometryInstance3D) -> bool:
|
||||||
|
if _geometry_forces_weather_overlay(node):
|
||||||
|
return false
|
||||||
|
if _node_name_indicates_water(node):
|
||||||
|
return true
|
||||||
|
|
||||||
|
var has_material: bool = false
|
||||||
|
var all_materials_ignored: bool = true
|
||||||
|
var material_override := node.material_override
|
||||||
|
if material_override != null:
|
||||||
|
has_material = true
|
||||||
|
all_materials_ignored = all_materials_ignored and _material_ignores_weather_overlay(material_override)
|
||||||
|
|
||||||
|
if node is MeshInstance3D:
|
||||||
|
for surface_index in node.get_surface_override_material_count():
|
||||||
|
var surface_material: Material = node.get_surface_override_material(surface_index)
|
||||||
|
if surface_material == null:
|
||||||
|
continue
|
||||||
|
|
||||||
|
has_material = true
|
||||||
|
all_materials_ignored = all_materials_ignored and _material_ignores_weather_overlay(surface_material)
|
||||||
|
|
||||||
|
if node.mesh:
|
||||||
|
for surface_index in node.mesh.get_surface_count():
|
||||||
|
var mesh_material: Material = node.mesh.surface_get_material(surface_index)
|
||||||
|
if mesh_material == null:
|
||||||
|
continue
|
||||||
|
|
||||||
|
has_material = true
|
||||||
|
all_materials_ignored = all_materials_ignored and _material_ignores_weather_overlay(mesh_material)
|
||||||
|
|
||||||
|
return has_material and all_materials_ignored
|
||||||
|
|
||||||
|
func _geometry_forces_weather_overlay(node: GeometryInstance3D) -> bool:
|
||||||
|
if _material_forces_weather_overlay(node.material_override):
|
||||||
|
return true
|
||||||
|
|
||||||
|
if node is MeshInstance3D:
|
||||||
|
for surface_index in node.get_surface_override_material_count():
|
||||||
|
if _material_forces_weather_overlay(node.get_surface_override_material(surface_index)):
|
||||||
|
return true
|
||||||
|
|
||||||
|
if node.mesh:
|
||||||
|
for surface_index in node.mesh.get_surface_count():
|
||||||
|
if _material_forces_weather_overlay(node.mesh.surface_get_material(surface_index)):
|
||||||
|
return true
|
||||||
|
|
||||||
|
return false
|
||||||
|
|
||||||
|
func _material_forces_weather_overlay(material: Material) -> bool:
|
||||||
|
if material == null:
|
||||||
|
return false
|
||||||
|
|
||||||
|
var resource_path := material.resource_path.to_lower()
|
||||||
|
for path_part in FORCE_WEATHER_MATERIAL_PATH_PARTS:
|
||||||
|
if resource_path.contains(path_part):
|
||||||
|
return true
|
||||||
|
|
||||||
|
return false
|
||||||
|
|
||||||
|
func _node_name_indicates_water(node: Node) -> bool:
|
||||||
|
var node_name := String(node.name).to_lower()
|
||||||
|
return node_name.begins_with("water") or node_name.contains("/water")
|
||||||
|
|
||||||
|
func _material_ignores_weather_overlay(material: Material) -> bool:
|
||||||
|
if material == null:
|
||||||
|
return false
|
||||||
|
|
||||||
|
var resource_path := material.resource_path.to_lower()
|
||||||
|
if resource_path.contains("/water") or resource_path.contains("water_"):
|
||||||
|
return true
|
||||||
|
if resource_path.contains("/cloud/") or resource_path.contains("cloud"):
|
||||||
|
return true
|
||||||
|
|
||||||
|
var base_material := material as BaseMaterial3D
|
||||||
|
if base_material != null:
|
||||||
|
return base_material.transparency != BaseMaterial3D.TRANSPARENCY_DISABLED or base_material.albedo_color.a < 0.99
|
||||||
|
|
||||||
|
return false
|
||||||
|
|
||||||
func _shader_material_uses_alpha_texture(material: ShaderMaterial) -> bool:
|
func _shader_material_uses_alpha_texture(material: ShaderMaterial) -> bool:
|
||||||
if material == null or material.shader == null:
|
if material == null or material.shader == null:
|
||||||
return false
|
return false
|
||||||
|
|
||||||
return material.shader.code.find("alpha_texture") != -1
|
var shader_code := material.shader.code
|
||||||
|
return shader_code.find("alpha_texture") != -1 or shader_code.find("ALPHA") != -1 or shader_code.find("opacity") != -1
|
||||||
|
|
||||||
func _should_ignore_weather_overlay(node: Node) -> bool:
|
func _should_ignore_weather_overlay(node: Node) -> bool:
|
||||||
return node.is_in_group("weather_overlay_ignore")
|
return node.is_in_group("weather_overlay_ignore")
|
||||||
|
|||||||
@@ -13,8 +13,9 @@ global uniform float global_snow_melt_speed = 0.1;
|
|||||||
global uniform float global_snow_amount = 0.0;
|
global uniform float global_snow_amount = 0.0;
|
||||||
global uniform vec4 global_snow_color;
|
global uniform vec4 global_snow_color;
|
||||||
global uniform float global_rain_intensity;
|
global uniform float global_rain_intensity;
|
||||||
const float LEAVES_FULL_SNOW_START = 0.58;
|
const float LEAVES_FULL_SNOW_START = 0.96;
|
||||||
const float LEAVES_FULL_SNOW_END = 0.86;
|
const float LEAVES_FULL_SNOW_END = 1.0;
|
||||||
|
const float LEAVES_TOP_SNOW_COVERAGE = 0.75;
|
||||||
|
|
||||||
uniform sampler2D wind_noise : filter_linear_mipmap;
|
uniform sampler2D wind_noise : filter_linear_mipmap;
|
||||||
uniform bool billboard_enabled = true;
|
uniform bool billboard_enabled = true;
|
||||||
@@ -110,7 +111,7 @@ void fragment() {
|
|||||||
float snow_amount = pow(get_snow_progress(), 0.55);
|
float snow_amount = pow(get_snow_progress(), 0.55);
|
||||||
|
|
||||||
float top_mask = 1.0 - shifted_uv.y;
|
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;
|
float snow_mask = smoothstep(1.0 - snow_amount * LEAVES_TOP_SNOW_COVERAGE, 1.08 - snow_amount * LEAVES_TOP_SNOW_COVERAGE, top_mask) * snow_visibility;
|
||||||
snow_mask *= step(0.01, snow_amount);
|
snow_mask *= step(0.01, snow_amount);
|
||||||
float full_snow_mask = smoothstep(LEAVES_FULL_SNOW_START, LEAVES_FULL_SNOW_END, snow_amount) * clamp(snow_visibility, 0.0, 1.0);
|
float full_snow_mask = smoothstep(LEAVES_FULL_SNOW_START, LEAVES_FULL_SNOW_END, snow_amount) * clamp(snow_visibility, 0.0, 1.0);
|
||||||
float final_snow_mask = max(snow_mask, full_snow_mask);
|
float final_snow_mask = max(snow_mask, full_snow_mask);
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ global uniform float global_snow_cap_flatness_end = 0.96;
|
|||||||
global uniform float global_snow_cap_noise_scale = 0.22;
|
global uniform float global_snow_cap_noise_scale = 0.22;
|
||||||
global uniform float global_snow_cap_noise_strength = 0.18;
|
global uniform float global_snow_cap_noise_strength = 0.18;
|
||||||
const float SNOW_VISUAL_RESPONSE = 0.55;
|
const float SNOW_VISUAL_RESPONSE = 0.55;
|
||||||
const float FULL_SNOW_VISUAL_START = 0.82;
|
const float FULL_SNOW_VISUAL_START = 0.58;
|
||||||
const float FULL_SNOW_VISUAL_END = 0.98;
|
const float FULL_SNOW_VISUAL_END = 0.86;
|
||||||
uniform bool snow_noise_enabled = true;
|
uniform bool snow_noise_enabled = true;
|
||||||
uniform float snow_noise_scale : hint_range(0.01, 1.0) = 0.15;
|
uniform float snow_noise_scale : hint_range(0.01, 1.0) = 0.15;
|
||||||
uniform float snow_edge_softness : hint_range(0.01, 0.5) = 0.2;
|
uniform float snow_edge_softness : hint_range(0.01, 0.5) = 0.2;
|
||||||
@@ -154,7 +154,7 @@ void fragment() {
|
|||||||
float flat_accumulation = smoothstep(0.0, 0.35, v_snow_cap_mask) * snow_accumulation;
|
float flat_accumulation = smoothstep(0.0, 0.35, v_snow_cap_mask) * snow_accumulation;
|
||||||
float snow_noise_mask = get_snow_noise_mask(world_pos, snow_progress);
|
float snow_noise_mask = get_snow_noise_mask(world_pos, snow_progress);
|
||||||
float snow_variation = mix(0.75, 1.15, noise_val);
|
float snow_variation = mix(0.75, 1.15, noise_val);
|
||||||
float snow_coverage = clamp(mix(snow_progress * 0.35, snow_progress * snow_variation, snow_noise_mask) + flat_accumulation * 0.15, 0.0, 1.0);
|
float snow_coverage = clamp(mix(snow_progress * 0.55, snow_progress * snow_variation, snow_noise_mask) + flat_accumulation * 0.2, 0.0, 1.0);
|
||||||
float snow_factor = max(snow_edge * snow_coverage, flat_accumulation);
|
float snow_factor = max(snow_edge * snow_coverage, flat_accumulation);
|
||||||
float snow_opacity = clamp(snow_factor, 0.0, 1.0);
|
float snow_opacity = clamp(snow_factor, 0.0, 1.0);
|
||||||
snow_opacity = max(snow_opacity, flat_accumulation * mix(0.45, 0.9, snow_noise_mask));
|
snow_opacity = max(snow_opacity, flat_accumulation * mix(0.45, 0.9, snow_noise_mask));
|
||||||
|
|||||||
84
tgcc/main menu/distant_menu_world.tscn
Normal file
84
tgcc/main menu/distant_menu_world.tscn
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
[gd_scene format=3 uid="uid://c7shevn0javuv"]
|
||||||
|
|
||||||
|
[ext_resource type="Material" uid="uid://blqelpjvdv23j" path="res://tgcc/chunk/material/grassflat_chunk.tres" id="1_grass"]
|
||||||
|
[ext_resource type="Material" uid="uid://c2x7xxweexmj" path="res://tgcc/chunk/material/field.tres" id="2_field"]
|
||||||
|
[ext_resource type="Material" uid="uid://4xhpd6lust7w" path="res://tgcc/chunk/material/path_chunk.tres" id="3_path"]
|
||||||
|
[ext_resource type="Material" uid="uid://cnu38m5dsy4uw" path="res://tgcc/chunk/material/terrain.tres" id="4_terrain"]
|
||||||
|
[ext_resource type="Material" uid="uid://o31kp0jm07q3" path="res://tgcc/chunk/material/rocks.tres" id="7_rocks"]
|
||||||
|
|
||||||
|
[sub_resource type="PlaneMesh" id="PlaneMesh_ground"]
|
||||||
|
size = Vector2(560, 360)
|
||||||
|
|
||||||
|
[sub_resource type="PlaneMesh" id="PlaneMesh_field_large"]
|
||||||
|
size = Vector2(70, 95)
|
||||||
|
|
||||||
|
[sub_resource type="PlaneMesh" id="PlaneMesh_field_small"]
|
||||||
|
size = Vector2(44, 62)
|
||||||
|
|
||||||
|
[sub_resource type="PlaneMesh" id="PlaneMesh_path_long"]
|
||||||
|
size = Vector2(12, 340)
|
||||||
|
|
||||||
|
[sub_resource type="PlaneMesh" id="PlaneMesh_path_short"]
|
||||||
|
size = Vector2(10, 120)
|
||||||
|
|
||||||
|
[sub_resource type="SphereMesh" id="SphereMesh_tree_crown"]
|
||||||
|
radius = 4.0
|
||||||
|
height = 5.0
|
||||||
|
radial_segments = 8
|
||||||
|
rings = 4
|
||||||
|
|
||||||
|
[node name="DistantMenuWorld" type="Node3D" unique_id=448788103]
|
||||||
|
|
||||||
|
[node name="Ground" type="MeshInstance3D" parent="." unique_id=1769769010]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -0.12, 250)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_ground")
|
||||||
|
surface_material_override/0 = ExtResource("1_grass")
|
||||||
|
|
||||||
|
[node name="BackDirt" type="MeshInstance3D" parent="." unique_id=441617212]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -155, -0.1, 235)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_field_large")
|
||||||
|
surface_material_override/0 = ExtResource("4_terrain")
|
||||||
|
|
||||||
|
[node name="FieldA" type="MeshInstance3D" parent="." unique_id=1168162022]
|
||||||
|
transform = Transform3D(0.9659258, 0, -0.25881904, 0, 1, 0, 0.25881904, 0, 0.9659258, -90, -0.08, 175)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_field_large")
|
||||||
|
surface_material_override/0 = ExtResource("2_field")
|
||||||
|
|
||||||
|
[node name="FieldB" type="MeshInstance3D" parent="." unique_id=908374467]
|
||||||
|
transform = Transform3D(0.8660254, 0, 0.5, 0, 1, 0, -0.5, 0, 0.8660254, 105, -0.08, 190)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_field_large")
|
||||||
|
surface_material_override/0 = ExtResource("2_field")
|
||||||
|
|
||||||
|
[node name="FieldC" type="MeshInstance3D" parent="." unique_id=725405179]
|
||||||
|
transform = Transform3D(0.9063078, 0, -0.42261827, 0, 1, 0, 0.42261827, 0, 0.9063078, 160, -0.08, 305)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_field_small")
|
||||||
|
surface_material_override/0 = ExtResource("2_field")
|
||||||
|
|
||||||
|
[node name="FieldD" type="MeshInstance3D" parent="." unique_id=180749651]
|
||||||
|
transform = Transform3D(0.9848077, 0, 0.17364818, 0, 1, 0, -0.17364818, 0, 0.9848077, -190, -0.08, 320)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_field_small")
|
||||||
|
surface_material_override/0 = ExtResource("2_field")
|
||||||
|
|
||||||
|
[node name="DistantRoadMain" type="MeshInstance3D" parent="." unique_id=979021818]
|
||||||
|
transform = Transform3D(0.70710677, 0, -0.70710677, 0, 1, 0, 0.70710677, 0, 0.70710677, 5, -0.06, 240)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_path_long")
|
||||||
|
surface_material_override/0 = ExtResource("3_path")
|
||||||
|
|
||||||
|
[node name="DistantRoadCross" type="MeshInstance3D" parent="." unique_id=1994181739]
|
||||||
|
transform = Transform3D(0.25881904, 0, 0.9659258, 0, 1, 0, -0.9659258, 0, 0.25881904, -20, -0.05, 220)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("PlaneMesh_path_short")
|
||||||
|
surface_material_override/0 = ExtResource("3_path")
|
||||||
|
|
||||||
|
[node name="RockPatch" type="MeshInstance3D" parent="." unique_id=12563390]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 0.35, 0, 0, 0, 0.65, -15, 0.6, 350)
|
||||||
|
cast_shadow = 0
|
||||||
|
mesh = SubResource("SphereMesh_tree_crown")
|
||||||
|
surface_material_override/0 = ExtResource("7_rocks")
|
||||||
@@ -4,13 +4,27 @@ extends Node3D
|
|||||||
@export var play_departure_delay_seconds: float = 1.0
|
@export var play_departure_delay_seconds: float = 1.0
|
||||||
@export var play_move_before_transition_seconds: float = 3.0
|
@export var play_move_before_transition_seconds: float = 3.0
|
||||||
@export var menu_train_whistle_volume_db: float = -12.0
|
@export var menu_train_whistle_volume_db: float = -12.0
|
||||||
|
@export var prewarm_chunks_before_show: bool = true
|
||||||
|
|
||||||
var _play_departure_started: bool = false
|
var _play_departure_started: bool = false
|
||||||
|
|
||||||
@onready var _rail_path: Node = $rail
|
@onready var _rail_path: Node = $rail
|
||||||
|
@onready var _biome_generator: Node = $biome_generator
|
||||||
|
@onready var _environment_manager: Node = $EnvironmentManager
|
||||||
@onready var _option_menu: Control = $MainMenuUI/SubViewport/OptionMenu
|
@onready var _option_menu: Control = $MainMenuUI/SubViewport/OptionMenu
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
if prewarm_chunks_before_show:
|
||||||
|
visible = false
|
||||||
|
await get_tree().physics_frame
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
if _biome_generator != null and _biome_generator.has_method("generate_initial_world_now"):
|
||||||
|
_biome_generator.generate_initial_world_now()
|
||||||
|
if _environment_manager != null and _environment_manager.has_method("flush_pending_environment_nodes"):
|
||||||
|
_environment_manager.flush_pending_environment_nodes()
|
||||||
|
visible = true
|
||||||
|
|
||||||
_stop_menu_train()
|
_stop_menu_train()
|
||||||
_configure_menu_train_whistle_volume()
|
_configure_menu_train_whistle_volume()
|
||||||
_configure_play_transition_delay()
|
_configure_play_transition_delay()
|
||||||
|
|||||||
@@ -105,6 +105,7 @@
|
|||||||
[ext_resource type="Shader" uid="uid://bhqtjjs3emv7f" path="res://tgcc/main menu/godraysmenu.gdshader" id="103_g1vc5"]
|
[ext_resource type="Shader" uid="uid://bhqtjjs3emv7f" path="res://tgcc/main menu/godraysmenu.gdshader" id="103_g1vc5"]
|
||||||
[ext_resource type="PackedScene" uid="uid://cp2vmysawnuql" path="res://tgcc/chunk/prop/sign/scene/signMenu.tscn" id="103_mrhmq"]
|
[ext_resource type="PackedScene" uid="uid://cp2vmysawnuql" path="res://tgcc/chunk/prop/sign/scene/signMenu.tscn" id="103_mrhmq"]
|
||||||
[ext_resource type="Material" uid="uid://dljvvppsdbjd1" path="res://tgcc/chunk/material/glowplane.tres" id="104_mrhmq"]
|
[ext_resource type="Material" uid="uid://dljvvppsdbjd1" path="res://tgcc/chunk/material/glowplane.tres" id="104_mrhmq"]
|
||||||
|
[ext_resource type="PackedScene" path="res://tgcc/main menu/distant_menu_world.tscn" id="105_background"]
|
||||||
|
|
||||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_00nq7"]
|
[sub_resource type="ShaderMaterial" id="ShaderMaterial_00nq7"]
|
||||||
render_priority = 0
|
render_priority = 0
|
||||||
@@ -176,13 +177,12 @@ metadata/_custom_type_script = "uid://brcimd12tx3dm"
|
|||||||
compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_q52t1")])
|
compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_q52t1")])
|
||||||
|
|
||||||
[sub_resource type="Curve3D" id="Curve3D_263ax"]
|
[sub_resource type="Curve3D" id="Curve3D_263ax"]
|
||||||
closed = true
|
|
||||||
bake_interval = 50.0
|
bake_interval = 50.0
|
||||||
_data = {
|
_data = {
|
||||||
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 3.5, 0, 0, 0, 0, 0, 0, 0, 0, 3.5, 0, 100, 0, 0, 0, 0, 0, 0, 2.961661, -0.009097099, -56.07381, 0, 0, 0, 0, 0, 0, 3.4848416, -0.013232231, -117.195526, 0, 0, 0, 0, 0, 0, 3.3488476, 0.0048189163, 176.55922, 0, 0, 0, 0, 0, 0, 1.7582202, 0.0118227005, 270.61703),
|
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 3.0078363, -1.8119812e-05, -12.587097, 0, 0, 0, 0, 0, 0, 3.360159, -1.8119812e-05, -79.54889, 0, 0, 0, 0, 0, 0, 2.826539, -1.8119812e-05, -159.47318, 0, 0, 0, 0, 0, 0, 3.0367248, -1.8119812e-05, -269.20667),
|
||||||
"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0)
|
"tilts": PackedFloat32Array(0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
point_count = 6
|
point_count = 4
|
||||||
|
|
||||||
[sub_resource type="PlaneMesh" id="PlaneMesh_00nq7"]
|
[sub_resource type="PlaneMesh" id="PlaneMesh_00nq7"]
|
||||||
|
|
||||||
@@ -284,6 +284,8 @@ size = Vector2(600, 300)
|
|||||||
[node name="MainMenu" type="Node3D" unique_id=448381304]
|
[node name="MainMenu" type="Node3D" unique_id=448381304]
|
||||||
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 0)
|
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 0)
|
||||||
script = ExtResource("1_4j5xl")
|
script = ExtResource("1_4j5xl")
|
||||||
|
play_departure_speed = 6.0
|
||||||
|
menu_train_whistle_volume_db = -14.0
|
||||||
|
|
||||||
[node name="EnvironmentManager" parent="." unique_id=1611939731 instance=ExtResource("1_2o8pc")]
|
[node name="EnvironmentManager" parent="." unique_id=1611939731 instance=ExtResource("1_2o8pc")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.822516, 0, 1.9254212)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.822516, 0, 1.9254212)
|
||||||
@@ -311,7 +313,7 @@ directional_shadow_mode = 0
|
|||||||
directional_shadow_max_distance = 200.0
|
directional_shadow_max_distance = 200.0
|
||||||
|
|
||||||
[node name="rail" type="Path3D" parent="." unique_id=28337754]
|
[node name="rail" type="Path3D" parent="." unique_id=28337754]
|
||||||
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, -47.25185, 1.7218199, 3.4257338)
|
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 114.74815, 1.7218199, 3.4257479)
|
||||||
curve = SubResource("Curve3D_263ax")
|
curve = SubResource("Curve3D_263ax")
|
||||||
script = ExtResource("7_5p27e")
|
script = ExtResource("7_5p27e")
|
||||||
train_model = ExtResource("8_ljvyb")
|
train_model = ExtResource("8_ljvyb")
|
||||||
@@ -322,7 +324,7 @@ wagon_gap = 0.6
|
|||||||
wagon_spacing_scale = 0.9
|
wagon_spacing_scale = 0.9
|
||||||
train_start_mode = 2
|
train_start_mode = 2
|
||||||
train_start_stop_index = 0
|
train_start_stop_index = 0
|
||||||
train_start_position = 540.0
|
train_start_position = 87.0
|
||||||
train_start_after_delay = false
|
train_start_after_delay = false
|
||||||
train_facing_direction = 2
|
train_facing_direction = 2
|
||||||
sleepers_model = ExtResource("10_00nq7")
|
sleepers_model = ExtResource("10_00nq7")
|
||||||
@@ -331,6 +333,9 @@ fireworks_scene = ExtResource("11_aylkj")
|
|||||||
[node name="MainMap" parent="." unique_id=1895741703 instance=ExtResource("2_wbrya")]
|
[node name="MainMap" parent="." unique_id=1895741703 instance=ExtResource("2_wbrya")]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 63.069893, 0, -4.743943e-06)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 63.069893, 0, -4.743943e-06)
|
||||||
|
|
||||||
|
[node name="DistantMenuWorld" parent="." unique_id=1852904287 instance=ExtResource("105_background")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -117.95)
|
||||||
|
|
||||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1523044435]
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1523044435]
|
||||||
transform = Transform3D(-80.07708, -1.0239479e-05, 4.277144e-13, 0, -2.9642006e-06, -64.80289, 1.2091303e-05, -67.813, 2.832624e-06, 308.45245, 59.279312, 332.5165)
|
transform = Transform3D(-80.07708, -1.0239479e-05, 4.277144e-13, 0, -2.9642006e-06, -64.80289, 1.2091303e-05, -67.813, 2.832624e-06, 308.45245, 59.279312, 332.5165)
|
||||||
cast_shadow = 0
|
cast_shadow = 0
|
||||||
@@ -375,14 +380,14 @@ transform = Transform3D(-0.09359112, 0, 0.9713834, 0, 0.56225973, 0, -0.38276488
|
|||||||
[node name="Fuji4" parent="." unique_id=930179001 instance=ExtResource("99_61psf")]
|
[node name="Fuji4" parent="." unique_id=930179001 instance=ExtResource("99_61psf")]
|
||||||
transform = Transform3D(-0.09359112, 0, 0.9713834, 0, 0.56225973, 0, -0.38276488, 0, -0.23751618, 239.46135, 1.7057877, 224.6928)
|
transform = Transform3D(-0.09359112, 0, 0.9713834, 0, 0.56225973, 0, -0.38276488, 0, -0.23751618, 239.46135, 1.7057877, 224.6928)
|
||||||
|
|
||||||
[node name="Landscape" parent="Fuji4" index="0" unique_id=244602034]
|
[node name="Landscape" parent="Fuji4" index="0" unique_id=581950846]
|
||||||
transform = Transform3D(28.638817, 1.7053026e-13, -7.6293945e-06, 0, 13.6219845, 2.1621709e-06, 0, -1.0284306e-06, 28.638834, -10.786804, 5.0069, 17.382736)
|
transform = Transform3D(28.638817, 1.7053026e-13, -7.6293945e-06, 0, 13.6219845, 2.1621709e-06, 0, -1.0284306e-06, 28.638834, -10.786804, 5.0069, 17.382736)
|
||||||
surface_material_override/0 = SubResource("ShaderMaterial_g1vc5")
|
surface_material_override/0 = SubResource("ShaderMaterial_g1vc5")
|
||||||
|
|
||||||
[node name="Fuji5" parent="." unique_id=1070037082 instance=ExtResource("99_61psf")]
|
[node name="Fuji5" parent="." unique_id=1070037082 instance=ExtResource("99_61psf")]
|
||||||
transform = Transform3D(0.0935979, 0, 0.9713791, 0, 0.56225973, 0, -0.38276324, 0, 0.23753339, -275.95566, -3.4616928, 232.02234)
|
transform = Transform3D(0.0935979, 0, 0.9713791, 0, 0.56225973, 0, -0.38276324, 0, 0.23753339, -275.95566, -3.4616928, 232.02234)
|
||||||
|
|
||||||
[node name="Landscape" parent="Fuji5" index="0" unique_id=244602034]
|
[node name="Landscape" parent="Fuji5" index="0" unique_id=581950846]
|
||||||
transform = Transform3D(28.638819, 1.7053026e-13, -7.6293945e-06, 0, 13.6219845, 2.1621709e-06, 0, -1.0284306e-06, 28.638836, -10.786743, 6.703195, 17.382767)
|
transform = Transform3D(28.638819, 1.7053026e-13, -7.6293945e-06, 0, 13.6219845, 2.1621709e-06, 0, -1.0284306e-06, 28.638836, -10.786743, 6.703195, 17.382767)
|
||||||
surface_material_override/0 = SubResource("ShaderMaterial_g1vc5")
|
surface_material_override/0 = SubResource("ShaderMaterial_g1vc5")
|
||||||
|
|
||||||
@@ -392,7 +397,7 @@ transform = Transform3D(-4.88843, -0.020050459, 0.86837775, -0.010355438, 4.9646
|
|||||||
[node name="Fuji6" parent="." unique_id=150126281 instance=ExtResource("100_0aqpp")]
|
[node name="Fuji6" parent="." unique_id=150126281 instance=ExtResource("100_0aqpp")]
|
||||||
transform = Transform3D(-5.287449, -0.020231497, 0.22351237, -0.011200703, 5.009496, 0.014500697, -0.9394429, 0.05414178, -1.2581636, 32.446022, 15.848213, 525.54346)
|
transform = Transform3D(-5.287449, -0.020231497, 0.22351237, -0.011200703, 5.009496, 0.014500697, -0.9394429, 0.05414178, -1.2581636, 32.446022, 15.848213, 525.54346)
|
||||||
|
|
||||||
[node name="Mt Fuji_simplified_3d_mesh" parent="Fuji6" index="0" unique_id=1389340781]
|
[node name="Mt Fuji_simplified_3d_mesh" parent="Fuji6" index="0" unique_id=65404928]
|
||||||
transform = Transform3D(0.5151193, -0.011206273, -0.07264297, 0.077138014, 0.07483422, 0.48510167, 3.5762787e-07, -0.4938935, 0.07515043, 6.299696, 12.244916, 3.004303)
|
transform = Transform3D(0.5151193, -0.011206273, -0.07264297, 0.077138014, 0.07483422, 0.48510167, 3.5762787e-07, -0.4938935, 0.07515043, 6.299696, 12.244916, 3.004303)
|
||||||
surface_material_override/0 = SubResource("ShaderMaterial_vvb5q")
|
surface_material_override/0 = SubResource("ShaderMaterial_vvb5q")
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ data = PackedByteArray("//vQZAAOhpd2PgtGR7JsJPfgYSYSJ6387g9rgIGKF+EZgxxoAM4TYIWm
|
|||||||
closed = true
|
closed = true
|
||||||
bake_interval = 60.0
|
bake_interval = 60.0
|
||||||
_data = {
|
_data = {
|
||||||
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0.717, 0, 4.915, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, -4.372, 0, 140, 0, 0, 0, 0, 0, 0, -20.963, 0, 160, 0, 0, 0, 0, 0, 0, -40.62518, 0, 168.52754, 0, 0, 0, 0, 0, 0, -60, 0, 170, 0, 0, 0, 0, 0, 0, -80, 0, 170, 0, 0, 0, 0, 0, 0, -100, 0, 170, 0, 0, 0, 0, 0, 0, -120.42937, 0, 171.50279, 0, 0, 0, 0, 0, 0, -141.41747, 7.6293945e-06, 180.5982, 0, 0, 0, 0, 0, 0, -155.77005, 7.6293945e-06, 198.35184, 0, 0, 0, 0, 0, 0, -160.14105, 7.6293945e-06, 219.80951, 0, 0, 0, 0, 0, 0, -163.99007, 7.6293945e-06, 239.36005, 0, 0, 0, 0, 0, 0, -175.77509, 7.6293945e-06, 256.16028, 0, 0, 0, 0, 0, 0, -195.62283, 7.6293945e-06, 267.46912, 0, 0, 0, 0, 0, 0, -219.9999, 7.6293945e-06, 270.11758, 0, 0, 0, 0, 0, 0, -240, 0, 270.118, 0, 0, 0, 0, 0, 0, -260, 0, 270.118, 0, 0, 0, 0, 0, 0, -275.19666, 7.6293945e-06, 270.55228, 0, 0, 0, 0, 0, 0, -294.2925, 7.6293945e-06, 276.05307, 0, 0, 0, 0, 0, 0, -307.19006, 7.6293945e-06, 286.9095, 0, 0, 0, 0, 0, 0, -317.32443, 7.6293945e-06, 303.14682, 0, 0, 0, 0, 0, 0, -320, 0, 320, 0, 0, 0, 0, 0, 0, -320, 0, 340, 0, 0, 0, 0, 0, 0, -320, 0, 360, 0, 0, 0, 0, 0, 0, -320, 0, 380, 0, 0, 0, 0, 0, 0, -316.78876, 7.6293945e-06, 396.91193, 0, 0, 0, 0, 0, 0, -307.68207, 7.6293945e-06, 412.70596, 0, 0, 0, 0, 0, 0, -291.08273, 7.6293945e-06, 424.7491, 0, 0, 0, 0, 0, 0, -270, 0, 429.994, 0, 0, 0, 0, 0, 0, -250, 0, 429.994, 0, 0, 0, 0, 0, 0, -229.90146, 7.6293945e-06, 433.90823, 0, 0, 0, 0, 0, 0, -217.15442, 7.6293945e-06, 442.98242, 0, 0, 0, 0, 0, 0, -204.60803, 7.6293945e-06, 459.93704, 0, 0, 0, 0, 0, 0, -200, 0, 480, 0, 0, 0, 0, 0, 0, -200, 0, 500, 0, 0, 0, 0, 0, 0, -195.5338, 7.6293945e-06, 520.0368, 0, 0, 0, 0, 0, 0, -184.9173, 7.6293945e-06, 535.07776, 0, 0, 0, 0, 0, 0, -170.36423, 7.6293945e-06, 545.0799, 0, 0, 0, 0, 0, 0, -150.56184, 0, 549.8127, 0, 0, 0, 0, 0, 0, -130, 0, 550, 0, 0, 0, 0, 0, 0, -110, 0, 550, 0, 0, 0, 0, 0, 0, -90, 0, 550, 0, 0, 0, 0, 0, 0, -70, 0, 550, 0, 0, 0, 0, 0, 0, -50, 0, 550, 0, 0, 0, 0, 0, 0, -29.862535, 7.6293945e-06, 545.3371, 0, 0, 0, 0, 0, 0, -13.215244, 7.6293945e-06, 533.0626, 0, 0, 0, 0, 0, 0, -4.098665, 7.6293945e-06, 519.6814, 0, 0, 0, 0, 0, 0, -0.048213482, 7.6293945e-06, 500.107, 0, 0, 0, 0, 0, 0, 3.7920675, 7.6293945e-06, 480.64902, 0, 0, 0, 0, 0, 0, 13.513225, 7.6293945e-06, 465.9133, 0, 0, 0, 0, 0, 0, 29.76715, 7.6293945e-06, 454.41486, 0, 0, 0, 0, 0, 0, 49.711926, 7.6293945e-06, 450.12488, 0, 0, 0, 0, 0, 0, 70, 0, 450, 0, 0, 0, 0, 0, 0, 90, 0, 450, 0, 0, 0, 0, 0, 0, 110.055405, 7.6293945e-06, 445.42627, 0, 0, 0, 0, 0, 0, 126.975784, 7.6293945e-06, 432.8683, 0, 0, 0, 0, 0, 0, 136.95703, 7.6293945e-06, 417.5506, 0, 0, 0, 0, 0, 0, 140, 0, 400, 0, 0, 0, 0, 0, 0, 140, 0, 380, 0, 0, 0, 0, 0, 0, 140, 0, 360, 0, 0, 0, 0, 0, 0, 140, 0, 340, 0, 0, 0, 0, 0, 0, 140, 0, 320, 0, 0, 0, 0, 0, 0, 140, 0, 300, 0, 0, 0, 0, 0, 0, 140, 0, 280, 0, 0, 0, 0, 0, 0, 140, 0, 260, 0, 0, 0, 0, 0, 0, 140, 0, 240, 0, 0, 0, 0, 0, 0, 140, 0, 220, 0, 0, 0, 0, 0, 0, 140, 0, 200, 0, 0, 0, 0, 0, 0, 140, 0, 180, 0, 0, 0, 0, 0, 0, 140, 0, 160, 0, 0, 0, 0, 0, 0, 140, 0, 140, 0, 0, 0, 0, 0, 0, 140, 0, 120, 0, 0, 0, 0, 0, 0, 140, 0, 100, 0, 0, 0, 0, 0, 0, 140, 0, 80, 0, 0, 0, 0, 0, 0, 140, 0, 60, 0, 0, 0, 0, 0, 0, 140, 0, 40, 0, 0, 0, 0, 0, 0, 140.26848, 0, 20, 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 136.2151, 7.6293945e-06, -18.930761, 0, 0, 0, 0, 0, 0, 124.47424, 7.6293945e-06, -35.771675, 0, 0, 0, 0, 0, 0, 109.556854, 7.6293945e-06, -45.911987, 0, 0, 0, 0, 0, 0, 90, 0, -50, 0, 0, 0, 0, 0, 0, 70, 0, -50, 0, 0, 0, 0, 0, 0, 50, 0, -50, 0, 0, 0, 0, 0, 0, 30.626865, 7.6293945e-06, -46.35706, 0, 0, 0, 0, 0, 0, 14.519331, 7.6293945e-06, -35.468895, 0, 0, 0, 0, 0, 0, 3.5, 0, -17.9),
|
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, -4.1409535, 0, 140, 0, 0, 0, 0, 0, 0, -20.385382, 0, 160.4621, 0, 0, 0, 0, 0, 0, -40.62518, 0, 168.52754, 0, 0, 0, 0, 0, 0, -60, 0, 170, 0, 0, 0, 0, 0, 0, -80, 0, 170, 0, 0, 0, 0, 0, 0, -100, 0, 170, 0, 0, 0, 0, 0, 0, -120.42937, 0, 171.50279, 0, 0, 0, 0, 0, 0, -141.41747, 7.6293945e-06, 180.5982, 0, 0, 0, 0, 0, 0, -155.77005, 7.6293945e-06, 198.35184, 0, 0, 0, 0, 0, 0, -160.14105, 7.6293945e-06, 219.80951, 0, 0, 0, 0, 0, 0, -163.99007, 7.6293945e-06, 239.36005, 0, 0, 0, 0, 0, 0, -175.77509, 7.6293945e-06, 256.16028, 0, 0, 0, 0, 0, 0, -195.62283, 7.6293945e-06, 267.46912, 0, 0, 0, 0, 0, 0, -219.9999, 7.6293945e-06, 270.11758, 0, 0, 0, 0, 0, 0, -240, 0, 270.118, 0, 0, 0, 0, 0, 0, -260, 0, 270.118, 0, 0, 0, 0, 0, 0, -275.19666, 7.6293945e-06, 270.55228, 0, 0, 0, 0, 0, 0, -294.2925, 7.6293945e-06, 276.05307, 0, 0, 0, 0, 0, 0, -307.19006, 7.6293945e-06, 286.9095, 0, 0, 0, 0, 0, 0, -317.32443, 7.6293945e-06, 303.14682, 0, 0, 0, 0, 0, 0, -320, 0, 320, 0, 0, 0, 0, 0, 0, -320, 0, 340, 0, 0, 0, 0, 0, 0, -320, 0, 360, 0, 0, 0, 0, 0, 0, -320, 0, 380, 0, 0, 0, 0, 0, 0, -316.78876, 7.6293945e-06, 396.91193, 0, 0, 0, 0, 0, 0, -307.68207, 7.6293945e-06, 412.70596, 0, 0, 0, 0, 0, 0, -291.08273, 7.6293945e-06, 424.7491, 0, 0, 0, 0, 0, 0, -270, 0, 429.994, 0, 0, 0, 0, 0, 0, -250, 0, 429.994, 0, 0, 0, 0, 0, 0, -229.90146, 7.6293945e-06, 433.90823, 0, 0, 0, 0, 0, 0, -217.15442, 7.6293945e-06, 442.98242, 0, 0, 0, 0, 0, 0, -203.97934, 7.6293945e-06, 459.7799, 0, 0, 0, 0, 0, 0, -200, 0, 480, 0, 0, 0, 0, 0, 0, -200, 0, 500, 0, 0, 0, 0, 0, 0, -195.5338, 7.6293945e-06, 520.0368, 0, 0, 0, 0, 0, 0, -184.9173, 7.6293945e-06, 535.07776, 0, 0, 0, 0, 0, 0, -170.36423, 7.6293945e-06, 545.0799, 0, 0, 0, 0, 0, 0, -150.56184, 0, 549.8127, 0, 0, 0, 0, 0, 0, -130, 0, 550, 0, 0, 0, 0, 0, 0, -110, 0, 550, 0, 0, 0, 0, 0, 0, -90, 0, 550, 0, 0, 0, 0, 0, 0, -70, 0, 550, 0, 0, 0, 0, 0, 0, -50, 0, 550, 0, 0, 0, 0, 0, 0, -29.862535, 7.6293945e-06, 545.3371, 0, 0, 0, 0, 0, 0, -12.945752, 7.6293945e-06, 534.1406, 0, 0, 0, 0, 0, 0, -4.098665, 7.6293945e-06, 519.6814, 0, 0, 0, 0, 0, 0, -0.048213482, 7.6293945e-06, 500.107, 0, 0, 0, 0, 0, 0, 3.7920675, 7.6293945e-06, 480.64902, 0, 0, 0, 0, 0, 0, 13.513225, 7.6293945e-06, 465.9133, 0, 0, 0, 0, 0, 0, 29.76715, 7.6293945e-06, 454.41486, 0, 0, 0, 0, 0, 0, 49.711926, 7.6293945e-06, 450.12488, 0, 0, 0, 0, 0, 0, 70, 0, 450, 0, 0, 0, 0, 0, 0, 90, 0, 450, 0, 0, 0, 0, 0, 0, 110.055405, 7.6293945e-06, 445.42627, 0, 0, 0, 0, 0, 0, 127.27293, 7.6293945e-06, 433.46255, 0, 0, 0, 0, 0, 0, 136.95703, 7.6293945e-06, 417.5506, 0, 0, 0, 0, 0, 0, 140, 0, 400, 0, 0, 0, 0, 0, 0, 140, 0, 380, 0, 0, 0, 0, 0, 0, 140, 0, 360, 0, 0, 0, 0, 0, 0, 140, 0, 340, 0, 0, 0, 0, 0, 0, 140, 0, 320, 0, 0, 0, 0, 0, 0, 140, 0, 300, 0, 0, 0, 0, 0, 0, 140, 0, 280, 0, 0, 0, 0, 0, 0, 140, 0, 260, 0, 0, 0, 0, 0, 0, 140, 0, 240, 0, 0, 0, 0, 0, 0, 140, 0, 220, 0, 0, 0, 0, 0, 0, 140, 0, 200, 0, 0, 0, 0, 0, 0, 140, 0, 180, 0, 0, 0, 0, 0, 0, 140, 0, 160, 0, 0, 0, 0, 0, 0, 140, 0, 140, 0, 0, 0, 0, 0, 0, 140, 0, 120, 0, 0, 0, 0, 0, 0, 140, 0, 100, 0, 0, 0, 0, 0, 0, 140, 0, 80, 0, 0, 0, 0, 0, 0, 140, 0, 60, 0, 0, 0, 0, 0, 0, 140, 0, 40, 0, 0, 0, 0, 0, 0, 140.26848, 0, 20, 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 136.2151, 7.6293945e-06, -18.930761, 0, 0, 0, 0, 0, 0, 124.47424, 7.6293945e-06, -35.771675, 0, 0, 0, 0, 0, 0, 109.556854, 7.6293945e-06, -45.911987, 0, 0, 0, 0, 0, 0, 90, 0, -50, 0, 0, 0, 0, 0, 0, 70, 0, -50, 0, 0, 0, 0, 0, 0, 50, 0, -50, 0, 0, 0, 0, 0, 0, 30.626865, 7.6293945e-06, -46.35706, 0, 0, 0, 0, 0, 0, 14.519331, 7.6293945e-06, -35.468895, 0, 0, 0, 0, 0, 0, 3.5, 0, -17.9, 0, 0, 0, 0, 0, 0, 0.2006703, 0, 0.20440674, 0, 0, 0, 0, 0, 0, 0.06303978, 0, 20.431122),
|
||||||
"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
point_count = 93
|
point_count = 93
|
||||||
@@ -207,7 +207,7 @@ biome_list = Array[ExtResource("6_jfe74")]([SubResource("Resource_3qrd0")])
|
|||||||
entity_pool = ExtResource("34_a2cst")
|
entity_pool = ExtResource("34_a2cst")
|
||||||
entity_spawn_probability = 0.4
|
entity_spawn_probability = 0.4
|
||||||
max_entities_per_chunk = 5
|
max_entities_per_chunk = 5
|
||||||
eye_line = 4
|
eye_line = 7
|
||||||
|
|
||||||
[node name="Terrain" type="MeshInstance3D" parent="." unique_id=219178561]
|
[node name="Terrain" type="MeshInstance3D" parent="." unique_id=219178561]
|
||||||
visible = false
|
visible = false
|
||||||
|
|||||||
Reference in New Issue
Block a user