diff options
author | Chris Blackbourn <chrisbblend@gmail.com> | 2022-06-12 08:47:42 +0300 |
---|---|---|
committer | Chris Blackbourn <chrisbblend@gmail.com> | 2022-06-12 08:49:25 +0300 |
commit | 4c7b0804f83fbf52ecea669d07398073bad552ea (patch) | |
tree | 60d7f4242a562fb9ddb56b69a19b7c2471b5aada /source/blender/gpu | |
parent | cc4d46d91ee1f35455676f4c84ec46502488043a (diff) |
Cleanup (GPU): Improve efficiency of circle drawing.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/intern/gpu_immediate_util.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/source/blender/gpu/intern/gpu_immediate_util.c b/source/blender/gpu/intern/gpu_immediate_util.c index 67035853594..daefd57a5b3 100644 --- a/source/blender/gpu/intern/gpu_immediate_util.c +++ b/source/blender/gpu/intern/gpu_immediate_util.c @@ -337,13 +337,27 @@ static void imm_draw_circle_3D( /* Note(Metal/AMD): For small primitives, line list more efficient than line strip. */ immBegin(GPU_PRIM_LINES, nsegments * 2); - immVertex3f(pos, x + radius * cosf(0.0f), y + radius * sinf(0.0f), 0.0f); - for (int i = 1; i < nsegments; i++) { - float angle = (float)(2 * M_PI) * ((float)i / (float)nsegments); - immVertex3f(pos, x + radius * cosf(angle), y + radius * sinf(angle), 0.0f); - immVertex3f(pos, x + radius * cosf(angle), y + radius * sinf(angle), 0.0f); + const float angle = (float)(2 * M_PI) / (float)nsegments; + float xprev = cosf(-angle) * radius; + float yprev = sinf(-angle) * radius; + const float alpha = 2.0f * cosf(angle); + + float xr = radius; + float yr = 0; + + for (int i = 0; i < nsegments; i++) { + immVertex3f(pos, x + xr, y + yr, 0.0f); + if (i) { + immVertex3f(pos, x + xr, y + yr, 0.0f); + } + const float xnext = alpha * xr - xprev; + const float ynext = alpha * yr - yprev; + xprev = xr; + yprev = yr; + xr = xnext; + yr = ynext; } - immVertex3f(pos, x + radius * cosf(0.0f), y + radius * sinf(0.0f), 0.0f); + immVertex3f(pos, x + radius, y, 0.0f); immEnd(); } else { |