#ifndef MOONLIGHT_TRIANGULATION_H
#define MOONLIGHT_TRIANGULATION_H
#include <stddef.h>
#include <stdint.h>
#if defined(_WIN32)
#define ML_API __declspec(dllexport)
#else
#define ML_API __attribute__((visibility("default")))
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct ml_mesh ml_mesh;
typedef uint32_t ml_status;
typedef uint32_t ml_obstruction_code;
typedef uint32_t ml_coordinate_error;
enum {
ML_STATUS_OK = 0,
ML_STATUS_NULL_POINTER = 1,
ML_STATUS_COUNT_OVERFLOW = 2,
ML_STATUS_BUFFER_TOO_SMALL = 3,
ML_STATUS_BUILD_OBSTRUCTION = 4,
ML_STATUS_RUNTIME_FAILURE = 5
};
enum {
ML_OBSTRUCTION_NONE = 0,
ML_OBSTRUCTION_INVALID_COORDINATE = 1,
ML_OBSTRUCTION_POINT_LOCATION_FAILED = 2,
ML_OBSTRUCTION_LOCATION_WALK_EXHAUSTED = 3,
ML_OBSTRUCTION_REFINEMENT_INPUT_TOPOLOGY_INVALID = 4,
ML_OBSTRUCTION_FRESH_INSERTION_MATCHED_EXISTING_VERTEX = 5,
ML_OBSTRUCTION_DEGENERATE_LINE_ENDPOINT_MISSING_OUTGOING = 6,
ML_OBSTRUCTION_DEGENERATE_LINE_ENDPOINT_TURN_MISSING = 7,
ML_OBSTRUCTION_DEGENERATE_LINE_CONNECTED_VERTEX_MISSING = 8,
ML_OBSTRUCTION_HULL_START_NOT_VISIBLE = 9,
ML_OBSTRUCTION_OUTER_RANGE_DID_NOT_TERMINATE = 10,
ML_OBSTRUCTION_OUTER_RANGE_CONTAINS_INNER_EDGE = 11,
ML_OBSTRUCTION_CONSTRAINED_EDGE_FLIP_REFUSED = 12,
ML_OBSTRUCTION_REMOVAL_VERTEX_OUT_OF_RANGE = 13,
ML_OBSTRUCTION_REMOVAL_EDGE_OUT_OF_RANGE = 14,
ML_OBSTRUCTION_REMOVAL_FACE_OUT_OF_RANGE = 15,
ML_OBSTRUCTION_REMOVAL_FACE_CYCLE_DID_NOT_TERMINATE = 16,
ML_OBSTRUCTION_REMOVAL_EMPTY_TRIANGULATION = 17,
ML_OBSTRUCTION_REMOVAL_TWO_POINT_DEGREE_MISMATCH = 18,
ML_OBSTRUCTION_REMOVAL_COLLINEAR_DEGREE_MISMATCH = 19,
ML_OBSTRUCTION_REMOVAL_BORDER_TOO_SHORT = 20,
ML_OBSTRUCTION_REMOVAL_BORDER_ARITY_MISMATCH = 21,
ML_OBSTRUCTION_REMOVAL_OUTGOING_CYCLE_DID_NOT_TERMINATE = 22,
ML_OBSTRUCTION_CIRCLE_SWEEP_HULL_EMPTY = 23,
ML_OBSTRUCTION_OUTER_CYCLE_DID_NOT_TERMINATE = 24,
ML_OBSTRUCTION_HIERARCHY_LEVEL_POPULATION_MISMATCH = 25,
ML_OBSTRUCTION_HIERARCHY_INSERTION_HANDLE_MISMATCH = 26,
ML_OBSTRUCTION_POINT_INDEX_CAPACITY_EXHAUSTED = 27,
ML_OBSTRUCTION_REFINEMENT_MINIMUM_ANGLE_NOT_FINITE = 28,
ML_OBSTRUCTION_REFINEMENT_MINIMUM_ANGLE_OUT_OF_RANGE = 29,
ML_OBSTRUCTION_REFINEMENT_MINIMUM_ANGLE_DERIVED_RATIO_NOT_FINITE = 30,
ML_OBSTRUCTION_REFINEMENT_MAXIMUM_ADDITIONAL_VERTICES_NEGATIVE = 31,
ML_OBSTRUCTION_REFINEMENT_MINIMUM_AREA_NOT_FINITE = 32,
ML_OBSTRUCTION_REFINEMENT_MINIMUM_AREA_NEGATIVE = 33,
ML_OBSTRUCTION_REFINEMENT_MAXIMUM_AREA_NOT_FINITE = 34,
ML_OBSTRUCTION_REFINEMENT_MAXIMUM_AREA_NOT_POSITIVE = 35,
ML_OBSTRUCTION_REFINEMENT_MAXIMUM_RADIUS_EDGE_RATIO_NOT_FINITE = 36,
ML_OBSTRUCTION_REFINEMENT_MAXIMUM_RADIUS_EDGE_RATIO_NOT_POSITIVE = 37,
ML_OBSTRUCTION_REFINEMENT_MINIMUM_AREA_EXCEEDS_MAXIMUM = 38,
ML_OBSTRUCTION_REFINEMENT_SEED_FACE_NOT_ACTIVE = 39,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_INTERFACE_EDGE_NOT_ACTIVE = 40,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_INTERFACE_MISSING = 41,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_INTERFACE_EXTRANEOUS = 42,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_TOPOLOGY_CHANGED = 43,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_REQUIRES_CONVEX_HULL_PRESERVATION = 44,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_REQUIRES_CONSTRAINT_PRESERVATION = 45,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_FORBIDS_OUTER_FACE_EXCLUSION = 46,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_WOULD_CROSS_INTERFACE = 47,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_WOULD_REWRITE_PROTECTED_FACE = 48,
ML_OBSTRUCTION_REFINEMENT_DOMAIN_PROTECTED_FACE_CHANGED = 49,
ML_OBSTRUCTION_CAPACITY_EXCEEDED = 50,
ML_OBSTRUCTION_HALF_EDGE_CAPACITY_EXCEEDED = 51,
ML_OBSTRUCTION_FACE_CAPACITY_EXCEEDED = 52,
ML_OBSTRUCTION_PAYLOAD_STORAGE_FAILURE = 53,
ML_OBSTRUCTION_COORDINATE_PAYLOAD_COUNT_MISMATCH = 54,
ML_OBSTRUCTION_NULL_POINTER = 100,
ML_OBSTRUCTION_COUNT_OVERFLOW = 101,
ML_OBSTRUCTION_BUFFER_TOO_SMALL = 102,
ML_OBSTRUCTION_RUNTIME_FAILURE = 103
};
enum {
ML_COORDINATE_ERROR_NONE = 0,
ML_COORDINATE_ERROR_NAN = 1,
ML_COORDINATE_ERROR_INFINITE = 2,
ML_COORDINATE_ERROR_TOO_SMALL = 3,
ML_COORDINATE_ERROR_TOO_LARGE = 4
};
typedef struct ml_obstruction {
uint32_t code;
uint32_t coordinate_error;
uint64_t input_index;
uint64_t first_index;
uint64_t second_index;
double first_value;
double second_value;
double point_x;
double point_y;
char message[256];
} ml_obstruction;
ML_API uint32_t ml_abi_version(void);
ML_API ml_status ml_runtime_initialize(void);
ML_API ml_status ml_delaunay_f64(const double *coordinates, size_t point_count, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_insert_many_f64(const ml_mesh *mesh, const double *coordinates, size_t point_count, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_union(const ml_mesh *left, const ml_mesh *right, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_intersection(const ml_mesh *left, const ml_mesh *right, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_difference(const ml_mesh *left, const ml_mesh *right, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_symmetric_difference(const ml_mesh *left, const ml_mesh *right, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_vertex_count(const ml_mesh *mesh, size_t *count, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_triangle_count(const ml_mesh *mesh, size_t *count, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_copy_vertices_f64(const ml_mesh *mesh, double *coordinates, size_t point_capacity, size_t *points_written, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_copy_triangles_u32(const ml_mesh *mesh, uint32_t *triangles, size_t triangle_capacity, size_t *triangles_written, ml_obstruction *obstruction);
ML_API void ml_mesh_free(ml_mesh *mesh);
#ifdef __cplusplus
}
#endif
#endif