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
91
92
93
94
95
96
97
98
|
#ifndef _SOFTSHADEROOM_DEVICE_H_
#define _SOFTSHADEROOM_DEVICE_H_
#include "../math/math.h"
#include "../util/type.h"
#include "mem.h"
#include "limits.h"
#include "shader.h"
#include "rasterizer.h"
#include "vert.h"
typedef enum ssr_MatrixMode {
MATRIX_MODEL = 0,
MATRIX_VIEW = 1,
MATRIX_PROJECTION = 2,
} ssr_MatrixMode;
typedef struct ssr_Config {
int width, height;
bool dbuffer;/* double buffer? */
Color* target; /* screen target buffer */
} ssr_Config;
typedef enum ssr_PrimitiveType {
PRIMITIVE_POINT,
PRIMITIVE_LINE,
PRIMITIVE_TRIANGLE,
} ssr_PrimitiveType;
typedef enum ssr_EnableMask {
ENABLEMASK_BACKFACECULL = 1 ,
ENABLEMASK_DEPTHTEST = 1 << 1,
} ssr_EnableMask;
void ssr_init(ssr_Config* config);
int ssr_getframebufferw();
int ssr_getframebufferh();
void ssr_matrixmode(ssr_MatrixMode mode);
void ssr_loadidentity();
void ssr_pushmatrix();
void ssr_popmatrix();
void ssr_lookat(Vec3* pos, Vec3* target, Vec3* up);
/*后乘,意味着这些操作会被率先应用到物体上,应该按照反向顺序调用这些函数*/
void ssr_translate(float x, float y, float z);
void ssr_rotate(float angle, float x, float y, float z);
void ssr_scale(float sx, float sy, float sz);
void ssr_multmatrix(Mat4* m);/*右乘矩阵*/
void ssr_loadmatrix(Mat4* m);
void ssr_frustum(float l, float r, float b, float t, float n, float f);
void ssr_perspective(float fov, float aspect, float n, float f);
void ssr_ortho(float l, float r, float b, float t, float n, float f);
void ssr_viewport(float l, float r, float b, float t);
void ssr_getmv(Mat4* out);
void ssr_getmvp(Mat4* out);
void ssr_enable(uint mask);
void ssr_disable(uint mask);
bool ssr_isenable(uint mask);
/* 绑定顶点数据 */
void ssr_bindvertices(Vert* verts, int nverts, uint* indices, int nprims);
void ssr_unbindvertices();
void ssr_useprogram(Program* program);
void ssr_unuseprogram();
void ssr_setuniformmat4(uint idx, Mat4* src);
void ssr_setuniformvec4(uint idx, Vec4* src);
void ssr_setuniformvec3(uint idx, Vec3* src);
void ssr_setuniformvec2(uint idx, Vec2* src);
void ssr_draw(ssr_PrimitiveType primitive);
void ssr_clearcolor(Color color);
void ssr_cleardepth();
void ssr_putpoint(uint screenx, uint screeny, Color color); /*直接修改某个位置的颜色*/
void ssr_present();
Color ssr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a);
//bool ssr_cutline(int* x0, int* y0, int* x1, int* y1);
bool ssr_testdepth(uint x, uint y, uint depth); /*尝试写入深度,如果可绘制返回true,否则discard*/
bool ssr_testdepthf(uint x, uint y, float depth01);
/*
** Utils
*/
void ssrU_viewport(Vec2* p, Vec2* out);
#endif
|