#pragma once #include #include "primitive/simple/sphere.hpp" #include "primitive/simple/cylinder.hpp" #include "primitive/simple/extrude.hpp" #include "subface/simple/extrude_polyline_side_face.hpp" #include "subface/simple/extrude_helixline_side_face.hpp" using plane_container_t = flat_object_set_mp; using sphere_container_t = flat_object_set_mp; using cylinder_container_t = flat_object_set_mp; using extrude_polyline_side_container_t = flat_object_set_mp; using extrude_helixline_side_container_t = flat_object_set_mp; using plane_geometry_container_t = flat_object_set_mp; using cylinder_geometry_container_t = flat_object_set_mp; using extrude_polyline_geometry_container_t = flat_object_set_mp; using extrude_helixline_geometry_container_t = flat_object_set_mp; 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{ surface_containers{std::in_place_index<0>, plane_container_t{} }, // plane surface_containers{std::in_place_index<1>, sphere_container_t{} }, // sphere surface_containers{std::in_place_index<2>, cylinder_container_t{} }, // cylinder surface_containers{std::in_place_index<0>, plane_container_t{} }, // cone(占位) surface_containers{std::in_place_index<3>, extrude_polyline_side_container_t{} }, // extrude_poly surface_containers{std::in_place_index<4>, extrude_helixline_side_container_t{}}, // extrude_helix }; struct geometry_containers { plane_geometry_container_t planes{}; cylinder_geometry_container_t cylinders{}; extrude_polyline_geometry_container_t extrude_polyline_geoms{}; extrude_helixline_geometry_container_t extrude_helixline_geoms{}; }geometries; const plane_descriptor_t* acquire_plane_geometry(const void* geometry); void release_plane_geometry(const void* geometry); const cylinder_descriptor_t* acquire_cylinder_geometry(const void* geometry); void release_cylinder_geometry(const void* geometry); const internal::extrude_polyline_geometry_t* acquire_extrude_polyline_geometry(const void* geometry); void release_extrude_polyline_geometry(const void* geometry); const internal::extrude_helixline_geometry_t* acquire_extrude_helixline_geometry(const void* geometry); void release_extrude_helixline_geometry(const void* geometry); void require_surface(surface_type type, const internal::paired_model_matrix& matrix, const void* geometry_ptr, marked_subface_ptr_t& subface); void release_surface(surface_type type, const marked_subface_ptr_t& subface); }; namespace internal { PE_API primitive* new_primitive(primitive_type type, primitive_data_center_t* data_center_ptr); PE_API primitive* copy_primitive(primitive* ptr); } // namespace internal