Improve PortMaster performance and controls
This commit is contained in:
parent
9afa60f6a5
commit
57df54d82d
14 changed files with 328 additions and 126 deletions
|
|
@ -216,8 +216,7 @@ func _run() -> void:
|
|||
) as EmoteRadialMenu
|
||||
assert(quick_menu != null and emote_menu != null)
|
||||
assert(QuickRadialMenu.ACTIONS.size() == QuickRadialMenu.SECTOR_COUNT)
|
||||
assert(QuickRadialMenu.ACTIONS.has(&"freecam"))
|
||||
assert(QuickRadialMenu.ACTIONS.has(&"hud"))
|
||||
assert(QuickRadialMenu.ACTIONS == [&"chat", &"freecam", &"hud"])
|
||||
game_ui.call("_on_quick_action_selected", &"freecam")
|
||||
assert(player.is_free_camera_active())
|
||||
var free_camera := player.get_active_gameplay_camera()
|
||||
|
|
@ -544,10 +543,6 @@ func _run() -> void:
|
|||
await process_frame
|
||||
assert(player.hotbar.get_selected_slot() == 1)
|
||||
assert(not service.is_active() and not toolbar.visible)
|
||||
game_ui.call("_on_quick_action_selected", &"paint")
|
||||
await process_frame
|
||||
assert(player.hotbar.get_selected_slot() == 0)
|
||||
assert(service.is_active() and toolbar.visible)
|
||||
|
||||
print("Art tools validation: PASS")
|
||||
var session := main.get_node("%NetworkSession") as NetworkSession
|
||||
|
|
|
|||
|
|
@ -211,12 +211,17 @@ func _validate_portmaster_launcher() -> String:
|
|||
"leftstick:b9",
|
||||
"rightstick:b12",
|
||||
"netfishing_controllerconfig=\"$GODOT_MUOS_MAPPING\"",
|
||||
"$GPTOKEYB \"NETfishing.aarch64\" &",
|
||||
"pm_platform_helper \"$GAME_EXECUTABLE\"",
|
||||
"SDL_GAMECONTROLLERCONFIG=\"$netfishing_controllerconfig\" \\",
|
||||
"pm_finish",
|
||||
]:
|
||||
if expected_fragment not in launcher:
|
||||
return "PortMaster launcher omitted " + expected_fragment
|
||||
if "$'\\n'" in launcher:
|
||||
return "PortMaster launcher appends mappings across a Weston-unsafe newline"
|
||||
if "$GPTOKEYB \"NETfishing.aarch64\" -c" in launcher:
|
||||
return "PortMaster launcher injects duplicate GPTOKEYB gameplay mappings"
|
||||
return ""
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@ const MainScene: PackedScene = preload("res://main/main.tscn")
|
|||
const RuntimePerformanceProfileType = preload(
|
||||
"res://main/runtime_performance_profile.gd"
|
||||
)
|
||||
const FOLIAGE_WIND_SHADER: Shader = preload(
|
||||
"res://world/materials/foliage_wind.gdshader"
|
||||
)
|
||||
|
||||
|
||||
func _initialize() -> void:
|
||||
|
|
@ -28,12 +31,27 @@ func _run() -> void:
|
|||
assert(bool(main.get("_application_initialized")))
|
||||
_validate_main_profile(main)
|
||||
_validate_minimal_weather(main)
|
||||
_stop_audio_players(main)
|
||||
main.queue_free()
|
||||
for _frame: int in 4:
|
||||
for _frame: int in 8:
|
||||
await process_frame
|
||||
OS.unset_environment(
|
||||
RuntimePerformanceProfileType.PROFILE_ENVIRONMENT_VARIABLE
|
||||
)
|
||||
var normal_main: Node = MainScene.instantiate()
|
||||
root.add_child(normal_main)
|
||||
for _frame: int in 4:
|
||||
await process_frame
|
||||
if not bool(normal_main.get("_application_initialized")):
|
||||
normal_main.call("_activate_selected_data_path", "", true)
|
||||
for _frame: int in 8:
|
||||
await process_frame
|
||||
assert(bool(normal_main.get("_application_initialized")))
|
||||
_validate_normal_profile(normal_main)
|
||||
_stop_audio_players(normal_main)
|
||||
normal_main.queue_free()
|
||||
for _frame: int in 8:
|
||||
await process_frame
|
||||
print("Light performance profile validation: PASS")
|
||||
quit()
|
||||
|
||||
|
|
@ -70,6 +88,131 @@ func _validate_main_profile(main: Node) -> void:
|
|||
assert(not pond.material_override is ShaderMaterial)
|
||||
assert(not ocean.material_override is ShaderMaterial)
|
||||
assert(not ocean.is_processing())
|
||||
_validate_ocean_fishing_coverage(main, ocean)
|
||||
var island := main.get_node(
|
||||
"TestWorld/Regions/StarterIslandRegion"
|
||||
) as StarterIslandRegion
|
||||
assert(island != null and not island.is_foliage_wind_enabled())
|
||||
assert(_count_foliage_wind_overrides(
|
||||
island.get_node("Terrain/Visual")
|
||||
) == 0)
|
||||
|
||||
var title_background := main.get_node("%TitleBackground") as ColorRect
|
||||
var title_material := title_background.material as ShaderMaterial
|
||||
assert(title_material != null)
|
||||
assert(not bool(title_material.get_shader_parameter(
|
||||
"animation_enabled"
|
||||
)))
|
||||
for backdrop_name: StringName in [
|
||||
&"PlayerMenuBackdrop",
|
||||
&"ShopBackdrop",
|
||||
]:
|
||||
var backdrop := main.get_node("%%%s" % backdrop_name) as ColorRect
|
||||
var backdrop_material := backdrop.material as ShaderMaterial
|
||||
assert(backdrop_material != null)
|
||||
assert(not bool(backdrop_material.get_shader_parameter(
|
||||
"animation_enabled"
|
||||
)))
|
||||
assert(
|
||||
backdrop_material.get_shader_parameter(
|
||||
"scroll_velocity_pixels"
|
||||
) == Vector2.ZERO
|
||||
)
|
||||
|
||||
|
||||
func _validate_normal_profile(main: Node) -> void:
|
||||
var profile: RuntimePerformanceProfile = main.get("_performance_profile")
|
||||
assert(profile != null and not profile.is_light())
|
||||
assert(is_equal_approx(root.scaling_3d_scale, 1.0))
|
||||
var pond := main.get_node(
|
||||
"TestWorld/Regions/StarterIslandRegion/WaterBodies/Pond/VisualWater"
|
||||
) as MeshInstance3D
|
||||
var ocean := main.get_node(
|
||||
"TestWorld/Regions/StarterIslandRegion/WaterBodies/Ocean/VisualWater"
|
||||
) as MeshInstance3D
|
||||
assert(pond.material_override is ShaderMaterial)
|
||||
assert(ocean.material_override is ShaderMaterial)
|
||||
assert(not ocean.is_processing())
|
||||
_validate_ocean_fishing_coverage(main, ocean)
|
||||
var island := main.get_node(
|
||||
"TestWorld/Regions/StarterIslandRegion"
|
||||
) as StarterIslandRegion
|
||||
assert(island != null and island.is_foliage_wind_enabled())
|
||||
assert(_count_foliage_wind_overrides(
|
||||
island.get_node("Terrain/Visual")
|
||||
) > 0)
|
||||
|
||||
var title_background := main.get_node("%TitleBackground") as ColorRect
|
||||
var title_material := title_background.material as ShaderMaterial
|
||||
assert(title_material != null)
|
||||
assert(bool(title_material.get_shader_parameter("animation_enabled")))
|
||||
for backdrop_name: StringName in [
|
||||
&"PlayerMenuBackdrop",
|
||||
&"ShopBackdrop",
|
||||
]:
|
||||
var backdrop := main.get_node("%%%s" % backdrop_name) as ColorRect
|
||||
var backdrop_material := backdrop.material as ShaderMaterial
|
||||
assert(backdrop_material != null)
|
||||
assert(bool(backdrop_material.get_shader_parameter(
|
||||
"animation_enabled"
|
||||
)))
|
||||
assert(
|
||||
backdrop_material.get_shader_parameter(
|
||||
"scroll_velocity_pixels"
|
||||
) != Vector2.ZERO
|
||||
)
|
||||
var visuals: WorldTimeVisualController = main.get_node(
|
||||
"%WorldTimeVisualController"
|
||||
)
|
||||
var rain := visuals.get_node("LocalRain") as GPUParticles3D
|
||||
assert(rain.amount == WorldTimeVisualController.RAIN_PARTICLE_AMOUNT)
|
||||
assert(rain.fixed_fps == 30)
|
||||
|
||||
|
||||
func _validate_ocean_fishing_coverage(
|
||||
main: Node,
|
||||
ocean: MeshInstance3D,
|
||||
) -> void:
|
||||
var ocean_mesh := ocean.mesh as PlaneMesh
|
||||
assert(ocean_mesh != null)
|
||||
var shape_node := main.get_node(
|
||||
"TestWorld/Regions/StarterIslandRegion/WaterBodies/Ocean/"
|
||||
+ "FishingRegions/OceanFishingRegion/Shape"
|
||||
) as CollisionShape3D
|
||||
assert(shape_node != null)
|
||||
var fishing_shape := shape_node.shape as BoxShape3D
|
||||
assert(fishing_shape != null)
|
||||
assert(fishing_shape.size.is_equal_approx(Vector3(
|
||||
ocean_mesh.size.x,
|
||||
2.0,
|
||||
ocean_mesh.size.y,
|
||||
)))
|
||||
|
||||
|
||||
func _count_foliage_wind_overrides(root_node: Node) -> int:
|
||||
var count: int = 0
|
||||
var mesh_instance := root_node as MeshInstance3D
|
||||
if mesh_instance != null and mesh_instance.mesh != null:
|
||||
for surface_index: int in mesh_instance.mesh.get_surface_count():
|
||||
var material := mesh_instance.get_surface_override_material(
|
||||
surface_index
|
||||
) as ShaderMaterial
|
||||
if material != null and material.shader == FOLIAGE_WIND_SHADER:
|
||||
count += 1
|
||||
for child: Node in root_node.get_children():
|
||||
count += _count_foliage_wind_overrides(child)
|
||||
return count
|
||||
|
||||
|
||||
func _stop_audio_players(root_node: Node) -> void:
|
||||
if root_node is AudioStreamPlayer:
|
||||
(root_node as AudioStreamPlayer).stop()
|
||||
elif root_node is AudioStreamPlayer2D:
|
||||
(root_node as AudioStreamPlayer2D).stop()
|
||||
elif root_node is AudioStreamPlayer3D:
|
||||
(root_node as AudioStreamPlayer3D).stop()
|
||||
for child: Node in root_node.get_children():
|
||||
_stop_audio_players(child)
|
||||
|
||||
|
||||
func _validate_minimal_weather(main: Node) -> void:
|
||||
|
|
@ -79,6 +222,8 @@ func _validate_minimal_weather(main: Node) -> void:
|
|||
var rain := visuals.get_node("LocalRain") as GPUParticles3D
|
||||
assert(rain.amount == WorldTimeVisualController.LIGHT_RAIN_PARTICLE_AMOUNT)
|
||||
assert(rain.fixed_fps == WorldTimeVisualController.LIGHT_RAIN_FIXED_FPS)
|
||||
assert(rain.amount == 128)
|
||||
assert(rain.fixed_fps == 12)
|
||||
var clouds := visuals.get_node("LocalStormClouds") as LocalStormCloudLayer
|
||||
assert(clouds.get_patch_count() == 1)
|
||||
var ceiling := clouds.get_node("CloudCeiling") as MeshInstance3D
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue