Every button will have a texture based on its frame AND its layer. Which means, if the button is on layer 2 and frame 1, its texture will be the contents of frame 1's layer 2 contents.
Trying to merge layers into the timeline, and eventually add more features like "share layer with all frames", among others. THIS IS NOT FINISHED, IT WILL *NOT* WORK PROPERLY. Once it is finished, this branch will be merged onto master.
So far only add layer and add frame work, and even they may have some issues. Undoing also does not work properly yet.
The UI is also not finished, as it currently has problems with the scroll containers.
Instead of replacing the pixels with the new color's alpha value, the alpha values of the selected color and the current pixel color get blended together. This means that, if you have a pixel with 50% alpha and you draw a color over it with 25% alpha, the final result will have 75% alpha, instead of 25% as it used to be.
The pressure sensitivity is still experimental and may not work properly. Works only with Godot 3.2 and above.
draw_pixel() has also been renamed to draw_brush()
One bug was that rotxel was used at the end, no matter what algorithm was chosen.
The other was that rotxel was taking into account a image of width x width dimensions.
Canvas.gd's _input() method returns when the canvas' frame is not the currently selected frame. Saves a little bit of performance and fixes some issues like the line angles of ALL frames being drawn, and might fix some crashes I had with motion drawing and undo/redoing.
New option for the color picker tool (closes #115 - also includes new translatable strings), VSplitContainer for the tools and their options and a ScrollContainer for the tool options.
Filled Circle brush is just like the Circle brush, but filled. Issue is, when drawing while moving the mouse, some pixels remain unfilled.
Also added some more file brushes.
They're like File brushes, but each time you draw, expect to see something different!
To make a random brush, just put the images you want in the same folder (under the main Brushes folder of course), and make sure their filename starts with "%".
I also changed _process() to _input() in Canvas.gd, so there may be some unexpected behavior.
Also, in Canvas.gd's _draw() method, draw_set_transform() is called again after the circle brush drawings, to reset the transform to its default state.
The circle's radius is the brush's size. Respects image/selection boundaries, works with mirror. A special plot_circle() method is found on Global, to calculate the rectangles used by the mouse cursor/position indicator.
Added a slider under the layer add/remove/etc buttons that changes the currently selected layer's transparency. It gets saved in .png and .pxo files, while respecting non-opaque pixels in the image too. Which means, their alpha values aren't being overwritten.