SDL
SDL copied to clipboard
Add a function to draw circles
This bug report was migrated from our old Bugzilla tracker.
Reported in version: HG 2.1 Reported for operating system, platform: All, All
Comments on the original bug report:
On 2014-03-29 02:02:21 +0000, Matheus Valadares wrote:
It seems that the 2D rendering subsystem doesn't have any functions to draw circles, is that an overlook or something that isn't intended to be implemented?
On 2016-07-30 18:40:53 +0000, Luxon Jean-Pierre wrote:
I recently implemented two functions that draw a circle on a renderer:
- SDL_RenderDrawCircle
- SDL_RenderFillCircle
You can find the implementation here : https://gist.github.com/Gumichan01/332c26f6197a432db91cc4327fcabb1c
I cannot submit this on the repository because I do not have the write :-/
On 2016-08-01 20:34:41 +0000, Philipp Wiesemann wrote:
The loop condition in the linked implementation seems wrong. It should be "offsety >= offsetx" instead of "y >= x".
On 2016-08-02 10:15:05 +0000, Luxon Jean-Pierre wrote:
Yes, I fixed that.
On 2018-08-06 21:20:19 +0000, Ryan C. Gordon wrote:
Hello, and sorry if you're getting dozens of copies of this message by email.
We are closing out bugs that appear to be abandoned in some form. This can happen for lots of reasons: we couldn't reproduce it, conversation faded out, the bug was noted as fixed in a comment but we forgot to mark it resolved, the report is good but the fix is impractical, we fixed it a long time ago without realizing there was an associated report, etc.
Individually, any of these bugs might have a better resolution (such as WONTFIX or WORKSFORME or INVALID) but we've added a new resolution of ABANDONED to make this easily searchable and make it clear that it's not necessarily unreasonable to revive a given bug report.
So if this bug is still a going concern and you feel it should still be open: please feel free to reopen it! But unless you respond, we'd like to consider these bugs closed, as many of them are several years old and overwhelming our ability to prioritize recent issues.
(please note that hundred of bug reports were sorted through here, so we apologize for any human error. Just reopen the bug in that case!)
Thanks, --ryan.
Why is this abandoned?
I don’t know, this seems useful to me. I’ll reopen it for SDL 3.0, thanks!
If we were to add this--and I'm not sure we should--we'd want to probably have most of the backends render a single rectangle and use a pixel shader to carve it down to a circle. But I haven't thought it through.
The code in that gist could just be copied into an app without any changes to SDL though, since it just renders with points and lines.
Is it bad manners to /bump?
@icculus
and I'm not sure we should
I'm curious about the reasoning on this. Drawing circles seems like a nice drawing primitive to have.
I tried the snippet (without researching much about circle rendering algorithms), and added this line to support alpha channels for the color:
SDL_SetRenderDrawBlendMode(state->renderer, SDL_BLENDMODE_BLEND);
Unfortunately, the "filled circle" function does not work very well:
Intuitively, this looks like there are more lines rendered in some parts of the circle, which "adds up" and make the region less transparent. Any tips to fix this?
I'm curious about the reasoning on this.
We're usually not adding new features to the 2D renderer, there isn't a GPU primitive that draws circles, and as you discovered, the proposed code doesn't work.
I still think if we were to add this, the right way is to draw a single rectangle and have a pixel shader discard the fragments outside the circle.
If someone wanted to create a PR that implements that for GLSL, HLSL and Metal, we would entertain that, but nobody has volunteered, instead solving it using images or their own rendering code.
@icculus Gotcha.
Are there resources somewhere on how to use shaders on an SDL_Renderer ?
You would have to do it inside the renderer. You can look at the shader code in each renderer to get an idea of what you'd have to do.