This is not based on any 'research' or 'reading' I came up with it myself, so pardon me if it sucks.
(But I think it's rather good and quick).
I wrote a note describing that and then I implemented it dirtily for myself. So far it's point lights and hard shadows(no penumbras) only.
Algorithm is:
For each light for each convex hull do:
1. find two points that will create lines with biggest angle when a
2. take curve enclosed between these points, including them
3. add 3 points: one taken from line made by light point and last edge point, one taken from line made by light point and avg of hull vertices and one taken from line made by light point and last edge point. Take them from far away the light point so that they lie at least 2* radius of light away from it, to be safe.
4. This polygon is the hard shadow for this hull made by this light. That's it.
Then you draw it using render textures and right blends and/or shaders, or clip the light circle with something like clipperlib and draw resulting concave poly after decomposing it (actually, I'd have to check but you might not even need to decompose it, since some concave shapes can be drawn using convex SFML polygon class, this result might fit the constraints required.. almost surely it will, since the way shadows are made fits the constraint SFML places but I'd still check if I went that route
).
The algorithm of course doesn't include the optimizations, limiting light angle and checking if light is inside hull and so on. It make shadows even if they are not needed because they don't lie in light circle, but all other things are 'noise' for the algorithm code, needed but not contributing to the algorithm itself.
Here's a screenshot with white lines drawn from light to each vertex and shadows being blue instead of black, you can see two outmost are selected and then a point is placed using them and then additional three points are added, two from that line and one from(not drawn) line that goes from light through middle of polygon.
I might post this code.. maybe.. if someone really wants, it's not optimized and messy now, and what I'm doing is not adding any public API and just commenting out //private: in every class and working that way. Definitely not the way to showcase work.
Also it's just hard shadows so far, no cones, etc. and I'd need to take some code from clipperlib and box2d for optimizations and so on.