From 403730174aeaadcf7a8aad842bc5319050411ef9 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sun, 16 Nov 2025 18:23:37 -0800 Subject: Initial commit --- include/swgfx.h | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 include/swgfx.h (limited to 'include') diff --git a/include/swgfx.h b/include/swgfx.h new file mode 100644 index 0000000..b6dc769 --- /dev/null +++ b/include/swgfx.h @@ -0,0 +1,68 @@ +/* +Software rendering library. + +Cooridnate systems: +- Pixel coordinates (i,j) refer to the center of the pixel. + Thus, real-valued coordinates (x,y) with no fractional part point at the pixel center. +- Viewport origin is the top-left corner of the screen. + The viewport axes extend down and to the right. + +Multi-threading: +- Internal resources (swgfx context) are externally synchronized. +- External resources (colour buffer) are internally synchronized. +*/ +#pragma once + +#include +#include + +typedef float R; + +typedef struct sgVec2i { int x, y; } sgVec2i; +typedef struct sgVec2 { R x, y; } sgVec2; +typedef struct sgVec3 { R x, y, z; } sgVec3; +typedef struct sgVec4 { R x, y, z, w; } sgVec4; + +typedef sgVec3 sgNormal; + +typedef struct sgQuadi { sgVec2i p0, p1; } sgQuadi; +typedef struct sgQuad { sgVec2 p0, p1; } sgQuad; +typedef struct sgTri2 { sgVec2 p0, p1, p2; } sgTri2; +typedef struct sgTri3 { sgVec3 p0, p1, p2; } sgTri3; + +// TODO: Should we use real-valued colours? +typedef struct sgPixel { uint8_t r, g, b, a; } sgPixel; + +typedef struct swgfx swgfx; + +swgfx* sgNew(); +void sgDel(swgfx**); + +// TODO: Write client app first, then implement the functions below in the C file. + +void sgColourBuffer(swgfx*, sgVec2i dimensions, sgPixel* buffer); +void sgPresent (swgfx*, sgVec2i dimensions, sgPixel* screen); + +void sgCam (swgfx*, sgVec3 position, sgVec3 forward); +void sgOrtho (swgfx*, R left, R right, R top, R bottom, R near, R far); +void sgPerspective(swgfx*, R fovy, R aspect, R near, R far); +void sgViewport (swgfx*, int x0, int y0, int width, int height); + +void sgClear(swgfx*); +void sgPixels(swgfx*, size_t count, const sgVec2i* positions, sgPixel colour); +void sgQuads (swgfx*, size_t count, const sgQuad*); +void sgQuadsi(swgfx*, size_t count, const sgQuadi*); +void sgTriangles2 (swgfx*, size_t count, const sgTri2*); +void sgTriangleStrip2(swgfx*, size_t count, const sgVec2*); +void sgTriangles (swgfx*, size_t count, const sgTri3*, const sgNormal*); +void sgTriangleStrip (swgfx*, size_t count, const sgVec3*, const sgNormal*); + +void sgCheck(swgfx*); + +// Memory +#define SG_ALIGN 64 +#define SG_ALIGN_PTR(P) ((uintptr_t)(P) & (~(SG_ALIGN-1))) +#define SG_ALIGN_ALLOC(COUNT, TYPE) (TYPE*)sgAlloc(1, COUNT * sizeof(TYPE)) +#define SG_FREE(PP) sgFree((void**)PP) +void* sgAlloc(size_t count, size_t size); +void sgFree(void**); -- cgit v1.2.3