|
|
|
|
@ -25,45 +25,58 @@
|
|
|
|
|
#include "Icosphere.h" |
|
|
|
|
|
|
|
|
|
#include "Math/Vector3.h" |
|
|
|
|
#include "Trade/MeshData3D.h" |
|
|
|
|
#include "MeshTools/Subdivide.h" |
|
|
|
|
#include "MeshTools/RemoveDuplicates.h" |
|
|
|
|
|
|
|
|
|
namespace Magnum { namespace Primitives { |
|
|
|
|
|
|
|
|
|
Icosphere<0>::Icosphere(): MeshData3D(Mesh::Primitive::Triangles, { |
|
|
|
|
1, 2, 6, |
|
|
|
|
1, 7, 2, |
|
|
|
|
3, 4, 5, |
|
|
|
|
4, 3, 8, |
|
|
|
|
6, 5, 11, |
|
|
|
|
5, 6, 10, |
|
|
|
|
9, 10, 2, |
|
|
|
|
10, 9, 3, |
|
|
|
|
7, 8, 9, |
|
|
|
|
8, 7, 0, |
|
|
|
|
11, 0, 1, |
|
|
|
|
0, 11, 4, |
|
|
|
|
6, 2, 10, |
|
|
|
|
1, 6, 11, |
|
|
|
|
3, 5, 10, |
|
|
|
|
5, 4, 11, |
|
|
|
|
2, 7, 9, |
|
|
|
|
7, 1, 0, |
|
|
|
|
3, 9, 8, |
|
|
|
|
4, 8, 0 |
|
|
|
|
}, {}, {{ |
|
|
|
|
{0.0f, -0.525731f, 0.850651f}, |
|
|
|
|
{0.850651f, 0.0f, 0.525731f}, |
|
|
|
|
{0.850651f, 0.0f, -0.525731f}, |
|
|
|
|
{-0.850651f, 0.0f, -0.525731f}, |
|
|
|
|
{-0.850651f, 0.0f, 0.525731f}, |
|
|
|
|
{-0.525731f, 0.850651f, 0.0f}, |
|
|
|
|
{0.525731f, 0.850651f, 0.0f}, |
|
|
|
|
{0.525731f, -0.850651f, 0.0f}, |
|
|
|
|
{-0.525731f, -0.850651f, 0.0f}, |
|
|
|
|
{0.0f, -0.525731f, -0.850651f}, |
|
|
|
|
{0.0f, 0.525731f, -0.850651f}, |
|
|
|
|
{0.0f, 0.525731f, 0.850651f} |
|
|
|
|
}}, {}) { |
|
|
|
|
positions(0).assign(normals(0).begin(), normals(0).end()); |
|
|
|
|
Trade::MeshData3D Icosphere::solid(const UnsignedInt subdivisions) { |
|
|
|
|
std::vector<UnsignedInt> indices{ |
|
|
|
|
1, 2, 6, |
|
|
|
|
1, 7, 2, |
|
|
|
|
3, 4, 5, |
|
|
|
|
4, 3, 8, |
|
|
|
|
6, 5, 11, |
|
|
|
|
5, 6, 10, |
|
|
|
|
9, 10, 2, |
|
|
|
|
10, 9, 3, |
|
|
|
|
7, 8, 9, |
|
|
|
|
8, 7, 0, |
|
|
|
|
11, 0, 1, |
|
|
|
|
0, 11, 4, |
|
|
|
|
6, 2, 10, |
|
|
|
|
1, 6, 11, |
|
|
|
|
3, 5, 10, |
|
|
|
|
5, 4, 11, |
|
|
|
|
2, 7, 9, |
|
|
|
|
7, 1, 0, |
|
|
|
|
3, 9, 8, |
|
|
|
|
4, 8, 0 |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
std::vector<Vector3> vertices{ |
|
|
|
|
{0.0f, -0.525731f, 0.850651f}, |
|
|
|
|
{0.850651f, 0.0f, 0.525731f}, |
|
|
|
|
{0.850651f, 0.0f, -0.525731f}, |
|
|
|
|
{-0.850651f, 0.0f, -0.525731f}, |
|
|
|
|
{-0.850651f, 0.0f, 0.525731f}, |
|
|
|
|
{-0.525731f, 0.850651f, 0.0f}, |
|
|
|
|
{0.525731f, 0.850651f, 0.0f}, |
|
|
|
|
{0.525731f, -0.850651f, 0.0f}, |
|
|
|
|
{-0.525731f, -0.850651f, 0.0f}, |
|
|
|
|
{0.0f, -0.525731f, -0.850651f}, |
|
|
|
|
{0.0f, 0.525731f, -0.850651f}, |
|
|
|
|
{0.0f, 0.525731f, 0.850651f} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
for(std::size_t i = 0; i != subdivisions; ++i) |
|
|
|
|
MeshTools::subdivide(indices, vertices, [](const Vector3& a, const Vector3& b) { |
|
|
|
|
return (a+b).normalized(); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
MeshTools::removeDuplicates(indices, vertices); |
|
|
|
|
return Trade::MeshData3D(Mesh::Primitive::Triangles, std::move(indices), {vertices}, {std::move(vertices)}, {}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
}} |
|
|
|
|
|