Also fixes a bug with the inconsistent behavior caused by resizing a selection with gizmos without pressing Shift, while the keep ratio button was pressed.
For some reason, cel_texture.texture.get_data() seemed to cause a segmentation fault, and then a crash, when the image size was large. Also added some extra static typing to the drag and drop methods, but they are unrelated to the crash.
* Added intial crop tool
* [skip ci] Removed unneeeded LINE_WIDTH constant from CropRect
* Added DimensionsLabel
* Cleaned up CropRect._draw
* Hide the CropRect after switching to a different tool
* Sets the crop values to the entire canvas size on setup
* [skip ci] Added crop tool tooltip
* Made Crop tools synced with eachother by placing the crop settings on CropRect
* Added new modes, refactored, added rule of thirds lines and darkened background
* [skip ci] reset optimization
* Renames
* [skip ci] Tweaked the darkened background
* Fixed bug with top/bottom/left/right sliders after rect refactor
* Changing width/height on locked aspect ratio bug
* Aspect ratio sliders rounding/setting a min of 1 px height/width
* Fixed bugs with drawing the crop rect, especially with locked aspect ratio
* Save the mode to config_cache
* Added size lock and renamed mode
* Added tooltip for size lock. Not sure if I did the translation file right
* removed signal that wasn't used
* Formatting
* Removed old TODO comment from one of my previous PRs that isn't true anymore
* Fixed definition order for linter
* Changed locked size modes moving to offset by @Variable-ind, reordered methods
---------
Co-authored-by: MrTriPie <MrTriPie>
* Image bruch now obeys dynamics as well
* Added a signal that resets dynamics
* formatting
* change uncheck.png
* added preview for pressure
* Added the requested changes
* Code Improvements to Perspective editor
* formatting
* fixed a bug
* Some drastic changes
* Delete src/UI/Tools directory
* Delete src/UI/UI/PerspectiveEditor directory
* Some drastic changes
* i messed up so here's the fix
* Added easy movement and rotation
* formatting
* useless script
* fix some things and add tracker disabler
* formatting
* fix incorrect length on redo
* remove useless code
The previous method was not working for perspective guides rotated at 315 degrees, due to the test line being parallel to it. Thanks to Variable for the solution.
* Added Code for cursor snapping
* Added the Snap option
* typo
* Fix snapvector not updating properly
* formatting
* better snapping system
This makes the stroke snapping more accurate by preferring the snap point nearest to the cursor
* changed Snap mode to spacing
* Code Improvements
* more changes
* Update Pencil.gd
* formatting
* fix max line length
---------
Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
* Added Perspective Editor
* removed unintended changes
* Removed unintended changes
* removed un-intended changes
* Delete Axes.tscn
* Delete Axis.gd
* Removed MouseGuides from editor
I will add them separately
* Added MouseGuides
* Some changes
* Fixed some things
* added mouse guide
* make MouseGuides remember last setting
* don't move if dialog is open
* Dont move tracker guides if dialog is open
* UI improvement to editor
* Update VanishingPoint.gd
* UI Improvement
* Minor Color Improvements
* fixed a bug
This was causing a crash
* Some UI Changes
* Improve UI some more
* fix typo
* Added Undo/Redo and improved UI
* Formatting
* formatting
* formatting
* formatting
* Fix Definition out of order
* Fix Definition out of order
* formatting
* formatting
* fix Duplicate error
* Fix some things
* Some UI Changes
* Some code refinement
* Removed un-needed lines
* Some code refinement
* Some more UI Changes
* Changes, Changes and Changes
* Delete LineButton.gd
* Delete LineButton.tscn
* Delete PerspectiveEditor.gd
* Delete PerspectiveEditor.tscn
* Delete PointCollapseContainer.gd
* Delete PerspectiveLine.tscn
* Delete PerspectiveLine.gd
* Changed boundary separators to ColorRects
* make the guide update more frequently
* make default color have full alpha
* Dim the boundaries based on luminance
* typo
* Formatting
* Formatting
* formatting i forgot to do
* Delete VanishingPoint.gd
* Delete VanishingPoint.tscn
* Fixed rouge collapsible container
---------
Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Have only two shaders, one for simple gradient and the other for dithered gradient generation. The gradient shape gets passed as a uniform to the shader. Gradients can now get repeated, and the size option for linear gradients is back.
Gradients are no longer limited to two colors, but can now instead have as many as we want, with each color having its own offset. Step gradients have now been removed; to generate the same effect, you can now generate a linear gradient with constant interpolation. Cubic interpolation in gradients is now also possible.
The dithering shaders were by far the biggest challenge and they had to be re-written in order for them to support multiple colors, with each one having a difference offset. I have noticed that some colors may disappear when Constant interpolation is used, though, so it can be buggy sometimes. Thanks to https://godotshaders.com/shader/dither-gradient-shader/ for the reference.
ValueSliders are now also used in the gradient window.
Snap to the rectangular grid and guides (excluding symmetry guides). Can be toggled from the View menu. Currently affects the following tools: Pencil, Eraser, Shading, Line, all shape tool and all selection tools. Although maybe this should not affect the Magic Wand and Select By Color? The snapping distance is currently unaffected by the zoom (should change), and it will be exposed as a parameter in the preferences at a later commit.
This commit removes the unnecessary point_in_rectangle() method, as Rect2.has_point() can be used instead. I was not aware that this built-in method existed back then.
* Upgrade the brushes popup
* upgrade brushes popup
* Formatting
* fix name of 1st brush not written
* use grid container instead of vbox
and added categories
* Some UI Changes
* typo
* Fix autowrap
* fix node paths
* formatting
* more formatting
* more formatting
And hopefully the final commit
* sigh... more formatting
Prior to this commit, the transformation (moving/scaling content with selections) of only one of the selected cels would appear, and the rest would only have a visible effect on transformation confirm.
* Fix move tool preview (without selection)
* typo
* Dont snap if transformation hasn't started
* Added a can_layer_get_drawn() check
* Formatting
* remove useless line
* Formatting (Again cause i am DUMB)
* Formatting (Again cause i am DUMB)
* Better Code
This lets us create ValueSlider and CollapsibleContainer nodes properly via the add node button, instead of instancing their scenes. They have also become more a bit more themeable. Eventually, ValueSlider.tscn and CollapsibleContainer.tscn will be deleted.
* Added Class System to Api
* formatting
* removed extends
* update extension version
* Added Some New Fail-Safes
* fix typo
* Formatting
* Update ExtensionsAPI.gd
* Typo
* formatting
* formatting
* Moved Reference Images to it's Folder
* Moved the rest to their respective folders
* formatting
* Fix formatting
I removed the `PackedScene` static typing declaration to reduce the number of characters in the line to less than 100. It's not really needed anyway, as Godot should be able to figure out that it's a PackedScene, since it's a tscn file, simply by using `:=`.
* reverting some changes
* Removed some un-expected things
* Fixed TransparentChecker Code
* fix typo
* Revert it
I didn't realize it was intended
* Removed unneded changes
* removed some unexpected changes
Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
* Api Improvements
Proper Removal of Tools
A new `get_current_cel_info()` method
* a new show_error() method
usefull for displaying messages like "Incompatible API" etc...
* typo
* formatting
* added an improvement
Otherwise we would have to connect the signal for every opened project. If a feature/extension requires it, we could add a reference to the project as a parameter for the cel_changed signal, but since that can get retrieved with Global.current_project, it's probably not needed.
Using a signal to change the cel was not a good idea, because it was not being emitted with the undo/redo system. The signal should also fire *after* the cel changes, and this is what happens in this commit. Should be useful for future features and extensions to check whether a cel has been changed.
A small refactor. A very minor performance boost when selecting cels, but also a minor performance decrease when selecting frame buttons. Selecting layer buttons should be pretty much the same. I think the code should be a bit more readable now, plus we got rid of that yield() in Project.gd so that's a bonus.
* Allow floating point for HRuler
* Allow floating point for VRuler
* Formatting
* Format again
Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
* Fix a typo
this is required because this is "Paint" Selection
(so it's not supposed to cancel selection if we click outside the canvas)
* Added Selction Modes
Default, Add, Subtract, Intersect
* removed whitespace
* better options
* Removed Separators from headers
* formatting
* more formatting that i didnt notice
* Solved Shortcut conflict
* remove whitespace
* Implement clear4x rotation
* Don't use pixelated uvs on the final result, only on the preview, and fix pivot positioning
* Update to cleanEdge algorithm
* Add cleanEdge scaling
* APNG loader: Import addon to take over APNG handling
* APNG loader: Transition code to using the AImgIO addon
* APNG loader: Can now open APNGs.
* AImgIO: Update to fix bugs
* APNG loader: HTML5
* APNG loader: gdformat/gdlint addon
* APNG loader: OpenSave formatting fix
* APNG Loader: Add ignore line to OpenSave because it's too big
* Fix GIFAnimationExporter bug caused by the switch to the addon
Removed `directory_path`, `file_name`, `file_format` and `was_exported` from Export.gd. These variables already exist on Project.gd, no need to have them twice.
* Tool shortcuts should ignore macOS Command modifier.
This prevents common shortcuts like CMD+S (Save), CMD+C (Copy), etc, from activating a tool.
* Fix formatting
Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Users can now change from GLES2 to GLES3 and vice versa. The change requires a restart of Pixelorama to take effect. Does not have any effect if Pixelorama is being run from the Godot editor. I suppose we should add logic that detects if GLES3 is even supported in the first place in that device before allowing it as an option, but at least I enabled GLES2 fallback in the project settings, so it *should* fall back to GLES2.
* Remove animation tab from the export dialog, unify it with the first tab
* Tidy up the UI using GridContainers
* Make ExportDialog a ConfirmationDialog and clean some code
* Make project a parameter in export methods
This will be useful in the future for exporting multiple projects at once via terminal arguments
* Add a layers option in the export dialog
Currently only visible layers and selected layers, need to add specific layer selection and handle group blending properly.
* Align everything to the left
* Change "directory" into "folder"
* Make animation direction affect spritesheets and multiple png exporting
Besides just gifs and apngs
* Minor code re-organization
* Keep spritesheet options when changing tab
* Use the Unicode multiplication sign in the dimension label
* Specific layer exporting with group blending support
* Change file format cursor mode to pointing hand instead of forbidden
* Add a new custom CollapsibleContainer node and use it for advanced settings in the export dialog
* Change Popups node into Control so its children will automatically inherit the theme
* Add the TextureRect of the CollapsibleContainer in the UIButtons group
* Update ExportDialog.gd
* Disable "Create new folder for each frame tag" when gif/apng is selected, and hide it completely on the spritesheet tab
* Fix "Create new folder for each frame tag" being visible even if the CollapsibleContainer's button is not pressed
* Show layer path for each layer in the export dialog's "Layers" option
* Update translations
* Update strings
* APNG: Initial refactorings of animation exporter internals
* APNG: Make ExportDialog actually able to handle multiple file formats
* APNG: Bugfix to FPS hint and such
* APNG: Refactoring: Fix file format propagation
* APNG: Make an "APNG exporter" which creates an empty PNG container
This was the testbed of the previous integration commits.
* APNG: The actual exporter!
* APNG: Remove random src/Main.tscn changes
* APNG: Format/lint
* APNG: Format & Lint, part II
OpenSave.handle_loading_files() has been renamed to OpenSave.handle_loading_file and it now takes a single string as a parameter, instead of a PoolStringArray. This was needed for Main.gd's new _handle_cmdline_arguments() method. This method does not add any new functionality for now, but it will in the future.
* Fixed link cel indicator color and animation tags position
* New scrolling and min size
* fixed dockable container for the timeline min size
* Cleanup
* Tweaked minimum size
* Removed some hacks that are no longer needed
* Fixed frame scrollbar not being in the right place at startup, added ensure_control_visible
* frame scroll horziontally without shift if can't scroll vertically + min size tweaks
* Renamed the frames/layer/cel containers
* Always scroll by whole frames
* Fixed conflict
* reoranized AnimationTimeline scene's node tree to wrok as expected
* tweaks
* Fixed tag position and removed uneeded layer button theme code
* added the icon theme code back, I thought this was for the timeline XD
* Smaller LayerButtons
* Save Layer and Cel size between sessions
* Combined _on_AddLayer_pressed and _on_AddGroup_pressed into 1 add_layer method
* Rename scroll container
* formatting
Co-authored-by: MrTriPie <MrTriPie>
* Implemented except for clone layer bug
* more asserts
* Fixed the layer cloning bug
* gdformat
* Fixed new cels linked crash
* Fixed old .pxo files
* Removed default red color from LinkedIndicator in PixelCelButton scene
Co-authored-by: MrTriPie <MrTriPie>
* Updated PixelLayerButton's LinkButton's hint_tooltip to be more accurate
* Don't automatically link the current frame's cel when enabling new_cels_linked on a layer
* Mostly added new system
* renamed link group to link set
* Enable drag and drop of linked cels on the same layer
* formatted CelButton.gd
* serialize/deserialize
* Copy frames w/ new linked cels system. Removed copy_cel from layer classes
* Removed commented out code from AnimationTimeline.copy_frames
* Removed Project.duplicate_layers
* Removed unlink_cel in favour of using null with link cel (as the first part of that method was the same)
* Disabled show_behind_parent on PixelCelButton's LinkedIndicator, as it wasn't enough to improve visibility of selection
* Moved BaseLayer.copy out of the Methods to Override section
* Added optional texture param to Cel's set_content method (needed for use when deserializing, and otherwise helpful
* set textures with set_content where needed
* open_image_as_spritesheet_layer new_cels_linked part updated
* clone layer with linked cels implemented. Removed copy_all_cels from layer classes
* weaked how copied layers names are updated
* Merge layers works with new linked cels now
* Fixed texture on cel buttons not being updated on button setup
* fixed bug where using set_content with new image texture would result in an empty texture
* Open old .pxo with new linked cels
* simplified backwards compatiblity
* removed linked_cels
* better linked cels backwards compatibility
* Removed some old TODO comments
* fixed linked_cels conversion bug when linked_cels is empty
* Added undo for linking the previous cel when creating new cels with new_cels_linked enabled
* Removed TODOs
* Cleaned up some method variable naming
* Cleaned up deserialization
* combined matching for loops
* Inlined BaseLayer.copy() where its used
* gdformat
* Fixed Translations,pot
Co-authored-by: MrTriPie <MrTriPie>
If you press and hold an arrow button, the value will keep changing until you release. Replicates SpinBox's behavior. We should be able to replace any SpinBox now without losing any functionality.
Their visibility is toggleable. They also currently do not support echo events, since for some reason Godot only supports them for InputEventKey(s). I suppose this feature could be replicated with a Timer. Once this is done, we can replace all SpinBox nodes.
When saving a pxo and a file of the same name already exists, the new file gets a temporary name (.pxo1 extension), and it gets renamed to its proper name if it's saved successfully (Pixelorama doesn't crash)
* Save changed color to palette file only when color dialog is closed
* Restructure palette panel to use unique names
* Make grid size reactive to palette panel size
* Add mouse wheel scroll support to palette grid
* Add palette swatch resizing
* Reorganize palette grid rendering
* Store swatch size in cache config
* Cleanup formatting
Prevents errors (and potentially unwanted behavior) if attempting to undo while in the middle of drawing with the Pencil, Eraser of Shading tools. Needs more testing in case I broke something else.
Previously it was possible to hold the right mouse button while the left was being held, then release the left and once the right button is released, the right tool would get activated. This commit ensures that the right tool gets activated only on first press of the right mouse button, if the left isn't already activated.
* Fixed issues with Shading tool Saturation and Value not always being right in Hue Shading mode
* Shading tool hue shifting fixes and tweaks
* Bringing over changes from layer groups brach, without any changes to layer blending
* Some quick fixes to make it work again
* Fixed some of the places where GroupLayers cause errors. Cel Buttons are now hidden when groups are collapsed
* Layer drag highlighting (need to actually drop them correctly, also need to do cels)
* Added more layer hierarchy related functions, organized the function order in the Layer classes a bit
* Switched the layer type changing from string to int
* Moved layer type enum to Global
* Added get_layer_type_name(), currently used for the default layer name
* Renamed the layer get_children/is_a_parent_of functions
* changed get_layer_type_name() to get_default_name(number)
* New layer drag and dropping behavior
* Added read/write_image_data_from/to_pxo functions to Cel classes to handle saving/loading the binary image data for each cel type
* Fixed warning
* Added a line to child layers wich makes it easier to see where they are in the hierarchy
* Fixed debugger warning
* Fixed all cel types loading as PixelCels
* Fixed spacing issue with cels when collapsing groups
* Fixed bug when dropping a child layer to the bottom region of its parent group, where it would end up to far down (maybe disappearing)
* updated temporary todo comments
* Created a base scene for layer buttons and merged layer button script into one
* Prevent the case of parenting to itself in layer drag and drop, fixed static reference to LayerButton still being BaseLayerButton
* Use a base scene for CelButtons
* First bit of the refactoring work
* Several bits of refactoring
* Fixed moving cels
* Cleaned up Project.move_cel function
* Fixed project_layer_removed
* Updated change_frame_order on FrameButton. Some (not all) work on getting the layer UI updated when pressing buttons such as collapse/visible/lock
* Bug fixes. Updating layer button's buttons
* Fixed timeline selection issues when creating a new project. Some code cleanup
* tweaks
* Removed a bunch of commented out code
* Removing more commented out code
* Fixed bugs with timeline selectio. Fixed cels being placed in the reverse layer order when adding a frame
* Changed add/remove_frame to add/remove_frames (multiple support)
* Refactored copy_frames in animation timeline
* added copy function to cel classes
* added layer copy function
* simplifed copy_frames a tiny bit
* Updated TODO comments to categorize them and remove any that were already done
* Turned Project.add/remove_layer into Project.add/remove_layers (multiple support), not yet tested
* Seperated the layer cloning functionality in timeline's add_layer to its own function, since they're only used by one button, renamed to _on_Button_pressed naming scheme, added children support to the delete layer button
* some TODOs
* Added layer swapping
* Added priorities to refactor TODOs
* Simplified layer swapping code a little
* Fixed performance regression on changing project, updated TODOs
* Included _on_MergeDownLayer_pressed in timeline refactor
* Cleaned up _on_MergeDownLayer_pressed refactor
* If all frames are selected, prevent being able to remove all of them
* Fixed cel linking when cloning layers/frames. Moved the copy function from cel classes to layer classes, splitting into copy_cel and copy_all_cels
* Combined and rewrote the 2 project _toggle_layer_buttons_.. functions into 1 simpler _toggle_layer_buttons function
* Simplified _toggle_layer_buttons some more
* Added hierarchy support for move up/down layer buttons
* Added toggle_frame_buttons method to project (extracted from _frame_changed). Called from main when setting up startup project. Removed _ from start of _toggle_layer_buttons name
* Fixed duplicate_layers parent references being to the original layers
* cleaned up project.move_layers method a bit
* TODOs
* moved the transform_content_confirm calls for the layer buttons in AnimationTimeline (Add/remove/clone) to the project layer modification functions
* animation first/last_frame tweaks and un-press play buttons when the first/last_frame are the same in _on_AnimationTimer_timeout in AnimationTimeline
* Cleaned up project_changed in ANimationTimeline a bit
* Cleaned up project_layer_added in AnimationTimeline
* Changed Layer classes get_default_name to set_name_to_default
* Cleaned up LayerButton.drop_data slightly
* Looked at some of my TODOs
* cleaned up copying cels
* Fixed CelButton linked_indicator not showing up right away when becoming linked
* Cleand up link/unlink cel menu option a little. Fixed situatoin where trying to call button_setup on cel_button that doesn't exist anymore due to undo/redo
* Fixed regression with copy_cel (linked) in when cloning a frame
* Minor cleanup, more detailed comments, updated TODOs
* more improved comments
* Made focus_mode on Cel/Layer/FrameButton NONE to fix bug where it looks like one is selected after pressing it and adding a new Layer/Frame (but its just in the focus state, not the pressed state
* Made AnimationTimeline.change_layer_order work a little more consistantly with LayerButton.drop_data, and fixed a minor bug in it
* Updated comments and TODOs
* cleanup
* removed some code that should no longer be needed
* updated comment
* removed Project's frames and layers setters _frames_changed and _layers_changed
* Made some 'for x in range(array.size())' just 'for x in array.size()'
* updated comments/TODOs
* Cel content changes intial
* Added 'content' methods to Cel classes
* Removed image var from PixelCelButton
* Reusing PixelCelButton.gd on GroupCelButton scene
* Renamed PixelCelButton.gd to CelButton.gd (as it will be used for all Cel Buttons) and deleted GroupCelButton.gd
* Hide the TransparentChecker on GroupCelButton.tscn until a preview texture is added for GroupCels
* TODOs, prevent memory leak when closing projects
* Link/unlink cel cleanup
:
* Added _project param to _init methods of Layer classes
* Added update_texture method to Cel classes (moving part from the update_texture and update_selected_cels_textures methods from Canvas.gd
* Removed a temporary check (which also fixed another bug)
* Clone child layers when cloning a layer
* Added temp dummy get_image method to GroupCel, and use get_image when copying or picking colors
* TODOs
* Made open_image_as_spritesheet_layer work after the timeline refactor (still doesn't work with groups yet though). TODO comment updates
* Added create_new_cel methods to Layer classes
* Updated TODOs and comments
* Renamed Layer class's create_empty_cel to new_empty_cel to match Project's new_emtpy_frame
* Renamed create_layer/cel_button to instantiate_layer/cel_button
* updated TODOs
* prioritized TODOs
* Fixed some warnings
* removed commented out code from previous commit
* Fixed export
* Made open_image_as_new_frame work after timeline refactor
* Fixed open_image_as_new_layer after timeline refactor
* Some linked cel fixes
* More linked cels fixes
* cleanup
* Optimized importing spreadsheet as new layer
* Fixed Scale Image crash with Groups
* Fixed onion skin with groups
* Removed blend_mode from BaseLayer for now
* Mostly fixed image effects
* Fixed resize canvas
* Fixed drag and drop not working with Cel Buttons on Group Layers
* updated TODOs
* Renamed Replace Frame (in open image) to Replace Cel
* Continued renaming Replace Frame to Replace Cel
* Made open_image_at_cels work after timeline refactor
* Added get_layer_path method to BaseLayer
* Replaced AtLayerSpinbox with AtLayerOption for Open Image as New Frame or Replace Cel
* Updated TODOs
* updated TODOs
* Comments for cel content methods
* fixed right clicking group cel button deselecting the button (even though cel is still selected
* frame/layer modification methods comments
* Removed unneeded size flags
* TODO updates
* Removed a loop that would never run from open_image_as_spritesheet_tab
* TODO update
* Combined BaseLayer.get_children_direct and get_children_recursive into a single get_children method with a bool for recursive. Added a get_child_count method
* Removed unneeded frame paramaters from _on_DeleteFrame_pressed and _on_CopyFrame_pressed
* TODO Updates
* Removed unneeded code from delete_frames
* Made delete_frames variable names more consistent with my other changes
* Continuation
* made variable names in copy_frames more consistent with rest of changes
* Update TODOs
* Removed TODOs for after this PR (moved to my notes)
* Fixed crash when pasting image on Group
* Fixed layer .visible check to be is_visible_in_hierarchy()
* Removed some drag highlight polish code that didn't work
* Removed code from Canvas update_texture and update_selected_cels_textures that was redundant
* gdformat
* gdformat
* gdlint fixes
* Fixed Cel button not having its linked indicator show when enabling new cels linked on a layer other than the current layer
* Fixed crop image and centralize image
* Added '# gdlint: ignore=max-public-methods' to the top of Project'
* Fixed dragging cels to layer of different type crash
* Formatted CelButton.gd
Co-authored-by: MrTriPie <MrTriPie>
Before this commit, if Pixelorama started in a language other than English and then the user switched languages, the Close button's string would remain translated in the previous language
Also fix issue with similar area and color fill where if the selected color is the same as the pixel's color in mouse position, the operation stops even if there are other cels selected.
Paste now places the pasted content in the middle of the canvas view, instead of its original position. A new option in the Edit menu has been added, "Paste in Place", that preserves the previous behavior. This is similar to how GIMP works.
The same ellipse algorithm will be used for the circular brushes, as I can't seem to make the current circle algorithm work with even-numbered diameters.
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.
* Get same color pixels shader (#2)
* Replace same color pixels bucket code with a shader
* Add pattern fill
Co-authored-by: novhack <42614907+novhack@users.noreply.github.com>
* formatting
* some minor changes and fixed a bug
* added similarity feature
* formatting
* Update Bucket.gd
* added similarity feature in shader
Co-authored-by: novhack <42614907+novhack@users.noreply.github.com>
* ShaderVision Funcionality
* reference to ShaderVision
* Greyscale shader
* A minor code improvement
* decided on a checkbox
* decided on a checkbox
i foresaw the earlier implementation isn't required so i decided on a checkbox
* removed unneeded code
* reverted a mistake commit
* Update TopMenuContainer.gd
* Precieved Brightness
Changes "Indicators" to "Cursors" and adds options that let the user use the native mouse cursors of the OS and toggle the cross cursor on or off for the canvas
This fixes the issue with the timeline UI nodes affecting the rest of the panels if the timeline becomes too small. Kind of an ugly fix because there can now be two scrollbars visible if there are many frames, eventually we may need to redesign the timeline.
* Some Popup changes and added self awareness
start/end is automatically determined by selected cels boundary
* Update FrameTagDialog.gd
* some more code formatting
* added a node path
* removed a line that's not needed
* added shader transparency "illusion"
before it "Alternate transparent background" was used.
* code formatting
* shader for ui transparency
* some more formatting
* more formatting...
* Add dockable container plugin
Experimenting with it, also added a tabs_visible property to the DockableContainer. Removed some code about Tallscreen from Main.gd, but not all of it.
* Add a panel behind the UI, temporarily restore the dark theme
* Remove tallscreen code
* Add edit mode, toggles DockableContainer's tab visibility on and off
* Split tool options into color pickers, left and right tool options
* Remove alternate_transparent_background
* Re-order tool buttons on resize
* Clip content in timeline
* Changes to the tool panel
* Removed some old unused node variables
* Restore Zen mode
* Set tabs_visible = false by default
* Better way to set tabs_visible = false by default
* Added the license of godot-dockable-container
* Remove unneeded lines
* Update README.md
* Restore window transparency with the canvas
It makes all of the TabContainers transparent however, which may not be what we actually want.
* Change tab names of the UI elements
* Remove unneeded nodes from ColorPickers.tscn
* Update default.tres
* Let the user hide elements individually
* Add some checks in HandleThemes
* Center tool icons
* Remove unneeded custom panel in SplashDialog
* Bump version to v0.10-dev and some other minor changes
* Fix crash on Zen Mode
* Added a hacky way to fix the issue with the palette panel size
* Fixed issues with Shading tool Saturation and Value not always being right in Hue Shading mode
* Shading tool hue shifting fixes and tweaks
* Duplicate shader resource before modifying its code
* added line before comment
Co-authored-by: MrTriPie <MrTriPie>
* Drastically changed an old func()
"open_image_as_spritesheet_layer" (Hope i didn't break anything...)
* removed whitespace
* some minor changes
spritesheet "Start frame" no longer restricted to existing frames number
and a minor UI change
* solved some format errors
Removed the "frame_container" property from Layer.gd, which used to hold a reference to a node, leading to orphan nodes being created and never freed. Memory management seems to be working okay now. Previously, every time the user made a change, memory kept going up and never coming down. Now, data that can never be recovered, like undo data that have been rewritten in history, are also removed from memory.
Now inherits from ImageEffect and uses a ShaderImageEffect to generate the image. We get to clear duplicate code that was shared between ShaderEffect.gd and ShaderImageEffect.gd this way, and it also uses the undo/redo logic from ImageEffect instead of Canvas.gd.
As a way to differentiate between public and private methods, as per the official GDScript naming convention. Haven't changed all of the codebase yet, just some scripts that had a lot of public methods. This fixed 4 of the 7 errors of the linter.
* better onion part (1/3)
changed code and added scripts
* better onion part (2/3)
added some onion variables
* better onion part (3/3)
Added to onion dialog
* removed whitespace that gave static error
* gdformat .
* Lint code - Part 1
* Format code - Part 2
* Lint code - Part 2
Trying to fix the max allowed line length errors
* Add normal_map_invert_y to the image .import files
Because of Godot 3.4
* Do not call private methods outside of the script's scope
Lint code - Part 3
* Format code - Part 3
* Fixed more line length exceeded errors - Lint code Part 3
* Export array of licenses - Lint code part 4
* Clean hint_tooltip code from Global
Removes a lot of lines of code
* Create static-checks.yml
* Fix FreeType's license
The idea is to make the project less dependant on Global. Global should strictly be used for reusable code in multiple places, not as a second Main. I just hope I'm not breaking anything during this process.
* Symmetry guide color work
* Changed to semi-transparent guides from red, blend slight blue into symmetry guides for variation
Co-authored-by: MrTriPie <MrTriPie>
* Animation tag fix (a)
fixed tag behavior in "Project.gd"
* Animation tag fix (b)
fixed tag behavior in "AnimationTimeline.gd"
* Animation tag fix (c)
fix top part of line not visible
* Animation tag fix (d)
a fix i forgot about earlier
* added a randomizer...
... to auto select colors of new tags
* Fix Tag scrolling without cels when scrolled on it
* removed randomize() cause it's not needed
* Open/Save Sprite Dialogs now have their directory cached so when reopening Pixelorama they will be set to that directory. Load last project and load recent project also syncs with the open/save dialogs and caches that directory
* Sets a projects default file path to the cached file directory (not sure about) and if the export directory is blank, use the cached file directory
* Changed 'file_dialog_dir' to 'current_dir'
Co-authored-by: MrTriPie <MrTriPie>
This lets the user change the strength of the tool. When it has an opacity of 255, the eraser will completely delete the underlying pixels. If it has less than 255, it will simply subtruct that value from the underlying pixel's alpha.
* Add support for creating Ubuntu Touch click packages.
The clickable directory contains the files necessary to create a
click package designed for Ubuntu Touch, a community-driven Linux
distro for mobile phones as an alternative to iOS and Android.
A new CI script has been added to create the packages, which is
copied over from one of my other projects. Please change this to
suit your needs.
A new custom feature "clickable" has been added to the project
settings to allow customizations for the Ubuntu Touch platform.
Signed-off-by: Marquis Kurt <software@marquiskurt.net>
* Make clickable CI follow more closely to desktop builds
* Remove sudo from clickable install step
* Install software-properties-common
* Comment out docker startups in click install
* Change export name for Click version
* Change name and export mode to pack only
* Change means of copying data to clickable dir
* Install sudo to docker
* Add -g to docker add user
* Remove docker user creation
* Remove other chpasswd stuff
* Split CI into two jobs
* Make build-ubports.sh runnable
* Use HiPDI GUI theme on Clickable
* Move clickable folder to Misc, add release CI targets
* Add mobile to clickable settings
* Add pixelorama_data to install data
* Create pixelorama_data subdir in click itself
* Change default save dir for clickable
* Update AppArmor policy
* Update clickable version to test AppArmor
* Revert changes and use user data dir
* Add README pertaining to Ubuntu Touch
* Remove GODOT_MAC_VERSION from UT port workflow
Co-authored-by: Manolis Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
* Added a timer to filter out useless values
This timer will determine if you actually want to view these changes or just want to skip ahead
* a live preview checkbox
* Some dialog improvements
* Minor changes/adjustments
* Fix for multiple cel selection issue
Now it will only apply selection to the selected cels that are **visible and unlocked**
* Fix for loss of selection data
This will hopefully fix the selection data loss on toggling layer buttons
* Fixed issues with Shading tool Saturation and Value not always being right in Hue Shading mode
* Shading tool hue shifting fixes and tweaks
Co-authored-by: MrTriPie <MrTriPie>
* Tweak right side panels to use less empty space
* Add fake grabber to tools panel. Add a bottom margin. Fix a few issues with resizing.
* Fix tallscreen mode. Set a bit smaller animation timeline min height.
* Change Preferences visibility settings
* Update Main.tscn
* Fix crash when changing to tallscreen and then switching themes
Co-authored-by: Manolis Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Not sure if this actually solves the issue or just makes it more rare, but I haven't been able to reproduce any PoolVector locking issues so far. The problem was that images were remained locked essentially all the time, which seemed to cause issues. Maybe other PoolVectors could not get locked?
Does not work with rotation. It might be a good idea to replace this whole system with one that uses a transformation matrix, to handle rotation and skewing more easily in the future. I'm not a huge fan of this current code.
* Set project name. Also fixed a bug
Added ability to set project name also fixed a bug that "if the aspect ratio button is pressed and a template of different width and height were selected, then the button also applied on them e.g a template of (but it shouldn't)"
Example: write 1 in width, 2 in height, enable aspect ratio, and then try to change template... a template of 256x240 will give 120x240
* Add files via upload
* Adjust save name to project name
* Add files via upload
Not sure if that single if statement counts as branching code, but it's generally a good idea to avoid if statements in shader code, so I used step instead.
Cursor icon is temporary. It works by clicking multiple times on the places you want to create edges, and to complete the polygon you either have to click at the first edge (if you hover the mouse, a circle appears in that position), or you can auto-fill by double clicking.
Basically, when the background color of the screen at certain points is dark, the preview at that spot is white, and when it is bright, the preview is white at that spot. This helps to keep the previews always distinguishable, regardless of the background color.
Icons most likely temporary. A bit problematic when the selection is in negative coords and the preview does not work well with mirroring and mirror view. Same is true for the shape tools.
Related to the PoolVectorArray locking issue (#331). This still doesn't fix the issue itself, but at least Pixelorama does not crash anymore. It is still possible, though, to fail to load a guide when opening a project. Opening it again may solve the issue.
* a minor visibility change.
made the nodes that were not needed in wide-screen "Invicible"
the visibility will now be controlled procedurally
* Added some lines of code in "change_ui_layout()"
The added lines will control node visibility changes to adjust to current screen mode
* added a line to fix tall-screen "zen-mode"
Moves selection with contents by default.
Control + arrow keys = Moves & snaps selection to grid.
Alt + arrow keys = Moves the selection itself without the contents.
Works similar to the rectangle & ellipse drawing tools. Shift for 1:1, Ctrl for expanding from center.
Shift + mouse click = add to selection
Ctrl + mouse click = subtract from selection
Mouse click + Shift = Create a 1:1 (square) selection
Mouse click + Ctrl = Create a selection that expands from center
Mouse click + Shift + Ctrl = Create a 1:1 (square) selection that expands from center
A combination like Shift + Mouse Click + Shift will add to selection while also making a 1:1 selection
When the user clicks on a pixel, all pixels of the same color are being selected. Shift adds to the selection, Ctrl subtracts. The icon and the hint tooltip are temporary.
Instead of having a gazillion icons for each tool and its blue-orange variations, which led us to create 4 different textures for each tool, now we only need one texture for each tool and each theme. The blue-orange background has been made into a different TextureRect for each button.
This makes it easier for people to create new tools. Now, each new tool requires 3 textures (to cover every theme), instead of 12(!). I'm hoping to bring the number down to 1 in a future commit, by automating the theme color converting process.
The MarchingAntsOutline was failing to compile on the Web platform due to the for loop not having constant expressions inside the shader. "Loop index cannot be initialized with non-constant expression"
* Basic move tool
* Added marching ants effect on the selection borders
* Rename SelectionRectangle to SelectionShape, make it have non-rectangular shape and multiple SelectionShapes can exist
- Create multiple selection rectangles
- Merge them together if they intersect
- Move the selections (without contents as of right now)
- Gizmos are being drawn but they are not functional yet
Code is very ugly.
* Sort vectors counter-clockwise to be used as polygon borders
I did this, no idea if it works properly, probably won't be used but I thought I'd keep it saved somewhere
* More experiments I may or may not need
Trying to generate a polygon from the individual selected pixels
* Change default rectangle select behavior and ability to clip polygons using Control
* Fix rectangle selection clipping
* Split polygon into two with selection subtracting
* Move selection with contents with the move tool
Code is still a mess, don't bother looking.
* Move some methods from SelectionShape.gd to Selection.gd
The purpose of this is to generalize some selection code, so that it applies to all polygons, the entire selection. More will follow.
* UndoRedo for border moving
Nothing else in the selections system works properly in UndoRedo right now. Needs:
- UR support for creating selections
- UR support for modifying selections (merging and cutting selections together)
- UR support for removing selection
- UR support for moving content
& for all the rest of the remaining features
* Moving all of the selection shape logic to Selection.gd
Handle all of the polygons there instead of having them as individual nodes. Should be easier to handle undo/redo this way. This commit probably breaks move tool + selection tool and undo/redo. Code is still a mess. For your sanity, I hope you are not reading this. I promise I will clean up.
* Move tool works again
Buggy and messy, of course.
* Remove unneeded code and restore selection move undoredo logic
* Made Selection.gd have one big preview_image for when moving content, instead of each polygon having its own image
Could be further optimized for some specific cases. We could also remove selected_pixels from SelectionPolygon.
* UndoRedo support for creating, deleting, merging and clipping selections
UndoRedo support for moving content not added in this commit. Should work but needs more testing. This PR also removes selected_pixels from the SelectionPolygon class.
* Confirm & cancel selection movement, should support undoredo properly too
Press Enter or do any editing to confirm movement, Escape to cancel. I will most likely add UI buttons for confirm and cancel too.
* Mirror View affects selection
* Restore Cut, Copy, Paste and Clear Selection
Pasting now no longer requires a pre-existing selection and instead copies the selections themselves too.
* Created a new Select menu, which has Select All and Clear Selection as options
Clear Selection now also confirms content moving. TopMenuContainer code has changed to no longer rely on Global for the menu buttons.
* Draw gizmos as rectangles
No functionality yet. They may need to be turned to nodes, so that they can easily resize based on zoom level and check for mouse enter/exit events.
* Made gizmos get drawn in the sides and corners of the big bounding rectangle instead of individual selection parts
Still no functionality yet.
* Restore label text
* Minor optimization when clipping selections
This will execute the for loop less times
* Made a Gizmo class, cursor change on hover, has_focus = false on mouse click
Now I should actually make them resize when dragged, aye?
* Very basic gizmo resizing, still a WIP, does not work properly yet
* Start replacing the array of selected pixels with a BitMap
This should optimize the selection making a lot, and it also allows for easy border drawing without having to deal with polygons, thanks to the MarchingAntsOutline.shader
Still commit is still a WIP, image effects and brushes may not work properly yet.
Because the BitMap has a fixed size, the size of the project, moving the selection outside of canvas boundaries has proven to be a bit tricky. I did implement a hacky way of handling it, but it may be buggy and problematic. I'm still unsure whether this is the best way to handle the situation.
* Selection works with mirror view
* Draw a black rectangle when the user is making a rectangular selection
After they release the mouse, the black rectangle becomes the selection
* Make Selection.gd update when undoing/redoing
* Fix brushes not working properly with non-rectangular selections
* Added invert selection
* Cache has_selection as a variable for a speedup
* Fix conflict issues with the shape tools
* Made the bitmap image squared so the marching ants effect will be the same on both dimensions
There may be a better way to fix the issue, perhaps inside the shader itself.
* Some optimizations to call selection_bitmap_changed() less times
* Restored almost all of the image effects
Left to do:
- Change gradient's behavior. Unsure of how it will work with non-rectangular selections yet, but it should not generate pixels outside of the selection.
- Restore rotation
- Resize bitmap on image resize
- Remove the `pixels` array from the ImageEffect
* Fix Selection.gd not updating when changing project
* Resize the selection bitmap along with image resize
* Restored rotation's old behavior and finally got rid of the selected_pixels array
The rotation does not yet work properly with selections, but at least it now "works".
* Resize selection too when using gizmos
Left to do for gizmos:
- Proper cancel transformation
- Begin transformation
(currently named move_content_start but it should be renamed to something more general) when resizing gizmos
- Keep the original image and selection in memory and resize them. Meaning, gizmos should not resize the already resized data, but only resize the original. This is less destructive as there is no danger of data loss.
- Always resize on InputEventMouseMotion. This is going to be worse for performance, but it will look better for the user.
* Image and bitmap resizing now uses the original data and begin transformation on gizmo click
No matter how many times the user resizes on the current transformation, the original data will not be lost until they either confirm or cancel, so there is no data loss before confirmation/cancel.
* Cancel transformation now works properly when the selection has been resized
* Made gizmos resize on mouse motion, fix issues with negative bounding rectangle and when combined with the move tool
* Resizing can now get out of positive bounds, clearing and inverting now gets limited to the canvas bounds
Resizing currently does not work properly with negative (left & up) canvas boundaries
* Flip image when resizing and the bounding rectangle gets flipped
* Call move_content_confirm() when inverting selection
* Attempt to implement selection resizing that goes outside of the canvas boundaries (not working properly yet)
* Flip selection when resizing to negative bounding rectangle sizes
And fix preview_image vertical flipping
* Fix rotation so that it works (almost) properly with selections
Rotation algorithms now accept and only work with a given image, and the pivot has been added as a parameter
* Experimental gizmo rotation - does not work properly yet
Transforming the selection outside of the canvas is still broken.
* Fix some issues with moving selection out of canvas bounds
* Fix more issues with selection getting resized outside of canvas bounds
* Update marching ants effect properly when switching between projects
And make sure the frequency of the marching ants effect always looks roughly the same on all project sizes
* Made the rotation gizmo part of the gizmos array and resize them based on camera zoom
* Remove unneeded parameter from move_bitmap_values()
* Remove more unneeded parameters
* Move the selection only if the cursor is above it and neither shift nor control are currently pressed
* Gradient generation now works on non-rectangular selections
Although this behavior might not be the intended one
* Copy/paste marching ants effect offset
Useful for when the selection is in negative coords
* Fix issue with clear selection & UndoRedo
* Restore the ability to move selection when it's in negative coords
* Made the marching ants offset a Project variable
This fixes the issue of project switching and keeping the previous project's offset. Again, this is only relevant for when the selection is in negative coords.
* Made the "from current selection" palette preset work with the new selection system
* Fix out of bounds error when using the rectangular select tool on negative coords
* Some code cleanup
* Comment out the rotation gizmo for now, since it does not work properly
* Update marching ants shader params and gizmo sizes when the bitmap changes
* Move some methods around in Selection.gd
* Replace old palette system with a new one
* Replace default json palettes with new resource versions
* Add missing translation strings
* Fix Erevoid's issues 2, 3 and 4
* Rewrite palette grid to improve performance
Add middle click scrolling
* Fix index conversion functions
* Fix palettes editing by copying them to XDG user write path
* Add Windows specific fixes
* Add import support for old json palette format
* Add create/edit palette settings check.
Hide add/delete color buttons when no palette is displayed.
Major speedup for large images. update_mask() is meant for pen pressure only, so there is no reason to calculate it if we don't have pressure sensitivity enabled
The issue occurred when the cursor exited the application window very fast while still on the canvas, thus Global.has_focus was still true, then lost focus. When Pixelorama regained focus, it would draw the tool even if the user clicked outside of the drawing canvas.
* fixed some more bugs
* Removed some more bugs
* Added "Replace Frame" option
It was originally made to use primarily in "Spritesheet (new layer)" but it thought it could also be useful to put it there as an import option
* Update PreviewDialog.tscn
* Update PreviewDialog.gd
* Update OpenSave.gd
* added import option for SpriteSheet and Frame
Now we can add SpriteSheets in current project and Replace frames in current project
* added functions for SpriteSheet and Frames
I added functions that would allow me to add SpriteSheet as new Layer. I also added an option for "Replace frame" (the function "open_image_at_frame()" is originally being used in "open_image_as_spritesheet_layer()" method but i decided to use it as an import option as well)
* Changed contribution name
* Changed contribution name
* Fixed some lines
* fixed sprite lines not updating
* allowed and enabled per_pixel_transparency
* Added a Transparency menu
* Added an Alternate screen for transparency
* Added transparency methods
Added the transparency methods plus modified fullscreen such that it resets transparency on toggling hence, Removing the issue of blackness
* Modified the shader to allow transparency
* Added a material to ViewportContainer
Fixed the bug that darkens image when decreasing opacity
* Update Global.gd
* Update Main.gd
* Update TopMenuContainer.gd
A performance boost for when opening large images. Also fixed an issue with pixels being selected outside of the canvas boundaries, when the selection rectangle was outside the canvas and its size got reduced.
* Cache tile mode rects
* Make TransparentChecker don't calculate tile mode rect on its own
* Minor fixes
- typo
- formatting
- moved unlock() call to the method where matching lock() was called
It now automatically sets the size to the current project's size, has a button to lock aspect ratio, and resizing based on percentage. Some UI changes to CreateNewImage too.
The lock aspect ratio button has been changed from a checkbox to a texture button and the template code has been refactored to use a Template class instead of enums. Only dark icons have been added for now.
* Move get_tile_mode_rect() method to the Project class
* Refactored isometric grid
Now it should be drawn properly in the target rect.
Settings (in pixels):
- cell's AABB size,
- offset from the canvas origin.
* Draw grid only over the Canvas (when in tiling mode)
* Replace some magic numbers with enums.
It's too easy to break something when adding something new in here. Should be a little harder now.
* Added Pixel Grid.
- Pixel grid is shown only when it's enabled and camera is zoomed close enough.
- Settings: pixel_grid_show_at_zoom (as a percentage because that's what's shown in the settings panel), pixel_grid_color. Default values might need changing.
- To distinguish between grid and pixel grid default settings for grid width, grid height are changed.
- Now both grid and pixel grid are drawn above (after) tile mode. Grid is drawn above (after) pixel grid.
It's Cel's property and thus it changes when frame_changed is called (also layer_changed calls frame_changed on its own).
Co-authored-by: kleonc <kleonc@users.noreply.github.com>
- Now the current frame is drawn to a separate Viewport (with transparent background) taking into account only per layer opacity,
- Tiling is drawn by drawing current frame's ViewportTexture with tile mode opacity applied (using premultiply alpha blending).
Co-authored-by: kleonc <kleonc@users.noreply.github.com>
Instead of having a frame_duration[] array in the Project class. This makes the code much more readable and understandable, using less lines of code and, by avoiding an extra array, we also avoid potential out-of-bound array crashes.
The functionality for the user has not changed, and by testing so far I didn't find any issues.
Fixes #377. The issue was that the shader material was being shared with the background of the cel buttons, and when the cel button transparent background was resized, the canvas transparent background was also affected.
- All colors move towards yellow when lighting, and purple when darkening. The logic has become more complex, so it doesn't just increase (or decrease) the hue when lighting (or darkening). This solves issues with green and blue.
- Added limits to the hue when lighting and darkening, limits to the value when darkening, and to the saturation when lighting.
This behavior should eventually be documented to explain how it works to the users.
When the user switched from one project to another, which had a larger size, the preview of the ImageEffect was trying to set pixels out of bounds, only when the affect option was different than "Current cel"
* Improved tiling feature
* Removed some unwanted code
* Fixed the bug mentioned by overloaded
* Added the requests by overload
* changed the y value which was given x value before
* Add shrink option that allow change default shrink
Shrink option allow to scale the godot application. This path enable
dynamic change of this value in the options.
* Fix the computation of cursor location
For an unknown reason the function get_local_mouse_position return
incorrect current_pixel when shrink is not 1. This path compute the
transformation manually and povide correct values for any shrink value.
- The CJK font (for Chinese & Korean) was changed to DroidSansFallback from NotoSansCJKtc. This results in a much smaller exported `.pck` (over 10MB less)
- Fixed Chinese and Korean characters not displaying properly in the Splash dialog and the About dialog.
* Add request #276
* Remove a warning message
* Some fixes
* Bug fix. Remove Global.save_project_to_recent_list() from src/Main.gd
Co-authored-by: Daniel Simon <dasimon@gmx.org>
Export.was_reported was keeping its value when switching projects, instead of being project-specific. Also fixed issue where imported images were not remembering the directory_path and file_name when switching projects.
More specifically, the color picked sometimes failed to pick transparent color (and picked black instead), swapping between colors when one of them is fully transparent made it fully opaque, and also when picking a color from a palette which was fully transparent made it fully opaque.
Closes #364
It now first attempts to serialize the project data and turn them to JSON, and then opens the file. This is a lto safer because, if a crash happens in the serialization, the file is not already open, and therefore it does not get corrupt. Earlier, if a crash happened, the file would be empty. This meant that if that file existed previously, all of the data would be lost.
* Sync for my local files to my repository
* This is frame properties update, it works but I can't be stored while
saving or loading and that makes crashes just the beggining :)
* I forgot this files :P
* Frame Properties update.
* Updating frame properties
* Update Translations.pot
* Changes to CanvasPreview and CelButton change