summaryrefslogtreecommitdiff
path: root/src/core/clip.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/clip.c')
-rw-r--r--src/core/clip.c267
1 files changed, 149 insertions, 118 deletions
diff --git a/src/core/clip.c b/src/core/clip.c
index 382c766..1deb4ee 100644
--- a/src/core/clip.c
+++ b/src/core/clip.c
@@ -1,5 +1,6 @@
#include "clip.h"
#include "shader.h"
+#include "../util/type.h"
typedef enum {
POSITIVE_W,
@@ -60,73 +61,75 @@ static float get_intersect_ratio(Vec4* prev, Vec4* curr, Plane plane) {
return 0;
}
}
-
-static bool clip_against_plane(Plane plane, uint varying_flag, ClippedBuffer* src_buffer, ClippedBuffer* dst_buffer) {
- int idx = 0;
- for (int i = 0; i < src_buffer->count; ++i) {
- ClippedVert* prev = &src_buffer->vertices[(i - 1 + src_buffer->count) % src_buffer->count];
- ClippedVert* curr = &src_buffer->vertices[i];
-
- bool prev_inside = is_inside_plane(&prev->clip_coord, plane);
- bool curr_inside = is_inside_plane(&curr->clip_coord, plane);
-
- if (prev_inside != curr_inside) {
- ClippedVert* dst = &dst_buffer->vertices[idx];
- float t = get_intersect_ratio(&prev->clip_coord, &curr->clip_coord, plane);
- ssrS_lerpvec4(t, &prev->clip_coord, &curr->clip_coord, &dst->clip_coord);
- /*set varying varibles*/
- if (varying_flag & VARYING_BASIC) {
- if (varying_flag & VARYING_POSITION) ssrS_lerpvec3(t, &prev->vertex.position, &curr->vertex.position, &dst->vertex.position);
- if (varying_flag & VARYING_NORMAL) ssrS_lerpvec3(t, &prev->vertex.normal, &curr->vertex.normal, &dst->vertex.normal);
- if (varying_flag & VARYING_TANGENT) ssrS_lerpvec3(t, &prev->vertex.tangent, &curr->vertex.tangent, &dst->vertex.tangent);
- if (varying_flag & VARYING_TEXCOORD) ssrS_lerpvec2(t, &prev->vertex.texcoord, &curr->vertex.texcoord, &dst->vertex.texcoord);
- if (varying_flag & VARYING_COLOR) ssrS_lerpcolor(t, prev->vertex.color, curr->vertex.color, &dst->vertex.color);
- if (varying_flag & VARYING_JOINT) ssrS_lerpvec4(t, &prev->vertex.joint, &curr->vertex.joint, &dst->vertex.joint);
- if (varying_flag & VARYING_WEIGHT) ssrS_lerpvec4(t, &prev->vertex.weight, &curr->vertex.weight, &dst->vertex.weight);
- }
- if (varying_flag & VARYING_EXTRA) {
- int j = 0;
- if (varying_flag & VARYING_NUM) {
- for (j = 0; j < REG_NUM_COUNT; ++j) {
- if (varying_flag & (VARYING_NUM_00 << j)) {
- ssrS_lerpnum(t, prev->num[j], curr->num[j], &dst->num[j]);
- }
- }
- }
- if (varying_flag & VARYING_V2) {
- for (j = 0; j < REG_V2_COUNT; ++j) {
- if (varying_flag & (VARYING_V2_00 << j)) {
- ssrS_lerpvec2(t, &prev->v2[j], &curr->v2[j], &dst->v2[j]);
- }
- }
- }
- if (varying_flag & VARYING_V3) {
- for (j = 0; j < REG_V3_COUNT; ++j) {
- if (varying_flag & (VARYING_V3_00 << j)) {
- ssrS_lerpvec3(t, &prev->v3[j], &curr->v3[j], &dst->v3[j]);
- }
- }
- }
- if (varying_flag & VARYING_V4) {
- for (j = 0; j < REG_V4_COUNT; ++j) {
- if (varying_flag & (VARYING_V4_00 << j)) {
- ssrS_lerpvec4(t, &prev->v4[j], &curr->v4[j], &dst->v4[j]);
- }
- }
- }
- }
- ++idx;
- }
-
- if (curr_inside) {
- ClippedVert* dst = &dst_buffer->vertices[idx];
- *dst = *curr;
- ++idx;
- }
- }
- dst_buffer->count = idx;
- return idx < 3;
-}
+//
+//static bool clip_against_plane(Plane plane, uint varying_flag, ClippedBuffer* src_buffer, ClippedBuffer* dst_buffer) {
+// int idx = 0;
+// for (int i = 0; i < src_buffer->count; ++i) {
+// ClippedVert* prev = &src_buffer->vertices[(i - 1 + src_buffer->count) % src_buffer->count];
+// ClippedVert* curr = &src_buffer->vertices[i];
+//
+// bool prev_inside = is_inside_plane(&prev->clip_coord, plane);
+// bool curr_inside = is_inside_plane(&curr->clip_coord, plane);
+//
+// if (prev_inside != curr_inside) {
+// ClippedVert* dst = &dst_buffer->vertices[idx];
+// float t = get_intersect_ratio(&prev->clip_coord, &curr->clip_coord, plane);
+// ssrS_lerpvec4(t, &prev->clip_coord, &curr->clip_coord, &dst->clip_coord);
+// /*set varying varibles*/
+// if (varying_flag & VARYING_BASIC) {
+// if (varying_flag & VARYING_POSITION) ssrS_lerpvec3(t, &prev->vertex.position, &curr->vertex.position, &dst->vertex.position);
+// if (varying_flag & VARYING_NORMAL) ssrS_lerpvec3(t, &prev->vertex.normal, &curr->vertex.normal, &dst->vertex.normal);
+// if (varying_flag & VARYING_TANGENT) ssrS_lerpvec3(t, &prev->vertex.tangent, &curr->vertex.tangent, &dst->vertex.tangent);
+// if (varying_flag & VARYING_TEXCOORD) ssrS_lerpvec2(t, &prev->vertex.texcoord, &curr->vertex.texcoord, &dst->vertex.texcoord);
+// if (varying_flag & VARYING_COLOR) ssrS_lerpcolor(t, prev->vertex.color, curr->vertex.color, &dst->vertex.color);
+///*
+// if (varying_flag & VARYING_JOINT) ssrS_lerpvec4(t, &prev->vertex.joint, &curr->vertex.joint, &dst->vertex.joint);
+// if (varying_flag & VARYING_WEIGHT) ssrS_lerpvec4(t, &prev->vertex.weight, &curr->vertex.weight, &dst->vertex.weight);
+//*/
+// }
+// if (varying_flag & VARYING_EXTRA) {
+// int j = 0;
+// if (varying_flag & VARYING_NUM) {
+// for (j = 0; j < REG_NUM_COUNT; ++j) {
+// if (varying_flag & (VARYING_NUM_00 << j)) {
+// ssrS_lerpnum(t, prev->num[j], curr->num[j], &dst->num[j]);
+// }
+// }
+// }
+// if (varying_flag & VARYING_V2) {
+// for (j = 0; j < REG_V2_COUNT; ++j) {
+// if (varying_flag & (VARYING_V2_00 << j)) {
+// ssrS_lerpvec2(t, &prev->v2[j], &curr->v2[j], &dst->v2[j]);
+// }
+// }
+// }
+// if (varying_flag & VARYING_V3) {
+// for (j = 0; j < REG_V3_COUNT; ++j) {
+// if (varying_flag & (VARYING_V3_00 << j)) {
+// ssrS_lerpvec3(t, &prev->v3[j], &curr->v3[j], &dst->v3[j]);
+// }
+// }
+// }
+// if (varying_flag & VARYING_V4) {
+// for (j = 0; j < REG_V4_COUNT; ++j) {
+// if (varying_flag & (VARYING_V4_00 << j)) {
+// ssrS_lerpvec4(t, &prev->v4[j], &curr->v4[j], &dst->v4[j]);
+// }
+// }
+// }
+// }
+// ++idx;
+// }
+//
+// if (curr_inside) {
+// ClippedVert* dst = &dst_buffer->vertices[idx];
+// *dst = *curr;
+// ++idx;
+// }
+// }
+// dst_buffer->count = idx;
+// return idx < 3;
+//}
#define CLIP(plane, from, to) \
do { \
@@ -136,6 +139,36 @@ do { \
} \
}while(0)
+ClippedBuffer clip_buffer;
+
+byte* clip_buffer_data[REG_TOTAL] =
+{
+ &clip_buffer.temp_reg_num[0],
+ &clip_buffer.temp_reg_num[1],
+ &clip_buffer.temp_reg_num[2],
+ &clip_buffer.temp_reg_num[3],
+ &clip_buffer.temp_reg_v2[0],
+ &clip_buffer.temp_reg_v2[1],
+ &clip_buffer.temp_reg_v2[2],
+ &clip_buffer.temp_reg_v2[3],
+ &clip_buffer.temp_reg_v2[4],
+ &clip_buffer.temp_reg_v2[5],
+ &clip_buffer.temp_reg_v3[0],
+ &clip_buffer.temp_reg_v3[1],
+ &clip_buffer.temp_reg_v3[2],
+ &clip_buffer.temp_reg_v3[3],
+ &clip_buffer.temp_reg_v3[4],
+ &clip_buffer.temp_reg_v3[5],
+ &clip_buffer.temp_reg_v3[6],
+ &clip_buffer.temp_reg_v3[7],
+ &clip_buffer.temp_reg_v4[0],
+ &clip_buffer.temp_reg_v4[1],
+ &clip_buffer.temp_reg_v4[2],
+ &clip_buffer.temp_reg_v4[3],
+ &clip_buffer.temp_reg_v4[4],
+ &clip_buffer.temp_reg_v4[5],
+};
+
bool clip_triangle(Vec4* c0, Vec4* c1, Vec4* c2, Vert* v0, Vert* v1, Vert* v2, uint varying_flag, ClippedBuffer* buffer) {
bool is_visible = is_vertex_visible(c0)
&& is_vertex_visible(c1)
@@ -144,55 +177,53 @@ bool clip_triangle(Vec4* c0, Vec4* c1, Vec4* c2, Vert* v0, Vert* v1, Vert* v2, u
if (is_visible) {
return 0; /*no need to clip*/
}
-
- /*clipping it*/
-
- static ClippedBuffer temp;
-
- /*copy vert data to temp*/
- temp.count = 3;
-#define INIT_CLIP_VERT(idx) \
- temp.vertices[idx].clip_coord = *c##idx; \
- temp.vertices[idx].vertex = *v##idx; \
- if (varying_flag & VARYING_EXTRA) { \
- int i = 0; \
- if(varying_flag & VARYING_NUM) { \
- for (i = 0; i < REG_NUM_COUNT; ++i) { \
- if (varying_flag & (VARYING_NUM_00 << i)) \
- temp.vertices[idx].num[i] = reg_num[i].num[v##idx->index]; \
- } \
- } \
- if(varying_flag & VARYING_V2) { \
- for (i = 0; i < REG_V2_COUNT; ++i) { \
- if (varying_flag & (VARYING_V2_00 << i)) \
- temp.vertices[idx].v2[i] = reg_v2[i].v2[v##idx->index]; \
- } \
- } \
- if(varying_flag & VARYING_V3) { \
- for (i = 0; i < REG_V3_COUNT; ++i) { \
- if (varying_flag & (VARYING_V3_00 << i)) \
- temp.vertices[idx].v3[i] = reg_v3[i].v3[v##idx->index]; \
- } \
- } \
- if(varying_flag & VARYING_V4) { \
- for (i = 0; i < REG_V4_COUNT; ++i) { \
- if (varying_flag & (VARYING_V4_00 << i)) \
- temp.vertices[idx].v4[i] = reg_v4[i].v4[v##idx->index]; \
- } \
- } \
- }
- INIT_CLIP_VERT(0);
- INIT_CLIP_VERT(1);
- INIT_CLIP_VERT(2);
-#undef INIT_CLIP_VERT
-
- CLIP(POSITIVE_W, &temp, buffer);
- CLIP(POSITIVE_X, buffer, &temp);
- CLIP(NEGATIVE_X, &temp, buffer);
- CLIP(POSITIVE_Y, buffer, &temp);
- CLIP(NEGATIVE_Y, &temp, buffer);
- CLIP(POSITIVE_Z, buffer, &temp);
- CLIP(NEGATIVE_Z, &temp, buffer);
-
- return 1;
+//
+// /*clipping it*/
+//
+// /*copy vert data to clip_buffer*/
+// clip_buffer.count = 3;
+//#define INIT_CLIP_VERT(idx) \
+// clip_buffer.vertices[idx].clip_coord = *c##idx; \
+// clip_buffer.vertices[idx].vertex = *v##idx; \
+// if (varying_flag & VARYING_EXTRA) { \
+// int i = 0; \
+// if(varying_flag & VARYING_NUM) { \
+// for (i = 0; i < REG_NUM_COUNT; ++i) { \
+// if (varying_flag & (VARYING_NUM_00 << i)) \
+// clip_buffer.vertices[idx].num[i] = reg_num[i].num[v##idx->index]; \
+// } \
+// } \
+// if(varying_flag & VARYING_V2) { \
+// for (i = 0; i < REG_V2_COUNT; ++i) { \
+// if (varying_flag & (VARYING_V2_00 << i)) \
+// clip_buffer.vertices[idx].v2[i] = reg_v2[i].v2[v##idx->index]; \
+// } \
+// } \
+// if(varying_flag & VARYING_V3) { \
+// for (i = 0; i < REG_V3_COUNT; ++i) { \
+// if (varying_flag & (VARYING_V3_00 << i)) \
+// clip_buffer.vertices[idx].v3[i] = reg_v3[i].v3[v##idx->index]; \
+// } \
+// } \
+// if(varying_flag & VARYING_V4) { \
+// for (i = 0; i < REG_V4_COUNT; ++i) { \
+// if (varying_flag & (VARYING_V4_00 << i)) \
+// clip_buffer.vertices[idx].v4[i] = reg_v4[i].v4[v##idx->index]; \
+// } \
+// } \
+// }
+// INIT_CLIP_VERT(0);
+// INIT_CLIP_VERT(1);
+// INIT_CLIP_VERT(2);
+//#undef INIT_CLIP_VERT
+//
+// CLIP(POSITIVE_W, &clip_buffer, buffer);
+// CLIP(POSITIVE_X, buffer, &clip_buffer);
+// CLIP(NEGATIVE_X, &clip_buffer, buffer);
+// CLIP(POSITIVE_Y, buffer, &clip_buffer);
+// CLIP(NEGATIVE_Y, &clip_buffer, buffer);
+// CLIP(POSITIVE_Z, buffer, &clip_buffer);
+// CLIP(NEGATIVE_Z, &clip_buffer, buffer);
+//
+// return 1;
}