This file provides an overview of the direction this project is heading. There is no timeline attached to milestones, because i don't know much i'm going to work on this in the future and how much people are willing to help.
There are still a lot of placeholders in the program. While i did my best to implement as much features as possible before i made the project public, there is still a lot to do. This is a list of features which i would expect from a program like this (and which are not implemented yet):
- Basic shape tools (rectangle, line, maybe a circle/oval)
- Color picker tool (picks colors from brush strokes on the canvas)
- Persist last opened projects, so you don't have to reopen files between program restarts
- Different themes (at least 1 dark and 1 light theme)
- Cleanup UI
- More settings (max zoom level, zoom speed, min/max brush size etc.)
- Improvements to project tabs (currently custom ui; maybe replace with Godot's
Tabs
to take advantage of scrolling and reordering) - Improve the brush stroke filter and optimizer
- Improve zooming
Save as
functionality- Stability across all platforms + bugfixing
- Stabilize savefile format (can still change later (before 1.0) but hopefully not as much)
- Improve the logo. I'm actually pretty proud of myself for the current logo, but i'm sure it can be improved. It's supposed to be a leaf by the way ;)
- Maybe setup unit tests? I have never done that in Godot, but it's worth checking out early on in the project
- i18n
- etc.
For the first iteration of the project i used Godot's built-in Line2D to render the brush stokes. Because of this built-in functionality i had a working prototype ready in less then a day. Line2D basically has everything i need:
- Renders lines of (almost) arbitrary length
- Variable width through the use of a Curve (useful for pressure sensitivity)
- Different colors
- Can do anti-aliasing (not ideal though; more on this later)
- Can leverage Godot's 2D batch rendering system for performance
But there are also some issues:
-
Out of the 2 anti-aliasing methods provided none work perfectly:
-
Line2D's
antialiased
property uses an OpenGL hint to draw smooth edges. OpenGL drivers are not required to implement hints, and in fact most don't, so it may work on my machine but not on yours. If it works, it looks really nice, but it's also pretty slow compared to the other method. -
Line2D has the ability to fill the rendered line with a texture. If you make a texture in a way that the edges have very low opacity, you can fake anti-aliasing. This is pretty fast and works on every system, but it looks kind of bad when you zoom in really far. This can maybe worked around with by switching between different textures based on the camera zoom level, but it's not ideal either.
-
-
Using Line2D's
width_curve
for drawing pressure sensitive lines is kind of wonky (the line literally wobbles when it's very long (only while still drawing; i.e. adding points))
Implement a custom system for:
- Line meshing (can reuse a modified version of Godot's LineBuilder which is used internally by Line2D). This should fix the
width_curve
wonkiness. - Line rendering with custom static batching; also use the VisualServer directly (should improve performance by a lot)
- Anti aliasing. Have to research different AA algorithms and see how feasable it is to implement them in Godot
- Streaming brush strokes in/out based on view frustrum insead of keeping Line2D nodes in scene tree?
Something simpler than going native would be nice.
- Implement a selection tool to select and move multiples strokes.
- Implement a brush stabilizer (can optionally be enabled for the brush tool)
- Color palettes / list of previously used colors
- Export functionality (png, jpg, svg)
- A grid
- Layers (pretty sure i'm NOT going to implement this, because you don't even have opacity (by design) and you can just create a new
.lorien
file instead) - A ruler
- etc.