mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-09 16:05:07 +00:00
Rendering refactor P1: Plane unification and render relaying (pictures and video included) (#8479)
Co-authored-by: TiviPlus <57223640+TiviPlus@users.noreply.github.com>
This commit is contained in:
232
code/_onclick/hud/rendering/plane_master.dm
Normal file
232
code/_onclick/hud/rendering/plane_master.dm
Normal file
@@ -0,0 +1,232 @@
|
||||
/atom/movable/screen/plane_master
|
||||
screen_loc = "CENTER"
|
||||
icon_state = "blank"
|
||||
appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR
|
||||
blend_mode = BLEND_OVERLAY
|
||||
var/show_alpha = 255
|
||||
var/hide_alpha = 0
|
||||
|
||||
//--rendering relay vars--
|
||||
///integer: what plane we will relay this planes render to
|
||||
var/render_relay_plane = RENDER_PLANE_MASTER
|
||||
///bool: Whether this plane should get a render target automatically generated
|
||||
var/generate_render_target = TRUE
|
||||
///integer: blend mode to apply to the render relay in case you dont want to use the plane_masters blend_mode
|
||||
var/blend_mode_override
|
||||
|
||||
/atom/movable/screen/plane_master/proc/Show(override)
|
||||
alpha = override || show_alpha
|
||||
|
||||
/atom/movable/screen/plane_master/proc/Hide(override)
|
||||
alpha = override || hide_alpha
|
||||
|
||||
//Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928
|
||||
//Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong.
|
||||
/atom/movable/screen/plane_master/proc/backdrop(mob/mymob)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(!isnull(render_relay_plane))
|
||||
relay_render_to_plane(mymob, render_relay_plane)
|
||||
|
||||
///Things rendered on "openspace"; holes in multi-z
|
||||
/atom/movable/screen/plane_master/openspace
|
||||
name = "open space backdrop plane master"
|
||||
plane = OPENSPACE_BACKDROP_PLANE
|
||||
appearance_flags = PLANE_MASTER
|
||||
blend_mode = BLEND_MULTIPLY
|
||||
alpha = 255
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/openspace/Initialize(mapload)
|
||||
. = ..()
|
||||
add_filter("first_stage_openspace", 1, drop_shadow_filter(color = "#04080FAA", size = -10))
|
||||
add_filter("second_stage_openspace", 2, drop_shadow_filter(color = "#04080FAA", size = -15))
|
||||
add_filter("third_stage_openspace", 3, drop_shadow_filter(color = "#04080FAA", size = -20))
|
||||
|
||||
/atom/movable/screen/plane_master/openspace
|
||||
name = "open space plane master"
|
||||
plane = OPENSPACE_PLANE
|
||||
appearance_flags = PLANE_MASTER
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
///Contains just the floor
|
||||
/atom/movable/screen/plane_master/floor
|
||||
name = "floor plane master"
|
||||
plane = FLOOR_PLANE
|
||||
appearance_flags = PLANE_MASTER
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
///Contains most things in the game world
|
||||
/atom/movable/screen/plane_master/game_world
|
||||
name = "game world plane master"
|
||||
plane = GAME_PLANE
|
||||
appearance_flags = PLANE_MASTER //should use client color
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/game_world/backdrop(mob/mymob)
|
||||
. = ..()
|
||||
if(istype(mymob) && mymob.client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion))
|
||||
add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA"))
|
||||
|
||||
|
||||
/atom/movable/screen/plane_master/massive_obj
|
||||
name = "massive object plane master"
|
||||
plane = MASSIVE_OBJ_PLANE
|
||||
appearance_flags = PLANE_MASTER //should use client color
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/ghost
|
||||
name = "ghost plane master"
|
||||
plane = GHOST_PLANE
|
||||
appearance_flags = PLANE_MASTER //should use client color
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_NON_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/point
|
||||
name = "point plane master"
|
||||
plane = POINT_PLANE
|
||||
appearance_flags = PLANE_MASTER //should use client color
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/**
|
||||
* Plane master handling byond internal blackness
|
||||
* vars are set as to replicate behavior when rendering to other planes
|
||||
* do not touch this unless you know what you are doing
|
||||
*/
|
||||
/atom/movable/screen/plane_master/blackness
|
||||
name = "darkness plane master"
|
||||
plane = BLACKNESS_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
color = list(null, null, null, "#0000", "#000f")
|
||||
blend_mode = BLEND_MULTIPLY
|
||||
appearance_flags = PLANE_MASTER | NO_CLIENT_COLOR | PIXEL_SCALE
|
||||
//byond internal end
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
///Contains all lighting objects
|
||||
/atom/movable/screen/plane_master/lighting
|
||||
name = "lighting plane master"
|
||||
plane = LIGHTING_PLANE
|
||||
blend_mode_override = BLEND_MULTIPLY
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/lighting/backdrop(mob/mymob)
|
||||
. = ..()
|
||||
mymob.overlay_fullscreen("lighting_backdrop_lit", /atom/movable/screen/fullscreen/lighting_backdrop/lit)
|
||||
mymob.overlay_fullscreen("lighting_backdrop_unlit", /atom/movable/screen/fullscreen/lighting_backdrop/unlit)
|
||||
|
||||
/*!
|
||||
* This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers.
|
||||
*
|
||||
* Emissive overlays are pasted with an atom color that converts them to be entirely some specific color.
|
||||
* Emissive blockers are pasted with an atom color that converts them to be entirely some different color.
|
||||
* Emissive overlays and emissive blockers are put onto the same plane.
|
||||
* The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects.
|
||||
* A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is.
|
||||
* This is then used to alpha mask the lighting plane.
|
||||
*/
|
||||
/atom/movable/screen/plane_master/lighting/Initialize(mapload)
|
||||
. = ..()
|
||||
add_filter("emissives", 1, alpha_mask_filter(render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE))
|
||||
add_filter("object_lighting", 2, alpha_mask_filter(render_source = O_LIGHTING_VISUAL_RENDER_TARGET, flags = MASK_INVERSE))
|
||||
|
||||
|
||||
/**
|
||||
* Handles emissive overlays and emissive blockers.
|
||||
*/
|
||||
/atom/movable/screen/plane_master/emissive
|
||||
name = "emissive plane master"
|
||||
plane = EMISSIVE_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
render_target = EMISSIVE_RENDER_TARGET
|
||||
render_relay_plane = null
|
||||
|
||||
/atom/movable/screen/plane_master/emissive/Initialize(mapload)
|
||||
. = ..()
|
||||
add_filter("em_block_masking", 1, color_matrix_filter(GLOB.em_mask_matrix))
|
||||
|
||||
/atom/movable/screen/plane_master/above_lighting
|
||||
name = "above lighting plane master"
|
||||
plane = ABOVE_LIGHTING_PLANE
|
||||
appearance_flags = PLANE_MASTER //should use client color
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
///Contains space parallax
|
||||
/atom/movable/screen/plane_master/parallax
|
||||
name = "parallax plane master"
|
||||
plane = PLANE_SPACE_PARALLAX
|
||||
blend_mode = BLEND_MULTIPLY
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/parallax_white
|
||||
name = "parallax whitifier plane master"
|
||||
plane = PLANE_SPACE
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/camera_static
|
||||
name = "camera static plane master"
|
||||
plane = CAMERA_STATIC_PLANE
|
||||
appearance_flags = PLANE_MASTER
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/excited_turfs
|
||||
name = "atmos excited turfs"
|
||||
plane = ATMOS_GROUP_PLANE
|
||||
appearance_flags = PLANE_MASTER
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
alpha = 0
|
||||
|
||||
/atom/movable/screen/plane_master/o_light_visual
|
||||
name = "overlight light visual plane master"
|
||||
plane = O_LIGHTING_VISUAL_PLANE
|
||||
render_target = O_LIGHTING_VISUAL_RENDER_TARGET
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
blend_mode = BLEND_MULTIPLY
|
||||
render_relay_plane = null
|
||||
|
||||
/atom/movable/screen/plane_master/runechat
|
||||
name = "runechat plane master"
|
||||
plane = RUNECHAT_PLANE
|
||||
appearance_flags = PLANE_MASTER
|
||||
blend_mode = BLEND_OVERLAY
|
||||
render_relay_plane = RENDER_PLANE_NON_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/runechat/backdrop(mob/mymob)
|
||||
. = ..()
|
||||
if(istype(mymob) && mymob.client?.prefs?.read_preference(/datum/preference/toggle/ambient_occlusion))
|
||||
add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA"))
|
||||
|
||||
/atom/movable/screen/plane_master/gravpulse
|
||||
name = "gravpulse plane"
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
plane = GRAVITY_PULSE_PLANE
|
||||
render_target = GRAVITY_PULSE_RENDER_TARGET
|
||||
render_relay_plane = null
|
||||
|
||||
/atom/movable/screen/plane_master/area
|
||||
name = "area plane"
|
||||
plane = AREA_PLANE
|
||||
render_relay_plane = RENDER_PLANE_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/radtext
|
||||
name = "radtext plane"
|
||||
plane = RAD_TEXT_PLANE
|
||||
render_relay_plane = RENDER_PLANE_NON_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/balloon_chat
|
||||
name = "balloon alert plane"
|
||||
plane = BALLOON_CHAT_PLANE
|
||||
render_relay_plane = RENDER_PLANE_NON_GAME
|
||||
|
||||
/atom/movable/screen/plane_master/fullscreen
|
||||
name = "fullscreen alert plane"
|
||||
plane = FULLSCREEN_PLANE
|
||||
render_relay_plane = RENDER_PLANE_NON_GAME
|
||||
Reference in New Issue
Block a user