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
158 lines
9.0 KiB
|
2 days ago
|
#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;
|
||
|
|
}
|