From bc5aa8a41f5fc246932c3c99082736f721737fba Mon Sep 17 00:00:00 2001 From: anyreso Date: Mon, 29 Apr 2024 15:12:56 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Headless=20optimizations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entities/flag/flag.gd | 1 - entities/flag/waypoint.gd | 9 ++++--- interfaces/menus/boot/boot.tscn | 6 +++-- main.tscn | 44 ++++++++++++++------------------ maps/genesis/genesis.tscn | 3 +++ maps/genesis/resources/env.tres | 10 ++++---- modes/multiplayer/multiplayer.gd | 21 ++++++--------- systems/maps_manager.gd | 3 +++ 8 files changed, 48 insertions(+), 49 deletions(-) diff --git a/entities/flag/flag.gd b/entities/flag/flag.gd index 017fdbf..79c3a67 100644 --- a/entities/flag/flag.gd +++ b/entities/flag/flag.gd @@ -43,4 +43,3 @@ func drop(dropper : Player) -> void: _mesh.show() flag_state = FlagState.FLAG_STATE_DROPPED dropped.emit(dropper) - diff --git a/entities/flag/waypoint.gd b/entities/flag/waypoint.gd index 7911110..12d6741 100644 --- a/entities/flag/waypoint.gd +++ b/entities/flag/waypoint.gd @@ -24,6 +24,12 @@ func _ready() -> void: Vector3(0, flag.get_node("CollisionShape3D").shape.size.y, 0)) func _process(_delta : float) -> void: + # disable waypoint repositioning when running headless + if DisplayServer.get_name() == "headless": + set_process(false) + return + + # repositon iff on viewport var camera : Camera3D = get_viewport().get_camera_3d() var viewport_rect : Rect2 = get_viewport_rect() # if the player is NOT infront of the camera or camera does NOT have LOS to player @@ -32,15 +38,12 @@ func _process(_delta : float) -> void: return else: _iff_container.show() # display the IFF - # get the screen location of the players head var new_iff_position : Vector2 = camera.unproject_position(attach_point.global_position) - # check if the unprojected point lies inside the viewport if !Rect2(Vector2(0, 0), viewport_rect.size).has_point(new_iff_position): _iff_container.hide() # hide the IFF and exit function return - # move the IFF up so the bottom of it is at the players head new_iff_position.y -= _iff_container.size.y # move the IFF left so it's centered horizontally above players head diff --git a/interfaces/menus/boot/boot.tscn b/interfaces/menus/boot/boot.tscn index 50f1264..5da0d5c 100644 --- a/interfaces/menus/boot/boot.tscn +++ b/interfaces/menus/boot/boot.tscn @@ -31,12 +31,14 @@ func _on_multiplayer_pressed() -> void: $SettingsPanelContainer.hide() $MainPanelContainer.hide() $MultiplayerPanelContainer.show() + show() func _on_settings_pressed() -> void: $MultiplayerPanelContainer.hide() $MultiplayerPanelContainer.tab_container.current_tab = 0 $SettingsPanelContainer.show() $MainPanelContainer.hide() + show() func _on_quit_pressed() -> void: get_tree().quit() @@ -46,6 +48,7 @@ func _on_main_menu_pressed() -> void: $MultiplayerPanelContainer.tab_container.current_tab = 0 $SettingsPanelContainer.hide() $MainPanelContainer.show() + show() " [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_krqeq"] @@ -81,7 +84,6 @@ signal join_server(host : String, port : int) @onready var modal : Control = $Modal @onready var menu : CanvasLayer = get_parent() -@onready var game : Node3D = get_tree().current_scene.get_node(\"/root/Game\") @onready var map_selector : OptionButton = %MapSelector @export var tab_container : TabContainer @@ -94,7 +96,7 @@ func _ready() -> void: call_deferred(\"_populate_map_selector\") func _populate_map_selector() -> void: - for map : PackedScene in game.maps: + for map : PackedScene in MapsManager.maps: var map_name : String = map._bundled.names[0] map_selector.add_item(map_name) diff --git a/main.tscn b/main.tscn index f049c16..2ca8b50 100644 --- a/main.tscn +++ b/main.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=6 format=3 uid="uid://ma1if3sjox6i"] +[gd_scene load_steps=5 format=3 uid="uid://ma1if3sjox6i"] [ext_resource type="PackedScene" uid="uid://boviiugcnfyrj" path="res://modes/singleplayer/demo.tscn" id="1_50a80"] [ext_resource type="PackedScene" uid="uid://bjctlqvs33nqy" path="res://interfaces/menus/boot/boot.tscn" id="1_acy5o"] [ext_resource type="PackedScene" uid="uid://bvwxfgygm2xb8" path="res://modes/multiplayer/multiplayer.tscn" id="2_g8xeb"] -[ext_resource type="Resource" uid="uid://dut5f1sq0wfeb" path="res://maps/maps.tres" id="3_1ipir"] [sub_resource type="GDScript" id="GDScript_e61dq"] script/source = "# This file is part of open-fpsz. @@ -26,12 +25,6 @@ class_name Game extends Node3D @export var SINGLEPLAYER : PackedScene @export var MULTIPLAYER : PackedScene -@export_category(\"Maps\") -@export var _maps_resource : ArrayPackedSceneResource - -@onready var maps : Array[PackedScene] = _maps_resource.get_items() - -# current mode, when the value is set to null we're in the main menu var mode : Node: set(new_mode): # clean up previous mode @@ -42,12 +35,14 @@ var mode : Node: # setup new mode if new_mode != null: add_child(new_mode) - Input.mouse_mode = Input.MOUSE_MODE_CAPTURED - else: - Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - func _ready() -> void: + # only run server in headless + if DisplayServer.get_name() == \"headless\": + mode = MULTIPLAYER.instantiate() + mode.start_server(9000, MapsManager.maps[MapsManager._rng.randi_range(0, len(MapsManager.maps) - 1)]) + return + # connect boot menu signals $BootMenu.start_demo.connect(_start_demo) $BootMenu/MultiplayerPanelContainer.start_server.connect(_start_server) $BootMenu/MultiplayerPanelContainer.join_server.connect(_join_server) @@ -55,16 +50,17 @@ func _ready() -> void: if not OS.is_debug_build(): DisplayServer.window_set_mode(Settings.get_value(\"video\", \"window_mode\")) - func _unhandled_input(event : InputEvent) -> void: if event.is_action_pressed(\"exit\"): - # reset game mode - mode = null - # make it easier to exit the game during development - if OS.is_debug_build(): - get_tree().quit(0) + if mode is Multiplayer: + $BootMenu._on_multiplayer_pressed() else: - $BootMenu.show() + $BootMenu._on_main_menu_pressed() + # reset game mode and get back to main menu + mode = null + if DisplayServer.get_name() != \"headless\": + Input.mouse_mode = Input.MOUSE_MODE_VISIBLE + return # switch window mode if event.is_action_pressed(\"window_mode\"): @@ -82,15 +78,13 @@ func _unhandled_input(event : InputEvent) -> void: func _start_demo() -> void: mode = SINGLEPLAYER.instantiate() + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED $BootMenu.hide() func _start_server(port : int, nickname : String) -> void: mode = MULTIPLAYER.instantiate() - mode.start_server({ - \"port\": port, - \"nickname\": nickname, - \"map\": maps[clamp($BootMenu/MultiplayerPanelContainer.map_selector.selected, 0, len(maps))] - }) + mode.start_server(port, MapsManager.maps[$BootMenu/MultiplayerPanelContainer.map_selector.selected], nickname) + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED $BootMenu.hide() func _join_server(host : String, port : int, nickname : String) -> void: @@ -98,12 +92,12 @@ func _join_server(host : String, port : int, nickname : String) -> void: mode.connected_to_server.connect($BootMenu/MultiplayerPanelContainer._on_connected_to_server) mode.connection_failed.connect($BootMenu/MultiplayerPanelContainer._on_connection_failed) mode.join_server(host, port, nickname) + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED " [node name="Game" type="Node3D"] script = SubResource("GDScript_e61dq") SINGLEPLAYER = ExtResource("1_50a80") MULTIPLAYER = ExtResource("2_g8xeb") -_maps_resource = ExtResource("3_1ipir") [node name="BootMenu" parent="." instance=ExtResource("1_acy5o")] diff --git a/maps/genesis/genesis.tscn b/maps/genesis/genesis.tscn index 6402712..53e804e 100644 --- a/maps/genesis/genesis.tscn +++ b/maps/genesis/genesis.tscn @@ -34,3 +34,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.847419, 94.7914, -0.106026 [node name="FlagPillar" parent="." instance=ExtResource("5_4kwtt")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.849599, 92.7505, -0.104984) + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 1440, 0) diff --git a/maps/genesis/resources/env.tres b/maps/genesis/resources/env.tres index eb27dd6..6653e43 100644 --- a/maps/genesis/resources/env.tres +++ b/maps/genesis/resources/env.tres @@ -18,22 +18,22 @@ ambient_light_source = 3 tonemap_mode = 3 tonemap_exposure = 0.6 tonemap_white = 0.6 -ssr_enabled = true ssao_intensity = 5.0 -ssil_enabled = true ssil_intensity = 5.0 ssil_sharpness = 0.7 +sdfgi_use_occlusion = true sdfgi_cascades = 6 sdfgi_max_distance = 819.2 sdfgi_y_scale = 0 glow_normalized = true glow_intensity = 2.0 glow_strength = 0.96 -fog_enabled = true fog_light_color = Color(1, 1, 1, 1) -fog_light_energy = 0.15 -fog_density = 0.0025 +fog_light_energy = 0.5 +fog_density = 0.001 fog_sky_affect = 0.3 +fog_height = 85.0 +fog_height_density = 0.01 volumetric_fog_density = 0.003 volumetric_fog_albedo = Color(1, 0.380392, 0.380392, 1) volumetric_fog_emission_energy = 192.23 diff --git a/modes/multiplayer/multiplayer.gd b/modes/multiplayer/multiplayer.gd index e830c58..d64b163 100644 --- a/modes/multiplayer/multiplayer.gd +++ b/modes/multiplayer/multiplayer.gd @@ -28,20 +28,17 @@ class_name Multiplayer extends Node signal connected_to_server signal connection_failed -func start_server(config : Dictionary) -> void: - # Check if required parameters are missing - var required_params : Array[String] = ["port", "map", "nickname"] - for param in required_params: - if not config.has(param): - print("Missing param in server config:", param) - return - # server setup +func start_server(port : int, map_scene : PackedScene, nickname : String = "mercury") -> void: + # setup enet server peer var peer : ENetMultiplayerPeer = ENetMultiplayerPeer.new() - peer.create_server(config["port"], MAX_CLIENTS) + peer.create_server(port, MAX_CLIENTS) multiplayer.peer_disconnected.connect(remove_player) multiplayer.multiplayer_peer = peer - _load_map.call_deferred(config["map"], config["nickname"]) + _load_map(map_scene) + + if DisplayServer.get_name() != "headless": + add_player(1, nickname) func join_server(host : String, port : int, nickname : String) -> void: var peer : ENetMultiplayerPeer = ENetMultiplayerPeer.new() @@ -89,13 +86,11 @@ func remove_player(peer_id : int) -> void: player.queue_free() print("Peer `%s` disconnected" % node_name) -func _load_map(scene : PackedScene, nickname : String) -> void: +func _load_map(scene : PackedScene) -> void: var map_scene : Node = scene.instantiate() MapsManager.current_map = map_scene map_scene.ready.connect(_add_flag) map.add_child(map_scene) - if DisplayServer.get_name() != "headless": - add_player(1, nickname) func _add_flag() -> void: var flag : Flag = FLAG.instantiate() diff --git a/systems/maps_manager.gd b/systems/maps_manager.gd index 30b2740..683846f 100644 --- a/systems/maps_manager.gd +++ b/systems/maps_manager.gd @@ -22,6 +22,9 @@ var environment := Environment.new() ## Random number generator instance var _rng := RandomNumberGenerator.new() +var _maps_resource : ArrayPackedSceneResource = preload("res://maps/maps.tres") +var maps : Array[PackedScene] = _maps_resource.get_items() + ## Reference to the current terrain map in the scene var current_map : Terrain3D = null: set(new_map):