You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

158 lines
9.0 KiB

#include <iostream>
#include <array>
#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 <solve.h>
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;
}