Cleanup (GPU): Improve efficiency of circle drawing.

This commit is contained in:
Chris Blackbourn 2022-06-12 17:47:42 +12:00
parent cc4d46d91e
commit 4c7b0804f8
1 changed files with 20 additions and 6 deletions

View File

@ -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 {