cudaslicer/include/gpu_sdf.h
2026-09-26 14:20:07 +03:00

209 lines
6.1 KiB
C

#ifndef GPU_SDF_H
#define GPU_SDF_H
#ifdef _WIN32
#ifdef GPU_OFFSET_EXPORTS
#define GPU_SDF_API __declspec(dllexport)
#else
#define GPU_SDF_API __declspec(dllimport)
#endif
#else
#define GPU_SDF_API __attribute__((visibility("default")))
#endif
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
#include <stdint.h>
#include "gpu_offset.h"
/**
* @brief CSG Operation Types for GPU SDF combinations
*/
typedef enum {
GPU_SDF_OP_UNION = 0, // A U B: max(d_A, d_B)
GPU_SDF_OP_INTERSECTION = 1, // A ^ B: min(d_A, d_B)
GPU_SDF_OP_DIFFERENCE = 2, // A \ B: min(d_A, -d_B)
GPU_SDF_OP_SMOOTH_UNION = 3, // Smooth union with blend radius k
GPU_SDF_OP_SMOOTH_INTERSECT= 4, // Smooth intersection with blend radius k
GPU_SDF_OP_SMOOTH_DIFF = 5 // Smooth difference with blend radius k
} GpuSdfOp;
/**
* @brief Layer matching policy when operating on two stacks
*/
typedef enum {
GPU_SDF_LAYER_MATCH_A_DOMINANT = 0, // Keep layers matching stack A (resample B at A's Z)
GPU_SDF_LAYER_MATCH_UNION = 1, // Output union of all unique layer Z heights
GPU_SDF_LAYER_MATCH_INTERSECTION = 2 // Output only exact matching layer Z heights
} GpuSdfLayerMatchMode;
/**
* @brief Procedural 3D Infill Pattern Types
*/
typedef enum {
GPU_SDF_INFILL_SOLID = 0,
GPU_SDF_INFILL_GRID = 1,
GPU_SDF_INFILL_GYROID = 2,
GPU_SDF_INFILL_SCHWARZ_P = 3,
GPU_SDF_INFILL_SCHWARZ_D = 4
} GpuSdfInfillPattern;
/**
* @brief Spatial metadata for a 2D/3D GPU Signed Distance Field stack
* All spatial coordinates and pitches are stored in integer micrometers (µm)
*/
typedef struct {
int32_t min_x_um; // Minimum X bound in micrometers (1 µm = 0.001 mm)
int32_t min_y_um; // Minimum Y bound in micrometers
int32_t pitch_um; // Pixel raster pitch in micrometers (e.g. 100 µm = 0.1 mm)
int width; // Grid columns (X)
int height; // Grid rows (Y)
size_t num_layers; // Total number of layers (Z)
} GpuSdfMetadata;
/**
* @brief Opaque handle representing a GPU-resident Signed Distance Field stack.
* Distance values are in millimeters (float):
* d > 0 : Inside the object (positive Euclidean distance to boundary)
* d < 0 : Outside the object (negative Euclidean distance to boundary)
* d = 0 : Exact object boundary
*/
typedef struct GpuSdfStack_T* GpuSdfStackHandle;
/**
* @brief Create an empty GPU SDF stack with given metadata and layer Z heights (in µm).
*/
GPU_SDF_API GpuSdfStackHandle gpu_sdf_create(
const GpuSdfMetadata* meta,
const int32_t* layer_z_heights_um
);
/**
* @brief Create a GPU SDF stack from 3D mesh triangles directly on GPU.
*/
GPU_SDF_API GpuSdfStackHandle gpu_sdf_from_mesh(
const GpuTriangle3D* triangles,
size_t num_triangles,
float min_x, float min_y, float min_z,
float max_x, float max_y, float max_z,
float layer_height_mm,
float first_layer_height_mm,
float pitch_mm,
float pad_mm
);
/**
* @brief Create a GPU SDF stack from raw host binary occupancy masks (0 = background, >0 = object).
*/
GPU_SDF_API GpuSdfStackHandle gpu_sdf_from_masks(
const uint8_t* h_masks,
int width,
int height,
size_t num_layers,
const int32_t* layer_z_heights_um,
int32_t min_x_um,
int32_t min_y_um,
int32_t pitch_um
);
/**
* @brief Clone an existing GPU SDF stack (allocates new GPU memory).
*/
GPU_SDF_API GpuSdfStackHandle gpu_sdf_clone(GpuSdfStackHandle stack);
/**
* @brief Free GPU memory allocated for a GPU SDF stack.
*/
GPU_SDF_API void gpu_sdf_destroy(GpuSdfStackHandle stack);
/**
* @brief Query metadata of a GPU SDF stack.
*/
GPU_SDF_API int gpu_sdf_get_metadata(GpuSdfStackHandle stack, GpuSdfMetadata* out_meta);
/**
* @brief Retrieve layer Z heights in micrometers (copies to host buffer of size num_layers).
*/
GPU_SDF_API int gpu_sdf_get_layer_z_um(GpuSdfStackHandle stack, int32_t* out_z_um);
/**
* @brief Retrieve raw SDF distance data (float mm) copied from GPU to Host.
* Buffer size must be: width * height * num_layers * sizeof(float).
*/
GPU_SDF_API int gpu_sdf_to_host(GpuSdfStackHandle stack, float* h_out_data);
/**
* @brief Get raw GPU device pointer for zero-copy interop (CuPy / PyTorch).
*/
GPU_SDF_API float* gpu_sdf_get_device_ptr(GpuSdfStackHandle stack);
/**
* @brief Get raw GPU device pointer for layer Z heights (int32_t* on device).
*/
GPU_SDF_API int32_t* gpu_sdf_get_device_z_ptr(GpuSdfStackHandle stack);
/**
* @brief Execute a CSG operation between two GPU SDF stacks without host roundtrips.
* Handles spatial bounding box differences and layer Z matching automatically.
*
* @param a First operand stack (GPU)
* @param b Second operand stack (GPU)
* @param op CSG operation (UNION, INTERSECTION, DIFFERENCE, SMOOTH_...)
* @param match_mode Layer Z matching mode
* @param blend_radius_mm Blend radius parameter for smooth operations
* @return GpuSdfStackHandle Resulting stack on GPU (caller must free with gpu_sdf_destroy)
*/
GPU_SDF_API GpuSdfStackHandle gpu_sdf_csg_op(
GpuSdfStackHandle a,
GpuSdfStackHandle b,
GpuSdfOp op,
GpuSdfLayerMatchMode match_mode,
float blend_radius_mm
);
/**
* @brief Apply a constant distance offset (dilation/expansion if delta > 0, inset/erosion if delta < 0).
*/
GPU_SDF_API GpuSdfStackHandle gpu_sdf_offset(
GpuSdfStackHandle stack,
float delta_mm
);
/**
* @brief Apply hollowing / shelling with a given wall thickness.
*/
GPU_SDF_API GpuSdfStackHandle gpu_sdf_shell(
GpuSdfStackHandle stack,
float thickness_mm
);
/**
* @brief Generate a procedural 3D infill pattern intersected with the interior region.
*/
GPU_SDF_API GpuSdfStackHandle gpu_sdf_generate_infill(
GpuSdfStackHandle stack,
GpuSdfInfillPattern pattern,
float cell_size_mm,
float density_ratio,
float wall_offset_mm
);
/**
* @brief Vectorize GPU SDF stack directly to polygon perimeter contours and infill mask.
*/
GPU_SDF_API int gpu_sdf_vectorize(
GpuSdfStackHandle stack,
const GpuOffsetConfig* config,
GpuLayerResult** out_results,
size_t* out_num_layers,
GpuOffsetStats* stats
);
#ifdef __cplusplus
}
#endif
#endif // GPU_SDF_H