Sorry you had a bad day, but this is how Blender has worked since forever. If you want unused data blocks (not just materials) to stay in the .blend, you need to check the Fake User button for that item. Otherwise, they get purged when you save and reload.
Longer explanation:
Blender uses a network model database. Any particular data block can be shared by multiple data blocks. (think linked duplicates) In order to maintain referential integrity when deleting data blocks, it is necessary to walk the entire network. The easiest way to do this is the save/reload process.
You could always add a small Outliner window to your layout in Orphan Data mode that will dynamically show you everything thatâs not currently referenced (has no users).
Or just switch your Outliner into that mode before you save after doing a lot of work to double-check that youâre not going to lose anything important.
I know itâs not much help after the fact, and I agree that this is a poor design (to throw everything away rather than risk accumulating unneeded clutter).
I think this could use some elaboration since itâs not an intuitive feature. The Fake User button is a little clickable square that has the letter âFâ written on it and itâs found to the right of the text-field for both material and texture names. It starts off looking like the default theme color and becomes dark once itâs pressed.
When Materials were simpler things maybe it made sense to throw away all unreferenced ones at Save time, but now that complex nodal Materials can represent as much time investment as an Object Mesh, it seems like a misfeature to just throw them away without warning, and this is a painful lesson that every Blender user seems to have to learn the hard way and which can catch out even the most experienced user.
Objects are always considered worthy of preservation by virtue of always being part of (in 2.8 terminology) a Scene Master Collection, so maybe having a âMaster Material Collectionâ that maintains a link to every Material wouldnât be such a bad thing. You can still provide some way of identifying Materials without users, but the risk of cluttering up a .blend file with unneeded Materials seems substantially less than the constant risk of a loss of valuable work due to this obsolete behavior.
Not to mention that it would likely match the expected behavior for virtually every new user and the actual behavior of every other 3D application.
The current behavior remains one of the few remaining âsharp edgesâ that Blender has, and eventually it has to get changed one way or another.
IMO we donât âneedâ anymore such thing as automatically removing unused materials (on the user POV at least, maybe itâs needed under the hood).
Most of the time, people donât expect any data loss when saving a file. They expect a data to be gone only when they deliberately asked for it.
And in the meantime, when we want to delete such data, we canât do it in a simple & intuitive way.
In other softwares, if you want to delete something, you just select it and press Del or right-click â Delete. If itâs some important data, or if itâs used somewhere, there will be a warning prompt, sometimes even an option to choose a replacement data (like in unreal engine).
But in Blender, this doesnât exist. You have to find a place where the data has an X cross icon and Shift click that icon (how unintuitive is that ? And you canât do this for several data at once), or open the outliner, play with the display mode and spend your time on searching your data and managing it the hard way, still dealing with non-standard behaviors and denominations.
I donât know why Blender works that way. Iâm sure there is/was a reason.
If itâs technical, is there a way to get around those issues and obtain a more intuitive and intended behavior?
If itâs a decision of âhow blender should workâ that have been made before, I think it should be reconsidered with todayâs standards: people complain about this, no matter if they are new users or old timers. Itâs always a pain.
Iâm in favor of the way Blender handles this nowâŚ
But it seems like an option to enable Fake user by default (on certain types of data blocks) would make several people happy. I expect this shouldnât be too hard to implement as a add-on.