## Mirror of PR #22521: [Partial atmos
refactor](https://github.com/space-wizards/space-station-14/pull/22521)
from <img src="https://avatars.githubusercontent.com/u/10567778?v=4"
alt="space-wizards" width="22"/>
[space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14)
###### `18a35e7e83b2b71ee84b054d44d9ed5e595dd618`
PR opened by <img
src="https://avatars.githubusercontent.com/u/60421075?v=4"
width="16"/><a href="https://github.com/ElectroJr"> ElectroJr</a> at
2023-12-15 03:45:42 UTC
---
PR changed 43 files with 891 additions and 635 deletions.
The PR had the following labels:
- Status: Needs Review
---
<details open="true"><summary><h1>Original Body</h1></summary>
> This PR reworks how some parts of atmos code work. Originally it was
just meant to be a performance and bugfix PR, but it has ballooned in
scope. I'm not sure about some of my changes largely because I'm not
sure if some things were an oversight or an intentional decision for
some reason.
>
> List of changes:
> - The `MolesArchived float[]` field is now read-only
> - It simply gets zeroed whenever the `GasMixture` is set to null
instead of constantly reallocating
> - Airtight query information is now cached in `TileAtmosphere`
> - This means that it should only iterate over anchored entities once
per update.
> - Previously an invalidated atmos tile would cause
`ProcessRevalidate()` to query airtight entities on the same tile six
times by calling a combination of `GridIsTileAirBlocked()`,
`NeedsVacuumFixing()`, and `GridIsTileAirBlocked()`. So this should help
significantly reduce component lookups & entity enumeration.
> - This does change some behaviour. In particular blocked directions
are now only updated if the tile was invalidated prior to the current
atmos-update, and will only ever be updated once per atmos-update.
> - AFAIK this only has an effect if the invalid tile processing is
deferred over multiple ticks, and I don't think it should cause any
issues?
> - Fixes a potential bug, where tiles might not dispose of their
excited group if their direction flags changed.
> - `MapAtmosphereComponent.Mixture` is now always immutable and no
longer nullable
> - I'm not sure why the mixture was nullable before? AFAICT the
component is meaningless if its null?
> - Space "gas" was always immutable, but there was nothing that
required planet atmospheres to be immutable. Requiring that it be
immutable gets rid of the constant gas mixture cloning.
> - I don't know if there was a reason for why they weren't immutable to
begin with.
> - Fixes lungs removing too much air from a gas mixture, resulting in
negative moles.
> - `GasMixture.Moles` is now `[Access]` restricted to the atmosphere
system.
> - This is to prevent people from improperly modifying the gas mixtures
(e.g., lungs), or accidentally modifying immutable mixtures.
> - Fixes an issue where non-grid atmosphere tiles would fail to update
their adjacent tiles, resulting in null reference exception spam
> - Fixes#21732
> - Fixes#21210 (probably)
> - Disconnected atmosphere tiles, i.e., tiles that aren't on or
adjacent to a grid tile, will now get removed from the tile set.
Previously the tile set would just always increase, with tiles never
getting removed.
> - Removes various redundant component and tile-definition queries.
> - Removes some method events in favour of just using methods.
> - Map-exposded tiles now get updated when a map's atmosphere changes
(or the grid moves across maps).
> - Adds a `setmapatmos` command for adding map-wide atmospheres.
> - Fixed (non-planet) map atmospheres rendering over grids.
>
> ## Media
>
> This PR also includes changes to the atmos debug overlay, though I've
also split that off into a separate PR to make reviewing easier
(#22520).
>
> Below is a video showing that atmos still seems to work, and that
trimming of disconnected tiles works:
>
>
https://github.com/space-wizards/space-station-14/assets/60421075/4da46992-19e6-4354-8ecd-3cd67be4d0ed
>
> For comparison, here is a video showing how current master works
(disconnected tiles never get removed):
>
>
https://github.com/space-wizards/space-station-14/assets/60421075/54590777-e11c-41dc-b49d-fd7e53bfeed7
>
> 🆑
> - fix: Fixed a bug where partially airtight entities (e.g., thin
windows or doors) could let air leak out into space.
>
</details>
Co-authored-by: SimpleStation14 <Unknown>
* Broadphase refactor (content)
* Shuttle jank
* Fixes
* Testing jank
* Features and things
* Balance stuffsies
* AHHHHHHHHHHHHHHHH
* Mass and stuff working
* Fix drops
* Another balance pass
* Balance AGEN
* Add in stuff for rotating shuttles for debugging
* Nothing to see here
* Testbed stuffsies
* Fix some tests
* Fixen test
* Try fixing map
* Shuttle movement balance pass
* lasaggne
* Basic Helmsman console working
* Slight docking cleanup
* Helmsman requires power
* Basic shuttle test
* Stuff
* Fix computations
* Add shuttle console to saltern
* Rename helmsman to shuttleconsole
* Final stretch
* More tweaks
* Fix piloting prediction for now.
* First pass
* Fix access and rename banananium to bananium
* Fix captialization of CookTimeInfoLabel
* Fix InteractUsing calls
* Remove unused [Dependency]
* Replace obsolete references to Anchored with BodyType
* Assign default value to shoving someone in disposals
* Fix naming
* Replace Initialize TryGetComponents with EnsureComponent
* Rework AnchorableComponent
* Fix singularity component
* Replace obsolete usages of Angle.South
* Fix efcore warning
* Fix container tests
* Fix DebugPressurePump invalid PressurePump yaml
* Fix getting pathfinding region of grid 0
* Fix atmos plaque missing layer and add info message when it happens
* Fix AiSteeringSystem steering in an invalid grid in entity test
* Make content able to choose which log level leads to test failures
* Revert container test fix for Acruid
* Fix sprite, pipe and saving errors
Make EntityTest print all errors instead of stopping on the first
* Reorder singularity visualizer
* Disable pvs for container occlusion adn simple predict reconcile, they use entities other than map ones
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
* Content side new physics structure
* BroadPhase outline done
* But we need to fix WorldAABB
* Fix static pvs AABB
* Fix import
* Rando fixes
* B is for balloon
* Change human mob hitbox to circle
* Decent movement
* Start adding friction to player controller
I think it's the best way to go about it to keep other objects somewhat consistent for physics.
* This baby can fit so many physics bugs in it.
* Slight mob mover optimisations.
* Player mover kinda works okay.
* Beginnings of testbed
* More testbed
* Circlestack bed
* Namespaces
* BB fixes
* Pull WorldAABB
* Joint pulling
* Semi-decent movement I guess.
* Pulling better
* Bullet controller + old movement
* im too dumb for this shit
* Use kinematic mob controller again
It's probably for the best TBH
* Stashed shitcode
* Remove SlipController
* In which movement code is entirely refactored
* Singularity fix
* Fix ApplyLinearImpulse
* MoveRelay fix
* Fix door collisions
* Disable subfloor collisions
Saves on broadphase a fair bit
* Re-implement ClimbController
* Zumzum's pressure
* Laggy item throwing
* Minor atmos change
* Some caching
* Optimise controllers
* Optimise CollideWith to hell and back
* Re-do throwing and tile friction
* Landing too
* Optimise controllers
* Move CCVars and other stuff swept is beautiful
* Cleanup a bunch of controllers
* Fix shooting and high pressure movement controller
* Flashing improvements
* Stuff and things
* Combat collisions
* Combat mode collisions
* Pulling distance joint again
* Cleanup physics interfaces
* More like scuffedularity
* Shit's fucked
* Haha tests go green
* Bigmoneycrab
* Fix dupe pulling
* Zumzum's based fix
* Don't run tile friction for non-predicted bodies
* Experimental pulling improvement
* Everything's a poly now
* Optimise AI region debugging a bit
Could still be better but should improve default performance a LOT
* Mover no updater
* Crazy kinematic body idea
* Good collisions
* KinematicController
* Fix aghost
* Throwing refactor
* Pushing cleanup
* Fix throwing and footstep sounds
* Frametime in ICollideBehavior
* Fix stuff
* Actually fix weightlessness
* Optimise collision behaviors a lot
* Make open lockers still collide with walls
* powwweeerrrrr
* Merge master proper
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
* Ch ch ch changesss
* SHIP IT
* Fix #if DEBUG
* Fix vaulting and item locker collision
* Fix throwing
* Editing yaml by hand what can go wrong
* on
* Last yaml fixes
* Okay now it's fixed
* Linter
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
Co-authored-by: Vera Aguilera Puerto <zddm@outlook.es>
* Content side new physics structure
* BroadPhase outline done
* But we need to fix WorldAABB
* Fix static pvs AABB
* Fix import
* Rando fixes
* B is for balloon
* Change human mob hitbox to circle
* Decent movement
* Start adding friction to player controller
I think it's the best way to go about it to keep other objects somewhat consistent for physics.
* This baby can fit so many physics bugs in it.
* Slight mob mover optimisations.
* Player mover kinda works okay.
* Beginnings of testbed
* More testbed
* Circlestack bed
* Namespaces
* BB fixes
* Pull WorldAABB
* Joint pulling
* Semi-decent movement I guess.
* Pulling better
* Bullet controller + old movement
* im too dumb for this shit
* Use kinematic mob controller again
It's probably for the best TBH
* Stashed shitcode
* Remove SlipController
* In which movement code is entirely refactored
* Singularity fix
* Fix ApplyLinearImpulse
* MoveRelay fix
* Fix door collisions
* Disable subfloor collisions
Saves on broadphase a fair bit
* Re-implement ClimbController
* Zumzum's pressure
* Laggy item throwing
* Minor atmos change
* Some caching
* Optimise controllers
* Optimise CollideWith to hell and back
* Re-do throwing and tile friction
* Landing too
* Optimise controllers
* Move CCVars and other stuff swept is beautiful
* Cleanup a bunch of controllers
* Fix shooting and high pressure movement controller
* Flashing improvements
* Stuff and things
* Combat collisions
* Combat mode collisions
* Pulling distance joint again
* Cleanup physics interfaces
* More like scuffedularity
* Shit's fucked
* Haha tests go green
* Bigmoneycrab
Co-authored-by: Metal Gear Sloth <metalgearsloth@gmail.com>
* Engine namespace changes.
* Automated remove redundant using statements.
* Simplified Graphics namespace.
* Apparently the container system stores full type names in the map file.😞 This updates those names.
* API Changes to LocalizationManager.LoadCulture.
* Update submodule to v0.3.2
* SIMD atmos
* Moles will always be a multiple of four.
* Component dependencies for grid atmos.
* Let's optimize allocations while we're at it!
* Inline this
* A bunch of atmos optimizations
* Fix crimes against atmos
* Microsoft moment
* Remove nuget.config
* do not reference Robust.UnitTests in Content.Benchmarks as it's unneeded.
* Revert "Remove nuget.config"
This reverts commit 872604ae6a51365af4075bb23687bd005befd8ac.
* Gas overlay optimization and fixes
* Lattice is now spess
* minor atmos tweaks
* Disable Pulling When Buckling an entity
* Projectile Improvements
If you shoot at a person that is critted now it will only hit if you aim at that person otherwise go "above" him and hit other targets.
- Dead people are still unhitable
* Update Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs
Co-authored-by: Víctor Aguilera Puerto <6766154+Zumorica@users.noreply.github.com>
* Firelock In Progress
* Revert "Projectile Improvements"
This reverts commit 5821afc798e49e530d4086d7a9ddbe097805fdc4.
* Firelock Graph
* Revert "Merge branch 'master' into test2"
This reverts commit c69661cc7d9dcdc6d8c0dd45770f9eb94b231463, reversing
changes made to 5f1de8b8d24cd52190addb3df5617cb1012fd52c.
* Bunch of stuff
- Metal Rods
- Reinforced Glass
- SetStackCount Condition
- Tables
- Lattice
* Output2 to FloorTileItemComponent
* Plating, Underplating and Tiles (+FloorTile Improvements)
* Turf Fixes
+ APC Electronics
* Reinforced Glass In-hand textures
* All the fixes
* Final Changes
* (Hopefully) Last commit
* Update Resources/Prototypes/Entities/Constructible/Doors/firelock_frame.yml
Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com>
* Update Content.Server/GameObjects/Components/Atmos/FirelockComponent.cs
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* A Few more things
* Edit FirelockComponent.cs
Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>
Co-authored-by: Víctor Aguilera Puerto <6766154+Zumorica@users.noreply.github.com>
Co-authored-by: Paul Ritter <ritter.paul1@googlemail.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Default grids go poof
* Address review
* Update submodule
* Fix DoAfterSystem for entities without grid.
* Fix SubFloorHideSystem for entities without grid.
* Fix ExplosionHelper for coordinates that aren't in a grid
* Fix TurfHelpers' GetWorldTileBox crash in the case of invalid grid
* Fix tile prying component crash when trying to pry space.
* Spill fixes when passing coordinates without grids.
* Are you static'in, son?
* Change SaveLoadSaveTest grid Id hardcoded value
It's still hardcoded, but at least now it's correct!
* Only send debug AI thing if grid is not invalid
* Update submodule.
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
- Powerful
- Data-oriented
- Approved by PJB
- Powered by node graphs and AI pathfinding
- Coded by the same nerd who brought you atmos
Co-authored-by: Exp <theexp111@gmail.com>