96 lines
4.4 KiB
C
96 lines
4.4 KiB
C
|
|
#pragma once
|
||
|
|
|
||
|
|
// ── 平台导出宏 ──
|
||
|
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||
|
|
#ifdef VDE_BUILDING_DLL
|
||
|
|
#define VDE_API __declspec(dllexport)
|
||
|
|
#else
|
||
|
|
#define VDE_API __declspec(dllimport)
|
||
|
|
#endif
|
||
|
|
#else
|
||
|
|
#define VDE_API __attribute__((visibility("default")))
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#ifdef __cplusplus
|
||
|
|
extern "C" {
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#include <stdint.h>
|
||
|
|
#include <stddef.h>
|
||
|
|
|
||
|
|
// ── 不透明句柄 ──
|
||
|
|
typedef struct VdeContext* VdeHandle;
|
||
|
|
typedef struct VdeMesh* VdeMeshHandle;
|
||
|
|
typedef struct VdeCurve* VdeCurveHandle;
|
||
|
|
typedef struct VdeSurface* VdeSurfaceHandle;
|
||
|
|
typedef struct VdeBVH* VdeBVHHandle;
|
||
|
|
typedef struct VdeSolver* VdeSolverHandle;
|
||
|
|
typedef struct VdeBody* VdeBodyHandle;
|
||
|
|
|
||
|
|
// ── 上下文管理 ──
|
||
|
|
VDE_API VdeHandle vde_create(void);
|
||
|
|
VDE_API void vde_destroy(VdeHandle ctx);
|
||
|
|
VDE_API const char* vde_version(void);
|
||
|
|
VDE_API const char* vde_last_error(VdeHandle ctx);
|
||
|
|
|
||
|
|
// ── I/O ──
|
||
|
|
VDE_API VdeMeshHandle vde_load_mesh(VdeHandle ctx, const char* path);
|
||
|
|
VDE_API int vde_save_mesh(VdeHandle ctx, VdeMeshHandle mesh, const char* path, const char* format);
|
||
|
|
|
||
|
|
// ── Mesh 查询 ──
|
||
|
|
VDE_API size_t vde_mesh_num_vertices(VdeMeshHandle mesh);
|
||
|
|
VDE_API size_t vde_mesh_num_faces(VdeMeshHandle mesh);
|
||
|
|
VDE_API void vde_mesh_get_vertex(VdeMeshHandle mesh, size_t idx, double* out_x, double* out_y, double* out_z);
|
||
|
|
VDE_API void vde_mesh_get_bounds(VdeMeshHandle mesh, double* out_min_x, double* out_min_y, double* out_min_z,
|
||
|
|
double* out_max_x, double* out_max_y, double* out_max_z);
|
||
|
|
VDE_API void vde_mesh_free(VdeMeshHandle mesh);
|
||
|
|
|
||
|
|
// ── Mesh 处理 ──
|
||
|
|
VDE_API VdeMeshHandle vde_mesh_simplify(VdeHandle ctx, VdeMeshHandle mesh, double target_ratio);
|
||
|
|
VDE_API VdeMeshHandle vde_mesh_smooth(VdeHandle ctx, VdeMeshHandle mesh, int iterations);
|
||
|
|
VDE_API VdeMeshHandle vde_mesh_boolean(VdeHandle ctx, VdeMeshHandle a, VdeMeshHandle b, int operation);
|
||
|
|
|
||
|
|
// ── 曲线 ──
|
||
|
|
VDE_API VdeCurveHandle vde_curve_create_bezier(VdeHandle ctx, const double* control_points,
|
||
|
|
int num_points, int dimension);
|
||
|
|
VDE_API void vde_curve_evaluate(VdeCurveHandle curve, double t,
|
||
|
|
double* out_x, double* out_y, double* out_z);
|
||
|
|
VDE_API int vde_curve_degree(VdeCurveHandle curve);
|
||
|
|
VDE_API void vde_curve_free(VdeCurveHandle curve);
|
||
|
|
|
||
|
|
// ── 碰撞检测 ──
|
||
|
|
VDE_API int vde_collision_gjk_spheres(VdeHandle ctx,
|
||
|
|
double cx1, double cy1, double cz1, double r1,
|
||
|
|
double cx2, double cy2, double cz2, double r2);
|
||
|
|
VDE_API int vde_collision_ray_mesh(VdeHandle ctx, VdeMeshHandle mesh,
|
||
|
|
double ox, double oy, double oz,
|
||
|
|
double dx, double dy, double dz,
|
||
|
|
double* out_t, double* out_x, double* out_y, double* out_z);
|
||
|
|
|
||
|
|
// ── 约束求解 ──
|
||
|
|
VDE_API VdeSolverHandle vde_solver_create(void);
|
||
|
|
VDE_API int vde_solver_add_point(VdeSolverHandle solver, double x, double y, int fixed);
|
||
|
|
VDE_API int vde_solver_add_line(VdeSolverHandle solver, int p0, int p1);
|
||
|
|
VDE_API void vde_solver_add_distance_constraint(VdeSolverHandle solver, int p0, int p1, double d);
|
||
|
|
VDE_API void vde_solver_add_horizontal(VdeSolverHandle solver, int line_id);
|
||
|
|
VDE_API void vde_solver_add_vertical(VdeSolverHandle solver, int line_id);
|
||
|
|
VDE_API int vde_solver_solve(VdeSolverHandle solver, int max_iter, double tol);
|
||
|
|
VDE_API void vde_solver_get_point(VdeSolverHandle solver, int idx, double* x, double* y);
|
||
|
|
VDE_API void vde_solver_free(VdeSolverHandle solver);
|
||
|
|
|
||
|
|
// ── B-Rep 建模 ──
|
||
|
|
VDE_API VdeBodyHandle vde_body_create_box(VdeHandle ctx, double w, double h, double d);
|
||
|
|
VDE_API VdeBodyHandle vde_body_create_cylinder(VdeHandle ctx, double r, double h, int segs);
|
||
|
|
VDE_API VdeBodyHandle vde_body_create_sphere(VdeHandle ctx, double r, int su, int sv);
|
||
|
|
VDE_API VdeMeshHandle vde_body_to_mesh(VdeHandle ctx, VdeBodyHandle body, double deflection);
|
||
|
|
VDE_API void vde_body_free(VdeBodyHandle body);
|
||
|
|
|
||
|
|
// ── 序列化 ──
|
||
|
|
VDE_API size_t vde_serialize_mesh(VdeHandle ctx, VdeMeshHandle mesh, uint8_t** out_data);
|
||
|
|
VDE_API VdeMeshHandle vde_deserialize_mesh(VdeHandle ctx, const uint8_t* data, size_t len);
|
||
|
|
VDE_API void vde_free_buffer(uint8_t* data);
|
||
|
|
|
||
|
|
#ifdef __cplusplus
|
||
|
|
}
|
||
|
|
#endif
|