Openturf & Lighting Improvements (#2961)

changes:

Openturf now uses ~200 MB less memory when sunlight is enabled.
Openturf now handles recursive OO copy better.
Lighting objects now update their existing color list if they can instead of creating a new one each time.
The sun can no longer fall out of the sky.
Openturfs should be a little gentler on clients.
Openturf darkening factor can be more easily changed.
Reset-Openturfs no longer hangs SSgarbage.
This commit is contained in:
Lohikar
2017-07-06 23:40:16 +03:00
committed by skull132
parent fd225cf97e
commit dbc70d9f49
5 changed files with 117 additions and 32 deletions
+61 -12
View File
@@ -45,9 +45,6 @@
#define ALL_EQUAL ((rr == gr && gr == br && br == ar) && (rg == gg && gg == bg && bg == ag) && (rb == gb && gb == bb && bb == ab))
/atom/movable/lighting_overlay/proc/update_overlay()
if (QDELING(src)) // This shouldn't happen.
return
var/turf/T = loc
if (!istype(T)) // Erm...
if (loc)
@@ -103,13 +100,29 @@
color = null
else
icon_state = LIGHTING_BASE_ICON_STATE
color = list(
rr, rg, rb, 0,
gr, gg, gb, 0,
br, bg, bb, 0,
ar, ag, ab, 0,
0, 0, 0, 1
)
if (islist(color))
var/list/c_list = color
c_list[CL_MATRIX_RR] = rr
c_list[CL_MATRIX_RG] = rg
c_list[CL_MATRIX_RB] = rb
c_list[CL_MATRIX_GR] = gr
c_list[CL_MATRIX_GG] = gg
c_list[CL_MATRIX_GB] = gb
c_list[CL_MATRIX_BR] = br
c_list[CL_MATRIX_BG] = bg
c_list[CL_MATRIX_BB] = bb
c_list[CL_MATRIX_AR] = ar
c_list[CL_MATRIX_AG] = ag
c_list[CL_MATRIX_AB] = ab
color = c_list
else
color = list(
rr, rg, rb, 0,
gr, gg, gb, 0,
br, bg, bb, 0,
ar, ag, ab, 0,
0, 0, 0, 1
)
#else
color = list(
cr.cache_r, cr.cache_g, cr.cache_b, 0,
@@ -120,8 +133,44 @@
)
#endif
if (bound_overlay)
update_above()
// If we're on an openturf, update the shadower object too.
// We could queue an icon update for the entire OT, but this involves less overhead.
var/turf/simulated/open/OT = loc:above
if (OT)
var/atom/movable/openspace/multiplier/shadower = OT.shadower
if (!shadower) // The OT hasn't been initialized yet.
OT.update_icon()
return
shadower.appearance = src
shadower.plane = OPENTURF_CAP_PLANE
shadower.layer = SHADOWER_LAYER
shadower.invisibility = 0
if (shadower.icon_state == LIGHTING_BASE_ICON_STATE)
// We're using a color matrix, so just darken the colors.
var/list/c_list = shadower.color
c_list[CL_MATRIX_RR] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_RG] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_RB] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_GR] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_GG] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_GB] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_BR] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_BG] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_BB] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_AR] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_AG] *= SHADOWER_DARKENING_FACTOR
c_list[CL_MATRIX_AB] *= SHADOWER_DARKENING_FACTOR
shadower.color = c_list
else
shadower.color = list(
SHADOWER_DARKENING_FACTOR, 0, 0,
0, SHADOWER_DARKENING_FACTOR, 0,
0, 0, SHADOWER_DARKENING_FACTOR
)
if (shadower.bound_overlay)
shadower.update_above()
#undef ALL_EQUAL
+6 -5
View File
@@ -90,14 +90,15 @@
/atom/movable/openspace/multiplier
name = "openspace multiplier"
desc = "You shouldn't see this."
icon = 'icons/misc/openspace.dmi'
icon_state = "white"
icon = 'icons/effects/lighting_overlay.dmi'
icon_state = "blank"
plane = OPENTURF_CAP_PLANE
layer = SHADOWER_LAYER
blend_mode = BLEND_MULTIPLY
color = list(
0.75, 0, 0,
0, 0.75, 0,
0, 0, 0.75
SHADOWER_DARKENING_FACTOR, 0, 0,
0, SHADOWER_DARKENING_FACTOR, 0,
0, 0, SHADOWER_DARKENING_FACTOR
)
/atom/movable/openspace/multiplier/Destroy()