This eliminates the need of the dialog having a rect_min_size, which lets users resize it to make it even smaller. The OK button is being hidden at the start, so visually it should look almost the same.
New speeds with this commit (approximately)
64x64: 0-1ms
1024x1024: 27ms
2048x2048: 73ms
4096x4096: 261ms
Old speeds before this commit (approximately)
64x64: 42ms
1024x1024: 5204ms
2048x2048: 20988ms
4096x4096: 83973ms
* hide accidentally visible dialog
* added new theme methods
* Wait for themes to add from api
* remove `find_theme`
* revert last commit
* Formatting
* Some code changes
* update to godot 3.5
* Use Image instead of BitMap for selection
Not complete and Pixelorama is currently broken
* Add a SelectionMap class
* Make the changes in Selection.gd
* Remove selection_bitmap
* Replace duplicate() with copy_from()
* Fix selection
Intersection and transforming are not working
* Fix wrong pixel color values
* Fix selection transforming
* Call selection_bitmap_changed() on scale
* Fix clipboard
* Remove bitmap_to_image()
* Rename selection_image to selection_map
* No errors in Magic Wand
* Rename selection_bitmap_changed() to selection_map_changed()
* Format
* Fix selection resizing
* Remove a line from image effects
* Fast selection inverting using shader
* Update SelectionMap.gd
* Format
* Convert SelectionMap back to LA8 after inverting
* Minor refactor in RectSelect.gd
* Fix intersections
* Use shader for ColorSelect and add color similarity option
* Update RotateImage.gd
* Load tilemask from current frame...
...instead of selecting from FileDialog
* Delete the FileDialog
* Added the reset button
every good loader needs a reset button, Cheers!!!
* Hide/Show options based on current tile option
* Changed a condition for tile mode
* Simplified tile detection code
* Priortize main tile as nearest if mouse is in it
* make tile mode draw behind canvas
* Changed a condition
* Tiles on top gets detected first...
...in case of overlap
* Only display relavant options
according to current mode
* Update preview according to..
..current mode
* removed print()
* Added tile masking
* Added tile masking
* Compare mask with project size
only masks with same size as project are accepted
* Formatting
* Added the suggestions
* Some minor modifications
* detect if a mask is loaded or not
* Added tile_mask to project
* Cosmetics
* added path detection
* added option to emit signal instead of loading...
... image directly through OpenSave
* Added a way to load mask for HTML5
* formatting
* formatting
* Formatting
* set proper way for saving tile_mask
* Formatting
* removed whitespace
* Added the pivot system
* Some re-arrangement
* a bug-fix
* fixed a conversion scale bug
The problem was the conversion from rect to pixel scale was not properly done, i changed it so that it sets conversion factor of shorter side according to the longer side
* Fix to allow manual pivoting
* remove an update()
i may have added it my self but i think its not needed now
* made shader pivot consistent with gd script
by doing `pivot + Vector2(0.5, 0.5)` for "Nearest neighbour (Shader)"
* Cosmetics
* Formatting
* more formatting
* an optimization
* add limit change with brush
* Delete Draw.gd
* Delete BaseTool.gd
* added error calculation
* revert last commit
* Implemented OS.clipboard (using var2str())
* some sanity checks
* formatting
* use text system instead of os clibboard
* Add preferences for tile mode basis vectors
Each tile is offset according to the x and y basis. For example, a tile (1,1) would be at basis_x + basis_y
* Update tools for custom tile modes
Show the indicator in the correct position, and only draw on the nearest tile.
* Fix style issues
* Move tile functionality to own class to prevent bloating Project
* Fix error in Tiles bounding box logic
* Make tile mode offsets project settings
Since the desired tile mode offsets depends on the tile being drawn, the tile mode offsets should be a project specific setting which is persisted in the project file.
* Update TileMode object immediately after closing dialog
* Don't draw center tile by default in TileMode
* Move tile mode offsets to view menu
* Move tile mode offsets dialog out of ImageEffects
* Refactored `draw_tool`
In draw.gd, efactored the `draw_tool(position)` function to memorize a
few preliminary steps that may be skipped on every pixel.
* Reformat
* Reformat
* Improved _set_pixel
Memorized a few results per-stroke rather than recomputing them on each
pixel.
* Refactor
* Improved draw_tool_circle
Memorized the shape of the circle as a vector of displacements from
the center to avoid recomputing the whole circle at every position.
* Refactor
* Reworked drat tool methods
I changed the implementations to use private functions that return the
array of points that would be affected by the tool. This way, when we
are drawing a stroke of a tool, we can get all points affected by the
stroke, filter out duplicates, and only set pixels once.
* refactor
These changes allow users to set the left (or right) mouse buttons as mapped shortcuts to the transform snap grid action, in order to automatically snap to grid while moving a selection.
Mapped to left and right mouse buttons respectively by default, as well was L1 and R1 buttons respectively in joypads. This commit should allow mouse-free drawing, since it's now possible to activate the left and right tools via joypad and keyboard buttons, thanks to the Keychain plugin.
Similar to GraphicsGale, you can now draw without moving the mouse. Although you still need the mouse for the left and right buttons, but I'd like to make give more options to the user as well so that they can activate tools using keyboard and joypad buttons, if they like.
The numpad arrow keys did nothing previously, so nothing changes for people who are not interested in this feature. They are also configurable thanks to the Keychain plugin.
* Start implementing the godot_better_input plugin
* Update ShortcutEdit.gd
* Load & save preset option
* Add some groups and fix action events not being deleted on load
* Add MenuInputAction class for multiple menu accelerators
* Create a proper plugin and a BetterInput autoload
* Update menu accelerators
* Move settings to BetterInput
* Move menu enums to Global, make more MenuInputActions
* Add more menu events
* Add new groups
* Optimize BetterInput _input() method
* Remove a lot of lines of code
* Change some previous events, add ignore actions and a View menu group
* Change update_item_accelerator to update_ui
* Move MenuInputAction initialization to BetterInput.gd
* Update hint tooltips when a shortcut changes
Temporarily comment out some code regarding the configurable modifiers
* Some MenuInputAction variable name changes
* Add handle_input() to InputAction
* Update the shortcuts of buttons
* Fix shortcut selector menu position
* Change plugin name into Keychain
* Fix keyboard input dialog exiting when Enter or Space is being pressed
* Add two more groups
* Make groups folded by default
* Temporarily make tool modifier shortcuts not configurable
A temporary change, they will be made configurable again, with different actions that are currently mapped to the same events, local/independent from each other.
* Add license for Keychain
* Fix issue where a key event would be added in other input types
* Fix bug where the assigned state was not updated when the dialog appeared again
* Update Main.tscn
* Add a disabled line edit in keyboard shortcut selector to grab focus
* Load presets in the Keychain autoload
This way, the input actions get updated from the start, instead of only at the ShortcutEdit scene.
WARNING, this currently causes crashes if the menu items have no shortcut binded to them.
* Move custom settings away from Keychain.gd
To keep it the same as the upstream plugin
* Change menu enum names
* Made action_get_first_key() more general
* Use arrays for menu items instead of dictionaries, fixes crash
* Move moveable panels to Window menu
* Format
* Optimize hint tooltip updating
* Add support for translations in Keychain
* Translation changes
* Made tool modifiers configurable
Needs more testing.
* Made camera arrow key movement configurable & joypad axis support
This commit removes the ability to press Shift and Control+Shift to adjust the camera arrow key movement speed. Instead, the speed depends on the zoom level.
The right joypad analog stick is configured to move the camera by default.
* Rename presets into shortcut profiles, use Resources and let users create their own
* [skip ci] Update addons README
* Update Global.gd
* add limit change with brush
* Delete Draw.gd
* Delete BaseTool.gd
* Some improvements
1) A Smarter Placement of "brushes_popup"
2) A Different Convention for image brushes (100 % instead of 1px)
* Formatting
* some more formatting
* add limit change with brush
* Delete Draw.gd
* Delete BaseTool.gd
* added error calculation
* revert last commit
* fixed rotation bug caused on some transparency
* fix for a bug
when selection was present
* added a comment
* added a fix when selection was enabled
* formating
* fixed another bug
* Added quick buttons for rotation
* Add 6 shader-based gradient types
* Shaders now respect selection
* Fix step gradient
* Remove comments
* Disable step and dithering shaders in Web version
* Fixed a weird bug with dithering shaders, selection and GLES2
Having a selection, applying a dithering gradient, removing the selection and then going to the gradient dialog again causes the dithering shaders to "remember" the previous selection, even if there is no selection currently. This only happens with the two dithering shaders and only with the GLES2 renderer. Removing `uniform sampler2D dither_texture;` from the shader code seems to fix the issue, but that's obviously isn't what we want so a "proper" fix is included in this commit.
* Format & lint
* Removed old gradient code
* Change how centers work on radial step and dithering
* Made angle, center and radius option a bit more clear
* Rename bayer-matrices directory to dither-matrices
* Use DitherMatrix class
* Create dithering types programmatically
* Remove unneeded code in shaders
* Rewrite the step shader without a for loop
More optimized and works on the Web version with GLES2
* Rewrite radial step and dithering shaders without for loop
Now all shaders work on the Web version and have been optimized.
* Fix Linear & Radial size range and remove some unneeded lines
* Added size uniform to Radial Step and Radial Dither
* Swap colors in the Linear gradient
* Make size a percentage
* Make the preview look the same as the result
Didn't change the dithering shaders because they seemed to give different results.
* Remove ratio uniform and divide uvs by the radius instead
This makes more sense because the smaller the number, the smaller the radius.
* Fix linear gradient
* Change Position to percentage and "Size" to "Transition size"
* Mix gradients with original color, if the gradient colors have transparency
* add limit change with brush
* Delete Draw.gd
* Delete BaseTool.gd
* Pivot correction in case of even size
* fix the Scale3x
it should not remove the edges now
* formatting
* more formatting
* add limit change with brush
* Delete Draw.gd
* Delete BaseTool.gd
* Added all shortcuts
* formatting
* Removed 1 shortcut from "Fullscreen"
* Assigned shortcuts to special behaviours
* formatting
* Added configurable shortcuts to special behaviour
* formatting
* Added special behaviour shortcuts and some code im
provements
* a minor fix
This results in both better and faster results. Unfortunately, the shader does not work in the Web version, so we have to rely on the old method for that platform.
* Removed some calls to can_pixel_get_drawn by
managing has_selection condition differently
* Refactored `_set_pixel` to shortcircuit.
This allowed shortcircuiting away some tests to speed up common code
paths.
* Further refactor of `_set_pixel`
Removed unused functions. Made conditions for pattern-fills clearer.
* Refactor.
* Refactor.
* Removed dev timers.
* add limit change with brush
* Delete Draw.gd
* Delete BaseTool.gd
* added more info about export conflict
* more info about export conflict
* Update Export.gd
* Update ExportDialog.tscn
* fixed a small mistake
* Implemented floodfill routine by Shawn Hargreaves
* Removed performance timers used for testing
* Reformatting file after setting "Trim Trailing
Whitespace On Save".
* Refactoring to respect code guidelines.
* More reformatting
* More refactoring
* Refactor: added # gdlint: ignore=max-line-length
to line the parser has me set to longer than 100 chars
* Manage selected areas
When exporting an imported image, the export will happen immediately, without having the export dialog appear, unless "Export as..." is selected. For .png imported images, the menu option will display "Overwrite" instead of "Export". This makes it clear that if Control + E is pressed on an imported png, that file will be overwritten.
Instead of LA8. This should result in slightly less memory usage and is more on par with Godot's BitMap "convert_to_image" method, which will be exposed in Godot 3.5.
In this line, a new texture is generated each time the canvas is updated it seems :
But it is mentionned in the documentation to use `void set_data(image: Image)` instead for slightly faster results, which updates the texture instead of creating a new one.
I hope that it is relevant !
Also, if it is approved, this change should be applied to everywhere it is used (except when initializing the texture)
* draw optimizer
* improvements
* some memory improvements
don't think this one's needed but doing it just in case...
* formatting
* add limit change with brush
* fixed a small bug
cache was being kept when frames were changed
* formatting
* change `_cache_limit` on changing `_brush_size`
* improvements to copy and delete methods
To allow cloning/deleting an array of frames
* formatting
* adapt to the new copy/delete methods
* Update AnimationTimeline.gd
* removed some bugs
* changed old tag behaviour
tags ahead get further by 1 frame on add_frame()
* modified tag behaviour
* formatting
* removed tag interaction
* sync import options (1/2)
* sync import options (2/2)
* resolve format check
* a minor improvement +
some code formatting
* some more formatting
* Some more formatting
...the checks becoming a pain...
* again you guessed it!
CODE FORMATTING
* used checkbutton instead of simple button
* formatting
This makes the initial app load time fast again, as it used to be before the tool logic changes. The code is uglier to read now but it's worth it.
Also optimize update_tool_cursors()
Might be useful for Extensions that add tools and for the future where we allow users more freedom with shortcut binding, including unbinding shortcuts.
Now when making a new tool we only have to set it up in Tools.gd, along with its button and cursor textures and its tool options scene. Previously, we also had to put it in ToolButtons.gd and manually create a button in Tools.tscn
Importing .pck or .zip Godot resource pack files into Pixelorama is now possible. This needs to be documented properly, but here's the basic idea, for now at least. This is super early work and I haven't tested it with a proper extension yet, so all of this could be a subject of change. I tested it with a custom theme extension though and it seems to be working perfectly.
Importing resource pack files, either by dragging and dropping them into the app window or by going to Edit>Preferences>Extensions>Add Extension, copies the files into user://extensions/. Extensions can be enabled/disabled and uninstalled. Uninstalling them deletes the resource pack files from user://extensions/.
The extension project source files need to be in a folder inside src/Extensions/ with the same name as the .pck or .zip file. **This is required for now, otherwise it will not work.** Inside that folder there also needs to be an extension.json file, with a structure similar to this:
{
"name": "ExtensionName",
"display_name": "Extension Name",
"description": "A Pixelorama extension",
"author": "Orama Interactive",
"version": "0.1",
"license": "MIT",
"nodes": [
"ExtensionExample.tscn"
]
}
The `nodes` array leads to the packed scene files with the nodes that are to be instantiated. **The root nodes of these scenes need to have the same name as the .tscn files they belong to.** The scripts of these nodes should have _enter_tree() and _exit_tree() methods to handle the extension enabling/disabling (or even uninstalling) logic. Note that .json files need to be included in the export options while exporting the extension from Godot.
Enabling an extension means that the scenes found in the extension.json's "nodes" array get instantiated, and disabling gets rid of these nodes from Pixelorama's SceneTree.
Use a Preference class instead of a nested array. Lines of code reduced from 461 to 330. Also fixed a minor bug in the Web version where, when the user changed language, "Interface" was being selected instead.