[Bf-blender-cvs] [4c7b0804f83] master: Cleanup (GPU): Improve efficiency of circle drawing.

Chris Blackbourn noreply at git.blender.org
Sun Jun 12 07:54:29 CEST 2022


Commit: 4c7b0804f83fbf52ecea669d07398073bad552ea
Author: Chris Blackbourn
Date:   Sun Jun 12 17:47:42 2022 +1200
Branches: master
https://developer.blender.org/rB4c7b0804f83fbf52ecea669d07398073bad552ea

Cleanup (GPU): Improve efficiency of circle drawing.

===================================================================

M	source/blender/gpu/intern/gpu_immediate_util.c

===================================================================

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 {



More information about the Bf-blender-cvs mailing list