From 78bbbfe20abc28e3f7c535c396754bf1493928b8 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Sun, 12 Mar 2017 15:01:57 -0400 Subject: [PATCH] Lighting micro optimizations and fixes (#24939) * Lighting micro optimizations and fixes * Cast it --- code/modules/lighting/lighting_atom.dm | 3 ++ code/modules/lighting/lighting_corner.dm | 44 ++++++++++++----------- code/modules/lighting/lighting_overlay.dm | 14 ++++---- code/modules/lighting/lighting_turf.dm | 20 ++++++----- 4 files changed, 47 insertions(+), 34 deletions(-) diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 126495fd739..e3f7c9feb47 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -94,14 +94,17 @@ switch (var_name) if ("light_range") set_light(l_range=var_value) + var_edited = TRUE return if ("light_power") set_light(l_power=var_value) + var_edited = TRUE return if ("light_color") set_light(l_color=var_value) + var_edited = TRUE return return ..() diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 76b39c0a1ef..747c0f3fc48 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -1,5 +1,4 @@ /var/list/datum/lighting_corner/all_lighting_corners = list() -/var/datum/lighting_corner/dummy/dummy_lighting_corner = new // Because we can control each corner of every lighting overlay. // And corners get shared between multiple turfs (unless you're on the corners of the map, then 1 corner doesn't). // For the record: these should never ever ever be deleted, even if the turf doesn't have dynamic lighting. @@ -8,8 +7,8 @@ /var/list/LIGHTING_CORNER_DIAGONAL = list(NORTHEAST, SOUTHEAST, SOUTHWEST, NORTHWEST) /datum/lighting_corner - var/list/turf/masters = list() - var/list/datum/light_source/affecting = list() // Light sources affecting us. + var/list/turf/masters + var/list/datum/light_source/affecting// Light sources affecting us. var/active = FALSE // TRUE if one of our masters has dynamic lighting. var/x = 0 @@ -30,8 +29,8 @@ var/update_gen = 0 /datum/lighting_corner/New(var/turf/new_turf, var/diagonal) - . = ..() - + masters = list() + affecting = list() all_lighting_corners += src masters[new_turf] = turn(diagonal, 180) @@ -51,33 +50,40 @@ // Diagonal one is easy. T = get_step(new_turf, diagonal) - if (T) // In case we're on the map's border. - if (!T.corners) - T.corners = list(null, null, null, null) + var/corners + if (T) // In case we're on the map's border. + corners = T.corners + if (!corners) + corners = list(null, null, null, null) + T.corners = corners masters[T] = diagonal i = LIGHTING_CORNER_DIAGONAL.Find(turn(diagonal, 180)) - T.corners[i] = src + corners[i] = src // Now the horizontal one. T = get_step(new_turf, horizontal) if (T) // Ditto. + corners = T.corners if (!T.corners) - T.corners = list(null, null, null, null) + corners = list(null, null, null, null) + T.corners = corners masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates. i = LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) - T.corners[i] = src + corners[i] = src // And finally the vertical one. T = get_step(new_turf, vertical) if (T) + corners = T.corners if (!T.corners) - T.corners = list(null, null, null, null) + corners = list(null, null, null, null) + T.corners = corners masters[T] = ((T.x > x) ? EAST : WEST) | ((T.y > y) ? NORTH : SOUTH) // Get the dir based on coordinates. i = LIGHTING_CORNER_DIAGONAL.Find(turn(masters[T], 180)) - T.corners[i] = src + corners[i] = src update_active() @@ -86,6 +92,7 @@ for (var/turf/T in masters) if (T.lighting_overlay) active = TRUE + break // God that was a mess, now to do the rest of the corner code! Hooray! /datum/lighting_corner/proc/update_lumcount(var/delta_r, var/delta_g, var/delta_b) @@ -120,10 +127,10 @@ for (var/TT in masters) var/turf/T = TT - if (T.lighting_overlay) - if (!T.lighting_overlay.needs_update) - T.lighting_overlay.needs_update = TRUE - lighting_update_overlays += T.lighting_overlay + var/atom/movable/lighting_overlay/lo = T.lighting_overlay + if (lo && !lo.needs_update) + lo.needs_update = TRUE + lighting_update_overlays += lo /datum/lighting_corner/dummy/New() @@ -131,9 +138,6 @@ /datum/lighting_corner/Destroy(var/force) - if (!force) - return QDEL_HINT_LETMELIVE - stack_trace("Ok, Look, TG, I need you to find whatever fucker decided to call qdel on a fucking lighting overlay, then tell him very nicely and politely that he is 100% retarded and needs his head checked. Thanks. Send them my regards by the way.") // Yeah fuck you anyways. return QDEL_HINT_LETMELIVE diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 828e9d37ed9..bfad74e12bb 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -51,10 +51,10 @@ var/turf/T = loc if (!istype(T)) // Erm... if (loc) - warning("A lighting overlay realised its loc was NOT a turf (actual loc: [loc], [loc.type]) in update_overlay()!") + WARNING("A lighting overlay realised its loc was NOT a turf (actual loc: [loc], [loc.type]) in update_overlay()!") else - warning("A lighting overlay realised it was in nullspace in update_overlay()!") + WARNING("A lighting overlay realised it was in nullspace in update_overlay()!") qdel(src, TRUE) return @@ -69,10 +69,12 @@ // See LIGHTING_CORNER_DIAGONAL in lighting_corner.dm for why these values are what they are. // No I seriously cannot think of a more efficient method, fuck off Comic. - var/datum/lighting_corner/cr = T.corners[3] || dummy_lighting_corner - var/datum/lighting_corner/cg = T.corners[2] || dummy_lighting_corner - var/datum/lighting_corner/cb = T.corners[4] || dummy_lighting_corner - var/datum/lighting_corner/ca = T.corners[1] || dummy_lighting_corner + var/list/corners = T.corners + var/static/datum/lighting_corner/dummy/dummy_lighting_corner = new + var/datum/lighting_corner/cr = corners[3] || dummy_lighting_corner + var/datum/lighting_corner/cg = corners[2] || dummy_lighting_corner + var/datum/lighting_corner/cb = corners[4] || dummy_lighting_corner + var/datum/lighting_corner/ca = corners[1] || dummy_lighting_corner var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx) diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 32c2dcafd15..9f60901e292 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -15,8 +15,9 @@ L.vis_update() /turf/proc/lighting_clear_overlay() - if (lighting_overlay) - qdel(lighting_overlay, TRUE) + var/lo = lighting_overlay + if (lo) + qdel(lo, TRUE) for (var/datum/lighting_corner/C in corners) C.update_active() @@ -88,8 +89,9 @@ reconsider_lights() /turf/proc/change_area(var/area/old_area, var/area/new_area) - if (new_area.dynamic_lighting != old_area.dynamic_lighting) - if (new_area.dynamic_lighting) + var/nadl = new_area.dynamic_lighting + if (nadl != old_area.dynamic_lighting) + if (nadl) lighting_build_overlay() else @@ -103,14 +105,16 @@ /turf/proc/generate_missing_corners() lighting_corners_initialised = TRUE - if (!corners) - corners = list(null, null, null, null) + var/ccorners = corners + if (!ccorners) + ccorners = list(null, null, null, null) + corners = ccorners for (var/i = 1 to 4) - if (corners[i]) // Already have a corner on this direction. + if (ccorners[i]) // Already have a corner on this direction. continue - corners[i] = new/datum/lighting_corner(src, LIGHTING_CORNER_DIAGONAL[i]) + ccorners[i] = new/datum/lighting_corner(src, LIGHTING_CORNER_DIAGONAL[i]) /turf/ChangeTurf(path)