#pragma once #include #include "primitive/simple/sphere.hpp" #include "primitive/simple/cylinder.hpp" #include "primitive/simple/cone.hpp" #include "primitive/simple/box.hpp" #include "primitive/extrude/extrude.hpp" #include "primitive/axis/helixline_extrude_axis.hpp" #include "primitive/axis/polyline_extrude_axis.hpp" #include "primitive/pattern/polyline_pattern.hpp" using plane_container_t = flat_object_set; using sphere_container_t = flat_object_set; using cylinder_container_t = flat_object_set; using cone_container_t = flat_object_set; using extrude_side_container_t = flat_object_set; using helixline_axis_container_t = flat_object_set; using polyline_axis_container_t = flat_object_set; using polyline_pattern_container_t = flat_object_set; EXTERN_C struct PE_API primitive_data_center_t { // all other data depend on cached transform_blocks using surface_containers = std::variant; std::array(surface_type::max_count)> surfaces{}; void require_surface(surface_type type, const internal::paired_model_matrix& matrix, std::array additional_structure, marked_subface_ptr_t& subface); void release_surface(surface_type type, const marked_subface_ptr_t& subface); using axis_containers = std::variant; std::array axes{}; internal::extrude_axis* require_axis(axis_type type, const internal::extrude_axis& temp_axis_ptr); void release_axis(axis_type type, const pointer_wrapper& axis); using pattern_containers = std::variant; std::array patterns{}; internal::pattern* require_pattern(pattern_type type, const internal::pattern& temp_pattern_ptr); void release_pattern(pattern_type type, const pointer_wrapper& pattern); }; namespace internal { PE_API primitive* new_primitive(primitive_type type, primitive_data_center_t* data_center_ptr); PE_API primitive* copy_primitive(primitive* ptr); PE_API primitive* new_param_primitive(const void* axis, bool closed_axis, const Eigen::AffineCompact3d& axis_to_world, const void* pattern, primitive_type type, primitive_data_center_t* data_center_ptr); } // namespace internal