#include #include #include "data/data_type.hpp" #include "io_blobtree.h" #include "io_primitive.h" #include "mimalloc.h" #include "primitive/simple/box.hpp" #include "primitive_descriptor.h" #include int main() { mi_version(); helixline_axis_descriptor_t axis_desc{}; axis_desc.axis_start = {0, 0, 0}; axis_desc.axis_end = {0, 0, 1}; axis_desc.is_righthanded = true; axis_desc.radius = 1.; axis_desc.advance_per_round = .5; axis_desc.start_direction = {1, 0, 0}; polyline_pattern_descriptor_t pattern_desc{}; pattern_desc.anchor = {0, 0}; std::vector points{ vector2d{-.8, 0}, vector2d{.8, 0}, vector2d{-.8, 0} }; pattern_desc.point_number = 3; pattern_desc.points = points.data(); std::vector bulges{1., 1.}; pattern_desc.bulge_number = 2; pattern_desc.bulges = bulges.data(); auto primitive_data_center = create_primitive_data_center(); auto main_cylinder = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(main_cylinder, {8, 8, 30}); auto input_cylinder1 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(input_cylinder1, {4, 4, 52}); primitive_apply_translation(input_cylinder1, {0, 0, 30}); auto input_cylinder2 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(input_cylinder2, {6, 6, 4}); primitive_apply_translation(input_cylinder2, {0, 0, 31}); auto input_cylinder3 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(input_cylinder3, {6, 6, 4}); primitive_apply_translation(input_cylinder3, {0, 0, 37}); auto input_cylinder4 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(input_cylinder4, {5, 5, 2}); primitive_apply_translation(input_cylinder4, {0, 0, 41.5}); auto input_cylinder5 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(input_cylinder5, {5, 5, 2}); primitive_apply_translation(input_cylinder5, {0, 0, 44}); auto input_cylinder6 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(input_cylinder6, {5, 5, 15}); primitive_apply_translation(input_cylinder6, {0, 0, 46.5}); auto output_cylinder1 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(output_cylinder1, {5, 5, 30}); primitive_apply_translation(output_cylinder1, {0, 0, -30}); auto output_cylinder2 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(output_cylinder2, {6, 6, 4}); primitive_apply_translation(output_cylinder2, {0, 0, -4}); auto output_cylinder3 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(output_cylinder3, {6, 6, 24}); primitive_apply_translation(output_cylinder3, {0, 0, -30}); auto output_cylinder4 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(output_cylinder4, {7, 7, 1}); primitive_apply_translation(output_cylinder4, {0, 0, -31}); auto output_cylinder5 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(output_cylinder5, {9, 9, 4}); primitive_apply_translation(output_cylinder5, {0, 0, -35}); auto inner_cylinder = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(inner_cylinder, {3, 3, 52}); primitive_apply_translation(inner_cylinder, {0, 0, 30}); auto key1 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(key1, {1, 10, 5}); primitive_apply_rotation(key1, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(key1, {0, 0, 72}); auto key2 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(key2, {1, 13, 5}); primitive_apply_rotation(key2, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(key2, {0, 5, 14}); auto hole1 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_SPHERE); primitive_apply_scale(hole1, {1.5, 1.5, 1.5}); primitive_apply_rotation(hole1, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(hole1, {0, 5.5, 32.5}); auto hole2 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_SPHERE); primitive_apply_scale(hole2, {1.5, 1.5, 1.5}); primitive_apply_rotation(hole2, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(hole2, {-5.5, 0, 32.5}); // auto circle_pattern = create_pattern(primitive_data_center, &pattern_desc, PATTERN_TYPE_POLYLINE); // auto righthand_axis = create_extrude_axis(primitive_data_center, &axis_desc, AXIS_TYPE_EXTRUDE_HELIXLINE); // auto helix1 = create_param_primitive(&righthand_axis, &circle_pattern, primitive_data_center, PRIMITIVE_TYPE_EXTRUDE); std::cout << "primitive created..." << std::endl; auto runtime_blobtree = create_blobtree(); auto node_iter1 = blobtree_add_primitive_node(runtime_blobtree, main_cylinder); auto node_iter2 = blobtree_add_primitive_node(runtime_blobtree, input_cylinder1); auto node_iter3 = blobtree_add_operation_node(runtime_blobtree, node_iter1, node_iter2, UNION_OP); auto node_iter4 = blobtree_add_primitive_node(runtime_blobtree, input_cylinder2); auto node_iter5 = blobtree_add_primitive_node(runtime_blobtree, input_cylinder3); auto node_iter6 = blobtree_add_operation_node(runtime_blobtree, node_iter3, node_iter4, UNION_OP); auto node_iter7 = blobtree_add_operation_node(runtime_blobtree, node_iter6, node_iter5, UNION_OP); auto node_iter8 = blobtree_add_primitive_node(runtime_blobtree, input_cylinder4); auto node_iter9 = blobtree_add_operation_node(runtime_blobtree, node_iter8, node_iter7, UNION_OP); auto node_iter10 = blobtree_add_primitive_node(runtime_blobtree, input_cylinder5); auto node_iter11 = blobtree_add_operation_node(runtime_blobtree, node_iter9, node_iter10, UNION_OP); auto node_iter12 = blobtree_add_primitive_node(runtime_blobtree, input_cylinder6); auto node_iter13 = blobtree_add_operation_node(runtime_blobtree, node_iter11, node_iter12, UNION_OP); auto node_iter14 = blobtree_add_primitive_node(runtime_blobtree, output_cylinder1); auto node_iter15 = blobtree_add_operation_node(runtime_blobtree, node_iter13, node_iter14, UNION_OP); auto node_iter16 = blobtree_add_primitive_node(runtime_blobtree, output_cylinder2); auto node_iter17 = blobtree_add_operation_node(runtime_blobtree, node_iter15, node_iter16, UNION_OP); auto node_iter18 = blobtree_add_primitive_node(runtime_blobtree, output_cylinder3); auto node_iter19 = blobtree_add_operation_node(runtime_blobtree, node_iter17, node_iter18, UNION_OP); auto node_iter20 = blobtree_add_primitive_node(runtime_blobtree, output_cylinder4); auto node_iter21 = blobtree_add_operation_node(runtime_blobtree, node_iter19, node_iter20, UNION_OP); auto node_iter22 = blobtree_add_primitive_node(runtime_blobtree, output_cylinder5); auto node_iter23 = blobtree_add_operation_node(runtime_blobtree, node_iter21, node_iter22, UNION_OP); auto node_iter24 = blobtree_add_primitive_node(runtime_blobtree, inner_cylinder); auto node_iter25 = blobtree_add_operation_node(runtime_blobtree, node_iter23, node_iter24, DIFFERENCE_OP); auto node_iter26 = blobtree_add_primitive_node(runtime_blobtree, key1); auto node_iter27 = blobtree_add_operation_node(runtime_blobtree, node_iter25, node_iter26, DIFFERENCE_OP); auto node_iter28 = blobtree_add_primitive_node(runtime_blobtree, key2); auto node_iter29 = blobtree_add_operation_node(runtime_blobtree, node_iter27, node_iter28, UNION_OP); auto node_iter30 = blobtree_add_primitive_node(runtime_blobtree, hole1); auto node_iter31 = blobtree_add_operation_node(runtime_blobtree, node_iter29, node_iter30, DIFFERENCE_OP); auto node_iter32 = blobtree_add_primitive_node(runtime_blobtree, hole2); auto node_iter33 = blobtree_add_operation_node(runtime_blobtree, node_iter31, node_iter32, DIFFERENCE_OP); auto baked_blobtree = bake_blobtree(runtime_blobtree); destroy_blobtree(runtime_blobtree); std::cout << "blobtree created..." << std::endl; s_settings settings{}; settings.resolution = 63; settings.scene_aabb_margin = 1e-5; settings.restricted_primitive_bounding_test = true; settings.integrand_density = 32; auto solver = create_solver(baked_blobtree, settings); auto result = generate_polymesh(solver); print_statistics(solver); destroy_solver(solver); destroy_baked_blobtree(baked_blobtree); // destroy_primitive(main_sphere); destroy_primitive_data_center(primitive_data_center); return 0; }