13#include <lagrange/Mesh.h>
14#include <lagrange/create_mesh.h>
15#include <lagrange/legacy/inline.h>
16#include <lagrange/primitive/generation_utils.h>
17#include <lagrange/subdivision/mesh_subdivision.h>
27template <
typename Scalar>
30template <
typename MeshType>
31typename MeshType::VertexArray generate_vertices(
32 const typename MeshType::Scalar width,
33 const typename MeshType::Scalar height,
34 const typename MeshType::Scalar depth);
36template <
typename MeshType>
37typename MeshType::FacetArray generate_facets();
41template <
typename MeshType>
42std::unique_ptr<MeshType> generate_hexahedron(
43 typename MeshType::Scalar radius,
44 const Eigen::Matrix<typename MeshType::Scalar, 3, 1>& center = {0, 0, 0})
46 using namespace Hexahedron;
48 using VertexArray =
typename MeshType::VertexArray;
49 using FacetArray =
typename MeshType::FacetArray;
50 using Scalar =
typename MeshType::Scalar;
51 using UVArray =
typename MeshType::UVArray;
52 using UVIndices =
typename MeshType::UVIndices;
56 Scalar length = 2.0 / sqrt(3) * radius;
57 VertexArray vertices = generate_vertices<MeshType>(length, length, length);
58 FacetArray facets = generate_facets<MeshType>();
61 if (center.squaredNorm() > TOLERANCE<Scalar>) {
62 vertices.rowwise() += center.transpose();
67 uvs << 0.0, 0.25, 0.25, 0.25, 0.5, 0.25, 0.75, 0.25, 1.0, 0.25, 0.0, 0.5, 0.25, 0.5, 0.5, 0.5,
68 0.75, 0.5, 1.0, 0.5, 0.25, 0.0, 0.5, 0.0, 0.25, 0.75, 0.5, 0.75;
70 UVIndices uv_indices(6, 4);
71 uv_indices << 10, 11, 2, 1, 12, 6, 7, 13, 1, 2, 7, 6, 3, 4, 9, 8, 0, 1, 6, 5, 2, 3, 8, 7;
72 mesh->initialize_uv(uvs, uv_indices);
75 lagrange::set_uniform_semantic_label(*mesh, PrimitiveSemanticLabel::SIDE);
82template <
typename MeshType>
83typename MeshType::VertexArray generate_vertices(
84 const typename MeshType::Scalar width,
85 const typename MeshType::Scalar height,
86 const typename MeshType::Scalar depth)
88 typename MeshType::VertexArray vertices(8, 3);
91 vertices.row(0) << -width, -height, depth;
92 vertices.row(1) << -width, -height, -depth;
93 vertices.row(2) << width, -height, -depth;
94 vertices.row(3) << width, -height, depth;
97 vertices.row(4) << -width, height, depth;
98 vertices.row(5) << width, height, depth;
99 vertices.row(6) << width, height, -depth;
100 vertices.row(7) << -width, height, -depth;
105template <
typename MeshType>
106typename MeshType::FacetArray generate_facets()
108 typename MeshType::FacetArray facets(6, 4);
@ Scalar
Mesh attribute must have exactly 1 channel.
Definition AttributeFwd.h:56
#define la_runtime_assert(...)
Runtime assertion check.
Definition assert.h:174
constexpr auto safe_cast(SourceType value) -> std::enable_if_t<!std::is_same< SourceType, TargetType >::value, TargetType >
Perform safe cast from SourceType to TargetType, where "safe" means:
Definition safe_cast.h:50
Main namespace for Lagrange.
auto create_mesh(const Eigen::MatrixBase< DerivedV > &vertices, const Eigen::MatrixBase< DerivedF > &facets)
This function create a new mesh given the vertex and facet arrays by copying data into the Mesh objec...
Definition create_mesh.h:39