voxel: Merge top and side atlases into one

This simplifies the shader setup a bit and reduces memory consumption since top/side textures are now shared if they are the same
voxel: Simplify side/top loading

Allocate separate slots based on JSON structure instead of path equivalence
voxel: Add tiling parameters
voxel: Add a blocky material type
Improve the inactive window behavior

Process file changes before waiting for the window to activate
Sleep in an inactive state to consume less CPU
shaders: Implement fast detiling prototype

This requires an explicit three-point blending in FS (more interpolators), but eliminates the need for blending.
On platforms without GS we can generate the VB (unfortunately, it seems that vertex sharing is either impossible or just very hard with this model)
voxel: Initial material-centric generation

Material determines whether a cell has data now; occupancy is additionally used to determine how much data there is.
Note: per-vertex materials sometimes contain Air now (not intended)
voxel: Ensure correct vertex materials

For that we merge 8 materials within a cube into 1, which right now is performed in a hacky fashion
Fix UI to account for Air material
voxel: Simplify marching cubes implementation

Remove hierarchical generation (does not result in smooth output anyway), enable material and random seed support
voxel: Switch to unsigned distance functions

Surface intersection code in both meshers still behaved as if the isovalue is a signed distance function.
Since it is derived from occupancy, and occupancy is unsigned, adjust equations to make sense.
Also remove arbitrary isolevel from both meshers - to be replaced by 'inside' flag.
voxel: Use explicit 'inside' flag

Replace iso with inside + occupancy.
Usually only inside flag is required; occupancy can be preserved as a byte for as long as possible with this approach.
voxel: Marching cubes refactoring

Remove unnecessary local array, read the entire source region