#pragma once #include #include #include 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