summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-12-08 10:59:54 +0800
committerchai <chaifix@163.com>2019-12-08 10:59:54 +0800
commitfb2791c41847d76327b6665398b44be41a44c02d (patch)
treee6083a40093f04520079b89e87fbcc47caf5f598 /src/core
parent8518e135ff5c312bd5a3b496d400c751aa3bd5b3 (diff)
*misc
Diffstat (limited to 'src/core')
-rw-r--r--src/core/clip.c15
-rw-r--r--src/core/device.c19
-rw-r--r--src/core/device.h2
-rw-r--r--src/core/mem.h2
-rw-r--r--src/core/rasterizer.c11
-rw-r--r--src/core/shader.h80
-rw-r--r--src/core/texture.h17
7 files changed, 90 insertions, 56 deletions
diff --git a/src/core/clip.c b/src/core/clip.c
index 071b14b..382c766 100644
--- a/src/core/clip.c
+++ b/src/core/clip.c
@@ -1,8 +1,6 @@
#include "clip.h"
#include "shader.h"
-/*from mesa3d*/
-
typedef enum {
POSITIVE_W,
POSITIVE_X,
@@ -131,12 +129,11 @@ static bool clip_against_plane(Plane plane, uint varying_flag, ClippedBuffer* sr
}
#define CLIP(plane, from, to) \
-do { \
-is_cull = clip_against_plane(plane, varying_flag, from, to); \
-if (is_cull) { \
- buffer->count = 0;/*cull this triangle*/ \
- return 1; \
-} \
+do { \
+ if (clip_against_plane(plane, varying_flag, from, to)) { \
+ buffer->count = 0;/*cull this triangle*/ \
+ return 1; \
+ } \
}while(0)
bool clip_triangle(Vec4* c0, Vec4* c1, Vec4* c2, Vert* v0, Vert* v1, Vert* v2, uint varying_flag, ClippedBuffer* buffer) {
@@ -189,8 +186,6 @@ bool clip_triangle(Vec4* c0, Vec4* c1, Vec4* c2, Vert* v0, Vert* v1, Vert* v2, u
INIT_CLIP_VERT(2);
#undef INIT_CLIP_VERT
- bool is_cull = FALSE;
-
CLIP(POSITIVE_W, &temp, buffer);
CLIP(POSITIVE_X, buffer, &temp);
CLIP(NEGATIVE_X, &temp, buffer);
diff --git a/src/core/device.c b/src/core/device.c
index b9c024c..9e4a6eb 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -75,6 +75,10 @@ void ssr_init(ssr_Config* conf) {
memset(state.zbuffer, 0xff, sizeof(uint)*config.width*config.height);
}
+float ssr_getaspect() {
+ return (float)config.width / config.height;
+}
+
int ssr_getframebufferw() {
return config.width;
}
@@ -204,8 +208,11 @@ void ssr_clearcolor(Color color) {
memset(state.framebuffer, 0, state.buffersize);
}
else {
- for (int i = 0; i < config.width*config.height; ++i)
- state.framebuffer[i] = color;
+ uint size = config.width * sizeof(Color);
+ for(int x = 0; x < config.width; ++x)
+ state.framebuffer[x] = color;
+ for (int y = 1; y < config.height; ++y)
+ ssrM_copy(&state.framebuffer[config.width * y], state.framebuffer, size);
}
}
@@ -242,10 +249,10 @@ bool ssr_testdepthf(uint x, uint y, float depth) {
void ssrU_viewport(Vec2* p, Vec2* out) {
ssr_assert(p && out);
float halfw = config.width / 2.f, halfh = config.height / 2.f;
- out->x = (int)(p->x * halfw + halfw);
- out->y = (int)(halfh - p->y * halfh);
- //out->x = (int)((p->x + 1) * (halfw - 0.5f));
- //out->y = (int)((1 - p->y) * (halfh - 0.5f));
+ //out->x = (int)round(p->x * halfw + halfw);
+ //out->y = (int)round(halfh - p->y * halfh);
+ out->x = (int)round((p->x + 1) * (halfw - 0.5f));
+ out->y = (int)round((1 - p->y) * (halfh - 0.5f));
}
void ssr_bindvertices(Vert* verts, int nverts, uint* indices, int nprims) {
diff --git a/src/core/device.h b/src/core/device.h
index 10db509..5cf9c4a 100644
--- a/src/core/device.h
+++ b/src/core/device.h
@@ -34,6 +34,8 @@ typedef enum ssr_EnableMask {
void ssr_init(ssr_Config* config);
+float ssr_getaspect();
+
int ssr_getframebufferw();
int ssr_getframebufferh();
diff --git a/src/core/mem.h b/src/core/mem.h
index e6cc714..dd6beca 100644
--- a/src/core/mem.h
+++ b/src/core/mem.h
@@ -6,6 +6,8 @@
void ssrM_freemem();
void ssrM_realloc();
+#define ssrM_copy memcpy
+
#define ssrM_zero(obj, size) memset(obj, 0, size)
#define ssrM_new(T) (T*)malloc(sizeof(T))
#define ssrM_newvector(T, c) ((T*)calloc(c, sizeof(T)))
diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c
index d39e246..bf210b7 100644
--- a/src/core/rasterizer.c
+++ b/src/core/rasterizer.c
@@ -210,7 +210,7 @@ void ssrR_triangle(
s[1].x = sc->y - sa->y; s[1].y = sb->y - sa->y;
#define RENDER_TRIANGLE \
- for (p.y = FROM->y; p.y < TO->y; ++p.y) { \
+ for (p.y = FROM->y; p.y < TO->y + OFFSET; ++p.y) { \
SET_FROM_AND_TO \
s[1].z = sa->y - p.y; \
for (p.x = from; order * (p.x - to) <= 0; p.x += order) { \
@@ -226,8 +226,10 @@ void ssrR_triangle(
bcp.x *= CAw; bcp.y *= CBw; bcp.z *= CCw; \
vec3_scale(&bcp, 1.f / (bcp.x + bcp.y + bcp.z), &bcp); \
/*depth test*/ \
- depth = (bcp.x*sa->z+bcp.y*sb->z+bcp.z*sc->z) * 0.5f + 0.5f; \
- discardif(!ssr_testdepthf(p.x, p.y, depth)); \
+ if(ssr_isenable(ENABLEMASK_DEPTHTEST)){ \
+ depth = (bcp.x*sa->z+bcp.y*sb->z+bcp.z*sc->z) * 0.5f + 0.5f;\
+ discardif(!ssr_testdepthf(p.x, p.y, depth)); \
+ } \
/*set varying variables*/ \
DO_INTERPOLATION \
if(program->fragmentshader(uniforms, &ssr_frag_in, &color)) \
@@ -239,6 +241,7 @@ void ssrR_triangle(
#define TO sb
#define FROMK invkAC
#define TOK invkAB
+#define OFFSET 0
#define SET_FROM_AND_TO \
from = (int)(invkAC * (p.y - sa->y) + sa->x); \
to = (int)(invkAB * (p.y - sa->y) + sa->x); \
@@ -249,6 +252,7 @@ void ssrR_triangle(
#define TO sc
#define FROMK invkAC
#define TOK invkBC
+#define OFFSET 1
#define SET_FROM_AND_TO \
if (p.y == sb->y && sb->y == sc->y) { \
from = sc->x; \
@@ -265,6 +269,7 @@ void ssrR_triangle(
#undef TO
#undef FROMK
#undef TOK
+#undef OFFSET
#undef SET_FROM_AND_TO
#undef RENDER_TRIANGLE
}
diff --git a/src/core/shader.h b/src/core/shader.h
index 224ebb4..f663a47 100644
--- a/src/core/shader.h
+++ b/src/core/shader.h
@@ -3,6 +3,7 @@
#include "../math/math.h"
#include "vert.h"
+#include "texture.h"
typedef struct UniformCollection {
/*built in varaibles*/
@@ -12,6 +13,7 @@ typedef struct UniformCollection {
Mat4* mvp;
Mat4* mv;
/*extra variables*/
+ Texture* var_tex[12];
Mat4 var_mat4[8];
Vec4 var_vec4[8];
Vec3 var_vec3[8];
@@ -21,6 +23,7 @@ typedef struct UniformCollection {
void* userdata;
} UniformCollection;
+#define TEX(i) (&uniforms->var_tex[i])
#define UM4(i) (&uniforms->var_mat4[i])
#define UV2(i) (&uniforms->var_vec2[i])
#define UV3(i) (&uniforms->var_vec3[i])
@@ -59,56 +62,55 @@ typedef struct Program {
#define VARYING_NONE (0)
-#define VARYING_POSITION (1 << 31)
-#define VARYING_NORMAL (1 << 30)
-#define VARYING_TANGENT (1 << 29)
-#define VARYING_TEXCOORD (1 << 28)
-#define VARYING_COLOR (1 << 27)
-#define VARYING_JOINT (1 << 26)
-#define VARYING_WEIGHT (1 << 25)
+#define VARYING_POSITION (1U << 31)
+#define VARYING_NORMAL (1U << 30)
+#define VARYING_TANGENT (1U << 29)
+#define VARYING_TEXCOORD (1U << 28)
+#define VARYING_COLOR (1U << 27)
+#define VARYING_JOINT (1U << 26)
+#define VARYING_WEIGHT (1U << 25)
-#define VARYING_UNUSED (1 << 24)
+#define VARYING_UNUSED (1U << 24)
#define VARYING_BASIC ( VARYING_UNUSED | VARYING_POSITION | VARYING_NORMAL | VARYING_TANGENT | VARYING_TEXCOORD | VARYING_COLOR | VARYING_JOINT | VARYING_WEIGHT )
-#define VARYING_NUM_00 (1 << 20)
-#define VARYING_NUM_01 (1 << 21)
-#define VARYING_NUM_02 (1 << 22)
-#define VARYING_NUM_03 (1 << 23)
+#define VARYING_NUM_00 (1U << 20)
+#define VARYING_NUM_01 (1U << 21)
+#define VARYING_NUM_02 (1U << 22)
+#define VARYING_NUM_03 (1U << 23)
#define VARYING_NUM (VARYING_NUM_00 | VARYING_NUM_01 | VARYING_NUM_02 | VARYING_NUM_03 )
-
-#define VARYING_V2_00 (1)
-#define VARYING_V2_01 (1 << 1)
-#define VARYING_V2_02 (1 << 2)
-#define VARYING_V2_03 (1 << 3)
-#define VARYING_V2_04 (1 << 4)
-#define VARYING_V2_05 (1 << 5)
+
+#define VARYING_V2_00 (1U)
+#define VARYING_V2_01 (1U << 1)
+#define VARYING_V2_02 (1U << 2)
+#define VARYING_V2_03 (1U << 3)
+#define VARYING_V2_04 (1U << 4)
+#define VARYING_V2_05 (1U << 5)
#define VARYING_V2 (VARYING_V2_00 | VARYING_V2_01 | VARYING_V2_02 | VARYING_V2_03 | VARYING_V2_04 | VARYING_V2_05)
-
-#define VARYING_V3_00 (1 << 6)
-#define VARYING_V3_01 (1 << 7)
-#define VARYING_V3_02 (1 << 8)
-#define VARYING_V3_03 (1 << 9)
-#define VARYING_V3_04 (1 << 10)
-#define VARYING_V3_05 (1 << 11)
-#define VARYING_V3_06 (1 << 12)
-#define VARYING_V3_07 (1 << 13)
+
+#define VARYING_V3_00 (1U << 6)
+#define VARYING_V3_01 (1U << 7)
+#define VARYING_V3_02 (1U << 8)
+#define VARYING_V3_03 (1U << 9)
+#define VARYING_V3_04 (1U << 10)
+#define VARYING_V3_05 (1U << 11)
+#define VARYING_V3_06 (1U << 12)
+#define VARYING_V3_07 (1U << 13)
#define VARYING_V3 (VARYING_V3_00 | VARYING_V3_01 | VARYING_V3_02 | VARYING_V3_03 | VARYING_V3_04 | VARYING_V3_05| VARYING_V3_06| VARYING_V3_07)
-
-#define VARYING_V4_00 (1 << 14)
-#define VARYING_V4_01 (1 << 15)
-#define VARYING_V4_02 (1 << 16)
-#define VARYING_V4_03 (1 << 17)
-#define VARYING_V4_04 (1 << 18)
-#define VARYING_V4_05 (1 << 19)
+
+#define VARYING_V4_00 (1U << 14)
+#define VARYING_V4_01 (1U << 15)
+#define VARYING_V4_02 (1U << 16)
+#define VARYING_V4_03 (1U << 17)
+#define VARYING_V4_04 (1U << 18)
+#define VARYING_V4_05 (1U << 19)
#define VARYING_V4 (VARYING_V4_00 | VARYING_V4_01 | VARYING_V4_02 | VARYING_V4_03 | VARYING_V4_04 | VARYING_V4_05)
#define VARYING_EXTRA (VARYING_NUM | VARYING_V2 | VARYING_V3 | VARYING_V4)
-
float* ssrS_bcpnum(Vec3* bc, float A, float B, float C, float* out);
Color* ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out);
Vec2* ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out);
@@ -193,4 +195,10 @@ void ssrS_setupregisterpoints(uint extra_varying_flag, int idx);
/*设置寄存器指针,指向fragIn结构*/
void ssrS_setregtofragin(uint extra_varying_flag, FragmentShaderIn* frag_in);
+
+/*
+** texture
+*/
+Color32 texture2d(float x, float y);
+
#endif \ No newline at end of file
diff --git a/src/core/texture.h b/src/core/texture.h
index d6aee82..20a0228 100644
--- a/src/core/texture.h
+++ b/src/core/texture.h
@@ -4,8 +4,23 @@
#include "vert.h"
typedef struct Texture{
- uint id;/*identifier*/
uint width, height;
+ Color* pixels;
}Texture;
+void texture_loadfromfile(const char* path, Texture* out);
+
+typedef enum FilterMode {
+ FILTERMODE_POINT,
+ FILTERMODE_BILINEAR,
+ FILTERMODE_TRILINEAR,
+} FilterMode;
+
+typedef enum WrapMode{
+ WRAPMODE_REPEAT,
+ WRAPMODE_CLAMP,
+} WrapMode;
+
+Color32 texture_sampling(Texture* tex, FilterMode filter_mode, WrapMode wrap_mode, float x, float y);
+
#endif \ No newline at end of file