Planecube Optimizations and Job Security: Part One (#91696)

## About The Pull Request

This is an atomized revival of #82419, with this part containing the
simplest of its features:
- Fixes AO pref refreshing the wrong plane, thus not updating until you
swap bodies
- Removes supermatter's copypasted warp effect
- Culls distortion effects when they're not in use because its a chonky
filter
- Hides the escape menu when its, well, hidden
- Fixes hide_highest_offset not working upon parent's creation (we're so
good at our jobs hell yeah)
- Replaces runechat's AO dropshadow with an outline, because its barely
visible due to low opacity.

## Why It's Good For The Game

Our rendering performance is shit and we need to improve it, and the
first step in this task is optimizing planecube's simplest parts. The
next step is conditional culling, better non-multiz handling and
parallax rework/removal, but all of those need to be atomized as to
prevent the PR from sharing the fate of the original.

## Changelog
🆑
fix: Ambient Occlusion pref should now update immediately upon being
changed, instead of having to swap bodies or waiting for server restart
to get it updated.
code: Slightly improved rendering code/performance just a tiny bit.
/🆑
This commit is contained in:
SmArtKar
2025-06-19 06:00:23 +02:00
committed by Roxy
parent 840b2ee5c2
commit 0712d9870c
11 changed files with 182 additions and 56 deletions

View File

@@ -7,7 +7,52 @@
Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits.
*/
//mob traits
// Traits applied to global objects
/// GLOB trait, applied whenever something in the world wants to use the distortion plane
/// Distortion is an expensive effect, so it's worthwhile to keep it off until we care
#define TRAIT_DISTORTION_IN_USE(z_layer) "distortion_in_use_#[z_layer]"
/// SSeconomy trait, if the market is crashing and people can't withdraw credits from ID cards.
#define TRAIT_MARKET_CRASHING "market_crashing"
/// Traits given by station traits
#define STATION_TRAIT_ASSISTANT_GIMMICKS "station_trait_assistant_gimmicks"
#define STATION_TRAIT_BANANIUM_SHIPMENTS "station_trait_bananium_shipments"
#define STATION_TRAIT_BIGGER_PODS "station_trait_bigger_pods"
#define STATION_TRAIT_BIRTHDAY "station_trait_birthday"
#define STATION_TRAIT_BOTS_GLITCHED "station_trait_bot_glitch"
#define STATION_TRAIT_MACHINES_GLITCHED "station_trait_machine_glitch"
#define STATION_TRAIT_BRIGHT_DAY "station_trait_bright_day"
#define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation"
#define STATION_TRAIT_CYBERNETIC_REVOLUTION "station_trait_cybernetic_revolution"
#define STATION_TRAIT_ECONOMY_ALERTS "station_trait_economy_alerts"
#define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint"
#define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint"
#define STATION_TRAIT_FORESTED "station_trait_forested"
#define STATION_TRAIT_HANGOVER "station_trait_hangover"
#define STATION_TRAIT_HUMAN_AI "station_trait_human_ai"
#define STATION_TRAIT_LATE_ARRIVALS "station_trait_late_arrivals"
#define STATION_TRAIT_LOANER_SHUTTLE "station_trait_loaner_shuttle"
#define STATION_TRAIT_MEDBOT_MANIA "station_trait_medbot_mania"
#define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched"
#define STATION_TRAIT_PREMIUM_INTERNALS "station_trait_premium_internals"
#define STATION_TRAIT_RADIOACTIVE_NEBULA "station_trait_radioactive_nebula"
#define STATION_TRAIT_RANDOM_ARRIVALS "station_trait_random_arrivals"
#define STATION_TRAIT_REVOLUTIONARY_TRASHING "station_trait_revolutionary_trashing"
#define STATION_TRAIT_SHUTTLE_SALE "station_trait_shuttle_sale"
#define STATION_TRAIT_SMALLER_PODS "station_trait_smaller_pods"
#define STATION_TRAIT_SPIDER_INFESTATION "station_trait_spider_infestation"
#define STATION_TRAIT_UNIQUE_AI "station_trait_unique_ai"
#define STATION_TRAIT_UNNATURAL_ATMOSPHERE "station_trait_unnatural_atmosphere"
#define STATION_TRAIT_SPIKED_DRINKS "station_trait_spiked_drinks"
// Hud traits
/// This hud is owned by a client with an open escape menu
#define TRAIT_ESCAPE_MENU_OPEN "escape_menu_open"
// Mob traits
/// Forces the user to stay unconscious.
#define TRAIT_KNOCKEDOUT "knockedout"
/// Prevents voluntary movement.
@@ -789,9 +834,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
///If the crate is immune to the wrong content in manifest error
#define TRAIT_NO_MANIFEST_CONTENTS_ERROR "no_manifest_contents_error"
///SSeconomy trait, if the market is crashing and people can't withdraw credits from ID cards.
#define TRAIT_MARKET_CRASHING "market_crashing"
// item traits
#define TRAIT_NODROP "nodrop"
/// cannot be inserted in a storage.
@@ -1142,37 +1184,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Has splattercasting
#define TRAIT_SPLATTERCASTER "splattercaster"
///Traits given by station traits
#define STATION_TRAIT_ASSISTANT_GIMMICKS "station_trait_assistant_gimmicks"
#define STATION_TRAIT_BANANIUM_SHIPMENTS "station_trait_bananium_shipments"
#define STATION_TRAIT_BIGGER_PODS "station_trait_bigger_pods"
#define STATION_TRAIT_BIRTHDAY "station_trait_birthday"
#define STATION_TRAIT_BOTS_GLITCHED "station_trait_bot_glitch"
#define STATION_TRAIT_MACHINES_GLITCHED "station_trait_machine_glitch"
#define STATION_TRAIT_BRIGHT_DAY "station_trait_bright_day"
#define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation"
#define STATION_TRAIT_CYBERNETIC_REVOLUTION "station_trait_cybernetic_revolution"
#define STATION_TRAIT_ECONOMY_ALERTS "station_trait_economy_alerts"
#define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint"
#define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint"
#define STATION_TRAIT_FORESTED "station_trait_forested"
#define STATION_TRAIT_HANGOVER "station_trait_hangover"
#define STATION_TRAIT_HUMAN_AI "station_trait_human_ai"
#define STATION_TRAIT_LATE_ARRIVALS "station_trait_late_arrivals"
#define STATION_TRAIT_LOANER_SHUTTLE "station_trait_loaner_shuttle"
#define STATION_TRAIT_MEDBOT_MANIA "station_trait_medbot_mania"
#define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched"
#define STATION_TRAIT_PREMIUM_INTERNALS "station_trait_premium_internals"
#define STATION_TRAIT_RADIOACTIVE_NEBULA "station_trait_radioactive_nebula"
#define STATION_TRAIT_RANDOM_ARRIVALS "station_trait_random_arrivals"
#define STATION_TRAIT_REVOLUTIONARY_TRASHING "station_trait_revolutionary_trashing"
#define STATION_TRAIT_SHUTTLE_SALE "station_trait_shuttle_sale"
#define STATION_TRAIT_SMALLER_PODS "station_trait_smaller_pods"
#define STATION_TRAIT_SPIDER_INFESTATION "station_trait_spider_infestation"
#define STATION_TRAIT_UNIQUE_AI "station_trait_unique_ai"
#define STATION_TRAIT_UNNATURAL_ATMOSPHERE "station_trait_unnatural_atmosphere"
#define STATION_TRAIT_SPIKED_DRINKS "station_trait_spiked_drinks"
///Deathmatch traits
#define TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS "deathmath_explosive_implants"

View File

@@ -101,6 +101,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
/area = list(
"TRAIT_HAS_SHUTTLE_CONSTRUCTION_TURF" = TRAIT_HAS_SHUTTLE_CONSTRUCTION_TURF,
),
/datum/controller/global_vars = list(
"TRAIT_DISTORTION_IN_USE" = TRAIT_DISTORTION_IN_USE(0),
),
/datum/controller/subsystem/economy = list(
"TRAIT_MARKET_CRASHING" = TRAIT_MARKET_CRASHING,
),
@@ -139,6 +142,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
/datum/deathmatch_lobby = list(
"TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS" = TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS,
),
/datum/hud = list(
"TRAIT_ESCAPE_MENU_OPEN" = TRAIT_ESCAPE_MENU_OPEN,
),
/datum/wound = list(
"TRAIT_WOUND_SCANNED" = TRAIT_WOUND_SCANNED,
),

View File

@@ -119,13 +119,14 @@ GLOBAL_LIST_INIT(available_erp_ui_styles, list(
var/atom/movable/screen/healthdoll/healthdoll
var/atom/movable/screen/spacesuit
var/atom/movable/screen/hunger/hunger
// subtypes can override this to force a specific UI style
/// Subtypes can override this to force a specific UI style
var/ui_style
var/erp_ui_style //SKYRAT EDIT - ADDITION - ERP ICONS FIX
// List of weakrefs to objects that we add to our screen that we don't expect to DO anything
// They typically use * in their render target. They exist solely so we can reuse them,
// and avoid needing to make changes to all idk 300 consumers if we want to change the appearance
/// List of weakrefs to objects that we add to our screen that we don't expect to DO anything
/// They typically use * in their render target. They exist solely so we can reuse them,
/// and avoid needing to make changes to all idk 300 consumers if we want to change the appearance
var/list/asset_refs_for_reuse = list()
/datum/hud/New(mob/owner)

View File

@@ -172,8 +172,26 @@
blend_mode = BLEND_ADD
render_target = GRAVITY_PULSE_RENDER_TARGET
render_relay_planes = list()
// We start out hidden as we do not need to render when there's no distortion on our level
start_hidden = TRUE
///Contains just the floor
/atom/movable/screen/plane_master/gravpulse/Initialize(mapload, datum/hud/hud_owner, datum/plane_master_group/home, offset)
. = ..()
RegisterSignal(GLOB, SIGNAL_ADDTRAIT(TRAIT_DISTORTION_IN_USE(offset)), PROC_REF(distortion_enabled))
RegisterSignal(GLOB, SIGNAL_REMOVETRAIT(TRAIT_DISTORTION_IN_USE(offset)), PROC_REF(distortion_disabled))
if(HAS_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(offset)))
distortion_enabled()
/atom/movable/screen/plane_master/gravpulse/proc/distortion_enabled(datum/source)
SIGNAL_HANDLER
var/mob/our_mob = home?.our_hud?.mymob
unhide_plane(our_mob)
/atom/movable/screen/plane_master/gravpulse/proc/distortion_disabled(datum/source)
SIGNAL_HANDLER
hide_plane()
/// Contains just the floor
/atom/movable/screen/plane_master/floor
name = "Floor"
documentation = "The well, floor. This is mostly used as a sorting mechanism, but it also lets us create a \"border\" around the game world plane, so its drop shadow will actually work."
@@ -440,7 +458,9 @@
return
remove_filter("AO")
if(istype(mymob) && mymob.canon_client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion))
add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA"))
// We use outlines instead of drop shadow due to how extremely expensive it is, and there's no reason to use it for runechat
// which already has high drop shadow transparency at just 32 alpha, so outline does the job good enough
add_filter("AO", 1, outline_filter(size = 3, color = "#04080F20", flags = OUTLINE_SQUARE))
/atom/movable/screen/plane_master/balloon_chat
name = "Balloon chat"
@@ -480,3 +500,27 @@
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
render_relay_planes = list(RENDER_PLANE_MASTER)
offsetting_flags = BLOCKS_PLANE_OFFSETTING|OFFSET_RELAYS_MATCH_HIGHEST
/atom/movable/screen/plane_master/escape_menu/show_to(mob/mymob)
. = ..()
if(!.)
return
var/datum/hud/our_hud = home.our_hud
if(!our_hud)
return
RegisterSignal(our_hud, SIGNAL_ADDTRAIT(TRAIT_ESCAPE_MENU_OPEN), PROC_REF(escape_opened), override = TRUE)
RegisterSignal(our_hud, SIGNAL_REMOVETRAIT(TRAIT_ESCAPE_MENU_OPEN), PROC_REF(escape_closed), override = TRUE)
if(!HAS_TRAIT(our_hud, TRAIT_ESCAPE_MENU_OPEN))
escape_closed()
/atom/movable/screen/plane_master/escape_menu/proc/escape_opened(datum/source)
SIGNAL_HANDLER
var/mob/our_mob = home?.our_hud?.mymob
unhide_plane(our_mob)
/atom/movable/screen/plane_master/escape_menu/proc/escape_closed(datum/source)
SIGNAL_HANDLER
var/mob/our_mob = home?.our_hud?.mymob
hide_plane(our_mob)

View File

@@ -79,8 +79,19 @@
/atom/movable/screen/plane_master/rendering_plate/game_plate/Initialize(mapload, datum/hud/hud_owner)
. = ..()
add_filter("displacer", 1, displacement_map_filter(render_source = OFFSET_RENDER_TARGET(GRAVITY_PULSE_RENDER_TARGET, offset), size = 10))
add_relay_to(GET_NEW_PLANE(EMISSIVE_BLOOM_PLATE, offset), blend_override = BLEND_MULTIPLY)
RegisterSignal(GLOB, SIGNAL_ADDTRAIT(TRAIT_DISTORTION_IN_USE(offset)), PROC_REF(distortion_enabled))
RegisterSignal(GLOB, SIGNAL_REMOVETRAIT(TRAIT_DISTORTION_IN_USE(offset)), PROC_REF(distortion_disabled))
if(HAS_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(offset)))
distortion_enabled()
/atom/movable/screen/plane_master/rendering_plate/game_plate/proc/distortion_enabled(datum/source)
SIGNAL_HANDLER
add_filter("displacer", 1, displacement_map_filter(render_source = OFFSET_RENDER_TARGET(GRAVITY_PULSE_RENDER_TARGET, offset), size = 10))
/atom/movable/screen/plane_master/rendering_plate/game_plate/proc/distortion_disabled(datum/source)
SIGNAL_HANDLER
remove_filter("displacer")
/atom/movable/screen/plane_master/rendering_plate/game_plate/show_to(mob/mymob)
. = ..()

View File

@@ -6,13 +6,13 @@
if(!istype(parent, /atom/movable/screen/plane_master))
return
RegisterSignal(SSmapping, COMSIG_PLANE_OFFSET_INCREASE, PROC_REF(on_offset_increase))
offset_increase(SSmapping.max_plane_offset)
offset_increase(-1, SSmapping.max_plane_offset)
/datum/component/plane_hide_highest_offset/proc/on_offset_increase(datum/source, old_offset, new_offset)
SIGNAL_HANDLER
offset_increase(new_offset)
offset_increase(old_offset, new_offset)
/datum/component/plane_hide_highest_offset/proc/offset_increase(new_offset)
/datum/component/plane_hide_highest_offset/proc/offset_increase(old_offset, new_offset)
var/atom/movable/screen/plane_master/plane_parent = parent
var/mob/our_mob = plane_parent.home?.our_hud?.mymob
var/our_offset = plane_parent.offset
@@ -20,5 +20,5 @@
return
if(our_offset == new_offset)
plane_parent.hide_plane(our_mob)
else if(plane_parent.force_hidden)
else if(our_offset == old_offset && plane_parent.force_hidden)
plane_parent.unhide_plane(our_mob)

View File

@@ -7,6 +7,44 @@
pixel_x = -176
pixel_y = -176
/atom/movable/warp_effect/Initialize(mapload)
. = ..()
var/turf/new_turf = get_turf(src)
if(new_turf)
var/new_offset = GET_TURF_PLANE_OFFSET(new_turf)
ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src))
/atom/movable/warp_effect/Destroy(force)
// Just in case I've forgotten how the movement api works
var/offset = GET_TURF_PLANE_OFFSET(loc)
REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(offset), ref(src))
return ..()
/atom/movable/warp_effect/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
. = ..()
var/turf/new_turf = get_turf(src)
var/turf/old_turf = get_turf(old_loc)
if(!new_turf)
var/old_offset = GET_TURF_PLANE_OFFSET(old_turf)
REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(old_offset), ref(src))
return
else if(get_turf(old_loc))
return
// If we're in a thing on a turf we COUNT as a distortion source
var/new_offset = GET_TURF_PLANE_OFFSET(new_turf)
ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src))
/atom/movable/warp_effect/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents)
. = ..()
if(same_z_layer)
return
if(old_turf)
var/old_offset = GET_TURF_PLANE_OFFSET(old_turf)
REMOVE_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(old_offset), ref(src))
if(new_turf)
var/new_offset = GET_TURF_PLANE_OFFSET(new_turf)
ADD_TRAIT(GLOB, TRAIT_DISTORTION_IN_USE(new_offset), ref(src))
/obj/effect/anomaly/grav
name = "gravitational anomaly"
icon = 'icons/effects/effects.dmi'

View File

@@ -6,5 +6,7 @@
/datum/preference/toggle/ambient_occlusion/apply_to_client(client/client, value)
/// Backdrop for the game world plane.
for(var/atom/movable/screen/plane_master/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(GAME_PLANE))
for(var/atom/movable/screen/plane_master/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(RENDER_PLANE_GAME_WORLD))
plane_master.show_to(client.mob)
for(var/atom/movable/screen/plane_master/plane_master as anything in client.mob?.hud_used?.get_true_plane_masters(RUNECHAT_PLANE))
plane_master.show_to(client.mob)

View File

@@ -21,6 +21,8 @@ GLOBAL_LIST_EMPTY(escape_menus)
/datum/escape_menu
/// The client that owns this escape menu
var/client/client
/// A weakref to the hud this escape menu currently applies to
var/datum/weakref/our_hud_ref
VAR_PRIVATE
ckey
@@ -41,6 +43,7 @@ GLOBAL_LIST_EMPTY(escape_menus)
ckey = client?.ckey
src.client = client
refresh_hud()
base_holder = new(client)
if(isnull(dim_screen))
@@ -64,11 +67,16 @@ GLOBAL_LIST_EMPTY(escape_menus)
QDEL_NULL(base_holder)
QDEL_NULL(page_holder)
var/datum/our_hud = our_hud_ref?.resolve()
if(our_hud)
REMOVE_TRAIT(our_hud, TRAIT_ESCAPE_MENU_OPEN, ref(src))
GLOB.escape_menus -= ckey
var/sound/esc_clear = sound(null, repeat = FALSE, channel = CHANNEL_ESCAPEMENU) //yes, I'm doing it like this with a null, no its absolutely intentional, cuts off the sound right as needed.
SEND_SOUND(client, esc_clear)
SEND_SOUND(client, 'sound/misc/escape_menu/esc_close.ogg')
client = null
return ..()
@@ -84,6 +92,19 @@ GLOBAL_LIST_EMPTY(escape_menus)
if (menu_page == PAGE_LEAVE_BODY)
qdel(src)
else
// Otherwise our client just switched bodies, let's update our hud
refresh_hud()
/datum/escape_menu/proc/refresh_hud()
var/datum/old_hud = our_hud_ref?.resolve()
if(old_hud)
REMOVE_TRAIT(old_hud, TRAIT_ESCAPE_MENU_OPEN, ref(src))
var/datum/new_hud = client.mob?.hud_used
our_hud_ref = WEAKREF(new_hud)
if(new_hud)
ADD_TRAIT(new_hud, TRAIT_ESCAPE_MENU_OPEN, ref(src))
/datum/escape_menu/proc/show_page()
PRIVATE_PROC(TRUE)

View File

@@ -169,7 +169,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
///Hue shift of the zaps color based on the power of the crystal
var/hue_angle_shift = 0
///Reference to the warp effect
var/atom/movable/supermatter_warp_effect/warp
var/atom/movable/warp_effect/warp
///The power threshold required to transform the powerloss function into a linear function from a cubic function.
var/powerloss_linear_threshold = 0
///The offset of the linear powerloss function set so the transition is differentiable.

View File

@@ -53,14 +53,6 @@
anchored = TRUE
moveable = FALSE
/atom/movable/supermatter_warp_effect
plane = GRAVITY_PULSE_PLANE
appearance_flags = PIXEL_SCALE // no tile bound so you can see it around corners and so
icon = 'icons/effects/light_overlays/light_352.dmi'
icon_state = "light"
pixel_x = -176
pixel_y = -176
/// Normal sm but small (sm sword recipe element) (wiz only) and adamantine pedestal for it
/obj/machinery/power/supermatter_crystal/small
name = "strangely small supermatter crystal"