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.

79 lines
3.2 KiB

#pragma once
#include <macros.h>
#include <math/math_defs.h>
#include <primitive_descriptor.h>
EXTERN_C_BEGIN
// forward declaration
struct primitive;
struct primitive_data_center_t;
/**
* @brief Create a new primitive data center to hold all data of primitives
* @return A pointer to the primitive data center
*/
API primitive_data_center_t* create_primitive_data_center() noexcept;
/**
* @brief Destroy the primitive data center and collect all primitives' data in it
* @param[in] data_center The pointer to the primitive data center
* @note This function will free all the data in the primitive data center, including the primitive data itself.
*/
API void destroy_primitive_data_center(primitive_data_center_t* data_center) noexcept;
/**
* @brief Create a new identity primitive
* @param[in] data_center The pointer to the primitive data center which will hold the data of new primitive
* @param[in] type The type of the primitive, which is used to determine the shape of the primitive
* @return A pointer to the new primitive
* @note This function will create a new primitive which has the same shape under local and world coord system. Detailly, for
* each type of primitive:
* - sphere: Centered at the origin with radius 1.0
*/
API primitive* create_primitive(void* data_center, primitive_type type);
/**
* @brief Destroy a primitive
* @param[in] primitive_ptr The pointer to the primitive
*/
API void destroy_primitive(primitive* primitive_ptr);
/**
* @brief Apply a scale to a valid primitive
* @param[in] primitive_ptr The pointer to the primitive
* @param[in] scale The scale vector, each component is the scale factor along the corresponding axis
* @note During this function call, the primitive may be changed to a new one, so the pointer to the primitive may be changed or
* invalidated
*/
API void primitive_apply_scale(primitive* primitive_ptr, vector3d scale);
/**
* @brief Apply a rotation to a valid primitive
* @param[in] primitive_ptr The pointer to the primitive
* @param[in] quaternion The quaternion representing the rotation
* @note During this function call, the primitive may be changed to a new one, so the pointer to the primitive may be changed or
* invalidated
* @note The quaternion should be normalized, otherwise the result may be unexpected
*/
API void primitive_apply_rotation(primitive* primitive_ptr, vector4d quaternion);
/**
* @brief Apply a translation to a valid primitive
* @param[in] primitive_ptr The pointer to the primitive
* @param[in] translation The translation vector, each component is the translation along the corresponding axis
* @note During this function call, the primitive may be changed to a new one, so the pointer to the primitive may be changed or
*/
API void primitive_apply_translation(primitive* primitive_ptr, vector3d translation);
/**
* @brief Duplicate a primitive
* @param[in] primitive_ptr The pointer to the primitive
* @return A new pointer to the duplicated primitive, which is a new object in the memory
* @note The duplicated primitive initially has the same subface pointers, but after transformations they may be changed
*/
API primitive* duplicate_primitive(const primitive* primitive_ptr);
EXTERN_C_END