Feedback from the post on the subreddit VoxelGameDev was good, I'll definitely share this project there again once I get all the interface elements sorted. Inspired by some of the discussion there I've been working on improving the JSON savefile format.
Improving JSON savefile format
schematic.block = [ [0,1,0], [0,0,0], [1,0,1]
[1,1,1], [0,1,0], [1,1,1]
[0,1,0], [0,0,0], [1,0,1] ];
When a much more space efficient representation would be to omit the square brackets and note the dimensions elsewhere. Concatenating the block data into a string results in less than half the characters before:
schematic.block = "010000101111010111010000101"
Even better results can be obtained if the block data is compressed. Wanting the JSON savefiles to be human readable I decided run-length encoding would be easy to implement for me or anyone else who wished to parse the savefile:
schematic.runLengthEncodedBlock = "AB4ABA4BABA3BAB4BABA"
With a run of multiples of the same symbol being denoted by a number followed by the symbol.
(A = block 0, B = block 1). The size of the run-length encoded data depends on how varied a voxel schematic is but on average it is a quarter of the concatenated version. A quick check with zip file compression shows that it is *only* half the size of the run-length encoded version, not bad for a compression algorithm that is so easy to implement :D
A picture is worth a thousand words
Having a readable savefile format is great for metadata such as creator, creation date, colour palette and dimensions. It doesn't allow the user to quickly see what the schematic is off though. I have added the option to save the isometric render of the schematic. Which serves not only as a quick preview and easily shared image but also has the data to reconstruct the voxel schematic embedded in it! I believe the game Spore allowed people to share their creatures with such 'encoded' images, shame the game wasn't too compelling. Here's a preview of such an encoded image, can you tell where the schematic data is stored?