Refactor area and turf lighting (#60954)

This commit is contained in:
TiviPlus
2021-08-26 00:07:38 +02:00
committed by GitHub
parent 256bfdd7d2
commit e629c36feb
33 changed files with 183 additions and 129 deletions
+50 -23
View File
@@ -1,32 +1,59 @@
/area
luminosity = TRUE
var/dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
luminosity = 1
///The mutable appearance we underlay to show light
var/mutable_appearance/lighting_effect = null
///Whether this area has a currently active base lighting, bool
var/area_has_base_lighting = FALSE
///alpha 0-255 of lighting_effect and thus baselighting intensity
var/base_lighting_alpha = 0
///The colour of the light acting on this area
var/base_lighting_color = null
/area/proc/set_dynamic_lighting(new_dynamic_lighting = DYNAMIC_LIGHTING_ENABLED)
if (new_dynamic_lighting == dynamic_lighting)
/area/proc/set_base_lighting(new_base_lighting_color = -1, new_alpha = -1)
if(base_lighting_alpha == new_alpha && base_lighting_color == new_base_lighting_color)
return FALSE
dynamic_lighting = new_dynamic_lighting
if (IS_DYNAMIC_LIGHTING(src))
cut_overlay(/obj/effect/fullbright)
blend_mode = BLEND_DEFAULT
for (var/turf/T in src)
if (IS_DYNAMIC_LIGHTING(T))
T.lighting_build_overlay()
else
add_overlay(/obj/effect/fullbright)
blend_mode = BLEND_MULTIPLY
for (var/turf/T in src)
if (T.lighting_object)
T.lighting_clear_overlay()
if(new_alpha != -1)
base_lighting_alpha = new_alpha
if(new_base_lighting_color != -1)
base_lighting_color = new_base_lighting_color
update_base_lighting()
return TRUE
/area/vv_edit_var(var_name, var_value)
switch(var_name)
if(NAMEOF(src, dynamic_lighting))
set_dynamic_lighting(var_value)
if("base_lighting_color")
set_base_lighting(new_base_lighting_color = var_value)
return TRUE
if("base_lighting_alpha")
set_base_lighting(new_alpha = var_value)
return TRUE
return ..()
/area/proc/update_base_lighting()
if(!area_has_base_lighting && (!base_lighting_alpha || !base_lighting_color))
return
if(!area_has_base_lighting)
add_base_lighting()
return
remove_base_lighting()
if(base_lighting_alpha && base_lighting_color)
add_base_lighting()
/area/proc/remove_base_lighting()
for(var/turf/T in src)
T.cut_overlay(lighting_effect)
QDEL_NULL(lighting_effect)
area_has_base_lighting = FALSE
/area/proc/add_base_lighting()
lighting_effect = mutable_appearance('icons/effects/alphacolors.dmi', "white")
lighting_effect.plane = LIGHTING_PLANE
lighting_effect.layer = LIGHTING_PRIMARY_LAYER
lighting_effect.blend_mode = BLEND_ADD
lighting_effect.alpha = base_lighting_alpha
lighting_effect.color = base_lighting_color
for(var/turf/T in src)
T.add_overlay(lighting_effect)
T.luminosity = 1
area_has_base_lighting = TRUE
+2 -4
View File
@@ -1,14 +1,12 @@
/proc/create_all_lighting_objects()
for(var/area/A in world)
if(!IS_DYNAMIC_LIGHTING(A))
if(!A.static_lighting)
continue
for(var/turf/T in A)
if(!IS_DYNAMIC_LIGHTING(T))
if(T.always_lit)
continue
new/datum/lighting_object(T)
CHECK_TICK
CHECK_TICK
+8 -3
View File
@@ -15,7 +15,7 @@
qdel(lighting_object, force=TRUE) //Shitty fix for lighting objects persisting after death
var/area/our_area = loc
if (!IS_DYNAMIC_LIGHTING(our_area) && !light_sources)
if (!our_area.static_lighting && !light_sources)
return
new/datum/lighting_object(src)
@@ -97,11 +97,16 @@
/turf/proc/change_area(area/old_area, area/new_area)
if(SSlighting.initialized)
if (new_area.dynamic_lighting != old_area.dynamic_lighting)
if (new_area.dynamic_lighting)
if (new_area.static_lighting != old_area.static_lighting)
if (new_area.static_lighting)
lighting_build_overlay()
else
lighting_clear_overlay()
//Inherit overlay of new area
if(old_area.lighting_effect)
cut_overlay(old_area.lighting_effect)
if(new_area.lighting_effect)
add_overlay(new_area.lighting_effect)
/turf/proc/generate_missing_corners()
if (!lighting_corner_NE)
@@ -0,0 +1,17 @@
GLOBAL_DATUM_INIT(fullbright_overlay, /mutable_appearance, create_fullbright_overlay())
/proc/create_fullbright_overlay()
var/mutable_appearance/lighting_effect = mutable_appearance('icons/effects/alphacolors.dmi', "white")
lighting_effect.plane = LIGHTING_PLANE
lighting_effect.layer = LIGHTING_PRIMARY_LAYER
lighting_effect.blend_mode = BLEND_ADD
return lighting_effect
/area
///Whether this area allows static lighting and thus loads the lighting objects
var/static_lighting = TRUE
//Non static lighting areas.
//Any lighting area that wont support static lights.
//These areas will NOT have corners generated.