summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRay <[email protected]>2024-06-30 11:15:45 +0200
committerRay <[email protected]>2024-06-30 11:15:45 +0200
commit13e309251184343b67773d16e6e264c7cac7c280 (patch)
treeb6d4fcbe2606d27ca022a16b8f806cb5b7d5ab11
parent953df38ac47e7e05a8f7b5eef12990aa07522af8 (diff)
downloadraylib-13e309251184343b67773d16e6e264c7cac7c280.tar.gz
raylib-13e309251184343b67773d16e6e264c7cac7c280.zip
REVIEWED: `DrawSphereEx()`, added educational info
-rw-r--r--src/rmodels.c60
1 files changed, 52 insertions, 8 deletions
diff --git a/src/rmodels.c b/src/rmodels.c
index 6de27021..b67c8e69 100644
--- a/src/rmodels.c
+++ b/src/rmodels.c
@@ -424,6 +424,48 @@ void DrawSphere(Vector3 centerPos, float radius, Color color)
// Draw sphere with extended parameters
void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color)
{
+#if 0
+ // Basic implementation, do not use it!
+ // For a sphere with 16 rings and 16 slices it requires 8640 cos()/sin() function calls!
+ // New optimized version below only requires 4 cos()/sin() calls
+
+ rlPushMatrix();
+ // NOTE: Transformation is applied in inverse order (scale -> translate)
+ rlTranslatef(centerPos.x, centerPos.y, centerPos.z);
+ rlScalef(radius, radius, radius);
+
+ rlBegin(RL_TRIANGLES);
+ rlColor4ub(color.r, color.g, color.b, color.a);
+
+ for (int i = 0; i < (rings + 2); i++)
+ {
+ for (int j = 0; j < slices; j++)
+ {
+ rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*i))*sinf(DEG2RAD*(360.0f*j/slices)),
+ sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*i)),
+ cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*i))*cosf(DEG2RAD*(360.0f*j/slices)));
+ rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*sinf(DEG2RAD*(360.0f*(j + 1)/slices)),
+ sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1))),
+ cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*cosf(DEG2RAD*(360.0f*(j + 1)/slices)));
+ rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*sinf(DEG2RAD*(360.0f*j/slices)),
+ sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1))),
+ cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*cosf(DEG2RAD*(360.0f*j/slices)));
+
+ rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*i))*sinf(DEG2RAD*(360.0f*j/slices)),
+ sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*i)),
+ cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*i))*cosf(DEG2RAD*(360.0f*j/slices)));
+ rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i)))*sinf(DEG2RAD*(360.0f*(j + 1)/slices)),
+ sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i))),
+ cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i)))*cosf(DEG2RAD*(360.0f*(j + 1)/slices)));
+ rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*sinf(DEG2RAD*(360.0f*(j + 1)/slices)),
+ sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1))),
+ cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*cosf(DEG2RAD*(360.0f*(j + 1)/slices)));
+ }
+ }
+ rlEnd();
+ rlPopMatrix();
+#endif
+
rlPushMatrix();
// NOTE: Transformation is applied in inverse order (scale -> translate)
rlTranslatef(centerPos.x, centerPos.y, centerPos.z);
@@ -440,16 +482,18 @@ void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color
float cosslice = cosf(sliceangle);
float sinslice = sinf(sliceangle);
- Vector3 vertices[4]; // Store face vertices
- vertices[2] = (Vector3){0,1,0};
- vertices[3] = (Vector3){sinring, cosring, 0};
+ 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 + 1; i++) {
- for (int j = 0; j < slices; j++) {
+ for (int i = 0; i < rings + 1; i++)
+ {
+ for (int j = 0; j < slices; j++)
+ {
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};
+ 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 };
rlVertex3f(vertices[0].x, vertices[0].y, vertices[0].z);
rlVertex3f(vertices[3].x, vertices[3].y, vertices[3].z);
@@ -461,7 +505,7 @@ void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color
}
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
+ 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();