Ver a proveniência

[rmodels] `DrawSphereEx()` optimization (#4106)

* Optimize DrawSphereEx()

Precalculates sin/cos to eliminate unnecessary calls.

* Formatting correction to previous commit

* Bugfix to optimized DrawSphereEx()

OBO error -- added 1 additional precalculated cos/sin value to each array to complete the 360-degree wraparound. Technically the value of these last elements will always be the same as the first element due to 360-degree wraparound, but this is the simplest solution.

* Corrected missing free()

* Formatting correction

* New DrawSphereEx() algorithm
pull/4120/head
smalltimewizard há 10 meses
committed by GitHub
ascendente
cometimento
953df38ac4
Não foi encontrada uma chave conhecida para esta assinatura, na base de dados ID da chave GPG: B5690EEEBB952194
1 ficheiros alterados com 29 adições e 23 eliminações
  1. +29
    -23
      src/rmodels.c

+ 29
- 23
src/rmodels.c Ver ficheiro

@ -432,30 +432,36 @@ void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color
rlBegin(RL_TRIANGLES); rlBegin(RL_TRIANGLES);
rlColor4ub(color.r, color.g, color.b, color.a); rlColor4ub(color.r, color.g, color.b, color.a);
for (int i = 0; i < (rings + 2); i++) float ringangle = DEG2RAD*(180.0f/(rings + 1)); // Angle between latitudinal parallels
{ float sliceangle = DEG2RAD*(360.0f/slices); // Angle between longitudinal meridians
for (int j = 0; j < slices; j++) float cosring = cosf(ringangle);
{ float sinring = sinf(ringangle);
rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*i))*sinf(DEG2RAD*(360.0f*j/slices)), float cosslice = cosf(sliceangle);
sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*i)), float sinslice = sinf(sliceangle);
cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*i))*cosf(DEG2RAD*(360.0f*j/slices))); Vector3 vertices[4]; // Store face vertices
rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*sinf(DEG2RAD*(360.0f*(j + 1)/slices)), vertices[2] = (Vector3){0,1,0};
sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1))), vertices[3] = (Vector3){sinring, cosring, 0};
cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*cosf(DEG2RAD*(360.0f*(j + 1)/slices))); for (int i = 0; i < rings + 1; i++) {
rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*sinf(DEG2RAD*(360.0f*j/slices)), for (int j = 0; j < slices; j++) {
sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1))), vertices[0] = vertices[2]; // Rotate around y axis to set up vertices for next face
cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*cosf(DEG2RAD*(360.0f*j/slices))); 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
rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*i))*sinf(DEG2RAD*(360.0f*j/slices)), vertices[3] = (Vector3){cosslice*vertices[3].x - sinslice*vertices[3].z, vertices[3].y, sinslice*vertices[3].x + cosslice*vertices[3].z};
sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*i)), rlVertex3f(vertices[0].x, vertices[0].y, vertices[0].z);
cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*i))*cosf(DEG2RAD*(360.0f*j/slices))); rlVertex3f(vertices[3].x, vertices[3].y, vertices[3].z);
rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i)))*sinf(DEG2RAD*(360.0f*(j + 1)/slices)), rlVertex3f(vertices[1].x, vertices[1].y, vertices[1].z);
sinf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i))), rlVertex3f(vertices[0].x, vertices[0].y, vertices[0].z);
cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i)))*cosf(DEG2RAD*(360.0f*(j + 1)/slices))); rlVertex3f(vertices[2].x, vertices[2].y, vertices[2].z);
rlVertex3f(cosf(DEG2RAD*(270 + (180.0f/(rings + 1))*(i + 1)))*sinf(DEG2RAD*(360.0f*(j + 1)/slices)), rlVertex3f(vertices[3].x, vertices[3].y, vertices[3].z);
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)));
} }
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(); rlEnd();
rlPopMatrix(); rlPopMatrix();

||||||
x
 
000:0
Carregando…
Cancelar
Guardar