extract explicit mesh with topology information from implicit surfaces with boolean operations, and do surface/volume integrating on them.
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

#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;
}