Cascade Image Editor

Hello everyone!

It has been a while. Some of you might remember that I was working on a node-based image editor for Windows and Linux.

I took a break from the project due to other commitments, but have recently picked it up again and I think I am on a good path to a first MVP version.

This is what it looks like at the moment:

I will be publishing new releases roughly monthly, and the latest one can be found here: https://github.com/ttddee/Cascade/releases

So what is this about?

Well, an editor for still images like I always wanted, back when I was working as a compositor in VFX.

Cascade is written in C++, using Qt with a Vulkan rendering backend. The whole rendering pipeline lives on the GPU and all pixel data is stored and processed in 32 bits per channel linear space. All image processing operations are implemented as GLSL shaders.

I have recently added a node called “GLSL Shader” that comes with a little code editor and lets you experiment with writing your own shader effects. A little bit like Shadertoy, but for still images.

Other than that, the most common file formats are supported and so are color spaces.

What else is planned?

In order to get to a version that I would call a Minimum Viable Product, I have the following things on the list:

  • Add a UI overlay on top of the rendered image to improve the user experience. A simple example is having draggable handles on the Crop Node, instead of having to type numbers into a box.
  • Add a bunch of nodes that provide essential operations/effects.
  • Implement batch processing, so that whole sequences of images can be processed.
  • Add more file formats and have the ability to set export settings for different formats. Like jpg compression etc.
  • Improve the usability of the node graph. Little things like automatic snapping of connections, being able to deactivate nodes, dropping nodes onto existing connections to auto-connect them. Make it feel less clunky overall.
  • Have a way to create masks.

And then?

The list of would-be-nice-to-have features is long :stuck_out_tongue:

I’ve been experimenting with a paint engine in Vulkan. I don’t imagine a sophisticated paint system but something simple for painting masks and clone-stamping and such. What I have basically works, I just have to find the time to dive into it again.

Another recent experiment was adding support for neural network algorithms with the Kompute framework. For example things like super-resolution could be fancy.

And of course adding all those other things that make a decent raster image editor, haha.

I previously added support for GMIC filters. Unfortunately I have disabled that feature for now, due to technical reasons. The code is there though and I hope to get it to work like it should in the future.

---------------------------------------

That’s it for now, I’ll post noteworthy updates here. Feedback is much appreciated! Or if you need help, want to contribute there is a link to the Discord server on the project Github page: https://github.com/ttddee/Cascade

Cheers

21 Likes

Hopefully a g’mic node is on the road map!

1 Like

In Cascade-Image-Editor-Win64-v0-1-8-release-a373977
the file vcruntime140_1.dll is missing.
Error
Easy to find on the web - but to be completed in the next version :smiley:
I also keep my fingers crossed for the rapid implementation of G’MIC.

1 Like

Hi!

Thanks for pointing this out, I will add the file to the next release!

As for G’MIC: Like I said in the original post, the code for the integration is basically all there. I need to find the time to figure out how to make G’MIC play nice with MSVC and it should be almost good to go. :crossed_fingers:

Could the g’mic issue has anything to do with number of channels used as input for g’mic?

No it is more about how difficult I found it to create a stable build environment on Windows. Back when I tried, it was needing a lot of manual intervention and eating up all my time.

Maybe things have changed though with the new version. If someone can point me to a working build setup or static binaries, or wants to contribute something in that direction, I would be happy to try again. I think the potential of using G’MIC in a node-based setup is huge.

Here you can see some testing I did back then on Linux: G'MIC in Cascade Image Editor - YouTube

Wow. Very impressive coding achievement.

1 Like

@till Very cool project! I wonder what your plans are for raw file-format support.

1 Like

Thanks!

Support for RAW images could be achieved pretty easily, since I am already using OpenImageIO and it supports reading RAW formats through libraw.

If there is interest in that I could bump it up the priority list.

1 Like

For rawproc, I make my Windows releases on Ubuntu with the mxe cross-compiler. With it, I’ve set up a x86_64 static toolchain that builds my executables with only system dependencies, no need to pack a bunch of .dlls in the installer. With that and running Inno installer in wine, easy-peasy.

https://mxe.cc/

I also build rawproc on my Windows tablet with msys2, which I just use a a default shell on that device.

https://www.msys2.org/

Wow! Nice work the coding sounds very similar to the OpenToonz FX node schematic which I am still trying to figure out how to add Gmic nodes too as well? please keep us updated.

1 Like

Hi,
If you come up with GMIC implementation, do you think it could be shared with Natron ? the other open source nodal compositor (here on pixl.us).

Note that Natron uses OpenFX, so code-sharing will probably not work.

I think there already is an OFX G’MIC plugin for Natron?

Yes, but AFAIK we are locked with an old version of GMIC due to breaking changes in G’MIC

loading the data is just the first step… you’d need quite a few modules to massage the data until it becomes useful in a regular raster pipeline.

i had a quick look at the glsl shaders in cascade, and it seems to me that code sharing at least on a copy/paste level would be not very hard at all with the modules in vkdt. there’s a bit more image load/store instead of textures and i didn’t look at how the buffer bindings are done on the cpu side. because masks were mentioned in this thread, vkdt has some code for basic brush stroking, though most of the effort here is the cpu side/setting up the rasterisation pipeline in vulkan (so not easy to share at all). anyways the projects seem to have very different focus.

Depends on how fancy of a RAW editing experience you want to have. To get a useable image I think loading RAW, setting wb, exposure, color space, demosaicing and then copying to the GPU could be enough?

See here: Bundled ImageIO Plugins - OpenImageIO 2.6.0 documentation

Or, do all of that on the GPU, which is of course a little bit more effort.

I think sharing code through GLSL shaders is a great way to get interoperability for image editing applications in general. There is no standard, but ISF looks interesting and conversion to other apps is not too complicated.

Thanks for sharing the brush stroking example, I want to have a good look at that when I have time!

You’ll also need a black subtract, depending on the camera…

I just released version 0.1.9 , including batch rendering, a new logo and a Linux AppImage:

4 Likes

Here is a tutorial on how to create your own effects in Cascade via GLSL shaders.

https://cascadedocs.readthedocs.io/en/latest/writingshader.html