Fixes lighting of pixel shifted objects and reverts the hacky memleak fix + other lighting fixes (#24963)

* Revert "Lighting micro optimizations and fixes (#24939)"

This reverts commit 78bbbfe20a.

* vg refactor stage 1

* Fix runtime in get_turf_pixel

* fix lighting on turfs

* Fix certain things reading light levels wrong.

* Made SS faster/better by making it split its tick allotment up between it's 3 tasks

* istypeless loops @pjb3005

/proc/typed_loop    6.826        6.830        6.858       190761
/proc/typeless_loop 5.582        5.586        5.620       190435

* lazy init lists
This commit is contained in:
Kyle Spier-Swenson
2017-03-14 11:27:23 -07:00
committed by AnturK
parent a8270c0b2a
commit 99002e25a3
17 changed files with 215 additions and 202 deletions

View File

@@ -6,6 +6,7 @@
var/atom/source_atom // The atom that we belong to.
var/turf/source_turf // The turf under the above.
var/turf/pixel_turf // The turf the top_atom appears to over.
var/light_power // Intensity of the emitter light.
var/light_range // The range of the emitted light.
var/light_color // The colour of the light, string, decomposed by parse_light_color()
@@ -44,6 +45,8 @@
top_atom.light_sources += src
source_turf = top_atom
pixel_turf = get_turf_pixel(top_atom) || source_turf
light_power = source_atom.light_power
light_range = source_atom.light_range
light_color = source_atom.light_color
@@ -121,10 +124,17 @@
if (isturf(top_atom))
if (source_turf != top_atom)
source_turf = top_atom
pixel_turf = source_turf
. = 1
else if (top_atom.loc != source_turf)
source_turf = top_atom.loc
pixel_turf = get_turf_pixel(top_atom)
. = 1
else
var/P = get_turf_pixel(top_atom)
if (P != pixel_turf)
. = 1
pixel_turf = get_turf_pixel(top_atom)
if (source_atom.light_power != light_power)
light_power = source_atom.light_power
@@ -158,9 +168,9 @@
// If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line.
// As such this all gets counted as a single line.
// The braces and semicolons are there to be able to do this on a single line.
#define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range)))
#define APPLY_CORNER(C) \
. = LUM_FALLOFF(C, source_turf); \
. = LUM_FALLOFF(C, pixel_turf); \
\
. *= light_power; \
\
@@ -184,7 +194,7 @@
);
// This is the define used to calculate falloff.
#define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range)))
/datum/light_source/proc/apply_lum()
var/static/update_gen = 1
@@ -194,17 +204,19 @@
applied_lum_r = lum_r
applied_lum_g = lum_g
applied_lum_b = lum_b
FOR_DVIEW(var/turf/T, light_range, source_turf, INVISIBILITY_LIGHTING)
var/thing
var/datum/lighting_corner/C
FOR_DVIEW(var/turf/T, light_range+1, source_turf, INVISIBILITY_LIGHTING)
if (!T.lighting_corners_initialised)
T.generate_missing_corners()
for (var/datum/lighting_corner/C in T.get_corners())
for (thing in T.get_corners())
C = thing
if (C.update_gen == update_gen)
continue
C.update_gen = update_gen
C.affecting += src
LAZYADD(C.affecting,src)
if (!C.active)
effect_str[C] = 0
@@ -212,29 +224,26 @@
APPLY_CORNER(C)
if (!T.affecting_lights)
T.affecting_lights = list()
T.affecting_lights += src
LAZYADD(T.affecting_lights, src)
affecting_turfs += T
update_gen++
/datum/light_source/proc/remove_lum()
applied = FALSE
for (var/turf/T in affecting_turfs)
if (!T.affecting_lights)
T.affecting_lights = list()
else
T.affecting_lights -= src
var/thing
for (thing in affecting_turfs)
var/turf/T = thing
LAZYREMOVE(T.affecting_lights, src)
affecting_turfs.Cut()
for (var/datum/lighting_corner/C in effect_str)
var/datum/lighting_corner/C
for (thing in effect_str)
C = thing
REMOVE_CORNER(C)
C.affecting -= src
LAZYREMOVE(C.affecting, src)
effect_str.Cut()
@@ -247,39 +256,48 @@
/datum/light_source/proc/smart_vis_update()
var/list/datum/lighting_corner/corners = list()
var/list/turf/turfs = list()
FOR_DVIEW(var/turf/T, light_range, source_turf, 0)
var/thing
var/datum/lighting_corner/C
var/turf/T
FOR_DVIEW(T, light_range+1, source_turf, 0)
if (!T.lighting_corners_initialised)
T.generate_missing_corners()
corners |= T.get_corners()
turfs += T
for (thing in T.get_corners(source_turf))
C = thing
corners[C] = 0
turfs += T
var/list/L = turfs - affecting_turfs // New turfs, add us to the affecting lights of them.
affecting_turfs += L
for (var/turf/T in L)
if (!T.affecting_lights)
T.affecting_lights = list(src)
else
T.affecting_lights += src
for (thing in L)
T = thing
LAZYADD(T.affecting_lights, src)
L = affecting_turfs - turfs // Now-gone turfs, remove us from the affecting lights.
affecting_turfs -= L
for (var/turf/T in L)
T.affecting_lights -= src
for (thing in L)
T = thing
LAZYREMOVE(T.affecting_lights, src)
for (var/datum/lighting_corner/C in corners - effect_str) // New corners
C.affecting += src
for (thing in corners - effect_str) // New corners
C = thing
LAZYADD(C.affecting, src)
if (!C.active)
effect_str[C] = 0
continue
APPLY_CORNER(C)
for (var/datum/lighting_corner/C in effect_str - corners) // Old, now gone, corners.
for (thing in effect_str - corners) // Old, now gone, corners.
C = thing
REMOVE_CORNER(C)
C.affecting -= src
LAZYREMOVE(C.affecting, src)
effect_str -= C
#undef effect_update
#undef EFFECT_UPDATE
#undef LUM_FALLOFF
#undef REMOVE_CORNER
#undef APPLY_CORNER