Files
armorpaint/paint/assets/api.h
T
2026-06-12 18:27:17 +02:00

1009 lines
36 KiB
C

// Begin API
#pragma once
#include <stdbool.h>
#include <stdint.h>
typedef int32_t i32;
typedef uint32_t u32;
typedef int16_t i16;
typedef uint16_t u16;
typedef int8_t i8;
typedef uint8_t u8;
typedef float f32;
// Opaque types
typedef struct gpu_texture gpu_texture_t;
typedef struct raw_mesh raw_mesh_t;
// Forward declarations for circular refs
typedef struct object object_t;
typedef struct transform transform_t;
// --- Array types ---
typedef struct {
i8 *buffer;
int length;
int capacity;
} i8_array_t;
typedef struct {
u8 *buffer;
int length;
int capacity;
} u8_array_t;
typedef struct {
i16 *buffer;
int length;
int capacity;
} i16_array_t;
typedef struct {
u16 *buffer;
int length;
int capacity;
} u16_array_t;
typedef struct {
i32 *buffer;
int length;
int capacity;
} i32_array_t;
typedef struct {
u32 *buffer;
int length;
int capacity;
} u32_array_t;
typedef struct {
f32 *buffer;
int length;
int capacity;
} f32_array_t;
typedef struct {
void **buffer;
int length;
int capacity;
} any_array_t;
typedef struct {
char **buffer;
int length;
int capacity;
} string_array_t;
typedef struct {
u8 *buffer;
int length;
int capacity;
} buffer_t;
typedef any_array_t obj_t_array_t;
typedef any_array_t vertex_array_t_array_t;
typedef any_array_t frustum_plane_array_t;
typedef any_array_t bind_const_t_array_t;
typedef any_array_t bind_tex_t_array_t;
typedef any_array_t material_context_t_array_t;
typedef any_array_t shader_const_t_array_t;
typedef any_array_t tex_unit_t_array_t;
typedef any_array_t vertex_element_t_array_t;
// --- Math types ---
typedef struct {
float x, y;
} vec2_t;
typedef struct {
float x, y, z;
} vec3_t;
typedef struct {
float x, y, z, w;
} vec4_t;
typedef struct {
float x, y, z, w;
} quat_t;
typedef struct {
float m00, m01, m02, m10, m11, m12, m20, m21, m22;
} mat3_t;
typedef struct {
float m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33;
} mat4_t;
// --- Enums ---
typedef enum {
UI_LAYOUT_VERTICAL,
UI_LAYOUT_HORIZONTAL
} ui_layout_t;
typedef enum {
UI_ALIGN_LEFT,
UI_ALIGN_CENTER,
UI_ALIGN_RIGHT
} ui_align_t;
typedef enum {
UI_STATE_IDLE,
UI_STATE_STARTED,
UI_STATE_DOWN,
UI_STATE_RELEASED,
UI_STATE_HOVERED
} ui_state_t;
typedef enum {
GPU_TEXTURE_FORMAT_RGBA32,
GPU_TEXTURE_FORMAT_RGBA64,
GPU_TEXTURE_FORMAT_RGBA128,
GPU_TEXTURE_FORMAT_R8,
GPU_TEXTURE_FORMAT_R16,
GPU_TEXTURE_FORMAT_R32,
GPU_TEXTURE_FORMAT_D32,
GPU_TEXTURE_FORMAT_RGBA32_BC7,
} gpu_texture_format_t;
// --- UI structs ---
typedef struct {
int i;
float f;
int b;
int layout;
float scroll_offset;
int color;
int redraws;
char *text;
int scroll_enabled;
int drag_enabled;
int changed;
int init;
any_array_t children;
} ui_handle_t;
typedef struct {
int id;
int node_id;
char *name;
char *type;
int color;
f32_array_t default_value;
float min;
float max;
float precision;
int display;
} ui_node_socket_t;
typedef struct {
char *name;
char *type;
int output;
f32_array_t default_value;
u8_array_t data;
float min;
float max;
float precision;
float height;
} ui_node_button_t;
typedef struct {
int id;
int from_id;
int from_socket;
int to_id;
int to_socket;
} ui_node_link_t;
typedef struct {
int id;
char *name;
char *type;
float x;
float y;
int color;
any_array_t inputs;
any_array_t outputs;
any_array_t buttons;
float width;
int flags;
} ui_node_t;
// --- Engine data structs ---
typedef struct {
char *name;
char *type;
char *data_ref;
f32_array_t transform;
f32_array_t dimensions;
int visible;
int spawn;
void *anim;
char *material_ref;
obj_t_array_t children;
void *_;
} obj_t;
typedef struct {
char *attrib;
char *data;
i16_array_t values;
} vertex_array_t;
typedef struct {
char *name;
float scale_pos;
float scale_tex;
vertex_array_t_array_t vertex_arrays;
u32_array_t index_array;
void *_;
} mesh_data_t;
typedef struct {
char *name;
float near_plane;
float far_plane;
float fov;
float aspect;
int frustum_culling;
f32_array_t ortho;
} camera_data_t;
typedef struct {
char *name;
int color;
float strength;
char *irradiance;
char *radiance;
int radiance_mipmaps;
char *envmap;
void *_;
} world_data_t;
typedef struct {
char *name;
char *data;
} vertex_element_t;
typedef struct {
char *name;
char *type;
char *link;
} shader_const_t;
typedef struct {
char *name;
char *link;
} tex_unit_t;
typedef struct {
char *name;
int depth_write;
char *compare_mode;
char *cull_mode;
char *vertex_shader;
char *fragment_shader;
int shader_from_source;
char *blend_source;
char *blend_destination;
char *alpha_blend_source;
char *alpha_blend_destination;
string_array_t color_attachments;
char *depth_attachment;
vertex_element_t_array_t vertex_elements;
shader_const_t_array_t constants;
tex_unit_t_array_t texture_units;
} shader_context_t;
typedef struct {
char *name;
any_array_t contexts;
} shader_data_t;
typedef struct {
char *name;
f32_array_t vec;
} bind_const_t;
typedef struct {
char *name;
char *file;
} bind_tex_t;
typedef struct {
char *name;
bind_const_t_array_t bind_constants;
bind_tex_t_array_t bind_textures;
void *_;
} material_context_t;
typedef struct {
char *name;
char *shader;
material_context_t_array_t contexts;
void *_;
} material_data_t;
typedef struct {
char *name;
int width;
int height;
char *format;
float scale;
gpu_texture_t *_image;
} render_target_t;
// --- Scene object structs ---
struct transform {
vec4_t loc;
float scale_world;
int dirty;
object_t *object;
float radius;
};
struct object {
int uid;
float urandom;
obj_t raw;
char *name;
transform_t transform;
object_t *parent;
any_array_t children;
int visible;
int culled;
int is_empty;
void *ext;
char *ext_type;
};
typedef struct {
object_t base;
mesh_data_t data;
material_data_t material;
float camera_dist;
int frustum_culling;
char *skip_context;
char *force_context;
} mesh_object_t;
typedef struct {
object_t base;
camera_data_t data;
int frame;
frustum_plane_array_t frustum_planes;
} camera_object_t;
// --- Paint structs ---
typedef struct {
int window_w;
int window_h;
float window_scale;
float rp_supersample;
string_array_t recent_projects;
string_array_t plugins;
char *keymap;
char *theme;
int undo_steps;
float camera_fov;
int layer_res;
int brush_live;
int node_previews;
int material_live;
int workspace;
int workflow;
} config_t;
typedef struct {
mesh_object_t paint_object;
int ddirty;
int pdirty;
int rdirty;
void *material;
void *layer;
void *brush;
int tool;
float brush_radius;
float brush_opacity;
float brush_hardness;
float brush_scale;
float brush_angle;
int brush_blending;
int viewport_mode;
int xray;
bool capturing_screenshot;
} context_t;
typedef struct {
char *version;
string_array_t assets;
int is_bgra;
char *envmap;
float envmap_strength;
float envmap_angle;
float camera_fov;
f32_array_t camera_world;
f32_array_t camera_origin;
void *swatches;
void *brush_nodes;
void *material_nodes;
string_array_t font_assets;
void *layer_datas;
void *mesh_datas;
string_array_t script_datas;
} project_t;
// --- Math ---
float vec2_len(vec2_t *v);
vec2_t *vec2_set_len(vec2_t *v, float len);
vec2_t *vec2_mult(vec2_t *v, float f);
vec2_t *vec2_add(vec2_t *a, vec2_t *b);
vec2_t *vec2_sub(vec2_t *a, vec2_t *b);
float vec2_cross(vec2_t *a, vec2_t *b);
vec2_t *vec2_norm(vec2_t *v);
float vec2_dot(vec2_t *a, vec2_t *b);
vec2_t *vec2_nan(void);
int vec2_isnan(vec2_t *v);
vec4_t *vec4_cross(vec4_t *a, vec4_t *b);
vec4_t *vec4_add(vec4_t *a, vec4_t *b);
vec4_t *vec4_fadd(vec4_t *v, float x, float y, float z, float w);
vec4_t *vec4_norm(vec4_t *v);
vec4_t *vec4_mult(vec4_t *v, float f);
float vec4_dot(vec4_t *a, vec4_t *b);
vec4_t *vec4_apply_proj(vec4_t *v, mat4_t *m);
vec4_t *vec4_apply_mat4(vec4_t *v, mat4_t *m);
vec4_t *vec4_apply_axis_angle(vec4_t *v, vec4_t *axis, float angle);
vec4_t *vec4_apply_quat(vec4_t *v, quat_t *q);
int vec4_equals(vec4_t *a, vec4_t *b);
int vec4_almost_equals(vec4_t *a, vec4_t *b, float eps);
float vec4_len(vec4_t *v);
vec4_t *vec4_sub(vec4_t *a, vec4_t *b);
float vec4_dist(vec4_t *a, vec4_t *b);
vec4_t *vec4_reflect(vec4_t *v, vec4_t *n);
vec4_t *vec4_clamp(vec4_t *v, float min, float max);
vec4_t *vec4_x_axis(void);
vec4_t *vec4_y_axis(void);
vec4_t *vec4_z_axis(void);
vec4_t *vec4_nan(void);
int vec4_isnan(vec4_t *v);
quat_t *quat_from_axis_angle(vec4_t *axis, float angle);
quat_t *quat_from_mat(mat4_t *m);
quat_t *quat_from_rot_mat(mat4_t *m);
quat_t *quat_mult(quat_t *a, quat_t *b);
quat_t *quat_norm(quat_t *q);
vec4_t *quat_get_euler(quat_t *q);
quat_t *quat_from_euler(float x, float y, float z);
float quat_dot(quat_t *a, quat_t *b);
quat_t *quat_from_to(vec4_t *from, vec4_t *to);
quat_t *quat_inv(quat_t *q);
mat3_t *mat3_identity(void);
mat3_t *mat3_translation(float x, float y);
mat3_t *mat3_rotation(float angle);
mat3_t *mat3_scale(mat3_t *m, vec4_t *s);
mat3_t *mat3_set_from4(mat4_t *m);
mat3_t *mat3_multmat(mat3_t *a, mat3_t *b);
mat3_t *mat3_transpose(mat3_t *m);
mat3_t *mat3_nan(void);
int mat3_isnan(mat3_t *m);
mat4_t *mat4_identity(void);
mat4_t *mat4_persp(float fov, float aspect, float near, float far);
mat4_t *mat4_ortho(float left, float right, float bottom, float top, float near, float far);
mat4_t *mat4_rot_z(float angle);
mat4_t *mat4_compose(vec4_t *loc, quat_t *rot, vec4_t *scale);
mat4_t *mat4_set_loc(mat4_t *m, vec4_t *loc);
mat4_t *mat4_from_quat(quat_t *q);
mat4_t *mat4_translate(mat4_t *m, float x, float y, float z);
mat4_t *mat4_scale(mat4_t *m, vec4_t *s);
mat4_t *mat4_mult_mat3x4(mat4_t *a, mat4_t *b);
mat4_t *mat4_mult_mat(mat4_t *a, mat4_t *b);
mat4_t *mat4_inv(mat4_t *m);
mat4_t *mat4_transpose(mat4_t *m);
mat4_t *mat4_transpose3(mat4_t *m);
vec4_t *mat4_get_loc(mat4_t *m);
vec4_t *mat4_get_scale(mat4_t *m);
mat4_t *mat4_mult(mat4_t *m, float f);
mat4_t *mat4_to_rot(mat4_t *m);
vec4_t *mat4_right(mat4_t *m);
vec4_t *mat4_look(mat4_t *m);
vec4_t *mat4_up(mat4_t *m);
void *mat4_to_f32_array(mat4_t *m);
float mat4_determinant(mat4_t *m);
mat4_t *mat4_nan(void);
int mat4_isnan(mat4_t *m);
void transform_set_matrix(transform_t *t, mat4_t *m);
void transform_rotate(transform_t *t, vec4_t *axis, float angle);
void transform_move(transform_t *t, vec4_t *dir, float dist);
vec4_t *transform_look(transform_t *t);
vec4_t *transform_right(transform_t *t);
vec4_t *transform_up(transform_t *t);
vec4_t *raycast_aabb(object_t *obj);
void line_draw_render(mat4_t *m);
void line_draw_bounds(mat4_t *m, vec4_t *bounds);
void shape_draw_sphere(mat4_t *m);
void draw_set_transform(mat3_t *m);
int iron_random_get(void);
int iron_random_get_max(int max);
int iron_random_get_in(int min, int max);
float vec4_fdist(float x0, float y0, float z0, float x1, float y1, float z1);
float mat4_cofactor(float a0, float a1, float a2, float b0, float b1, float b2, float c0, float c1, float c2);
float cosf(float x);
float sinf(float x);
// --- Object ---
object_t *object_create(int is_empty);
void object_set_parent(object_t *obj, object_t *parent);
void object_remove(object_t *obj);
object_t *object_get_child(object_t *obj, char *name);
// --- Transform ---
transform_t *transform_create(object_t *obj);
void transform_reset(transform_t *t);
void transform_update(transform_t *t);
void transform_build_matrix(transform_t *t);
void transform_decompose(transform_t *t);
float transform_world_x(transform_t *t);
float transform_world_y(transform_t *t);
float transform_world_z(transform_t *t);
// --- Camera object ---
camera_object_t *camera_object_create(camera_data_t *data);
void camera_object_build_proj(camera_object_t *cam, float aspect);
void camera_object_remove(camera_object_t *cam);
void camera_object_build_mat(camera_object_t *cam);
// --- World data ---
world_data_t *world_data_parse(void *raw, char *name);
void world_data_load_envmap(world_data_t *data);
// --- Material data ---
material_data_t *material_data_create(void *raw, char *name);
material_data_t *material_data_parse(void *raw, char *name);
material_context_t *material_data_get_context(material_data_t *data, char *name);
void material_context_load(material_context_t *ctx);
// --- Shader data ---
shader_data_t *shader_data_create(void *raw);
shader_data_t *shader_data_parse(void *raw, char *name);
void shader_data_delete(shader_data_t *data);
shader_context_t *shader_data_get_context(shader_data_t *data, char *name);
void shader_context_load(shader_context_t *ctx);
void shader_context_compile(shader_context_t *ctx);
void shader_context_finish_compile(shader_context_t *ctx);
void shader_context_delete(shader_context_t *ctx);
void shader_context_add_const(shader_context_t *ctx, int i);
void shader_context_add_tex(shader_context_t *ctx, int i);
// --- Mesh data ---
mesh_data_t *mesh_data_parse(void *raw, char *name);
mesh_data_t *mesh_data_create(void *raw);
int mesh_data_get_vertex_size(mesh_data_t *data);
void mesh_data_build_vertices(mesh_data_t *data, void *buf);
void mesh_data_build_indices(mesh_data_t *data, void *buf);
vertex_array_t *mesh_data_get_vertex_array(mesh_data_t *data, char *attrib);
void mesh_data_build(mesh_data_t *data);
void mesh_data_delete(mesh_data_t *data);
// --- Mesh object ---
mesh_object_t *mesh_object_create(mesh_data_t *data, material_data_t *mat);
void mesh_object_set_data(mesh_object_t *obj, mesh_data_t *data);
void mesh_object_remove(mesh_object_t *obj);
void mesh_object_render(mesh_object_t *obj, material_data_t *mat, void *ctx);
// --- Data ---
mesh_data_t *data_get_mesh(void *pack, char *name);
camera_data_t *data_get_camera(void *pack, char *name);
material_data_t *data_get_material(void *pack, char *name);
world_data_t *data_get_world(void *pack, char *name);
shader_data_t *data_get_shader(void *pack, char *name);
void *data_get_scene_raw(char *name);
gpu_texture_t *data_get_image(char *name);
buffer_t *data_get_blob(char *name);
void *data_get_video(char *name);
void *data_get_font(char *name);
void data_delete_mesh(char *name);
void data_delete_blob(char *name);
void data_delete_image(char *name);
void data_delete_video(char *name);
void data_delete_font(char *name);
bool data_is_abs(char *path);
char *data_path(void);
// --- Scene ---
void *scene_create(char *name);
void scene_remove(void);
void *scene_set_active(void *scene);
object_t *scene_add_object(char *name);
object_t *scene_get_child(char *name);
mesh_object_t *scene_add_mesh_object(char *mesh, char *mat, char *name);
camera_object_t *scene_add_camera_object(char *data, char *name);
void *scene_add_scene(char *name, object_t *parent);
object_t *scene_spawn_object(void *scene, object_t *parent, int anim);
object_t *scene_get_raw_object_by_name(void *scene, char *name);
object_t *scene_create_object(void *scene, char *name, object_t *parent);
mesh_object_t *scene_create_mesh_object(void *pack, char *name, mesh_data_t *data, material_data_t *mat);
void scene_gen_transform(object_t *obj, void *scene);
// --- Render path ---
void render_path_set_target(char *name, void *additional_targets, void *clear_color, int flags, int color_bits, float depth_bits);
void render_path_end(void);
void render_path_draw_meshes(char *context);
void render_path_draw_skydome(char *name);
void render_path_bind_target(char *name, char *uniform);
void render_path_draw_shader(char *name);
void render_path_load_shader(char *name);
void render_path_resize(void);
render_target_t *render_path_create_render_target(render_target_t *rt);
render_target_t *render_target_create(void);
// --- UI ---
void ui_begin(void *g);
void ui_begin_sticky(void);
void ui_end_sticky(void);
void ui_begin_region(void *g, int x, int y, int w);
void ui_end_region(void);
bool ui_window(ui_handle_t *handle, int x, int y, int w, int h, int drag);
bool ui_button(char *text, int align, char *icon);
int ui_text(char *text, int align, int bg);
bool ui_tab(ui_handle_t *handle, char *text, int vertical, int color, int notab);
bool ui_panel(ui_handle_t *handle, char *text, int type, int filled, int pack);
int ui_sub_image(gpu_texture_t *img, int color, int sx, int sy, int sw, int sh, int h);
int ui_image(gpu_texture_t *img, int color, int h);
char *ui_text_input(ui_handle_t *handle, char *label, int align, int multiline, int password);
bool ui_check(ui_handle_t *handle, char *text, char *label);
bool ui_radio(ui_handle_t *handle, int index, char *text, char *label);
int ui_combo(ui_handle_t *handle, void *texts, char *label, int init_max, int search_bar, int label_align);
float ui_slider(ui_handle_t *handle, char *text, float from, float to, int filled, float precision, int display_value, int align, int no_bg);
void ui_row(f32_array_t *splits);
void ui_row2(void);
void ui_row3(void);
void ui_row4(void);
void ui_row5(void);
void ui_row6(void);
void ui_row7(void);
void ui_separator(int h, int color);
void ui_tooltip(char *text);
void ui_tooltip_image(gpu_texture_t *img, int max_size);
void ui_end(void);
void ui_end_window(void);
void ui_mouse_down(void *g, int button, int x, int y);
void ui_mouse_move(void *g, int x, int y, int mx, int my);
void ui_mouse_up(void *g, int button, int x, int y);
void ui_mouse_wheel(void *g, float delta);
void ui_key_down(void *g, int key);
void ui_key_up(void *g, int key);
void ui_key_press(void *g, int key);
ui_handle_t *ui_handle_create(void);
ui_handle_t *ui_nest(ui_handle_t *handle, int i);
void ui_set_scale(float scale);
bool ui_get_hover(float h);
bool ui_get_released(float h);
bool ui_input_in_rect(float x, float y, float w, float h);
void ui_fill(float x, float y, float w, float h, int color);
void ui_rect(float x, float y, float w, float h, int color, float strength);
bool ui_is_visible(float h);
void ui_end_element(void);
void ui_end_element_of_size(float h);
void ui_fade_color(float amount);
void ui_draw_string(char *text, float x, float y, int align, int truncate);
void ui_draw_shadow(float x, float y, float w, float h);
void ui_draw_rect(int fill, int shadows, float x, float y, float w, float h);
void ui_start_text_edit(ui_handle_t *handle, int align);
float UI_SCALE(void);
float UI_ELEMENT_W(void);
float UI_ELEMENT_H(void);
float UI_ELEMENT_OFFSET(void);
float UI_ARROW_SIZE(void);
float UI_BUTTON_H(void);
float UI_CHECK_SIZE(void);
float UI_CHECK_SELECT_SIZE(void);
float UI_FONT_SIZE(void);
float UI_SCROLL_W(void);
float UI_TEXT_OFFSET(void);
float UI_TAB_W(void);
float UI_HEADER_DRAG_H(void);
float UI_TOOLTIP_DELAY(void);
float ui_float_input(ui_handle_t *handle, char *text, int align, float precision);
int ui_inline_radio(ui_handle_t *handle, void *texts, int align);
int ui_color_wheel(ui_handle_t *handle, int alpha, float w, float h, int button, char *picker, char *label);
char *ui_text_area(ui_handle_t *handle, int align, int editable, char *label, int word_wrap);
void ui_begin_menu(void);
void ui_end_menu(void);
bool ui_menubar_button(char *text);
int ui_color_r(int color);
int ui_color_g(int color);
int ui_color_b(int color);
int ui_color_a(int color);
int ui_color(int r, int g, int b, int a);
// --- UI nodes ---
void ui_nodes_init(void *canvas);
void ui_node_canvas(void *g, void *canvas);
void ui_nodes_rgba_popup(ui_handle_t *handle, ui_node_socket_t *socket, int x, int y);
void ui_remove_node(ui_node_t *node, void *canvas);
float UI_NODES_SCALE(void);
float UI_NODES_PAN_X(void);
float UI_NODES_PAN_Y(void);
float UI_NODE_X(ui_node_t *node);
float UI_NODE_Y(ui_node_t *node);
float UI_NODE_W(ui_node_t *node);
float UI_NODE_H(ui_node_t *node, void *canvas);
float UI_OUTPUT_Y(ui_node_t *node, int i);
float UI_INPUT_Y(ui_node_t *node, void *canvas, int i);
float UI_OUTPUTS_H(ui_node_t *node, int i);
float UI_BUTTONS_H(ui_node_t *node);
float UI_LINE_H(void);
int ui_get_socket_id(void *canvas);
ui_node_link_t *ui_get_link(void *canvas, int i);
int ui_next_link_id(void *canvas);
ui_node_t *ui_get_node(void *canvas, int i);
int ui_next_node_id(void *canvas);
// --- System ---
float sys_time(void);
float sys_delta(void);
float sys_real_delta(void);
int sys_w(void);
int sys_h(void);
int sys_x(void);
int sys_y(void);
char *sys_title(void);
void sys_title_set(char *title);
void *sys_get_shader(char *name);
char *sys_buffer_to_string(buffer_t *buf);
buffer_t *sys_string_to_buffer(char *s);
// --- Shape ---
void line_draw_init(void);
void line_draw_lineb(int x0, int y0, int z0, int x1, int y1, int z1);
void line_draw_line(float x0, float y0, float z0, float x1, float y1, float z1);
void line_draw_begin(void);
void line_draw_end(void);
// --- Draw ---
void draw_begin(gpu_texture_t *img, int clear, int color);
void draw_scaled_sub_image(gpu_texture_t *img, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh);
void draw_scaled_image(gpu_texture_t *img, float x, float y, float w, float h);
void draw_sub_image(gpu_texture_t *img, float x, float y, float sx, float sy, float sw, float sh);
void draw_image(gpu_texture_t *img, float x, float y);
void draw_filled_triangle(float x0, float y0, float x1, float y1, float x2, float y2);
void draw_filled_rect(float x, float y, float w, float h);
void draw_rect(float x, float y, float w, float h, float strength);
void draw_line(float x0, float y0, float x1, float y1, float strength);
void draw_line_aa(float x0, float y0, float x1, float y1, float strength);
void draw_string(char *text, float x, float y);
void draw_end(void);
void draw_flush(void);
void draw_set_color(int color);
int draw_get_color(void);
void draw_set_pipeline(void *pipeline);
bool draw_set_font(void *font, int size);
float draw_sub_string_width(void *font, int size, char *text, int start, int end);
int draw_string_width(void *font, int size, char *text);
void draw_filled_circle(float x, float y, float r, int segments);
void draw_circle(float x, float y, float r, int segments, float strength);
void draw_cubic_bezier(f32_array_t *x, f32_array_t *y, int segments, float strength);
// --- String ---
char *string_alloc(int size);
char *string_copy(char *s);
int string_length(char *s);
bool string_equals(char *a, char *b);
char *i32_to_string(int i);
char *i32_to_string_hex(int i);
char *i64_to_string(int i);
char *u64_to_string(int i);
char *f32_to_string(float f);
char *f32_to_string_with_zeros(float f);
void string_strip_trailing_zeros(char *s);
int string_index_of(char *s, char *sub);
int string_index_of_pos(char *s, char *sub, int pos);
int string_last_index_of(char *s, char *sub);
string_array_t *string_split(char *s, char *sep);
char *string_array_join(string_array_t *arr, char *sep);
char *string_replace_all(char *s, char *from, char *to);
char *substring(char *s, int from, int to);
char *string_from_char_code(int code);
int char_code_at(char *s, int i);
char *char_at(char *s, int i);
bool starts_with(char *s, char *prefix);
bool ends_with(char *s, char *suffix);
char *trim_end(char *s);
int string_utf8_decode(char *s, void *out);
// --- File ---
bool iron_file_reader_open(void *reader, char *path, int size);
bool iron_file_reader_close(void *reader);
int iron_file_reader_read(void *reader, void *buf, int size);
int iron_file_reader_size(void *reader);
int iron_file_reader_pos(void *reader);
bool iron_file_reader_seek(void *reader, int pos);
bool iron_file_writer_open(void *writer, char *path);
void iron_file_writer_write(void *writer, void *buf, int size);
void iron_file_writer_close(void *writer);
void *iron_read_directory(char *path);
void iron_create_directory(char *path);
bool iron_is_directory(char *path);
bool iron_file_exists(char *path);
void iron_delete_file(char *path);
void iron_file_save_bytes(char *path, void *buf, int size);
void iron_file_download(char *url, void *buf, int size, char *path);
void *file_read_directory(char *path);
void file_copy(char *from, char *to);
void file_start(char *path);
void file_download_to(char *url, char *path, void *cb, int size);
// --- GC ---
void *gc_alloc(int size);
void gc_leaf(void *p);
void gc_root(void *p);
void gc_unroot(void *p);
void *gc_realloc(void *p, int size);
void gc_free(void *p);
void gc_pause(void);
void gc_resume(void);
void gc_run(void);
void gc_start(void *heap);
void gc_stop(void);
// --- Map ---
void i32_map_set(void *map, char *key, int val);
void f32_map_set(void *map, char *key, float val);
void any_map_set(void *map, char *key, void *val);
int i32_map_get(void *map, char *key);
float f32_map_get(void *map, char *key);
void *any_map_get(void *map, char *key);
void map_delete(void *map, char *key);
string_array_t *map_keys(void *map);
void *i32_map_create(void);
void *any_map_create(void);
void i32_imap_set(void *map, int key, int val);
void any_imap_set(void *map, int key, void *val);
int i32_imap_get(void *map, int key);
void *any_imap_get(void *map, int key);
void imap_delete(void *map, int key);
i32_array_t *imap_keys(void *map);
void *any_imap_create(void);
// --- Array ---
void array_free(void *arr);
void i8_array_push(i8_array_t *arr, int val);
void u8_array_push(u8_array_t *arr, int val);
void i16_array_push(i16_array_t *arr, int val);
void u16_array_push(u16_array_t *arr, int val);
void i32_array_push(i32_array_t *arr, int val);
void u32_array_push(u32_array_t *arr, int val);
void f32_array_push(f32_array_t *arr, float val);
void any_array_push(any_array_t *arr, void *val);
void string_array_push(string_array_t *arr, char *val);
void i8_array_resize(i8_array_t *arr, int size);
void u8_array_resize(u8_array_t *arr, int size);
void i16_array_resize(i16_array_t *arr, int size);
void u16_array_resize(u16_array_t *arr, int size);
void i32_array_resize(i32_array_t *arr, int size);
void u32_array_resize(u32_array_t *arr, int size);
void f32_array_resize(f32_array_t *arr, int size);
void any_array_resize(any_array_t *arr, int size);
void string_array_resize(string_array_t *arr, int size);
void buffer_resize(buffer_t *arr, int size);
void array_sort(void *arr, void *fn);
void i32_array_sort(i32_array_t *arr, void *fn);
void *array_pop(any_array_t *arr);
int i32_array_pop(i32_array_t *arr);
void *array_shift(any_array_t *arr);
void array_splice(any_array_t *arr, int start, int count);
void i32_array_splice(i32_array_t *arr, int start, int count);
any_array_t *array_concat(any_array_t *a, any_array_t *b);
any_array_t *array_slice(any_array_t *arr, int from, int to);
void array_insert(any_array_t *arr, int i, void *val);
void array_remove(any_array_t *arr, void *val);
void string_array_remove(string_array_t *arr, char *val);
void i32_array_remove(i32_array_t *arr, int val);
int array_index_of(any_array_t *arr, void *val);
int string_array_index_of(string_array_t *arr, char *val);
int i32_array_index_of(i32_array_t *arr, int val);
void array_reverse(any_array_t *arr);
buffer_t *buffer_slice(buffer_t *buf, int from, int to);
int buffer_get_u8(buffer_t *buf, int pos);
int buffer_get_i8(buffer_t *buf, int pos);
int buffer_get_u16(buffer_t *buf, int pos);
int buffer_get_i16(buffer_t *buf, int pos);
float buffer_get_f16(buffer_t *buf, int pos);
int buffer_get_u32(buffer_t *buf, int pos);
int buffer_get_i32(buffer_t *buf, int pos);
float buffer_get_f32(buffer_t *buf, int pos);
float buffer_get_f64(buffer_t *buf, int pos);
int buffer_get_i64(buffer_t *buf, int pos);
void buffer_set_u8(buffer_t *buf, int pos, int val);
void buffer_set_i8(buffer_t *buf, int pos, int val);
void buffer_set_u16(buffer_t *buf, int pos, int val);
void buffer_set_i16(buffer_t *buf, int pos, int val);
void buffer_set_u32(buffer_t *buf, int pos, int val);
void buffer_set_i32(buffer_t *buf, int pos, int val);
void buffer_set_f32(buffer_t *buf, int pos, float val);
buffer_t *buffer_create(int size);
buffer_t *buffer_create_from_raw(void *p, int size);
f32_array_t *f32_array_create(int size);
f32_array_t *f32_array_create_from_buffer(buffer_t *buf);
f32_array_t *f32_array_create_from_array(f32_array_t *arr);
f32_array_t *f32_array_create_from_raw(void *p, int size);
f32_array_t *f32_array_create_x(float x);
f32_array_t *f32_array_create_xy(float x, float y);
f32_array_t *f32_array_create_xyz(float x, float y, float z);
f32_array_t *f32_array_create_xyzw(float x, float y, float z, float w);
f32_array_t *f32_array_create_xyzwv(float x, float y, float z, float w, float v);
u32_array_t *u32_array_create(int size);
u32_array_t *u32_array_create_from_array(u32_array_t *arr);
u32_array_t *u32_array_create_from_raw(void *p, int size);
i32_array_t *i32_array_create(int size);
i32_array_t *i32_array_create_from_array(i32_array_t *arr);
i32_array_t *i32_array_create_from_raw(void *p, int size);
u16_array_t *u16_array_create(int size);
u16_array_t *u16_array_create_from_raw(void *p, int size);
i16_array_t *i16_array_create(int size);
i16_array_t *i16_array_create_from_array(i16_array_t *arr);
i16_array_t *i16_array_create_from_raw(void *p, int size);
u8_array_t *u8_array_create(int size);
u8_array_t *u8_array_create_from_array(u8_array_t *arr);
u8_array_t *u8_array_create_from_raw(void *p, int size);
u8_array_t *u8_array_create_from_string(char *s);
char *u8_array_to_string(u8_array_t *arr);
i8_array_t *i8_array_create(int size);
i8_array_t *i8_array_create_from_raw(void *p, int size);
any_array_t *any_array_create(int size);
any_array_t *any_array_create_from_raw(void *p, int size);
string_array_t *string_array_create(int size);
// --- Input ---
bool mouse_down(char *button);
bool mouse_down_any(void);
bool mouse_started(char *button);
bool mouse_started_any(void);
bool mouse_released(char *button);
float mouse_view_x(void);
float mouse_view_y(void);
bool keyboard_down(char *key);
bool keyboard_started(char *key);
bool keyboard_started_any(void);
bool keyboard_released(char *key);
bool keyboard_repeat(char *key);
char *keyboard_key_code(int code);
// --- Paint ---
void *plugin_create(void);
void plugin_notify_on_ui(void *plugin, void *fn);
void plugin_notify_on_update(void *plugin, void *fn);
void plugin_notify_on_delete(void *plugin, void *fn);
void script_notify_on_update(void *fn);
void script_notify_on_next_frame(void *fn);
void console_info(char *s);
void console_error(char *s);
void console_log(char *s);
void ui_box_show_message(char *title, char *text, bool copyable);
void ui_files_show2(char *filters, bool is_save, bool open_multiple, void *files_done);
void project_save(bool save_and_quit);
char *project_filepath_get(void);
void project_filepath_set(char *path);
context_t *script_get_context(void);
config_t *script_get_config(void);
project_t *script_get_project(void);
object_t *script_get_object(char *name);
void context_set_viewport_shader(void *viewport_shader);
void context_set_viewport_mode(int mode);
void context_set_camera_controls(int i);
void node_shader_write_frag(void *raw, char *s);
void plugin_register_texture(char *format, void *fn);
void plugin_unregister_texture(char *format);
void plugin_register_mesh(char *format, void *fn);
void plugin_unregister_mesh(char *format);
raw_mesh_t *plugin_make_raw_mesh(char *name, i16_array_t *posa, i16_array_t *nora, u32_array_t *inda, float scale_pos);
void plugin_material_category_add(char *category_name, any_array_t *node_list);
void plugin_brush_category_add(char *category_name, any_array_t *node_list);
void plugin_material_category_remove(char *category_name);
void plugin_brush_category_remove(char *category_name);
void plugin_material_custom_nodes_set(char *node_type, void *fn);
void plugin_brush_custom_nodes_set(char *node_type, void *fn);
void plugin_material_custom_nodes_remove(char *node_type);
void plugin_brush_custom_nodes_remove(char *node_type);
void *plugin_material_kong_get(void);
char *parser_material_parse_value_input(ui_node_socket_t *inp, bool vector_as_grayscale);
mesh_object_t *context_main_object(void);
void export_texture_run(char *path, bool bake_material);
void context_select_tool(int i);
gpu_texture_t *gpu_create_render_target(int width, int height, int format);
void viewport_capture_screenshot_to(gpu_texture_t *target, float x, float y, float w, float h);
void viewport_save_texture(gpu_texture_t *screenshot);
void project_reimport_mesh_skinned(int frame);
void iron_delay_idle_sleep(void);
// --- Printf / string formatting ---
int printf(char *fmt, ...);
char *string(char *fmt, ...);
// End API