It is a bit of a difficult concept.
First, let me clarify something: simply parenting a model to another model does not make the two models into a single cullable unit. So you can parent all of your rocks, trees, etc. to the terrain, and each of them can still be culled individually. In fact, you usually want to structure your scene graph with some depth to it, so that objects that are physically near each other are parented to the same node together–this makes the culling process faster, since if all of the objects under a common node are outside of the culling volume, Panda doesn’t have to look at the individual objects. On the other hand, you don’t want to go too crazy with this, and create thousands of useless nodes, which can make culling more expensive (since Panda would then have to traverse all of those nodes every frame).
The smallest cullable unit in Panda is a Geom, which is a part of a GeomNode. So as long as your scene is broken up into multiple different Geoms, each Geom could be culled as a unit or drawn as a unit. (Of course, there is also a drawing penalty per Geom–each Geom corresponds more-or-less with a single DrawPrimitive call to the graphics card, which is a relatively expensive call. So you have to balance having lots of Geoms to make your culling effective, vs. having relatively few Geoms to streamline the rendering overhead.)
If you parent several pieces of geometry to a common node, and then call flattenStrong() on that common node, Panda will try to combine all of the Geoms under that node into as few Geoms as possible. (It will help if you also use egg-palettize to reduce the number of individual textures used by this group, since each different texture will necessarily have to be in a different Geom.) Finding the right size of these node groups is part of the art of optimizing your scene, and the right balance point depends on the level of hardware you are targeting–in general, the better graphics cards prefer to have fewer Geoms with more vertices per Geom, while the older graphics cards prefer to have more Geoms with fewer vertices per Geom. But if a particular object will always be either wholly onscreen or wholly offscreen, it is always a good idea to combine this object into as few Geoms as possible (ideally one).
Now. The culling algorithm that Panda employs is called view-frustum culling, which means simply that any object that is not physically within the viewing frustum is culled, and any object which is at least partially within the viewing frustum is drawn. That is to say, if it is in front of the camera, it will be drawn, even if it is behind a wall.
So the interiors of your buildings will be drawn, even if you can’t see through the door from where you’re standing–in fact, even if the door happens to be closed.
It is theoretically possible to arrange it so that the interiors will be culled in a smarter fashion. Cell-portal visibility, for instance, would be perfect for this. This is an algorithm in which you define certain “cells” of space–for instance, the interior of a building would be a cell–and “portals” through which you can look into the cells–e.g. the door is a portal. If you set this up properly, Panda will know that the only way you can see the interior is by looking through the door, and it can cull the parts of the interior that aren’t directly visible through the door. But cell-portal visibility is a bit tricky to set up properly, and its implementation in Panda is still a little rough.
There exist other kinds of visibility algorithms that attempt to make more automatic determinations of what is occluded or not, without requiring you to structure your scene into cells and portals. We have been experimenting with adding some of these algorithms to Panda, with varying degrees of success. Nothing’s ready for prime time yet.
You can also do other tricks, such as to put the interior under an LOD node, so that the actual interior will be visible only if you happen to be standing very near the door; if you are a bit further away, you can have the LOD swap in a lower-level model, which is really just a painted flat inside the building that looks just like the contents of your interior.
And, of course, if your doors are the sort that might be open or closed, you should have the application hide (or remove) the interior when the door is closed.
David