Skip to content

Commit

Permalink
Merge pull request #34664 from Spookerton/spkrtn/fix/inadvisorble-access
Browse files Browse the repository at this point in the history
scene group renderer is owned again, add mob/GetRenderer
  • Loading branch information
Spookerton committed Jun 14, 2024
2 parents 76b49f1 + fa1b475 commit f2f7fb9
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 34 deletions.
65 changes: 37 additions & 28 deletions code/__defines/_renderer.dm
Original file line number Diff line number Diff line change
Expand Up @@ -102,27 +102,29 @@ INITIALIZE_IMMEDIATE(/atom/movable/renderer)
* to share them globally.
*/

/// The map of (instance = plane) renderers in use by this mob.
/mob/var/list/atom/movable/renderer/renderers
/// A map of (instance = plane) renderers in use by this mob.
/mob/var/list/atom/movable/renderer/rdr_to_plane

/// A list of non-main types of renderers in use by this mob.
/mob/var/list/atom/movable/renderer/extra_renderers
/// A map of (type = instance) renderers in use by this mob.
/mob/var/list/atom/movable/renderer/rdr_by_type


/// Creates the mob's renderers on /Login()
/mob/proc/AddDefaultRenderers()
if (renderers)
if (rdr_to_plane)
ClearRenderers()
renderers = list()
extra_renderers = list()
rdr_to_plane = list()
rdr_by_type = list()
for (var/atom/movable/renderer/renderer as anything in GLOB.rdr_main_owned)
renderer = new renderer (null, src)
renderers[renderer] = renderer.plane
rdr_to_plane[renderer] = renderer.plane
rdr_by_type[renderer.type] = renderer
if (renderer.relay)
my_client.screen += renderer.relay
my_client.screen += renderer
for (var/atom/movable/renderer/renderer as anything in GLOB.rdr_main_shared)
renderers[renderer] = renderer.plane
rdr_to_plane[renderer] = renderer.plane
rdr_by_type[renderer.type] = renderer
if (renderer.relay)
my_client.screen += renderer.relay
my_client.screen += renderer
Expand All @@ -131,14 +133,24 @@ INITIALIZE_IMMEDIATE(/atom/movable/renderer)
/// Removes the mob's renderers on /Logout()
/mob/proc/ClearRenderers()
if (my_client)
for (var/atom/movable/renderer/renderer as anything in renderers)
for (var/atom/movable/renderer/renderer as anything in rdr_to_plane)
if (renderer.relay)
my_client.screen -= renderer.relay
my_client.screen -= renderer
if (~renderer.renderer_flags & RENDERER_SHARED)
qdel(renderer)
extra_renderers = null
renderers = null
rdr_to_plane = null
rdr_by_type = null


/// Returns the renderer instance of_type if the mob has one and it is not shared.
/mob/proc/GetRenderer(atom/movable/renderer/of_type)
if (!my_client)
return
var/atom/movable/renderer/renderer = rdr_by_type[of_type]
if (renderer?.renderer_flags & RENDERER_SHARED)
return
return renderer


/// Adds a non-main renderer to the mob by type if the mob doesn't already have it.
Expand All @@ -148,7 +160,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/renderer)
var/flags = initial(of_type.renderer_flags)
if (flags & RENDERER_MAIN)
return
if (of_type in extra_renderers)
if (of_type in rdr_by_type)
return
var/atom/movable/renderer/renderer
if (flags & RENDERER_SHARED)
Expand All @@ -158,8 +170,8 @@ INITIALIZE_IMMEDIATE(/atom/movable/renderer)
if (renderer.relay)
my_client.screen += renderer.relay
my_client.screen += renderer
renderers[renderer] = renderer.plane
extra_renderers += of_type
rdr_to_plane[renderer] = renderer.plane
rdr_by_type[of_type] = renderer


/// Removes a non-main renderer to the mob by type.
Expand All @@ -169,19 +181,16 @@ INITIALIZE_IMMEDIATE(/atom/movable/renderer)
var/flags = initial(of_type.renderer_flags)
if (flags & RENDERER_MAIN)
return
if (!(of_type in extra_renderers))
return
for (var/atom/movable/renderer/renderer as anything in renderers)
if (renderer.type != of_type)
continue
extra_renderers -= of_type
renderers -= renderer
if (renderer.relay)
my_client.screen -= renderer.relay
my_client.screen -= renderer
if (~renderer.renderer_flags & RENDERER_SHARED)
qdel(renderer)
var/atom/movable/renderer/renderer = rdr_by_type[of_type]
if (!renderer)
return
if (renderer.relay)
my_client.screen -= renderer.relay
my_client.screen -= renderer
rdr_by_type -= of_type
rdr_to_plane -= renderer
if (~renderer.renderer_flags & RENDERER_SHARED)
qdel(renderer)


/* *
Expand Down Expand Up @@ -308,7 +317,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/renderer)
name = "Scene Group"
group = RENDER_GROUP_FINAL
plane = RENDER_GROUP_SCENE
renderer_flags = RENDERER_MAIN | RENDERER_SHARED
renderer_flags = RENDERER_MAIN


/// Render group for stuff OUTSIDE the typical game context - UI, full screen effects, etc.
Expand Down
7 changes: 4 additions & 3 deletions code/modules/client/client_color.dm
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,9 @@
0, 1, 0,
0, 0, 1
)
var/scene_group = GetRenderer(/atom/movable/renderer/scene_group)
if (!length(client_colors))
animate(renderers[10], color = initial(color))
animate(scene_group, color = initial(color))
animate(client, color = initial(color))
return
var/datum/client_color/top_color
Expand All @@ -93,15 +94,15 @@
if (entry.override)
break
if (!top_color.ignore_blood)
animate(renderers[10], color = color)
animate(scene_group, color = color)
animate(client, color = list(
1, 0, 0,
0, 1, 0,
0, 0, 1
))
else
animate(client, color = color)
animate(renderers[10], color = list(
animate(scene_group, color = list(
1, 0, 0,
0, 1, 0,
0, 0, 1
Expand Down
6 changes: 3 additions & 3 deletions code/modules/client/preference_setup/global/preferences.dm
Original file line number Diff line number Diff line change
Expand Up @@ -271,9 +271,9 @@ var/global/list/_client_preferences_by_type
default_value = GLOB.PREF_HIGH

/datum/client_preference/graphics_quality/changed(mob/preference_mob, new_value)
if(preference_mob?.client)
for(var/atom/movable/renderer/R as anything in preference_mob.renderers)
R.GraphicsUpdate()
if (preference_mob?.client)
for (var/atom/movable/renderer/renderer as anything in preference_mob.rdr_to_plane)
renderer.GraphicsUpdate()

/datum/client_preference/goonchat
description = "Use Goon Chat"
Expand Down

0 comments on commit f2f7fb9

Please sign in to comment.