pxl8/src/pxl8_gfx.h

107 lines
4.2 KiB
C
Raw Normal View History

2025-08-13 15:04:49 -05:00
#pragma once
2025-10-17 17:54:33 -05:00
#include "pxl8_hal.h"
2025-10-04 04:13:48 -05:00
#include "pxl8_math.h"
#include "pxl8_types.h"
2025-08-13 15:04:49 -05:00
2025-10-05 16:25:17 -05:00
typedef struct pxl8_atlas pxl8_atlas;
2025-10-04 04:13:48 -05:00
typedef struct pxl8_gfx pxl8_gfx;
2025-08-13 15:04:49 -05:00
typedef enum pxl8_blend_mode {
PXL8_BLEND_ADD,
2025-10-04 04:13:48 -05:00
PXL8_BLEND_ALPHA,
PXL8_BLEND_MULTIPLY,
PXL8_BLEND_NONE
2025-08-13 15:04:49 -05:00
} pxl8_blend_mode;
typedef struct pxl8_palette_cycle {
2025-10-04 04:13:48 -05:00
bool active;
2025-08-13 15:04:49 -05:00
u8 end_index;
f32 speed;
2025-10-04 04:13:48 -05:00
u8 start_index;
2025-08-13 15:04:49 -05:00
f32 timer;
} pxl8_palette_cycle;
typedef struct pxl8_scanline_effect {
bool active;
2025-10-04 04:13:48 -05:00
void (*process)(pxl8_gfx* gfx, i32 line, f32 time);
2025-08-13 15:04:49 -05:00
} pxl8_scanline_effect;
2025-10-04 04:13:48 -05:00
typedef struct pxl8_vertex {
u32 color;
pxl8_vec3 normal;
pxl8_vec3 position;
f32 u, v;
} pxl8_vertex;
2025-08-13 15:04:49 -05:00
typedef struct pxl8_effects {
pxl8_palette_cycle palette_cycles[8];
pxl8_scanline_effect scanline_effects[4];
f32 time;
} pxl8_effects;
2025-10-04 04:13:48 -05:00
typedef struct pxl8_triangle {
pxl8_vertex v[3];
2025-10-05 16:25:17 -05:00
u32 texture_id;
2025-10-04 04:13:48 -05:00
} pxl8_triangle;
2025-09-28 13:10:29 -05:00
#ifdef __cplusplus
extern "C" {
#endif
2025-10-17 17:54:33 -05:00
pxl8_gfx* pxl8_gfx_create(const pxl8_hal* hal, pxl8_color_mode mode, pxl8_resolution resolution, const char* title, i32 window_width, i32 window_height);
2025-10-04 04:13:48 -05:00
void pxl8_gfx_destroy(pxl8_gfx* gfx);
pxl8_bounds pxl8_gfx_get_bounds(pxl8_gfx* gfx);
pxl8_color_mode pxl8_gfx_get_color_mode(pxl8_gfx* gfx);
u8* pxl8_gfx_get_framebuffer(pxl8_gfx* gfx);
i32 pxl8_gfx_get_height(const pxl8_gfx* gfx);
2025-10-05 16:25:17 -05:00
u32 pxl8_gfx_get_palette_size(const pxl8_gfx* gfx);
2025-09-28 13:10:29 -05:00
void pxl8_gfx_get_resolution_dimensions(pxl8_resolution resolution, i32* width, i32* height);
2025-10-04 04:13:48 -05:00
i32 pxl8_gfx_get_width(const pxl8_gfx* gfx);
pxl8_result pxl8_gfx_load_font_atlas(pxl8_gfx* gfx);
pxl8_result pxl8_gfx_load_palette(pxl8_gfx* gfx, const char* path);
pxl8_result pxl8_gfx_load_sprite(pxl8_gfx* gfx, const char* path);
2025-10-05 16:25:17 -05:00
pxl8_result pxl8_gfx_create_texture(pxl8_gfx* gfx, const u8* pixels, u32 width, u32 height);
2025-10-04 04:13:48 -05:00
void pxl8_gfx_present(pxl8_gfx* gfx);
void pxl8_gfx_project(pxl8_gfx* gfx, f32 left, f32 right, f32 top, f32 bottom);
void pxl8_gfx_upload_atlas(pxl8_gfx* gfx);
void pxl8_gfx_upload_framebuffer(pxl8_gfx* gfx);
2025-10-04 11:55:04 -05:00
pxl8_viewport pxl8_gfx_viewport(pxl8_bounds bounds, i32 width, i32 height);
void pxl8_gfx_set_viewport(pxl8_gfx* gfx, pxl8_viewport vp);
2025-10-04 04:13:48 -05:00
void pxl8_gfx_color_ramp(pxl8_gfx* gfx, u8 start, u8 count, u32 from_color, u32 to_color);
void pxl8_gfx_cycle_palette(pxl8_gfx* gfx, u8 start, u8 count, i32 step);
void pxl8_gfx_fade_palette(pxl8_gfx* gfx, u8 start, u8 count, f32 amount, u32 target_color);
void pxl8_gfx_interpolate_palettes(pxl8_gfx* gfx, u32* palette1, u32* palette2, u8 start, u8 count, f32 t);
void pxl8_gfx_process_effects(pxl8_gfx* gfx, pxl8_effects* effects, f32 dt);
void pxl8_gfx_swap_palette(pxl8_gfx* gfx, u8 start, u8 count, u32* new_colors);
void pxl8_circle(pxl8_gfx* gfx, i32 cx, i32 cy, i32 radius, u32 color);
void pxl8_circle_fill(pxl8_gfx* gfx, i32 cx, i32 cy, i32 radius, u32 color);
2025-11-15 11:55:00 -06:00
void pxl8_clear(pxl8_gfx* gfx, u32 color);
2025-10-04 04:13:48 -05:00
u32 pxl8_get_pixel(pxl8_gfx* gfx, i32 x, i32 y);
void pxl8_line(pxl8_gfx* gfx, i32 x0, i32 y0, i32 x1, i32 y1, u32 color);
void pxl8_pixel(pxl8_gfx* gfx, i32 x, i32 y, u32 color);
void pxl8_rect(pxl8_gfx* gfx, i32 x, i32 y, i32 w, i32 h, u32 color);
void pxl8_rect_fill(pxl8_gfx* gfx, i32 x, i32 y, i32 w, i32 h, u32 color);
void pxl8_sprite(pxl8_gfx* gfx, u32 sprite_id, i32 x, i32 y, i32 w, i32 h);
void pxl8_text(pxl8_gfx* gfx, const char* text, i32 x, i32 y, u32 color);
void pxl8_3d_clear_zbuffer(pxl8_gfx* gfx);
void pxl8_3d_draw_line_3d(pxl8_gfx* gfx, pxl8_vec3 p0, pxl8_vec3 p1, u32 color);
void pxl8_3d_draw_triangle(pxl8_gfx* gfx, pxl8_triangle tri);
void pxl8_3d_draw_triangle_raw(pxl8_gfx* gfx, pxl8_vec3 v0, pxl8_vec3 v1, pxl8_vec3 v2, u32 color);
2025-10-05 16:25:17 -05:00
void pxl8_3d_draw_triangle_textured(pxl8_gfx* gfx, pxl8_vec3 v0, pxl8_vec3 v1, pxl8_vec3 v2, f32 u0, f32 v0f, f32 u1, f32 v1f, f32 u2, f32 v2f, u32 texture_id);
2025-11-09 06:30:17 -06:00
const pxl8_frustum* pxl8_3d_get_frustum(pxl8_gfx* gfx);
2025-10-05 16:25:17 -05:00
void pxl8_3d_set_affine_textures(pxl8_gfx* gfx, bool affine);
2025-10-04 04:13:48 -05:00
void pxl8_3d_set_backface_culling(pxl8_gfx* gfx, bool culling);
void pxl8_3d_set_model(pxl8_gfx* gfx, pxl8_mat4 mat);
void pxl8_3d_set_projection(pxl8_gfx* gfx, pxl8_mat4 mat);
void pxl8_3d_set_view(pxl8_gfx* gfx, pxl8_mat4 mat);
void pxl8_3d_set_wireframe(pxl8_gfx* gfx, bool wireframe);
2025-08-13 15:04:49 -05:00
2025-09-28 13:10:29 -05:00
#ifdef __cplusplus
}
#endif