Slight radiation performance improvements. (#11839)
This commit is contained in:
@@ -48,7 +48,7 @@ public partial class RadiationSystem
|
|||||||
// send ray towards destination entity
|
// send ray towards destination entity
|
||||||
var ray = Irradiate(sourceTrs.Owner, sourceTrs, sourceWorld,
|
var ray = Irradiate(sourceTrs.Owner, sourceTrs, sourceWorld,
|
||||||
destTrs.Owner, destTrs, destWorld,
|
destTrs.Owner, destTrs, destWorld,
|
||||||
source.Intensity, source.Slope, saveVisitedTiles, resistanceQuery);
|
source.Intensity, source.Slope, saveVisitedTiles, resistanceQuery, transformQuery);
|
||||||
if (ray == null)
|
if (ray == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -85,7 +85,8 @@ public partial class RadiationSystem
|
|||||||
private RadiationRay? Irradiate(EntityUid sourceUid, TransformComponent sourceTrs, Vector2 sourceWorld,
|
private RadiationRay? Irradiate(EntityUid sourceUid, TransformComponent sourceTrs, Vector2 sourceWorld,
|
||||||
EntityUid destUid, TransformComponent destTrs, Vector2 destWorld,
|
EntityUid destUid, TransformComponent destTrs, Vector2 destWorld,
|
||||||
float incomingRads, float slope, bool saveVisitedTiles,
|
float incomingRads, float slope, bool saveVisitedTiles,
|
||||||
EntityQuery<RadiationGridResistanceComponent> resistanceQuery)
|
EntityQuery<RadiationGridResistanceComponent> resistanceQuery,
|
||||||
|
EntityQuery<TransformComponent> transformQuery)
|
||||||
{
|
{
|
||||||
// lets first check that source and destination on the same map
|
// lets first check that source and destination on the same map
|
||||||
if (sourceTrs.MapID != destTrs.MapID)
|
if (sourceTrs.MapID != destTrs.MapID)
|
||||||
@@ -117,7 +118,7 @@ public partial class RadiationSystem
|
|||||||
// todo: entity queries doesn't support interface - use it when IMapGridComponent will be removed
|
// todo: entity queries doesn't support interface - use it when IMapGridComponent will be removed
|
||||||
if (!TryComp(sourceTrs.GridUid.Value, out IMapGridComponent? gridComponent))
|
if (!TryComp(sourceTrs.GridUid.Value, out IMapGridComponent? gridComponent))
|
||||||
return ray;
|
return ray;
|
||||||
return Gridcast(gridComponent.Grid, ray, saveVisitedTiles, resistanceQuery);
|
return Gridcast(gridComponent.Grid, ray, saveVisitedTiles, resistanceQuery, sourceTrs, destTrs, transformQuery.GetComponent(sourceTrs.GridUid.Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
// lets check how many grids are between source and destination
|
// lets check how many grids are between source and destination
|
||||||
@@ -130,7 +131,7 @@ public partial class RadiationSystem
|
|||||||
// the ray will be updated with each grid that has some blockers
|
// the ray will be updated with each grid that has some blockers
|
||||||
foreach (var grid in grids)
|
foreach (var grid in grids)
|
||||||
{
|
{
|
||||||
ray = Gridcast(grid, ray, saveVisitedTiles, resistanceQuery);
|
ray = Gridcast(grid, ray, saveVisitedTiles, resistanceQuery, sourceTrs, destTrs, transformQuery.GetComponent(grid.GridEntityId));
|
||||||
|
|
||||||
// looks like last grid blocked all radiation
|
// looks like last grid blocked all radiation
|
||||||
// we can return right now
|
// we can return right now
|
||||||
@@ -142,7 +143,10 @@ public partial class RadiationSystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
private RadiationRay Gridcast(IMapGrid grid, RadiationRay ray, bool saveVisitedTiles,
|
private RadiationRay Gridcast(IMapGrid grid, RadiationRay ray, bool saveVisitedTiles,
|
||||||
EntityQuery<RadiationGridResistanceComponent> resistanceQuery)
|
EntityQuery<RadiationGridResistanceComponent> resistanceQuery,
|
||||||
|
TransformComponent sourceTrs,
|
||||||
|
TransformComponent destTrs,
|
||||||
|
TransformComponent gridTrs)
|
||||||
{
|
{
|
||||||
var blockers = new List<(Vector2i, float)>();
|
var blockers = new List<(Vector2i, float)>();
|
||||||
|
|
||||||
@@ -153,8 +157,26 @@ public partial class RadiationSystem
|
|||||||
var resistanceMap = resistance.ResistancePerTile;
|
var resistanceMap = resistance.ResistancePerTile;
|
||||||
|
|
||||||
// get coordinate of source and destination in grid coordinates
|
// get coordinate of source and destination in grid coordinates
|
||||||
var sourceGrid = grid.TileIndicesFor(ray.Source);
|
|
||||||
var destGrid = grid.TileIndicesFor(ray.Destination);
|
// TODO Grid overlap. This currently assumes the grid is always parented directly to the map (local matrix == world matrix).
|
||||||
|
// If ever grids are allowed to overlap, this might no longer be true. In that case, this should precompute and cache
|
||||||
|
// inverse world matrices.
|
||||||
|
|
||||||
|
Vector2 srcLocal = sourceTrs.ParentUid == grid.GridEntityId
|
||||||
|
? sourceTrs.LocalPosition
|
||||||
|
: gridTrs.InvLocalMatrix.Transform(ray.Source);
|
||||||
|
|
||||||
|
Vector2 dstLocal = destTrs.ParentUid == grid.GridEntityId
|
||||||
|
? destTrs.LocalPosition
|
||||||
|
: gridTrs.InvLocalMatrix.Transform(ray.Destination);
|
||||||
|
|
||||||
|
Vector2i sourceGrid = new(
|
||||||
|
(int) Math.Floor(srcLocal.X / grid.TileSize),
|
||||||
|
(int) Math.Floor(srcLocal.Y / grid.TileSize));
|
||||||
|
|
||||||
|
Vector2i destGrid = new(
|
||||||
|
(int) Math.Floor(dstLocal.X / grid.TileSize),
|
||||||
|
(int) Math.Floor(dstLocal.Y / grid.TileSize));
|
||||||
|
|
||||||
// iterate tiles in grid line from source to destination
|
// iterate tiles in grid line from source to destination
|
||||||
var line = new GridLineEnumerator(sourceGrid, destGrid);
|
var line = new GridLineEnumerator(sourceGrid, destGrid);
|
||||||
|
|||||||
Reference in New Issue
Block a user