#pragma once
#include
#include
#include
namespace internal
{
struct extrude_t final : public primitive {
extrude_t(const extrude_axis* axis,
bool closed_axis,
const Eigen::AffineCompact3d& axis_to_world,
const pattern* pattern,
primitive_data_center_t* data_center_ptr)
: primitive(data_center_ptr)
{
paired_model_matrix axis_transform{};
axis_transform.local_to_world = axis_to_world;
axis_transform.world_to_local = axis_to_world.inverse();
// TODO: 修改为更紧密的aabb
auto aabb = axis->get_local_aabb();
aabb.transform(axis_to_world);
auto pattern_max_length = pattern->get_max_bounding_length();
aabb.min().array() -= pattern_max_length;
aabb.max().array() += pattern_max_length;
if (closed_axis)
initialize(
{
make_pointer_wrapper(axis_transform)
},
{{(void*)axis, (void*)pattern}},
aabb);
else {
paired_model_matrix bottom_cap_transform{};
bottom_cap_transform.local_to_world = axis_to_world * axis->get_local_cap_mat(0);
bottom_cap_transform.world_to_local = bottom_cap_transform.local_to_world.inverse();
paired_model_matrix top_cap_transform{};
top_cap_transform.local_to_world = axis_to_world * axis->get_local_cap_mat(1);
top_cap_transform.world_to_local = top_cap_transform.local_to_world.inverse();
initialize(
{
make_pointer_wrapper(axis_transform),
make_pointer_wrapper(bottom_cap_transform),
make_pointer_wrapper(top_cap_transform)
},
{{(void*)axis, (void*)pattern}, {}, {}},
aabb);
}
}
primitive_type get_type() const override { return PRIMITIVE_TYPE_EXTRUDE; };
span> get_subfaces() const override
{
return {const_cast*>(subfaces.data()), subfaces[1] == nullptr ? 1u : 3u};
}
std::vector get_subface_types() const override
{
if (subfaces[1] == nullptr)
return {surface_type::extrude_side};
else
return {surface_type::extrude_side, surface_type::plane, surface_type::plane};
}
std::array, 3> subfaces{nullptr, nullptr, nullptr};
};
} // namespace internal