diff options
Diffstat (limited to 'src/core/clip.c')
-rw-r--r-- | src/core/clip.c | 267 |
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; } |