packages feed

moonlight-triangulation-1.3.0.0: include/moonlight_triangulation.h

#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 struct ml_region ml_region;
typedef struct ml_structuring_element ml_structuring_element;
typedef uint32_t ml_status;
typedef uint32_t ml_obstruction_code;
typedef uint32_t ml_coordinate_error;
typedef uint32_t ml_region_location;
typedef uint32_t ml_minkowski_operation;

enum {
  ML_STATUS_OK = 0,
  ML_STATUS_NULL_POINTER = 1,
  ML_STATUS_COUNT_OVERFLOW = 2,
  ML_STATUS_BUFFER_TOO_SMALL = 3,
  ML_STATUS_GEOMETRY_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_CIRCLE_SWEEP_REQUIRES_DENSE_STORAGE = 55,
  ML_OBSTRUCTION_NULL_POINTER = 100,
  ML_OBSTRUCTION_COUNT_OVERFLOW = 101,
  ML_OBSTRUCTION_BUFFER_TOO_SMALL = 102,
  ML_OBSTRUCTION_RUNTIME_FAILURE = 103,
  ML_OBSTRUCTION_REGION_LAYOUT_INVALID = 200,
  ML_OBSTRUCTION_REGION_VALIDATION_FAILED = 201,
  ML_OBSTRUCTION_OVERLAY_FAILED = 202,
  ML_OBSTRUCTION_REGION_PUBLICATION_FAILED = 203,
  ML_OBSTRUCTION_VALUATION_FAILED = 204,
  ML_OBSTRUCTION_MINKOWSKI_FAILED = 205,
  ML_OBSTRUCTION_REGION_PROJECTION_FAILED = 206
};

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
};

enum {
  ML_REGION_EXTERIOR = 0,
  ML_REGION_BOUNDARY = 1,
  ML_REGION_INTERIOR = 2
};

enum {
  ML_MINKOWSKI_ADDITION = 0,
  ML_MINKOWSKI_EROSION = 1,
  ML_MINKOWSKI_OPENING = 2,
  ML_MINKOWSKI_CLOSING = 3
};

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;

typedef struct ml_minkowski_receipt {
  uint32_t operation;
  uint32_t reserved;
  uint64_t input_components;
  uint64_t convex_pieces;
  uint64_t generated_pieces;
  uint64_t generated_convolution_edges;
  uint64_t overlay_passes;
  uint64_t exact_crossings;
  uint64_t output_cells;
  uint64_t exact_coordinate_bit_growth;
} ml_minkowski_receipt;

ML_API uint32_t ml_abi_version(void);
ML_API ml_status ml_runtime_initialize(void);

/* Immutable Delaunay meshes; these operations combine site sets, not regions. */
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_site_union(const ml_mesh *left, const ml_mesh *right, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_site_intersection(const ml_mesh *left, const ml_mesh *right, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_site_difference(const ml_mesh *left, const ml_mesh *right, ml_mesh **result, ml_obstruction *obstruction);
ML_API ml_status ml_mesh_site_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);

/*
 * Bulk exact-region authoring. loop_point_counts gives the number of points in
 * each loop; component_loop_counts gives the number of loops in each component.
 * Within each component, the first loop is a CCW outer loop and subsequent
 * loops are CW holes.
 */
ML_API ml_status ml_region_create_f64(
  const double *coordinates,
  size_t point_count,
  const size_t *loop_point_counts,
  size_t loop_count,
  const size_t *component_loop_counts,
  size_t component_count,
  ml_region **result,
  ml_obstruction *obstruction
);
ML_API ml_status ml_region_counts(const ml_region *region, size_t *component_count, size_t *loop_count, size_t *point_count, ml_obstruction *obstruction);
/* Capacities count points or offset entries; copied coordinates are a derived binary64 rendering projection. */
ML_API ml_status ml_region_copy_f64(
  const ml_region *region,
  double *coordinates,
  size_t point_capacity,
  size_t *loop_point_offsets,
  size_t loop_offset_capacity,
  size_t *component_loop_offsets,
  size_t component_offset_capacity,
  ml_obstruction *obstruction
);
ML_API ml_status ml_region_union(const ml_region *left, const ml_region *right, ml_region **result, ml_obstruction *obstruction);
ML_API ml_status ml_region_intersection(const ml_region *left, const ml_region *right, ml_region **result, ml_obstruction *obstruction);
ML_API ml_status ml_region_difference(const ml_region *left, const ml_region *right, ml_region **result, ml_obstruction *obstruction);
ML_API ml_status ml_region_symmetric_difference(const ml_region *left, const ml_region *right, ml_region **result, ml_obstruction *obstruction);
ML_API ml_status ml_region_locate_point_f64(const ml_region *region, double x, double y, ml_region_location *location, ml_obstruction *obstruction);
/* area_bytes_written excludes the trailing NUL; area_capacity includes it. */
ML_API ml_status ml_region_measure(
  const ml_region *region,
  int64_t *euler_characteristic,
  char *area_ratio_utf8,
  size_t area_capacity,
  size_t *area_bytes_written,
  double *perimeter_lower,
  double *perimeter_upper,
  ml_obstruction *obstruction
);
ML_API void ml_region_free(ml_region *region);

ML_API ml_status ml_structuring_element_create_f64(const double *coordinates, size_t point_count, ml_structuring_element **result, ml_obstruction *obstruction);
ML_API void ml_structuring_element_free(ml_structuring_element *element);
ML_API ml_status ml_region_minkowski_sum(const ml_region *left, const ml_region *right, ml_region **result, ml_minkowski_receipt *receipt, ml_obstruction *obstruction);
ML_API ml_status ml_region_offset(const ml_structuring_element *element, const ml_region *region, ml_region **result, ml_minkowski_receipt *receipt, ml_obstruction *obstruction);
ML_API ml_status ml_region_inset(const ml_structuring_element *element, const ml_region *region, ml_region **result, ml_minkowski_receipt *receipt, ml_obstruction *obstruction);
ML_API ml_status ml_region_open(const ml_structuring_element *element, const ml_region *region, ml_region **result, ml_minkowski_receipt *receipt, ml_obstruction *obstruction);
ML_API ml_status ml_region_close(const ml_structuring_element *element, const ml_region *region, ml_region **result, ml_minkowski_receipt *receipt, ml_obstruction *obstruction);

#ifdef __cplusplus
}
#endif

#endif