summaryrefslogtreecommitdiff
path: root/include/swgfx.h
blob: 9905382d9705d291eacba30bae7e7afe8ed26228 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
Software rendering library.

Coordinate systems:
- The coordinate systems for image addressing and texture sampling are the same
  except in scale.
    Origin is in the top-left corner of the image.
    Axes extend down and to the right.
- Image addressing:
    (i,j) integer coordinates refer to the center of the pixel.
- Texture addressing:
    (u,v) range in [0,1].
    (0,0) is the center of the top-left pixel.
    (1,1) is the center of the bottom-right pixel.

Multi-threading:
- Internal resources (swgfx context) are externally synchronized.
- External resources (colour buffer) are internally synchronized.
*/
#pragma once

#include <stddef.h>
#include <stdint.h>

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 sgVert2i { sgVec2i pos; sgVec2 uv; } sgVert2i;
typedef struct sgVert2  { sgVec2  pos; sgVec2 uv; } sgVert2;
typedef struct sgVert3  { sgVec3  pos; sgVec2 uv; } sgVert3;

typedef struct sgQuadi { sgVert2i p0, p1; }     sgQuadi;
typedef struct sgQuad  { sgVert2  p0, p1; }     sgQuad;
typedef struct sgTri2  { sgVert2  p0, p1, p2; } sgTri2;
typedef struct sgTri3  { sgVert3  p0, p1, p2; } sgTri3;

typedef uint16_t sgIdx;
typedef struct   sgVertIdx { sgIdx pos, uv, normal; } sgVertIdx;
typedef struct   sgTriIdx  { sgVertIdx v0, v1, v2;  } sgTriIdx;

typedef struct sgBgra { uint8_t b, g, r, a; } sgBgra;
typedef struct sgRgba { uint8_t r, g, b, a; } sgRgba;
// TODO: Should we use real-valued colours?
typedef sgRgba sgPixel;
// TODO: Expose a macro to control the desired surface format.
typedef sgBgra sgScreenPixel;

typedef struct sgImage {
  int      width;
  int      height;
  sgPixel* pixels;
} sgImage;

typedef struct swgfx swgfx;

size_t sgMem(int width, int height); // Get memory requirements.
swgfx* sgNew(int width, int height, void* mem);
void   sgDel(swgfx**);

// TODO: Write client app first, then implement the functions below in the C file.

void sgPresent(swgfx*, sgVec2i dimensions, sgScreenPixel* screen);

void sgModelId    (swgfx*);
void sgModel      (swgfx*, sgVec3 position, sgVec3 right, sgVec3 up, sgVec3 forward);
void sgView       (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 sgTexture(swgfx*, const sgImage*);

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 sgTrianglesIndexed(swgfx*, size_t numIndices, const sgIdx* indices, const sgVec3* positions, const sgVec2* texcoords);
void sgTrianglesIndexedNonUniform(swgfx*, size_t numTris, const sgTriIdx* tris, const sgVec3* positions, const sgVec2* texcoords);

void sgCheck(swgfx*);