#ifndef SPATIAL_CODEC_DRACO_H
#define SPATIAL_CODEC_DRACO_H
#pragma once
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
typedef enum DracoWrapperPcEncodingMethod {
DracoWrapperPointCloudSequentialEncoding = 0,
DracoWrapperPointCloudKdTreeEncoding = 1,
} DracoWrapperPcEncodingMethod;
typedef enum PointCloudEncodingMethod {
Sequential = 0,
KdTree = 1,
} PointCloudEncodingMethod;
typedef enum SpatialDracoStatus {
Ok = 0,
NullPtr = 1,
InvalidInput = 2,
EncodeFailed = 3,
DecodeFailed = 4,
Panic = 255,
} SpatialDracoStatus;
typedef struct DracoWrapperEncodeResult {
bool success;
uintptr_t size;
const uint8_t *data;
char *error_msg;
} DracoWrapperEncodeResult;
typedef struct DracoWrapperEncodeConfig {
uint32_t position_quantization_bits;
uint32_t color_quantization_bits;
uint8_t encoding_speed;
uint8_t decoding_speed;
} DracoWrapperEncodeConfig;
typedef struct DracoWrapperDecodeResult {
bool success;
uintptr_t num_points;
float *coords;
uint8_t *colors;
char *error_msg;
} DracoWrapperDecodeResult;
typedef struct SpatialDracoEncodeConfig {
uint32_t position_quantization_bits;
uint32_t color_quantization_bits;
uint8_t encoding_speed;
uint8_t decoding_speed;
} SpatialDracoEncodeConfig;
typedef struct SpatialDracoBytes {
uint8_t *ptr;
uintptr_t len;
} SpatialDracoBytes;
typedef struct SpatialDracoPointCloudF32Rgb8 {
float *coords;
uint8_t *colors;
uintptr_t num_points;
} SpatialDracoPointCloudF32Rgb8;
extern struct DracoWrapperEncodeResult *draco_wrapper_encode_points_to_draco(const float *coords,
const uint8_t *colors,
uintptr_t num_points,
enum DracoWrapperPcEncodingMethod encoding_method,
const struct DracoWrapperEncodeConfig *config);
extern struct DracoWrapperDecodeResult *draco_wrapper_decode_draco_data(const uint8_t *encoded_data,
uintptr_t encoded_size);
extern void draco_wrapper_free_encode_result(struct DracoWrapperEncodeResult *result);
extern void draco_wrapper_free_decode_result(struct DracoWrapperDecodeResult *result);
enum SpatialDracoStatus spatial_draco_encode_f32_rgb8(const float *coords,
uintptr_t coords_len,
const uint8_t *colors,
uintptr_t colors_len,
enum PointCloudEncodingMethod encoding_method,
const struct SpatialDracoEncodeConfig *config,
struct SpatialDracoBytes *out,
char *err,
uintptr_t err_len);
enum SpatialDracoStatus spatial_draco_decode_f32_rgb8(const uint8_t *data,
uintptr_t len,
struct SpatialDracoPointCloudF32Rgb8 *out,
char *err,
uintptr_t err_len);
void spatial_draco_bytes_free(struct SpatialDracoBytes bytes);
void spatial_draco_point_cloud_free(struct SpatialDracoPointCloudF32Rgb8 pc);
#endif