Boolean modifier does the same thing even when normals are flipped (Blender 2.91.2)

So, I’d been under the impression that whichever way the normal of a face is pointing is treated as the “outer” side of the face, and as such, if I were to use the boolean difference modifier on the object, the impression created in the surface would be facing away from the normal.

However, in practice, the direction of the normal seems to make no difference. I’m not sure if this is a bug, or if boolean operations simply don’t work how I expect.

Case in point: I’m modelling a room with recess lighting in the ceiling. Since the room is only supposed to be viewed from the inside, I flipped all the normals inward. I then created a cylinder as the boolean object to cut out of the ceiling for the recess lighting. However, when I added the boolean difference modifier to the room with the cylinder, rather than creating a recess in the ceiling, it creates a cylindrical protrusion. Although this is easily fixed in this particular case by changing the boolean operation to a union, I had assumed since the normals were flipped, it would carve from the inside of the room, not the outside. However, normals seem to make no difference, whether I flip them on the room, or the cylinder.

I know that in this particular case, there’s an easy fix, but I feel like in more complex scenarios, things might not be so easy, so I’d like to improve my understanding. Should the boolean modifier be behaving this way? And if so, is there another way to flip a face’s orientation that would change the behavior of the boolean modifier?

Here’s some pics from my modelling:

I think this is something that @howardt could shed some light on if he finds a minute.

Yeah, I agree that the behavior @veritableVariable expected is what I would expect, so I guess this is a bug. But it might be kind of hard to fix. The Exact boolean code has to find the “outside everything” cell, called the “ambient cell”, and it kind of assumes that it is the thing that extends to infinity and has other finite things in it. Then it propagates insideness/outsideness from that ambient cell across all the boundaries, and it is supposed to be paying attention to normal directions as it crosses.

In the case here, the ambient cell should be the inside of the room when the normals are flipped that way. I don’t think it is easy to adapt my code to do that. I’ll have to investigate what my code does in this case that it wasn’t expecting.

You already found a workaround, but another one would have been to put a normal cube (with normals pointing outward) around everything, as part of the “room” mesh.

Ah, thank you for the clarification, @howardt . And glad to know I helped draw attention to a bug.