#pragma once
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#define FOLDIT_PLUGIN_ABI_VERSION 7
enum FolditPluginAssemblyPayloadKind
#ifdef __cplusplus
: uint8_t
#endif {
FOLDIT_PLUGIN_ASSEMBLY_PAYLOAD_KIND_FULL = 0,
FOLDIT_PLUGIN_ASSEMBLY_PAYLOAD_KIND_DELTA = 1,
};
#ifndef __cplusplus
typedef uint8_t FolditPluginAssemblyPayloadKind;
#endif
enum FolditPluginStatus
#ifdef __cplusplus
: uint32_t
#endif {
FOLDIT_PLUGIN_STATUS_OK = 0,
FOLDIT_PLUGIN_STATUS_ERR = 1,
FOLDIT_PLUGIN_STATUS_UNSUPPORTED = 2,
};
#ifndef __cplusplus
typedef uint32_t FolditPluginStatus;
#endif
enum FolditPluginParamTag
#ifdef __cplusplus
: uint32_t
#endif {
FOLDIT_PLUGIN_PARAM_TAG_UNSPECIFIED = 0,
FOLDIT_PLUGIN_PARAM_TAG_INT = 1,
FOLDIT_PLUGIN_PARAM_TAG_FLOAT = 2,
FOLDIT_PLUGIN_PARAM_TAG_BOOL = 3,
FOLDIT_PLUGIN_PARAM_TAG_STRING = 4,
FOLDIT_PLUGIN_PARAM_TAG_VEC3 = 5,
};
#ifndef __cplusplus
typedef uint32_t FolditPluginParamTag;
#endif
typedef struct FolditPluginBuffer {
uint8_t *data;
size_t len;
size_t capacity;
} FolditPluginBuffer;
typedef struct FolditPluginError {
struct FolditPluginBuffer code;
struct FolditPluginBuffer message;
} FolditPluginError;
typedef struct FolditPluginVec3 {
float x;
float y;
float z;
} FolditPluginVec3;
typedef struct FolditPluginResidueRef {
uint64_t entity_id;
uint32_t residue_index;
uint32_t padding;
} FolditPluginResidueRef;
typedef struct FolditPluginDispatchContext {
uint8_t has_focused_entity;
uint8_t padding[7];
uint64_t focused_entity_id;
const struct FolditPluginResidueRef *selection;
size_t selection_len;
const struct FolditPluginResidueRef *designable;
size_t designable_len;
} FolditPluginDispatchContext;
typedef struct FolditPluginParamValue {
FolditPluginParamTag tag;
uint32_t padding;
int32_t int_value;
float float_value;
uint8_t bool_value;
uint8_t padding2[7];
const uint8_t *string_data;
size_t string_len;
struct FolditPluginVec3 vec3_value;
} FolditPluginParamValue;
typedef struct FolditPluginParamEntry {
const uint8_t *key_data;
size_t key_len;
struct FolditPluginParamValue value;
} FolditPluginParamEntry;
typedef void *FolditPluginHandle;
typedef struct FolditPluginAsset {
const uint8_t *name_data;
size_t name_len;
const uint8_t *data;
size_t data_len;
} FolditPluginAsset;
typedef struct FolditPluginVtable {
uint32_t abi_version;
uint32_t padding;
FolditPluginHandle (*create)(const char *config_json, size_t config_len);
void (*destroy)(FolditPluginHandle handle);
FolditPluginStatus (*register_)(FolditPluginHandle handle,
struct FolditPluginBuffer *out_buf,
struct FolditPluginError *out_err);
FolditPluginStatus (*init)(FolditPluginHandle handle,
const uint8_t *assembly,
size_t assembly_len,
const struct FolditPluginAsset *assets,
size_t assets_len,
const struct FolditPluginParamEntry *params,
size_t params_len,
uint64_t *out_session,
struct FolditPluginBuffer *out_initial_buf,
struct FolditPluginError *out_err);
FolditPluginStatus (*update_assembly)(FolditPluginHandle handle,
uint64_t session,
FolditPluginAssemblyPayloadKind payload_kind,
const uint8_t *bytes,
size_t bytes_len,
uint64_t from_gen,
uint64_t to_gen,
struct FolditPluginError *out_err);
FolditPluginStatus (*drop_session)(FolditPluginHandle handle,
uint64_t session,
struct FolditPluginError *out_err);
FolditPluginStatus (*invoke)(FolditPluginHandle handle,
uint64_t session,
const uint8_t *op_id,
size_t op_id_len,
const struct FolditPluginDispatchContext *ctx,
const struct FolditPluginParamEntry *params,
size_t params_len,
struct FolditPluginBuffer *out_assembly,
struct FolditPluginError *out_err);
FolditPluginStatus (*start_stream)(FolditPluginHandle handle,
uint64_t session,
const uint8_t *op_id,
size_t op_id_len,
const struct FolditPluginDispatchContext *ctx,
const struct FolditPluginParamEntry *params,
size_t params_len,
uint64_t request_id,
struct FolditPluginError *out_err);
FolditPluginStatus (*poll_stream)(FolditPluginHandle handle,
uint64_t request_id,
struct FolditPluginBuffer *out_buf,
struct FolditPluginError *out_err);
FolditPluginStatus (*update_stream)(FolditPluginHandle handle,
uint64_t request_id,
const struct FolditPluginParamEntry *params,
size_t params_len,
struct FolditPluginError *out_err);
FolditPluginStatus (*cancel_stream)(FolditPluginHandle handle,
uint64_t request_id,
struct FolditPluginError *out_err);
FolditPluginStatus (*query)(FolditPluginHandle handle,
uint64_t session,
const uint8_t *query_id,
size_t query_id_len,
const struct FolditPluginDispatchContext *ctx,
const struct FolditPluginParamEntry *params,
size_t params_len,
const uint8_t *assembly,
size_t assembly_len,
struct FolditPluginBuffer *out_data,
struct FolditPluginError *out_err);
void (*free_buffer)(struct FolditPluginBuffer *buf);
void (*free_error)(struct FolditPluginError *err);
} FolditPluginVtable;
typedef const struct FolditPluginVtable *(*FolditPluginVtableFn)(void);