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.
222 lines
7.1 KiB
222 lines
7.1 KiB
|
2 days ago
|
#include <iostream>
|
||
|
|
#include <array>
|
||
|
|
#include "io_blobtree.h"
|
||
|
|
#include "io_primitive.h"
|
||
|
|
#include "math/math_defs.hpp"
|
||
|
|
#include "mimalloc.h"
|
||
|
|
#include "primitive_descriptor.h"
|
||
|
|
|
||
|
|
#include <solve.h>
|
||
|
|
|
||
|
|
#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;
|
||
|
|
}
|