OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-godot4-test / menu / main / menu_main.gd

290 lines · gd ref:
extends Node

signal replace_main_scene
#warning-ignore:unused_signal
signal quit # Useless, but needed as there is no clean way to check if a node exposes a signal

@onready var ui = $CenterContainer
@onready var uiProper = $CenterContainer

@onready var main = uiProper.get_node("Main")
@onready var resume_button : Button = main.get_node("Resume")
@onready var settings_button : Button = main.get_node("Settings")
@onready var multiplayer_button : Button = main.get_node("Multiplayer")
@onready var quit_button : Button = main.get_node("Quit")

@onready var settings_menu = uiProper.get_node("Settings")
@onready var settings_actions = settings_menu.get_node("Actions")
@onready var settings_action_apply = settings_actions.get_node("Apply")
@onready var settings_action_cancel = settings_actions.get_node("Cancel")

@onready var multiplayer_menu = uiProper.get_node("Multiplayer")
@onready var multiplayer_menu_proper = multiplayer_menu.get_node("VBoxContainer")
@onready var multiplayer_LabelGWStatus = multiplayer_menu_proper.get_node("HyperGatewayStatus").get_node("LabelGWStatus")
@onready var multiplayer_StartGW = multiplayer_menu_proper.get_node("Gateway").get_node("Start")
@onready var multiplayer_StopGW = multiplayer_menu_proper.get_node("Gateway").get_node("Stop")
@onready var multiplayer_LabelGossipStatus = multiplayer_menu_proper.get_node("HyperGossipStatus").get_node("LabelGossipStatus")
@onready var multiplayer_PortInput = multiplayer_menu_proper.get_node("HyperGatewayPort").get_node("LineEdit")
@onready var multiplayer_GossipURLInput = multiplayer_menu_proper.get_node("GossipURL").get_node("LineEdit")
@onready var multiplayer_actions_ok = multiplayer_menu_proper.get_node("Actions").get_node("OK")

@onready var shadows_menu = settings_menu.get_node("Shadows")
@onready var shadows_4096 = shadows_menu.get_node("4096")
@onready var shadows_2048 = shadows_menu.get_node("2048")
@onready var shadows_1024 = shadows_menu.get_node("1024")
@onready var shadows_disabled = shadows_menu.get_node("Disabled")

@onready var gi_menu = settings_menu.get_node("GI")
@onready var gi_full = gi_menu.get_node("Full")
@onready var gi_half = gi_menu.get_node("Half")
@onready var gi_disabled = gi_menu.get_node("Disabled")

@onready var aa_menu = settings_menu.get_node("AA")
@onready var aa_8x = aa_menu.get_node("8x")
@onready var aa_4x = aa_menu.get_node("4x")
@onready var aa_2x = aa_menu.get_node("2x")
@onready var aa_disabled = aa_menu.get_node("Disabled")

@onready var bloom_menu = settings_menu.get_node("Bloom")
@onready var bloom_high = bloom_menu.get_node("High")
@onready var bloom_low = bloom_menu.get_node("Low")
@onready var bloom_disabled = bloom_menu.get_node("Disabled")

var hyperGatewayNode : HyperGateway = null
var hyperGatewayPID : int = 0
var hyperGatewayPort : int = 0

var hyperGossipNode : HyperGossip = null
var hyperGossipURL : String = ""

var hyperGWPortInputBackup : String = ""

var world_environment : WorldEnvironment = null

func _ready():
	# get_tree().set_screen_stretch(SceneTree.STRETCH_MODE_2D, SceneTree.STRETCH_ASPECT_KEEP, Vector2(1440, 810))
	Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
	
	# Setup Signals
	var callable
	callable = Callable(self, "_on_resume_pressed")
	resume_button.connect("pressed", callable)
	callable = Callable(self, "_on_settings_pressed")
	settings_button.connect("pressed", callable)
	callable = Callable(self, "_on_multiplayer_pressed")
	multiplayer_button.connect("pressed", callable)
	callable = Callable(self, "_on_quit_pressed")
	quit_button.connect("pressed", callable)
	
	callable = Callable(self, "_on_settings_apply_pressed")
	settings_action_apply.connect("pressed", callable)
	callable = Callable(self, "_on_settings_cancel_pressed")
	settings_action_cancel.connect("pressed", callable)
	
	callable = Callable(self, "_on_multiplayer_start_pressed")
	multiplayer_StartGW.connect("pressed", callable)
	callable = Callable(self, "_on_multiplayer_stop_pressed")
	multiplayer_StopGW.connect("pressed", callable)
	callable = Callable(self, "_on_multiplayer_ok_pressed")
	multiplayer_actions_ok.connect("pressed", callable)
	
func _getIsMenuShowing() -> bool:
	return ui.visible

func _on_quit_pressed():
	get_tree().quit()
	
func hideUI():
	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
	ui.hide()
	
func showUI():
	# resetUI()
	ui.show()
	Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
	
func resetUI():
	settings_menu.hide()
	multiplayer_menu.hide()
	main.show()

func _on_settings_pressed():
	main.hide()
	settings_menu.show()
	settings_action_cancel.grab_focus()
	
	# Find Environment Node
	if(world_environment == null or !is_instance_valid(world_environment) ):
		world_environment = get_tree().get_current_scene().find_child("WorldEnvironment", true, false)
	
	if Settings.gi_quality == Settings.GIQuality.HIGH:
		gi_full.button_pressed = true
	elif Settings.gi_quality == Settings.GIQuality.LOW:
		gi_half.button_pressed = true
	elif Settings.gi_quality == Settings.GIQuality.DISABLED:
		gi_disabled.button_pressed = true

	if Settings.aa_quality == Settings.AAQuality.AA_8X:
		aa_8x.button_pressed = true
	elif Settings.aa_quality == Settings.AAQuality.AA_4X:
		aa_4x.button_pressed = true
	elif Settings.aa_quality == Settings.AAQuality.AA_2X:
		aa_2x.button_pressed = true
	elif Settings.aa_quality == Settings.AAQuality.DISABLED:
		aa_disabled.button_pressed = true

	if Settings.bloom_quality == Settings.BloomQuality.HIGH:
		bloom_high.button_pressed = true
	elif Settings.bloom_quality == Settings.BloomQuality.LOW:
		bloom_low.button_pressed = true
	elif Settings.bloom_quality == Settings.BloomQuality.DISABLED:
		bloom_disabled.button_pressed = true
		
func _UpdateHyperGatewayInfo():
	multiplayer_StartGW.disabled = false
	multiplayer_StopGW.disabled = true
	multiplayer_LabelGWStatus.text = "Not Running"
	
	if(hyperGatewayNode != null):
		if(hyperGatewayNode is HyperGateway):
			hyperGatewayPID = hyperGatewayNode.getGatewayPID()
			hyperGatewayPort = hyperGatewayNode.getGatewayPort()
			
			if( hyperGatewayNode.getIsGatewayRunning() ):
				multiplayer_StopGW.disabled = false
				multiplayer_StartGW.disabled = true
				multiplayer_LabelGWStatus.text = "Running (PID " + str(hyperGatewayPID) + ") on Port " + str(hyperGatewayPort)
				
func _UpdateHyperGossipInfo():
	multiplayer_LabelGossipStatus.text = "N/A"
	if(hyperGossipNode != null):
		if(hyperGossipNode is HyperGossip):
			if( hyperGatewayNode.getIsGatewayRunning() ):
				hyperGossipURL = hyperGossipNode._get_url()
				multiplayer_LabelGossipStatus.text = hyperGossipURL
			

func _on_multiplayer_pressed():
	main.hide()
	# Check for HyperGateway Node
	if(hyperGatewayNode == null):
		hyperGatewayNode = get_tree().get_current_scene().find_child("HyperGateway")
	_UpdateHyperGatewayInfo()
	# Check for HyperGossip Node
	if(hyperGossipNode == null):
		hyperGossipNode = get_tree().get_current_scene().find_child("HyperGossip")
	_UpdateHyperGossipInfo()
	
			
	multiplayer_menu.show()
	
func ChangeGIProbeVisibility(_visible : bool):
	pass

func _on_settings_apply_pressed():
	main.show()
	# play_button.grab_focus()
	settings_menu.hide()
	
	if shadows_4096.button_pressed:
		Settings.shadows_quality = Settings.ShadowsQuality.SHADOWS_4096
		ProjectSettings["rendering/shadows/directional_shadow/size"] = 4096
		ProjectSettings["rendering/shadows/shadow_atlas/size"] = 4096
		ProjectSettings["rendering/shadows/directional_shadow/soft_shadow_quality"] = 2
	elif shadows_2048.button_pressed:
		Settings.shadows_quality = Settings.ShadowsQuality.SHADOWS_2048
		ProjectSettings["rendering/shadows/directional_shadow/size"] = 2048
		ProjectSettings["rendering/shadows/shadow_atlas/size"] = 2048
		ProjectSettings["rendering/shadows/directional_shadow/soft_shadow_quality"] = 2
	elif shadows_1024.button_pressed:
		Settings.shadows_quality = Settings.ShadowsQuality.SHADOWS_1024
		ProjectSettings["rendering/shadows/directional_shadow/size"] = 1024
		ProjectSettings["rendering/shadows/shadow_atlas/size"] = 1024
		ProjectSettings["rendering/shadows/directional_shadow/soft_shadow_quality"] = 2
	elif shadows_disabled.button_pressed:
		Settings.shadows_quality = Settings.ShadowsQuality.DISABLED
		ProjectSettings["rendering/shadows/directional_shadow/size"] = 0
		ProjectSettings["rendering/shadows/shadow_atlas/size"] = 0
		ProjectSettings["rendering/shadows/directional_shadow/soft_shadow_quality"] = 2

	if gi_full.button_pressed:
		Settings.gi_quality = Settings.GIQuality.HIGH
		ProjectSettings["rendering/quality/voxel_cone_tracing/high_quality"] = true
	elif gi_half.button_pressed:
		Settings.gi_quality = Settings.GIQuality.LOW
		ProjectSettings["rendering/quality/voxel_cone_tracing/high_quality"] = false
	elif gi_disabled.button_pressed:
		Settings.gi_quality = Settings.GIQuality.DISABLED

	if aa_8x.button_pressed:
		Settings.aa_quality = Settings.AAQuality.AA_8X
		ProjectSettings["rendering/anti_aliasing/quality/msaa"] = 3
		get_viewport().msaa = Viewport.MSAA_8X
	elif aa_4x.button_pressed:
		Settings.aa_quality = Settings.AAQuality.AA_4X
		ProjectSettings["rendering/anti_aliasing/quality/msaa"] = 2
		get_viewport().msaa = Viewport.MSAA_4X
	elif aa_2x.button_pressed:
		Settings.aa_quality = Settings.AAQuality.AA_2X
		ProjectSettings["rendering/anti_aliasing/quality/msaa"] = 1
		get_viewport().msaa = Viewport.MSAA_2X
	elif aa_disabled.button_pressed:
		Settings.aa_quality = Settings.AAQuality.DISABLED
		ProjectSettings["rendering/anti_aliasing/quality/msaa"] = 0
		get_viewport().msaa = Viewport.MSAA_DISABLED

	if bloom_high.button_pressed:
		Settings.bloom_quality = Settings.BloomQuality.HIGH
		if(world_environment != null):
			world_environment.environment.glow_enabled = true
			ProjectSettings["rendering/environment/glow/upscale_mode"] = 1
	elif bloom_low.button_pressed:
		Settings.bloom_quality = Settings.BloomQuality.LOW
		if(world_environment != null):
			world_environment.environment.glow_enabled = true
			ProjectSettings["rendering/environment/glow/upscale_mode"] = 0
	elif bloom_disabled.button_pressed:
		Settings.bloom_quality = Settings.BloomQuality.DISABLED
		if(world_environment != null):
			world_environment.environment.glow_enabled = false
			ProjectSettings["rendering/environment/glow/upscale_mode"] = 0

	Settings.save_settings()


func _on_settings_cancel_pressed():
	main.show()
	# play_button.grab_focus()
	settings_menu.hide()

func _on_multiplayer_ok_pressed():
	main.show()
	# play_button.grab_focus()
	multiplayer_menu.hide()


func _on_multiplayer_start_pressed():
	hyperGatewayNode.port = multiplayer_PortInput.text.to_int()
	hyperGossipNode.url = multiplayer_GossipURLInput.text
	hyperGatewayNode.start()
	_UpdateHyperGatewayInfo()
	_UpdateHyperGossipInfo()


func _on_multiplayer_stop_pressed():
	hyperGatewayNode.stop()
	_UpdateHyperGatewayInfo()
	_UpdateHyperGossipInfo()


func _on_HyperGWPort_LineEdit_text_changed(new_text : String):
	if(new_text.length() < 1 or new_text.is_valid_int() or new_text.to_int() > 65535):
		hyperGWPortInputBackup = new_text
	else:
		multiplayer_PortInput.text = hyperGWPortInputBackup


func _on_resume_pressed():
	# Hide UI (for now)
	hideUI()