Browse Source

Primitives: use Math::sincos() where appropriate.

pull/364/head
Vladimír Vondruš 7 years ago
parent
commit
3967116dee
  1. 10
      src/Magnum/Primitives/Capsule.cpp
  2. 12
      src/Magnum/Primitives/Circle.cpp
  3. 34
      src/Magnum/Primitives/Implementation/Spheroid.cpp
  4. 21
      src/Magnum/Primitives/Implementation/WireframeSpheroid.cpp

10
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<Float, Float> 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<Float, Float> sincos = Math::sincos(angle);
const Float x = sincos.second;
const Float y = sincos.first+halfLength;
positions.insert(positions.end(), {{-x, y}, {x, y}});
}

12
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<Float, Float> 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<Float, Float> 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<Float, Float> 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<Float, Float> sincos = Math::sincos(angle);
positions.emplace_back(sincos.second, sincos.first, 0.0f);
}
return Trade::MeshData3D{MeshPrimitive::LineLoop, {}, {std::move(positions)}, {}, {}, {}, nullptr};

34
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<Float, Float> 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<Float, Float> 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<Float, Float> 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<Float, Float> segmentSinCos = Math::sincos(segmentAngle);
positions.emplace_back(segmentSinCos.first, y, segmentSinCos.second);
normals.push_back(normal);
if(textureCoords == TextureCoords::Generate)

21
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<Float, Float> 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<Float, Float> 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<Float, Float> 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);
}
}

Loading…
Cancel
Save