I would like to create a KinematicBody2D that uses multiple collision shapes, each interacting on different layers, for movement and collision with the environment.
My player character's root is a KinematicBody2D with child CollisionShape2Ds. I want some of these collisions to ignore parts of the Tilemaps while using the move_and_slide() function to move. This looks like a scenario where collision layers and masks should be used, but there is no way to split the CollisionShape2D across multiple layers without re-parenting them away from the KinematicBody2D and breaking the move_and_slide() collisions.
Here is an example scenario where I want this to happen. In the next screenshot, the blue shape represents the primary collision shape of the player character. The red shape is an additional collision shape which is enabled when the player carries an object, and doubles the width of the player.

When the player's collision is widened that way, they should not be able to pass through a 1-tile gap between two walls (#1 in the next image), but they should still be pass through a 1-tile gap between two holes in the ground (#2 in the next image). This is the same as saying "Every collision should interact with each other, except for the red player shape and the blue Tilemap shape".

The to-go way to filter collisions like this would be to use layer bits, but as explained I don't think I can put the collision shapes on different layers while using them for the KinematicBody2D movement. I'm thinking of writing my own player movement/collision function as a workaround, but before I put time toward that, I'd like to know if a more elegant solution exists that would allow me to still use move_and_slide().
Thank you!