From c4d714dea848d2ccf737920ad04bcf779ec8ede1 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 18 Apr 2018 21:54:58 -0400 Subject: [PATCH] Replaces set_light with direct update_lumcount for planet suns. Setting lights on every single turf takes way too long. Instead of havingto create a light source for every single outdoor turf, we find the corners to light up and apply the sunlight to them directly. We also make sure to avoid having planet sunlight being 4x too strong, which would happen if we naively looped over all corners of all outdoor turfs. Note: This has the side effect of making the sun's light and color ACCURATELY reflected on turfs. Previous code doubled up on light and appeared brighter than it should. --- code/controllers/Processes/planet.dm | 36 ++++++++++++++++++++++++---- code/modules/planet/planet.dm | 3 ++- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm index e39b5e81b8..9ab541c80d 100644 --- a/code/controllers/Processes/planet.dm +++ b/code/controllers/Processes/planet.dm @@ -61,14 +61,40 @@ var/datum/controller/process/planet/planet_controller = null //Sun light needs changing if(P.needs_work & PLANET_PROCESS_SUN) P.needs_work &= ~PLANET_PROCESS_SUN - //Redraw sun overlay - var/new_range = P.sun["range"] + // Remove old value from corners + var/list/sunlit_corners = P.sunlit_corners + var/old_lum_r = -P.sun["lum_r"] + var/old_lum_g = -P.sun["lum_g"] + var/old_lum_b = -P.sun["lum_b"] + if(old_lum_r || old_lum_g || old_lum_b) + for(var/C in P.sunlit_corners) + var/datum/lighting_corner/LC = C + LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b) + SCHECK + sunlit_corners.Cut() + + // Calculate new values to apply var/new_brightness = P.sun["brightness"] var/new_color = P.sun["color"] - for(var/T in P.planet_floors) - var/turf/simulated/turf = T - turf.set_light(new_range, new_brightness, new_color) + var/lum_r = new_brightness * GetRedPart (new_color) / 255 + var/lum_g = new_brightness * GetGreenPart(new_color) / 255 + var/lum_b = new_brightness * GetBluePart (new_color) / 255 + var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs. + for(var/I in P.planet_floors) + var/turf/simulated/T = I + if(!T.lighting_corners_initialised) + T.generate_missing_corners() + for(var/C in T.get_corners()) + var/datum/lighting_corner/LC = C + if(LC.update_gen != update_gen && LC.active) + sunlit_corners += LC + LC.update_gen = update_gen + LC.update_lumcount(lum_r, lum_g, lum_b) SCHECK + update_gen-- + P.sun["lum_r"] = lum_r + P.sun["lum_g"] = lum_g + P.sun["lum_b"] = lum_b //Temperature needs updating if(P.needs_work & PLANET_PROCESS_TEMP) diff --git a/code/modules/planet/planet.dm b/code/modules/planet/planet.dm index 97c7847fde..061ae73398 100644 --- a/code/modules/planet/planet.dm +++ b/code/modules/planet/planet.dm @@ -12,7 +12,8 @@ var/datum/weather_holder/weather_holder var/sun_position = 0 // 0 means midnight, 1 means noon. - var/list/sun = list("range","brightness","color") + var/list/sun = list("range","brightness","color","lum_r","lum_g","lum_b") + var/list/datum/lighting_corner/sunlit_corners = list() var/expected_z_levels = list() var/turf/unsimulated/wall/planetary/planetary_wall_type = /turf/unsimulated/wall/planetary