#include #include #include "io_blobtree.h" #include "io_primitive.h" #include "math/math_defs.hpp" #include "mimalloc.h" #include "primitive_descriptor.h" #include #define CONCAT(a, b) a ## b #define CONCAT_INDIRECT(a, b) CONCAT(a, b) #define INC_1 2 #define INC_2 3 #define INC_3 4 #define INC_4 5 #define INC_5 6 #define INC_6 7 #define INC_7 8 #define INC_8 9 #define INC_9 10 #define INC_10 11 #define INC_11 12 #define INC_12 13 #define INC_13 14 #define INC_14 15 #define INC_15 16 #define INC_16 17 #define INC_17 18 #define INC_18 19 #define INC_19 20 #define INC_20 21 #define INC_21 22 #define INC_22 23 #define INC_23 24 #define INC_24 25 #define INC_25 26 #define INC_26 27 #define INC_27 28 #define INC_28 29 #define INC_29 30 #define INC_30 31 #define INC_31 32 #define ADD2_1 3 #define ADD2_2 4 #define ADD2_3 5 #define ADD2_4 6 #define ADD2_5 7 #define ADD2_6 8 #define ADD2_7 9 #define ADD2_8 10 #define ADD2_9 11 #define ADD2_10 12 #define ADD2_11 13 #define ADD2_12 14 #define ADD2_13 15 #define ADD2_14 16 #define ADD2_15 17 #define ADD2_16 18 #define ADD2_17 19 #define ADD2_18 20 #define ADD2_19 21 #define ADD2_20 22 #define ADD2_21 23 #define ADD2_22 24 #define ADD2_23 25 #define ADD2_24 26 #define ADD2_25 27 #define ADD2_26 28 #define ADD2_27 29 #define ADD2_28 30 #define ADD2_29 31 #define ADD2_30 32 #define ADD2_31 33 #define INC(x) CONCAT_INDIRECT(INC_, x) #define ADD2(x) CONCAT_INDIRECT(ADD2_, x) #define tree_add_primitive(num, prim) \ auto CONCAT_INDIRECT(node_iter, num) = blobtree_add_primitive_node(runtime_blobtree, prim); #define tree_add_op(num, op) \ auto CONCAT_INDIRECT(node_iter, ADD2(num)) = blobtree_add_operation_node( \ runtime_blobtree, CONCAT_INDIRECT(node_iter, num), CONCAT_INDIRECT(node_iter, INC(num)), op); int main() { mi_version(); auto primitive_data_center = create_primitive_data_center(); auto c1 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c1, {3, 3, 16}); auto c2 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c2, {4, 4, 12}); primitive_apply_translation(c2, {0, 0, 2}); auto c3 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c3, {4, 4, 10}); primitive_apply_rotation(c3, {0, sqrt_2 / 2, 0, sqrt_2 / 2}); primitive_apply_translation(c3, {-4, 0, 8}); auto c4 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c4, {2, 2, 6}); primitive_apply_rotation(c4, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(c4, {0, 0, 8}); auto c5 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c5, {3, 3, 10}); primitive_apply_rotation(c5, {0, sqrt_2 / 2, 0, sqrt_2 / 2}); primitive_apply_translation(c5, {-2, 0, 8}); auto c6 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c6, {3, 3, 2}); primitive_apply_rotation(c6, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(c6, {0, 6, 8}); auto c7 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_rotation(c7, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(c7, {2.5, 7, 10.5}); auto c8 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_rotation(c8, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(c8, {-2.5, 7, 5.5}); auto c9 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_rotation(c9, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(c9, {-2.5, 7, 10.5}); auto c10 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_rotation(c10, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(c10, {2.5, 7, 5.5}); auto c11 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c11, {2, 2, 1}); primitive_apply_rotation(c11, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(c11, {0, 7, 8}); auto c12 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c12, {1, 1, 4}); primitive_apply_rotation(c12, {-sqrt_2 / 2, 0, 0, sqrt_2 / 2}); primitive_apply_translation(c12, {0, 7, 8}); auto c13 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c13, {1, 1, 16}); auto c14 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c14, {2, 2, 3}); auto c15 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c15, {2, 2, 3}); primitive_apply_translation(c15, {0, 0, 13}); auto c16 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c16, {1, 1, 8}); primitive_apply_rotation(c16, {0, sqrt_2 / 2, 0, sqrt_2 / 2}); primitive_apply_translation(c16, {0, 0, 8}); auto c17 = create_primitive(primitive_data_center, PRIMITIVE_TYPE_CYLINDER); primitive_apply_scale(c17, {2, 2, 3}); primitive_apply_rotation(c17, {0, sqrt_2 / 2, 0, sqrt_2 / 2}); primitive_apply_translation(c17, {5, 0, 8}); std::cout << "primitive created..." << std::endl; auto runtime_blobtree = create_blobtree(); tree_add_primitive(1, c1); tree_add_primitive(2, c2); tree_add_op(1, UNION_OP); tree_add_primitive(4, c3); tree_add_op(3, UNION_OP); tree_add_primitive(6, c4); tree_add_op(5, UNION_OP); tree_add_primitive(8, c5); tree_add_op(7, UNION_OP); tree_add_primitive(10, c6); tree_add_op(9, UNION_OP); tree_add_primitive(12, c7); tree_add_op(11, UNION_OP); tree_add_primitive(14, c8); tree_add_op(13, UNION_OP); tree_add_primitive(16, c9); tree_add_op(15, UNION_OP); tree_add_primitive(18, c10); tree_add_op(17, UNION_OP); tree_add_primitive(20, c11); tree_add_op(19, DIFFERENCE_OP); tree_add_primitive(22, c12); tree_add_op(21, UNION_OP); tree_add_primitive(24, c13); tree_add_op(23, DIFFERENCE_OP); tree_add_primitive(26, c14); tree_add_op(25, DIFFERENCE_OP); tree_add_primitive(28, c15); tree_add_op(27, DIFFERENCE_OP); tree_add_primitive(30, c16); tree_add_op(29, DIFFERENCE_OP); tree_add_primitive(32, c17); tree_add_op(31, 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_data_center(primitive_data_center); return 0; }