diff --git a/src/Magnum/Primitives/Capsule.cpp b/src/Magnum/Primitives/Capsule.cpp index c72556e2c..53ebed1af 100644 --- a/src/Magnum/Primitives/Capsule.cpp +++ b/src/Magnum/Primitives/Capsule.cpp @@ -51,8 +51,9 @@ Trade::MeshData2D capsule2DWireframe(const UnsignedInt hemisphereRings, const Un /* Bottom hemisphere */ for(UnsignedInt i = 0; i != hemisphereRings; ++i) { const Rad angle(Float(i+1)*angleIncrement); - const Float x = Math::sin(angle); - const Float y = -Math::cos(angle)-halfLength; + const std::pair sincos = Math::sincos(angle); + const Float x = sincos.first; + const Float y = -sincos.second-halfLength; positions.insert(positions.end(), {{-x, y}, {x, y}}); } @@ -65,8 +66,9 @@ Trade::MeshData2D capsule2DWireframe(const UnsignedInt hemisphereRings, const Un /* Top hemisphere */ for(UnsignedInt i = 0; i != hemisphereRings; ++i) { const Rad angle(Float(i)*angleIncrement); - const Float x = Math::cos(angle); - const Float y = Math::sin(angle)+halfLength; + const std::pair sincos = Math::sincos(angle); + const Float x = sincos.second; + const Float y = sincos.first+halfLength; positions.insert(positions.end(), {{-x, y}, {x, y}}); } diff --git a/src/Magnum/Primitives/Circle.cpp b/src/Magnum/Primitives/Circle.cpp index 8853074ae..63254f9ac 100644 --- a/src/Magnum/Primitives/Circle.cpp +++ b/src/Magnum/Primitives/Circle.cpp @@ -48,7 +48,8 @@ Trade::MeshData2D circle2DSolid(const UnsignedInt segments) { const Rad angleIncrement(Constants::tau()/segments); for(UnsignedInt i = 0; i != segments + 1; ++i) { const Rad angle(Float(i)*angleIncrement); - positions.emplace_back(Math::cos(angle), Math::sin(angle)); + const std::pair sincos = Math::sincos(angle); + positions.emplace_back(sincos.second, sincos.first); } return Trade::MeshData2D{MeshPrimitive::TriangleFan, {}, {std::move(positions)}, {}, {}, nullptr}; @@ -65,7 +66,8 @@ Trade::MeshData2D circle2DWireframe(const UnsignedInt segments) { const Rad angleIncrement(Constants::tau()/segments); for(UnsignedInt i = 0; i != segments; ++i) { const Rad angle(Float(i)*angleIncrement); - positions.emplace_back(Math::cos(angle), Math::sin(angle)); + const std::pair sincos = Math::sincos(angle); + positions.emplace_back(sincos.second, sincos.first); } return Trade::MeshData2D{MeshPrimitive::LineLoop, {}, {std::move(positions)}, {}, {}, nullptr}; @@ -86,7 +88,8 @@ Trade::MeshData3D circle3DSolid(const UnsignedInt segments) { const Rad angleIncrement(Constants::tau()/segments); for(UnsignedInt i = 0; i != segments + 1; ++i) { const Rad angle(Float(i)*angleIncrement); - positions.emplace_back(Math::cos(angle), Math::sin(angle), 0.0f); + const std::pair sincos = Math::sincos(angle); + positions.emplace_back(sincos.second, sincos.first, 0.0f); } /* Normals. All pointing in the same direction. */ @@ -106,7 +109,8 @@ Trade::MeshData3D circle3DWireframe(const UnsignedInt segments) { const Rad angleIncrement(Constants::tau()/segments); for(UnsignedInt i = 0; i != segments; ++i) { const Rad angle(Float(i)*angleIncrement); - positions.emplace_back(Math::cos(angle), Math::sin(angle), 0.0f); + const std::pair sincos = Math::sincos(angle); + positions.emplace_back(sincos.second, sincos.first, 0.0f); } return Trade::MeshData3D{MeshPrimitive::LineLoop, {}, {std::move(positions)}, {}, {}, {}, nullptr}; diff --git a/src/Magnum/Primitives/Implementation/Spheroid.cpp b/src/Magnum/Primitives/Implementation/Spheroid.cpp index 1b6a849ec..7868c45fc 100644 --- a/src/Magnum/Primitives/Implementation/Spheroid.cpp +++ b/src/Magnum/Primitives/Implementation/Spheroid.cpp @@ -43,17 +43,19 @@ void Spheroid::capVertex(Float y, Float normalY, Float textureCoordsV) { } void Spheroid::hemisphereVertexRings(UnsignedInt count, Float centerY, Rad startRingAngle, Rad ringAngleIncrement, Float startTextureCoordsV, Float textureCoordsVIncrement) { - Rad segmentAngleIncrement(Constants::tau()/segments); - Float x, y, z; + const Rad segmentAngleIncrement(Constants::tau()/segments); for(UnsignedInt i = 0; i != count; ++i) { - Rad ringAngle = startRingAngle + Float(i)*ringAngleIncrement; - x = z = Math::cos(ringAngle); - y = Math::sin(ringAngle); + const Rad ringAngle = startRingAngle + Float(i)*ringAngleIncrement; + const std::pair ringSinCos = Math::sincos(ringAngle); + const Float x = ringSinCos.second; + const Float z = ringSinCos.second; + const Float y = ringSinCos.first; for(UnsignedInt j = 0; j != segments; ++j) { - Rad segmentAngle = Float(j)*segmentAngleIncrement; - positions.emplace_back(x*Math::sin(segmentAngle), centerY+y, z*Math::cos(segmentAngle)); - normals.emplace_back(x*Math::sin(segmentAngle), y, z*Math::cos(segmentAngle)); + const Rad segmentAngle = Float(j)*segmentAngleIncrement; + const std::pair segmentSinCos = Math::sincos(segmentAngle); + positions.emplace_back(x*segmentSinCos.first, centerY+y, z*segmentSinCos.second); + normals.emplace_back(x*segmentSinCos.first, y, z*segmentSinCos.second); if(textureCoords == TextureCoords::Generate) textureCoords2D.emplace_back(j*1.0f/segments, startTextureCoordsV + i*textureCoordsVIncrement); @@ -72,12 +74,13 @@ void Spheroid::cylinderVertexRings(const UnsignedInt count, const Float startY, const Vector2 baseNormal = -increment.perpendicular().normalized(); Vector2 base = {1.0f, startY}; - Rad segmentAngleIncrement(Constants::tau()/segments); + const Rad segmentAngleIncrement(Constants::tau()/segments); for(UnsignedInt i = 0; i != count; ++i) { for(UnsignedInt j = 0; j != segments; ++j) { - Rad segmentAngle = Float(j)*segmentAngleIncrement; - positions.emplace_back(base.x()*Math::sin(segmentAngle), base.y(), base.x()*Math::cos(segmentAngle)); - normals.emplace_back(baseNormal.x()*Math::sin(segmentAngle), baseNormal.y(), baseNormal.x()*Math::cos(segmentAngle)); + const Rad segmentAngle = Float(j)*segmentAngleIncrement; + const std::pair segmentSinCos = Math::sincos(segmentAngle); + positions.emplace_back(base.x()*segmentSinCos.first, base.y(), base.x()*segmentSinCos.second); + normals.emplace_back(baseNormal.x()*segmentSinCos.first, baseNormal.y(), baseNormal.x()*segmentSinCos.second); if(textureCoords == TextureCoords::Generate) textureCoords2D.emplace_back(j*1.0f/segments, startTextureCoordsV + i*textureCoordsVIncrement); @@ -146,11 +149,12 @@ void Spheroid::topFaceRing() { } void Spheroid::capVertexRing(Float y, Float textureCoordsV, const Vector3& normal) { - Rad segmentAngleIncrement(Constants::tau()/segments); + const Rad segmentAngleIncrement(Constants::tau()/segments); for(UnsignedInt i = 0; i != segments; ++i) { - Rad segmentAngle = Float(i)*segmentAngleIncrement; - positions.emplace_back(Math::sin(segmentAngle), y, Math::cos(segmentAngle)); + const Rad segmentAngle = Float(i)*segmentAngleIncrement; + const std::pair segmentSinCos = Math::sincos(segmentAngle); + positions.emplace_back(segmentSinCos.first, y, segmentSinCos.second); normals.push_back(normal); if(textureCoords == TextureCoords::Generate) diff --git a/src/Magnum/Primitives/Implementation/WireframeSpheroid.cpp b/src/Magnum/Primitives/Implementation/WireframeSpheroid.cpp index 68a08fa91..64dccafca 100644 --- a/src/Magnum/Primitives/Implementation/WireframeSpheroid.cpp +++ b/src/Magnum/Primitives/Implementation/WireframeSpheroid.cpp @@ -48,11 +48,12 @@ void WireframeSpheroid::bottomHemisphere(const Float endY, const UnsignedInt rin const Rad ringAngleIncrement(Constants::piHalf()/rings); for(UnsignedInt j = 0; j != rings-1; ++j) { const Rad angle = Float(j+1)*ringAngleIncrement; + const std::pair sincos = Math::sincos(angle); - _positions.emplace_back(0.0f, endY - Math::cos(angle), Math::sin(angle)); - _positions.emplace_back(Math::sin(angle), endY - Math::cos(angle), 0.0f); - _positions.emplace_back(0.0f, endY - Math::cos(angle), -Math::sin(angle)); - _positions.emplace_back(-Math::sin(angle), endY - Math::cos(angle), 0.0f); + _positions.emplace_back(0.0f, endY - sincos.second, sincos.first); + _positions.emplace_back(sincos.first, endY - sincos.second, 0.0f); + _positions.emplace_back(0.0f, endY - sincos.second, -sincos.first); + _positions.emplace_back(-sincos.first, endY - sincos.second, 0.0f); /* Connect vertices to next ring */ for(UnsignedInt i = 0; i != 4; ++i) @@ -70,15 +71,16 @@ void WireframeSpheroid::topHemisphere(const Float startY, const UnsignedInt ring const Rad ringAngleIncrement(Constants::piHalf()/rings); for(UnsignedInt j = 0; j != rings-1; ++j) { const Rad angle = Float(j+1)*ringAngleIncrement; + const std::pair sincos = Math::sincos(angle); /* Connect previous hemisphere ring to current vertices */ if(j != 0) for(UnsignedInt i = 0; i != 4; ++i) _indices.insert(_indices.end(), {UnsignedInt(_positions.size())-4+i, UnsignedInt(_positions.size())+i}); - _positions.emplace_back(0.0f, startY + Math::sin(angle), Math::cos(angle)); - _positions.emplace_back(Math::cos(angle), startY + Math::sin(angle), 0.0f); - _positions.emplace_back(0.0f, startY + Math::sin(angle), -Math::cos(angle)); - _positions.emplace_back(-Math::cos(angle), startY + Math::sin(angle), 0.0f); + _positions.emplace_back(0.0f, startY + sincos.first, sincos.second); + _positions.emplace_back(sincos.second, startY + sincos.first, 0.0f); + _positions.emplace_back(0.0f, startY + sincos.first, -sincos.second); + _positions.emplace_back(-sincos.second, startY + sincos.first, 0.0f); } /* Final vertex */ @@ -97,8 +99,9 @@ void WireframeSpheroid::ring(const Float y) { for(UnsignedInt j = 0; j != _segments; ++j) { for(UnsignedInt i = 0; i != 4; ++i) { const Rad segmentAngle = Rad(Float(i)*Constants::piHalf()) + Float(j)*segmentAngleIncrement; + const std::pair sincos = Math::sincos(segmentAngle); if(j != 0) _indices.insert(_indices.end(), {UnsignedInt(_positions.size()-4), UnsignedInt(_positions.size())}); - _positions.emplace_back(Math::sin(segmentAngle), y, Math::cos(segmentAngle)); + _positions.emplace_back(sincos.first, y, sincos.second); } }