|
|
|
#include <internal_api.hpp>
|
|
|
|
|
|
|
|
#include <io.h>
|
|
|
|
|
|
|
|
EXTERN_C_BEGIN
|
|
|
|
|
|
|
|
API void free_blobtree() { clear_blobtree(); }
|
|
|
|
|
|
|
|
API virtual_node_t blobtree_new_node_by_copy(const copyable_descriptor_t desc, primitive_type type)
|
|
|
|
{
|
|
|
|
legal_primitive_descriptor_t temp_desc;
|
|
|
|
|
|
|
|
#define CASE_OPERATION(type, type_enum) \
|
|
|
|
case type_enum: temp_desc.emplace<type>(*(const type*)desc.desc); break
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
CASE_OPERATION(constant_descriptor_t, PRIMITIVE_TYPE_CONSTANT);
|
|
|
|
CASE_OPERATION(plane_descriptor_t, PRIMITIVE_TYPE_PLANE);
|
|
|
|
CASE_OPERATION(sphere_descriptor_t, PRIMITIVE_TYPE_SPHERE);
|
|
|
|
CASE_OPERATION(cylinder_descriptor_t, PRIMITIVE_TYPE_CYLINDER);
|
|
|
|
CASE_OPERATION(cone_descriptor_t, PRIMITIVE_TYPE_CONE);
|
|
|
|
CASE_OPERATION(box_descriptor_t, PRIMITIVE_TYPE_BOX);
|
|
|
|
CASE_OPERATION(mesh_descriptor_t, PRIMITIVE_TYPE_MESH);
|
|
|
|
CASE_OPERATION(extrude_polyline_descriptor_t, PRIMITIVE_TYPE_EXTRUDE_POLYLINE);
|
|
|
|
CASE_OPERATION(extrude_helixline_descriptor_t, PRIMITIVE_TYPE_EXTRUDE_HELIXLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef CASE_OPERATION
|
|
|
|
|
|
|
|
return blobtree_new_virtual_node(temp_desc);
|
|
|
|
}
|
|
|
|
|
|
|
|
API virtual_node_t blobtree_new_node_by_move(const movable_descriptor_t desc, primitive_type type)
|
|
|
|
{
|
|
|
|
legal_primitive_descriptor_t temp_desc;
|
|
|
|
|
|
|
|
#define CASE_OPERATION(type, type_enum) \
|
|
|
|
case type_enum: temp_desc.emplace<type>(std::move(*(const type*)desc.desc)); break
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
CASE_OPERATION(constant_descriptor_t, PRIMITIVE_TYPE_CONSTANT);
|
|
|
|
CASE_OPERATION(plane_descriptor_t, PRIMITIVE_TYPE_PLANE);
|
|
|
|
CASE_OPERATION(sphere_descriptor_t, PRIMITIVE_TYPE_SPHERE);
|
|
|
|
CASE_OPERATION(cylinder_descriptor_t, PRIMITIVE_TYPE_CYLINDER);
|
|
|
|
CASE_OPERATION(cone_descriptor_t, PRIMITIVE_TYPE_CONE);
|
|
|
|
CASE_OPERATION(box_descriptor_t, PRIMITIVE_TYPE_BOX);
|
|
|
|
CASE_OPERATION(mesh_descriptor_t, PRIMITIVE_TYPE_MESH);
|
|
|
|
CASE_OPERATION(extrude_polyline_descriptor_t, PRIMITIVE_TYPE_EXTRUDE_POLYLINE);
|
|
|
|
CASE_OPERATION(extrude_helixline_descriptor_t, PRIMITIVE_TYPE_EXTRUDE_HELIXLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef CASE_OPERATION
|
|
|
|
|
|
|
|
return blobtree_new_virtual_node(std::move(temp_desc));
|
|
|
|
}
|
|
|
|
|
|
|
|
API void virtual_node_boolean_union(virtual_node_t* node1, const virtual_node_t* node2)
|
|
|
|
{
|
|
|
|
virtual_node_boolean_union(*node1, *node2);
|
|
|
|
}
|
|
|
|
|
|
|
|
API void virtual_node_boolean_intersect(virtual_node_t* node1, const virtual_node_t* node2)
|
|
|
|
{
|
|
|
|
virtual_node_boolean_intersect(*node1, *node2);
|
|
|
|
}
|
|
|
|
|
|
|
|
API void virtual_node_boolean_difference(virtual_node_t* node1, const virtual_node_t* node2)
|
|
|
|
{
|
|
|
|
virtual_node_boolean_difference(*node1, *node2);
|
|
|
|
}
|
|
|
|
|
|
|
|
API void virtual_node_offset(virtual_node_t* node, const raw_vector3d_t& direction, const double length)
|
|
|
|
{
|
|
|
|
virtual_node_offset(*node, direction, length);
|
|
|
|
}
|
|
|
|
|
|
|
|
API void virtual_node_offset_directly(virtual_node_t* node, const raw_vector3d_t& offset)
|
|
|
|
{
|
|
|
|
virtual_node_offset(*node, offset);
|
|
|
|
}
|
|
|
|
|
|
|
|
API void virtual_node_split(virtual_node_t* node, raw_vector3d_t base_point, raw_vector3d_t normal)
|
|
|
|
{
|
|
|
|
virtual_node_split(*node, base_point, normal);
|
|
|
|
}
|
|
|
|
|
|
|
|
API bool virtual_node_set_parent(const virtual_node_t* node, const virtual_node_t* parent)
|
|
|
|
{
|
|
|
|
return virtual_node_set_parent(*node, *parent);
|
|
|
|
}
|
|
|
|
|
|
|
|
API bool virtual_node_set_left_child(const virtual_node_t* node, const virtual_node_t* child)
|
|
|
|
{
|
|
|
|
return virtual_node_set_left_child(*node, *child);
|
|
|
|
}
|
|
|
|
|
|
|
|
API bool virtual_node_set_right_child(const virtual_node_t* node, const virtual_node_t* child)
|
|
|
|
{
|
|
|
|
return virtual_node_set_right_child(*node, *child);
|
|
|
|
}
|
|
|
|
|
|
|
|
API bool virtual_node_add_child(const virtual_node_t* node, const virtual_node_t* child)
|
|
|
|
{
|
|
|
|
return virtual_node_add_child(*node, *child);
|
|
|
|
}
|
|
|
|
|
|
|
|
API bool virtual_node_remove_child(const virtual_node_t* node, const virtual_node_t* child)
|
|
|
|
{
|
|
|
|
return virtual_node_remove_child(*node, *child);
|
|
|
|
}
|
|
|
|
|
|
|
|
API bool virtual_node_replace_primitive_by_copy(const virtual_node_t* node,
|
|
|
|
const copyable_descriptor_t desc,
|
|
|
|
primitive_type type)
|
|
|
|
{
|
|
|
|
legal_primitive_descriptor_t temp_desc;
|
|
|
|
|
|
|
|
#define CASE_OPERATION(type, type_enum) \
|
|
|
|
case type_enum: temp_desc.emplace<type>(*(const type*)desc.desc); break
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
CASE_OPERATION(constant_descriptor_t, PRIMITIVE_TYPE_CONSTANT);
|
|
|
|
CASE_OPERATION(plane_descriptor_t, PRIMITIVE_TYPE_PLANE);
|
|
|
|
CASE_OPERATION(sphere_descriptor_t, PRIMITIVE_TYPE_SPHERE);
|
|
|
|
CASE_OPERATION(cylinder_descriptor_t, PRIMITIVE_TYPE_CYLINDER);
|
|
|
|
CASE_OPERATION(cone_descriptor_t, PRIMITIVE_TYPE_CONE);
|
|
|
|
CASE_OPERATION(box_descriptor_t, PRIMITIVE_TYPE_BOX);
|
|
|
|
CASE_OPERATION(mesh_descriptor_t, PRIMITIVE_TYPE_MESH);
|
|
|
|
CASE_OPERATION(extrude_polyline_descriptor_t, PRIMITIVE_TYPE_EXTRUDE_POLYLINE);
|
|
|
|
CASE_OPERATION(extrude_helixline_descriptor_t, PRIMITIVE_TYPE_EXTRUDE_HELIXLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef CASE_OPERATION
|
|
|
|
|
|
|
|
return virtual_node_replace_primitive(*node, temp_desc);
|
|
|
|
}
|
|
|
|
|
|
|
|
API bool virtual_node_replace_primitive_by_move(const virtual_node_t* node,
|
|
|
|
const movable_descriptor_t desc,
|
|
|
|
primitive_type type)
|
|
|
|
{
|
|
|
|
legal_primitive_descriptor_t temp_desc;
|
|
|
|
|
|
|
|
#define CASE_OPERATION(type, type_enum) \
|
|
|
|
case type_enum: temp_desc.emplace<type>(std::move(*(const type*)desc.desc)); break
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
CASE_OPERATION(constant_descriptor_t, PRIMITIVE_TYPE_CONSTANT);
|
|
|
|
CASE_OPERATION(plane_descriptor_t, PRIMITIVE_TYPE_PLANE);
|
|
|
|
CASE_OPERATION(sphere_descriptor_t, PRIMITIVE_TYPE_SPHERE);
|
|
|
|
CASE_OPERATION(cylinder_descriptor_t, PRIMITIVE_TYPE_CYLINDER);
|
|
|
|
CASE_OPERATION(cone_descriptor_t, PRIMITIVE_TYPE_CONE);
|
|
|
|
CASE_OPERATION(box_descriptor_t, PRIMITIVE_TYPE_BOX);
|
|
|
|
CASE_OPERATION(mesh_descriptor_t, PRIMITIVE_TYPE_MESH);
|
|
|
|
CASE_OPERATION(extrude_polyline_descriptor_t, PRIMITIVE_TYPE_EXTRUDE_POLYLINE);
|
|
|
|
CASE_OPERATION(extrude_helixline_descriptor_t, PRIMITIVE_TYPE_EXTRUDE_HELIXLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef CASE_OPERATION
|
|
|
|
|
|
|
|
return virtual_node_replace_primitive(*node, std::move(temp_desc));
|
|
|
|
}
|
|
|
|
|
|
|
|
EXTERN_C_END
|