From a0b8ef3d482c965901f094879a79dd9c5fd8245c Mon Sep 17 00:00:00 2001
From: chai <chaifix@163.com>
Date: Sun, 15 Dec 2019 13:29:05 +0800
Subject: *misc

---
 src/core/device.c      | 78 ++++++++++++++++++++++++++++++++++++++++++++++----
 src/core/device.h      | 30 +++++++++----------
 src/core/framebuffer.c |  5 ++++
 src/core/rasterizer.c  | 22 ++++----------
 src/core/rasterizer.h  |  3 +-
 src/core/shader.c      | 15 ++++++++++
 src/core/shader.h      | 11 ++-----
 7 files changed, 117 insertions(+), 47 deletions(-)

(limited to 'src/core')

diff --git a/src/core/device.c b/src/core/device.c
index 3566448..4b16d32 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -88,8 +88,8 @@ void ssr_init(ssr_Config* conf) {
 	state.filtermode = FILTERMODE_POINT;
 	state.wrapmode = WRAPMODE_CLAMP;
 
-	state.blendfactor.src = BLENDFACTOR_SRC_ALPHA;
-	state.blendfactor.dst = BLENDFACTOR_ONE_MINUS_SRC_ALPHA;
+	state.blendfactor.src = BLEND_SRC_ALPHA;
+	state.blendfactor.dst = BLEND_ONE_MINUS_SRC_ALPHA;
 }
 
 float ssr_getaspect() {
@@ -313,14 +313,82 @@ void ssr_blend(Color32* src, Color32* dst, Color32* out) {
 	ssrU_blend(state.blendfactor.src, state.blendfactor.dst, src, dst, out);
 }
 
-void ssrU_blend(ssr_BlendFactor sfactor
+static _blend(ssr_BlendFactor factor, Color32* src, Color32* dst, Color32* out) {
+	switch (factor) {
+		case BLEND_ONE:
+			break;
+		case BLEND_ZERO:
+			out->r = out->g = out->b = out->a = 0;
+			break;
+		case BLEND_SRC_COLOR:
+			out->r *= src->r;
+			out->g *= src->g;
+			out->b *= src->b;
+			out->a *= src->a;
+			break;
+		case BLEND_ONE_MINUS_SRC_COLOR:
+			out->r *= (1 - src->r);
+			out->g *= (1 - src->g);
+			out->b *= (1 - src->b);
+			out->a *= (1 - src->a);
+			break;
+		case BLEND_DST_COLOR:
+			out->r *= dst->r;
+			out->g *= dst->g;
+			out->b *= dst->b;
+			out->a *= dst->a;
+			break;
+		case BLEND_ONE_MINUS_DST_COLOR:
+			out->r *= (1 - dst->r);
+			out->g *= (1 - dst->g);
+			out->b *= (1 - dst->b);
+			out->a *= (1 - dst->a);
+			break;
+		case BLEND_SRC_ALPHA:
+			out->r *= src->a;
+			out->g *= src->a;
+			out->b *= src->a;
+			out->a *= src->a;
+			break;
+		case BLEND_ONE_MINUS_SRC_ALPHA:
+			out->r *= (1 - src->a);
+			out->g *= (1 - src->a);
+			out->b *= (1 - src->a);
+			out->a *= (1 - src->a);
+			break;
+		case BLEND_DST_ALPHA:
+			out->r *= dst->a;
+			out->g *= dst->a;
+			out->b *= dst->a;
+			out->a *= dst->a;
+			break;
+		case BLEND_ONE_MINUS_DST_ALPHA:
+			out->r *= (1 - dst->a);
+			out->g *= (1 - dst->a);
+			out->b *= (1 - dst->a);
+			out->a *= (1 - dst->a);
+			break;
+		default: 
+			ssr_assert(FALSE);
+			break;
+	}
+}
+
+void ssrU_blend(
+	ssr_BlendFactor sfactor
 	, ssr_BlendFactor dfactor
 	, Color32* src
 	, Color32* dst
 	, Color32* out
 ) {
 	ssr_assert(src && dst && out);
-	
+	Color32 s0; s0 = *src;
+	_blend(sfactor, src, dst, src);
+	_blend(dfactor, &s0, dst, dst);
+	out->r = src->r + dst->r;
+	out->g = src->g + dst->g;
+	out->b = src->b + dst->b;
+	out->a = src->a + dst->a;
 }
 
 Color32 ssr_getfbocolor(uint x, uint y) {
@@ -426,7 +494,7 @@ void ssr_draw(ssr_PrimitiveType primitive) {
 			v2 = &state.verts[i2];
 
 			/*back face culling*/
-			if (ssr_isenable(ENABLEMASK_BACKFACECULL)) { 
+			if (ssr_isenable(ENABLE_BACKFACECULL)) { 
 				float w0 = 1 / h0->w, w1 = 1 / h1->w, w2 = 1 / h2->w;
 				Vec3 ab, ac;
 				ab.x = h1->x * w1 - h0->x * w0; 
diff --git a/src/core/device.h b/src/core/device.h
index d8daf76..066d399 100644
--- a/src/core/device.h
+++ b/src/core/device.h
@@ -29,24 +29,24 @@ typedef enum {
 } ssr_PrimitiveType;
 
 typedef enum {
-	ENABLEMASK_BACKFACECULL = 1,
-	ENABLEMASK_DEPTHTEST    = 1 << 1,
-	ENABLEMASK_MULTISAMPLE  = 1 << 2,
-	ENABLEMASK_BLEND        = 1 << 3,
-	ENABLEMASK_WRITEDEPTH   = 1 << 4,
+	ENABLE_BACKFACECULL = 1,
+	ENABLE_DEPTHTEST    = 1 << 1,
+	ENABLE_MULTISAMPLE  = 1 << 2,
+	ENABLE_BLEND        = 1 << 3,
+	ENABLE_WRITEDEPTH   = 1 << 4,
 } ssr_EnableMask;
 
 typedef enum {
-	BLENDFACTOR_ONE,
-	BLENDFACTOR_ZERO,
-	BLENDFACTOR_SRC_COLOR, 
-	BLENDFACTOR_ONE_MINUS_SRC_COLOR, 
-	BLENDFACTOR_DST_COLOR, 
-	BLENDFACTOR_ONE_MINUS_DST_COLOR,
-	BLENDFACTOR_SRC_ALPHA,
-	BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
-	BLENDFACTOR_DST_ALPHA,
-	BLENDFACTOR_ONE_MINUS_DST_ALPHA,
+	BLEND_ONE,
+	BLEND_ZERO,
+	BLEND_SRC_COLOR, 
+	BLEND_ONE_MINUS_SRC_COLOR, 
+	BLEND_DST_COLOR, 
+	BLEND_ONE_MINUS_DST_COLOR,
+	BLEND_SRC_ALPHA,
+	BLEND_ONE_MINUS_SRC_ALPHA,
+	BLEND_DST_ALPHA,
+	BLEND_ONE_MINUS_DST_ALPHA,
 } ssr_BlendFactor;
 
 void ssr_init(ssr_Config* config);
diff --git a/src/core/framebuffer.c b/src/core/framebuffer.c
index e69de29..7fa0865 100644
--- a/src/core/framebuffer.c
+++ b/src/core/framebuffer.c
@@ -0,0 +1,5 @@
+#include "framebuffer.h"
+
+FrameBuffer* fbo_create(uint height, uint width) {
+
+}
diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c
index 772eb29..aad29e9 100644
--- a/src/core/rasterizer.c
+++ b/src/core/rasterizer.c
@@ -123,21 +123,10 @@ void ssrR_triangle( Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Pro
 	s[0].x = sc->x - sa->x; s[0].y = sb->x - sa->x;
 	s[1].x = sc->y - sa->y; s[1].y = sb->y - sa->y;
 
-	bool depth_test   = ssr_isenable(ENABLEMASK_DEPTHTEST);
-	bool multi_sample = ssr_isenable(ENABLEMASK_MULTISAMPLE);
-	bool blend        = ssr_isenable(ENABLEMASK_BLEND);
-	bool write_depth  = ssr_isenable(ENABLEMASK_WRITEDEPTH);
-
-#define DO_INTERPOLATION  \
-	if (varying_flag & VARYING_BASIC) {																																										 		 \
-		if (varying_flag & VARYING_POSITION) ssrS_bcpvec3(&bc, &A->position, &B->position, &C->position, &ssr_frag_in.position); \
-		if (varying_flag & VARYING_NORMAL) ssrS_bcpvec3(&bc, &A->normal, &B->normal, &C->normal, &ssr_frag_in.normal);					 \
-		if (varying_flag & VARYING_TANGENT) ssrS_bcpvec3(&bc, &A->tangent, &B->tangent, &C->tangent, &ssr_frag_in.tangent);			 \
-		if (varying_flag & VARYING_TEXCOORD) ssrS_bcpvec2(&bc, &A->texcoord, &B->texcoord, &C->texcoord, &ssr_frag_in.texcoord); \
-/*		if (varying_flag & VARYING_JOINT) ssrS_bcpvec4(&bc, &A->joint, &B->joint, &C->joint, &ssr_frag_in.joint);								 \
-		if (varying_flag & VARYING_WEIGHT) ssrS_bcpvec4(&bc, &A->weight, &B->weight, &C->weight, &ssr_frag_in.weight);					 \
-	*/	if (varying_flag & VARYING_COLOR) ssrS_bcpcolor(&bc, A->color, B->color, C->color, &ssr_frag_in.color);									 \
-	}	
+	bool depth_test   = ssr_isenable(ENABLE_DEPTHTEST);
+	bool multi_sample = ssr_isenable(ENABLE_MULTISAMPLE);
+	bool blend        = ssr_isenable(ENABLE_BLEND);
+	bool write_depth  = ssr_isenable(ENABLE_WRITEDEPTH);
 
 #define RENDER_TRIANGLE \
 	for (p.y = FROM->y; p.y < TO->y + OFFSET; ++p.y) {							   \
@@ -161,7 +150,7 @@ void ssrR_triangle( Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Pro
 				discardif(!ssr_testdepth(p.x, p.y, depth));						       \
 			}																														   \
 			/*set varying variables*/																		   \
-			DO_INTERPOLATION																							 \
+			ssrS_solveprops(varying_flag, &bc, A, B, C);									 \
 			ssrS_solveregs(&bc, A->index, B->index, C->index);             \
 			/*enter fragment shader*/																			 \
 			if(program->fragmentshader(uniforms, &ssr_frag_in, &color))	{	 \
@@ -177,6 +166,7 @@ void ssrR_triangle( Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Pro
 				if(write_depth) {																						 \
 					ssr_writedepth(p.x, p.y, depth);													 \
 				}																														 \
+				color32_saturate(&color);																		 \
 				ssr_putpoint32(p.x, p.y, &color);														 \
 			}																															 \
 		}																													       \
diff --git a/src/core/rasterizer.h b/src/core/rasterizer.h
index 8e35511..4fa2482 100644
--- a/src/core/rasterizer.h
+++ b/src/core/rasterizer.h
@@ -13,7 +13,6 @@ bool ssrR_barycentric(Vec2* A, Vec2* B, Vec2* C, Vec2* p, Vec3* out); /*
 void ssrR_center(Vec2* A, Vec2* B, Vec2* C, Vec2* out); /*�������*/
 bool ssrR_ispointintriangle(Vec2* A, Vec2* B, Vec2* C, Vec2* p);
 
-void ssrR_triangle(Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Program* program, UniformCollection* uniforms
-);
+void ssrR_triangle(Vec4* CA, Vec4* CB, Vec4* CC, Vert* A, Vert* B, Vert* C, Program* program, UniformCollection* uniforms);
 
 #endif
\ No newline at end of file
diff --git a/src/core/shader.c b/src/core/shader.c
index 0490362..86c2ad6 100644
--- a/src/core/shader.c
+++ b/src/core/shader.c
@@ -159,6 +159,21 @@ void ssrS_solveregs(Vec3* bc, uint a, uint b, uint c) {
 	}
 }
 
+/*����������ԵIJ�ֵ�������*/
+void ssrS_solveprops(uint varying_flag, Vec3* bc, Vert* A, Vert* B, Vert* C) {
+	if (varying_flag & VARYING_BASIC) {																																										 		
+		if (varying_flag & VARYING_POSITION) ssrS_bcpvec3(bc, &A->position, &B->position, &C->position, &ssr_frag_in.position);
+		if (varying_flag & VARYING_NORMAL) ssrS_bcpvec3(bc, &A->normal, &B->normal, &C->normal, &ssr_frag_in.normal);					
+		if (varying_flag & VARYING_TANGENT) ssrS_bcpvec3(bc, &A->tangent, &B->tangent, &C->tangent, &ssr_frag_in.tangent);			
+		if (varying_flag & VARYING_TEXCOORD) ssrS_bcpvec2(bc, &A->texcoord, &B->texcoord, &C->texcoord, &ssr_frag_in.texcoord);
+/*
+		if (varying_flag & VARYING_JOINT) ssrS_bcpvec4(&bc, &A->joint, &B->joint, &C->joint, &ssr_frag_in.joint);							
+		if (varying_flag & VARYING_WEIGHT) ssrS_bcpvec4(&bc, &A->weight, &B->weight, &C->weight, &ssr_frag_in.weight);					
+*/
+		if (varying_flag & VARYING_COLOR) ssrS_bcpcolor(bc, A->color, B->color, C->color, &ssr_frag_in.color);								
+	}	
+}
+
 /*���Ĵ������ݣ������Ҫ�Ļ���*/
 void ssrS_setregisters(int capacity) {
 	Register* reg;
diff --git a/src/core/shader.h b/src/core/shader.h
index d74581d..fd71f5a 100644
--- a/src/core/shader.h
+++ b/src/core/shader.h
@@ -169,15 +169,6 @@ Register registers[REG_TOTAL];
 ActiveReg active_regs[REG_TOTAL];
 uint open_regsi[REG_TOTAL]; /*draw call�õ��ļĴ���������������registers��active_regs*/
 
-#define REG_NUM_OFFSET 0
-#define REG_V2_OFFSET 4
-#define REG_V3_OFFSET 10
-#define REG_V4_OFFSET 18
-#define REG_NUM(i) (registers[i])
-#define REG_V2(i)  (registers[REG_V2_OFFSET + i])
-#define REG_V3(i)  (registers[REG_V3_OFFSET + i])
-#define REG_V4(i)  (registers[REG_V4_OFFSET + i])
-
 /*�Ĵ���ָ��accessor��ָ��Ĵ����е�ij��ֵ��������shader����ٷ��ʣ�ʹ�ô�����ܻ����Ұָ��*/
 float *reg_num_00, *reg_num_01, *reg_num_02, *reg_num_03;
 Vec2 *reg_v2_00, *reg_v2_01, *reg_v2_02, *reg_v2_03, *reg_v2_04, *reg_v2_05;
@@ -196,6 +187,8 @@ void ssrS_setupregisterpoints(int idx);
 /*���üĴ���ָ�룬ָ��fragIn�ṹ*/
 void ssrS_setregtofragin();
 
+void ssrS_solveprops(uint varying, Vec3* bc, Vert* a, Vert* b, Vert* c);
+
 #define tex2d(tex, uv) \
 texture_sampling(tex, ssr_getfiltermode(), ssr_getwrapmode(), (uv).x, (uv).y)
 
-- 
cgit v1.1-26-g67d0