From 24f35987896846cb13f0727cfffadb17ebce4acb Mon Sep 17 00:00:00 2001 From: oscujic <52619003+oscujic@users.noreply.github.com> Date: Mon, 20 Jul 2026 09:50:48 -0600 Subject: [PATCH] DrawSphereWires + DrawSphereEx parity Summary: - Replaced DrawSphereWires algorithm with one based on the much faster algorithm from DrawSphereEx - Fixed +1 ring quirk on DrawSphereEx to match the change made to DrawSphereWires --- src/rmodels.c | 54 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/rmodels.c b/src/rmodels.c index 6cf049e41..119ac315a 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -488,7 +488,7 @@ void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color rlBegin(RL_TRIANGLES); rlColor4ub(color.r, color.g, color.b, color.a); - float ringangle = DEG2RAD*(180.0f/(rings + 1)); // Angle between latitudinal parallels + float ringangle = DEG2RAD*(180.0f/rings); // Angle between latitudinal parallels float sliceangle = DEG2RAD*(360.0f/slices); // Angle between longitudinal meridians float cosring = cosf(ringangle); @@ -500,7 +500,7 @@ void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color vertices[2] = (Vector3){ 0, 1, 0 }; vertices[3] = (Vector3){ sinring, cosring, 0 }; - for (int i = 0; i < rings + 1; i++) + for (int i = 0; i < rings; i++) { for (int j = 0; j < slices; j++) { @@ -542,32 +542,42 @@ void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Col rlBegin(RL_LINES); rlColor4ub(color.r, color.g, color.b, color.a); + float ringangle = DEG2RAD*(180.0f/rings); // Angle between latitudinal parallels + float sliceangle = DEG2RAD*(360.0f/slices); // Angle between longitudinal meridians + + float cosring = cosf(ringangle); + float sinring = sinf(ringangle); + float cosslice = cosf(sliceangle); + float sinslice = sinf(sliceangle); + + Vector3 vertices[4] = { 0 }; // Required to store face vertices + vertices[2] = (Vector3){ 0, 1, 0 }; + vertices[3] = (Vector3){ sinring, cosring, 0 }; + for (int i = 0; i < rings; i++) { for (int j = 0; j < slices; j++) { - // Diagonal Lines - rlVertex3f(sinf(DEG2RAD*((180.0f/rings)*i))*sinf(DEG2RAD*(360.0f*j/slices)), - cosf(DEG2RAD*((180.0f/rings)*i)), - sinf(DEG2RAD*((180.0f/rings)*i))*cosf(DEG2RAD*(360.0f*j/slices))); - rlVertex3f(sinf(DEG2RAD*((180.0f/rings)*(i + 1)))*sinf(DEG2RAD*(360.0f*(j + 1)/slices)), - cosf(DEG2RAD*((180.0f/rings)*(i + 1))), - sinf(DEG2RAD*((180.0f/rings)*(i + 1)))*cosf(DEG2RAD*(360.0f*(j + 1)/slices))); - // Latitude Lines - rlVertex3f(sinf(DEG2RAD*((180.0f/rings)*i))*sinf(DEG2RAD*(360.0f*(j + 1)/slices)), - cosf(DEG2RAD*((180.0f/rings)*i)), - sinf(DEG2RAD*((180.0f/rings)*i))*cosf(DEG2RAD*(360.0f*(j + 1)/slices))); - rlVertex3f(sinf(DEG2RAD*((180.0f/rings)*i))*sinf(DEG2RAD*(360.0f*j/slices)), - cosf(DEG2RAD*((180.0f/rings)*i)), - sinf(DEG2RAD*((180.0f/rings)*i))*cosf(DEG2RAD*(360.0f*j/slices))); + vertices[0] = vertices[2]; // Rotate around y axis to set up vertices for next face + vertices[1] = vertices[3]; + vertices[2] = (Vector3){ cosslice*vertices[2].x - sinslice*vertices[2].z, vertices[2].y, sinslice*vertices[2].x + cosslice*vertices[2].z }; // Rotation matrix around y axis + vertices[3] = (Vector3){ cosslice*vertices[3].x - sinslice*vertices[3].z, vertices[3].y, sinslice*vertices[3].x + cosslice*vertices[3].z }; + // Longitude Lines - rlVertex3f(sinf(DEG2RAD*((180.0f/rings)*(i + 1)))*sinf(DEG2RAD*(360.0f*j/slices)), - cosf(DEG2RAD*((180.0f/rings)*(i + 1))), - sinf(DEG2RAD*((180.0f/rings)*(i + 1)))*cosf(DEG2RAD*(360.0f*j/slices))); - rlVertex3f(sinf(DEG2RAD*((180.0f/rings)*i))*sinf(DEG2RAD*(360.0f*j/slices)), - cosf(DEG2RAD*((180.0f/rings)*i)), - sinf(DEG2RAD*((180.0f/rings)*i))*cosf(DEG2RAD*(360.0f*j/slices))); + rlVertex3f(vertices[0].x, vertices[0].y, vertices[0].z); + rlVertex3f(vertices[1].x, vertices[1].y, vertices[1].z); + + // Latitude Lines + rlVertex3f(vertices[0].x, vertices[0].y, vertices[0].z); + rlVertex3f(vertices[2].x, vertices[2].y, vertices[2].z); + + // Diagonal Lines + rlVertex3f(vertices[0].x, vertices[0].y, vertices[0].z); + rlVertex3f(vertices[3].x, vertices[3].y, vertices[3].z); } + + vertices[2] = vertices[3]; // Rotate around z axis to set up starting vertices for next ring + vertices[3] = (Vector3){ cosring*vertices[3].x + sinring*vertices[3].y, -sinring*vertices[3].x + cosring*vertices[3].y, vertices[3].z }; // Rotation matrix around z axis } rlEnd(); rlPopMatrix();