If you are worried about optimization for this case, then any time the Irrlicht library declares an offset member pointer it should include the appropriate header. As you already know, Irrlicht does not use offset member pointers.It's chapter 6.8, member pointers. It's really an astonishing document.
First off, not true. In many cases the user of a class only needs the compiler to know the size of the object and its layout. They do not need definitions for all of the classes that can be used with that class type. Think about my example of the SMaterial structure. The user of the SMaterial almost _never_ needs to know the definition of ITexture. They assign the texture pointer that is returned from the video driver and that is it. Think about the IVideoDriver interface. Just because the user needs a definition for the abstract video driver class does not mean that they need [or even want] a definition for the IImageLoader or IImageWriter interfaces. I'd be willing to bet most applications don't directly access either of these interfaces at all.But esp. interface includes should contain all necessary headers because they either require them anyway due to inline implementations and because otherwise the enduser would be required to include additional headers anyway, at least in the majority of cases.
Also, isn't this what the Irrlicht.h header is for? It includes every one of the Irrlicht interface class headers.
Normally the interface class headers would use forward declarations and include the minimal headers required so that it will compile when included into an empty source file. Then a package or library header is made that includes all of those interface headers. If the library user cares about compile times, then they include only the necessary files to compile each source file. If they care only about ease of use, then they just include the library header. This gives the user the most flexibility.
By the way, I happened to work for a company that made professional C++ class libraries. I can remember specific instances where changing unnecessary includes to a forward declarations significantly reduced end user compile times. I don't mean 20 seconds, I mean hours.