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.
 
 
 

68 lines
2.6 KiB

#pragma once
#include "io_primitive.h"
EXTERN_C_BEGIN
// forward declartions
struct blobtree_t;
struct baked_blobtree_t;
enum node_operation { UNION_OP, INTERSECTION_OP, DIFFERENCE_OP };
// just used for guards the data range of the iterator
// DO NOT TRY TO MODIFY THIS STRUCTURE MANUALLY
struct node_iterator_t {
void *_, *__, *___;
};
/**
* @brief Creates a new blobtree.
* @return A pointer to the newly created blobtree.
* @note The blobtree just holds some information pointing to each primitive given, but not has the own of the primitives.
*/
API blobtree_t* create_blobtree() noexcept;
API void destroy_blobtree(blobtree_t* blobtree) noexcept;
/**
* @brief Bakes the blobtree into a more efficient structure for solvers.
* @param[in] blobtree The blobtree to bake, which should only hold one tree but a forest of trees.
* @return A pointer to the baked blobtree.
* @note This operation can be time consuming since it involves twice time of depth-first travelsal.
*/
API baked_blobtree_t* bake_blobtree(const blobtree_t* blobtree) noexcept;
API void destroy_baked_blobtree(baked_blobtree_t* baked_blobtree) noexcept;
/**
* @brief Add a primitive node to the blobtree.
* @param[in] blobtree The blobtree to add the node to.
* @param[in] primitive The primitive to add to the blobtree.
* @return The iterator of the newly created node.
*/
API node_iterator_t blobtree_add_primitive_node(blobtree_t* blobtree, primitive* primitive) noexcept;
/**
* @brief Add an operation node to the blobtree.
* @param[in] blobtree The blobtree to add the node to.
* @param[in] lhs The left-hand side node iterator.
* @param[in] rhs The right-hand side node iterator.
* @param[in] op The operation to perform on the two nodes.
* @return The iterator of the newly created node.
* @note This function does not check whether the input nodes are on that blobtree or not.
* It is the user's responsibility to check that.
*/
API node_iterator_t blobtree_add_operation_node(blobtree_t* blobtree,
node_iterator_t lhs,
node_iterator_t rhs,
node_operation op) noexcept;
/**
* @brief remove a node from the blobtree.
* @param[in] blobtree The blobtree to remove the node from.
* @param[in] node The iterator of the node to remove.
* @note This function does not check whether the node is on that blobtree or not.
* It is the user's responsibility to check that.
*/
API void blobtree_remove_node(blobtree_t* blobtree, node_iterator_t node) noexcept;
EXTERN_C_END