Show HN: Poulette – A Color Palette GUI
github.com
github.com
A feature I like is that every color you create is kept on the palette so you can build new colors upon previous ones. It's also kind of a natural way to create a history of the colors you used. Colors that are removed from the palette are kept on the side so you can temporarily reduce the complexity of the palette.
For the technical side, it is made with regular js/html/css and webgl, no framework is required. It is supposed to work on touch devices as well as desktop computers.
This is still a bit experimental so I'd be very happy to have some feedback. Thank you!
I think it needs some work to make it "learnable". It wasn't obvious to me whether the colours on the side were the final palette, or the "trash can".
It might be nice to have a way to see multiple colours together in a "demo". At the moment you just see one colour as the background.
Lastly I'm not sure that dragging to the side is very intuitive as a way of removing the colour. It mixes two things up - moving the colour to adjust the palette, and getting rid of it. Maybe the user could double-click instead.
All that said, I thought this was great and really fun and intuitive.
I'll add the double-click for the deletion, you are not the first person to suggest it.
I have to admit the colors on the side are a bit of an afterthought. You need some diversity to be able to create the colors you want. If you can't retrieve the deleted colors you can be stuck. I agree its role is not obvious. I don't know how to fix that but I'll keep the issue in mind.
I'm not sure what you mean about the "multiple colours in a demo". I think the demo is missing some kind of "real world usage" aspect. At the same time I tried to keep it focused on the component itself. Maybe I'll add an example to the readme tomake things clearer
What's a little annoying is that colours jump around when I move anchors closer or farther away from each other, but I guess there's no good solution for that.
Also, it would be nice if the connections between the anchors were less obvious. Right now, they're very clearly visible straight lines. Not sure how that could be solved, though, either.
What colour space are you using for all the transitions?
That sounded quite negative, but I really like what you've done here, it's a very creative approach to an otherwise technical topic.
the "obviousness" of the connections is tricky. The blending is in the linear RGB space. I initially tried sRGB but it was terrible. I'm not sure how to improve it. At the moment the interpolation is done through the varyings between the vertex and fragment shader. This is quite limiting.
About the lack of deliberate choice, in theory you can reach any rgb color. In practice this is limited by the initial colors I chose (they are smoother than pure RGB-CMY). I'm not sure how much of the RGB space I'm missing.
For the antialiasing issue I'll look into it. I'm not sure I correctly set the AA in webgl. Could also be due to some issue with the size of the canvas
Thank you again!
Possibly use a radial basis function for interpolation rather than triangles? I don't have JavaScript code handy but rbf-interp[1] is Rust code that could either be adapted or called from wasm.
A-B
|/|
C-D
the position of D could have an impact on how ABC is rendered.But I'll try another color space first, it should be easier to implement.
A better color space can also help with some issues (in the demo the darker colors are harder to reach when blending with the black point than lighter colors are when the white point is involved) but how I understand it the colors in a triangle are influenced by the colors and shapes of the surrounding triangles, whatever the color space.
I must say that I'm very happy to have had your input on this. I'm a big fan of your work and your blog is a real treasure!
Thank you!
Anyways, awesome work :)
So it looks like you're first applying Delauny triangulation to the color points, and then apply linear interpolation along the created triangles using Barycentric coordinates? Did I get that right? Pretty elegant solution (not to mention all the other little details that went into designing the interface).
edit: wait, if I'm placing a outside the existing shape it's projected to the closest line and linearly interpolates on it? Nice, this is really thought through!
The colors still looks a bit strange along the triangle edges sometimes, and glancing at the source code it seems like you're mixing in linear RGB[0] so it's not that. I guess that just means that I'm looking at a saddle point in the color space?
(this made me wonder how smoothing functions would work for triangle meshes (that aren't secretly quads split into two triangles), and a quick search suggests that could be quite a deep rabbit hole to fall into)
[0] https://github.com/grgrdvrt/poulette/blob/main/src/utils/col...
This is indeed Delaunay triangulation, barycentric coordinates, linear RGB and projections on the edges for the points outside of the mesh. You got everything right!
Having a nice blending along the edges doesn't seem straightforward. I have a few options in mind but nothing obviously right (working with a voronoi diagram instead of a delaunay one, bezier interpolation)
[0] https://www.graphics.rwth-aachen.de/media/papers/sqrt31.pdf
I’ll show myself out...
Are you thinking about constraints for the positions or for the colors?