|
|
@ -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(); |
|
|
|