Starts the implementation of the chunk-based pixel storage system for
levels and drawings.
Previously the levels had a Pixels structure which was just an array of
X,Y and palette index triplets. The new chunk system divides the map up
into square chunks, and lets each chunk manage its own memory layout.
The "MapAccessor" layout is implemented first which is a map of X,Y
coordinates to their Swatches (pointer to an index of the palette). When
serialized the MapAccessor maps the "X,Y": "index" similarly to the old
Pixels array.
The object hierarchy for the chunk system is like:
* Chunker: the manager of the chunks who keeps track of the ChunkSize
and a map of "chunk coordinates" to the chunk in charge of it.
* Chunk: a part of the drawing ChunkSize length square. A chunk has a
Type (of how it stores its data, 0 being a map[Point]Swatch and 1
being a [][]Swatch 2D array), and the chunk has an Accessor which
implements the underlying type.
* Accessor: an interface for a Chunk to provide access to its
pixels.
* MapAccessor: a "sparse map" of coordinates to their Swatches.
* GridAccessor: TBD, will be a "dense" 2D grid of Swatches.
The JSON files are loaded in two passes:
1. The chunks only load their swatch indexes from disk.
2. With the palette also loaded, the chunks are "inflated" and linked
to their swatch pointers.
Misc changes:
* The `level.Canvas` UI widget switches from the old Grid data type to
being able to directly use a `level.Chunker`
* The Chunker is a shared data type between the on-disk level format and
the actual renderer (level.Canvas), so saving the level is easy
because you can just pull the Chunker out from the canvas.
* ChunkSize is stored inside the level file and the default value is at
balance/numbers.go: 1000
* Add ui.Window to easily create reusable windows with titles.
* Add a palette window (panel) to the right edge of the Edit Mode.
* Has Radio Buttons listing the colors available in the palette.
* Add palette support to Edit Mode so when you draw pixels, they take
on the color and attributes of the currently selected Swatch in your
palette.
* Revise the on-disk format to better serialize the Palette object to
JSON.
* Break Play Mode: collision detection fails because the Grid key
elements are now full Pixel objects (which retain their Palette and
Swatch properties).
* The Grid will need to be re-worked to separate X,Y coordinates from
the Pixel metadata to just test "is something there, and what is
it?"
Known bugs:
* The Pixel format in the Grid has DX and DY attributes and
it wreaks havoc on collision detection in Play Mode when you
come straight from the editor. Reloading the map from disk to
play is OK cuz it lacks these attrs.
First pass at a level storage format to save and restore maps.
To save a map: press F12. It takes a screenshot PNG into the
screenshots/ folder and outputs a map JSON in the working directory.
To restore a map: "go run cmd/doodle/main.go map.json"