summaryrefslogtreecommitdiff
path: root/src/core/device.h
blob: 135010578feeeb667842be0b932cc09f2fefbb8e (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
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