Mercurial > hg > Members > kono > Cerium
diff old/simple_render/task/create_span.cpp @ 507:735f76483bb2
Reorganization..
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 12 Oct 2009 09:39:35 +0900 |
parents | TaskManager/Test/simple_render/task/create_span.cpp@f64d75473f95 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/old/simple_render/task/create_span.cpp Mon Oct 12 09:39:35 2009 +0900 @@ -0,0 +1,234 @@ +#include <iostream> +#include "viewer.h" +#include "polygon_pack.h" +#include "SpuSpan.h" +using namespace std; + +static float calc(float f1, float f2,int i, float base){ + float ans; + ans = f1/f2*i + base; + return ans; +} + + +static VertexPack* +vMid1(VertexPack *vMid1, VertexPack *vMin, VertexPack *vMid, VertexPack *vMax) +{ + int d, d1; + + // float2int のマクロとか書く? +#if 0 + d = (int)vMax->y - (int)vMin->y; + d1 = (int)vMid->y - (int)vMin->y; +#else + d = (int)(vMax->y - vMin->y); + d1 = (int)(vMid->y - vMin->y); +#endif + + vMid1->tex_x = calc(vMax->tex_x - vMin->tex_x, d, d1, vMin->tex_x); + vMid1->tex_y = calc(vMax->tex_y - vMin->tex_y, d, d1, vMin->tex_y); + vMid1->x = calc(vMax->x - vMin->x, d, d1, vMin->x); + vMid1->y = vMid->y; + vMid1->z = calc(vMax->z - vMin->z, d, d1, vMin->z); + + return vMid1; +} + +void +half_triangle(SpuSpan *ssl, + long *tex_addr, long tex_width, long tex_height, + VertexPack *vMin, VertexPack *vMid, VertexPack *vMid1) +{ + float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2; + float tmp_xpos,tmp_end,tmp_zpos; + int i; + //int j; + float div_y; + float start_z,end_z; + float start_tex_x,end_tex_x,start_tex_y,end_tex_y; + int x,y,length; + int k =0; + int l = 1; + int start_y = (int)vMid->y; + int end_y = (int)vMin->y; + int real_x, real_y; + + if (start_y<end_y) { + int i; i=end_y; end_y=start_y; start_y = i; + k = 1; + l = -1; + } + + div_y = start_y - end_y; // > 0 + + for(i = k; i < div_y+1; i++) { + tmp_xpos = calc(vMid1->x - vMin->x ,div_y, i, vMin->x); + tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x); + tmp_z = calc(vMid1->z - vMin->z ,div_y, i, vMin->z); + tmp_zpos = calc(vMid->z - vMin->z ,div_y, i, vMin->z); + + tmp_tex1 =((i/(div_y)) * vMid1->tex_x) + + ( ((div_y - i)/(div_y)) * vMin->tex_x); + tmp_tex2 =( (i/(div_y)) * vMid->tex_x) + + ( ((div_y - i)/(div_y)) * vMin->tex_x); + + tmp_tey1 =( (i/(div_y)) * vMid1->tex_y) + + ( ((div_y - i)/(div_y)) * vMin->tex_y); + tmp_tey2 =( (i/(div_y)) * vMid->tex_y) + + ( ((div_y - i)/(div_y)) * vMin->tex_y); + + if (tmp_xpos > tmp_end) { + x = (int)tmp_end; + y = (int)vMin->y + i*l; + length = (int)(tmp_xpos)-(int)(tmp_end)+1; + start_z = tmp_zpos; + end_z = tmp_z; + start_tex_x = tmp_tex2; + end_tex_x = tmp_tex1; + start_tex_y = tmp_tey2; + end_tex_y = tmp_tey1; + } else { + x = (int)tmp_xpos; + y = (int)vMin->y + i*l; + length = (int)(tmp_end)-(int)(tmp_xpos)+1; + start_z = tmp_z; + end_z = tmp_zpos; + start_tex_x = tmp_tex1; + end_tex_x = tmp_tex2; + start_tex_y = tmp_tey1; + end_tex_y = tmp_tey2; + } + + // 画面外のものはここで + // この判定で当たってるのかな? +#if 0 + real_x = x + Viewer::width/2; + real_y = y + Viewer::height/2; + + if (real_x < 0 || real_x > Viewer::width || + real_y < 0 || real_y > Viewer::height) { + continue; + } + + int line_set = (y + (Viewer::height/2))/TEXTURE_SPLIT_PIXEL; +#else + if (x < 0 || x > Viewer::width || + y < 0 || y > Viewer::height) { + continue; + } + + int line_set = y / TEXTURE_SPLIT_PIXEL; +#endif + + int spu_no = line_set % SPE_NUM_MAX; + int spp_no = line_set / SPE_NUM_MAX; + + SpanPack *spack = &ssl->list[spu_no].packs[spp_no]; + + while (spack->next) spack = spack->next; + + if (spack->info.size >= MAX_SIZE_SPAN) { + SpanPack *pack_new = new SpanPack(); + //SpanPack *pack_new; + //posix_memalign((void**)&pack_new, 16, sizeof(SpanPack)); + pack_new->init(); + spack->next = pack_new; + spack = pack_new; + } + + int span_no = spack->info.size++; + Span *span = &spack->span[span_no]; + + span->tex_addr = tex_addr; + span->tex_width = tex_width; + span->tex_height = tex_height; + span->x = x; + span->y = y; + span->length_x = length; + span->start_z = start_z; + span->end_z = end_z; + span->tex_x1 = start_tex_x; + span->tex_x2 = end_tex_x; + span->tex_y1 = start_tex_y; + span->tex_y2 = end_tex_y; + } +} + +void +fill(SpuSpan *ssl) +{ + for (int y = 0; y < Viewer::height; y = y + TEXTURE_SPLIT_PIXEL) { + int line_set = y / TEXTURE_SPLIT_PIXEL; + int spu_no = line_set % SPE_NUM_MAX; + int spp_no = line_set / SPE_NUM_MAX; + + SpanPack *spack = &ssl->list[spu_no].packs[spp_no]; + + // 既に Span がある場合はスルー + if (spack->info.size > 0) continue; + + // 塗りつぶし用 Span は info.size = -1 + // + // ってことにしたけど、わかりづらいか・・・・ + spack->info.size = -1; + Span *span = &spack->span[0]; + span->y = y; + } +} + +int create_span(void *rbuf,void *wbuf) { + PolygonPack *polygon = (PolygonPack*)rbuf; + SpuSpan *ssl = polygon->ssl; + VertexPack *vMin, *vMid, *vMax, *vMid10; + VertexPack ver; + vMid10 = &ver; + TrianglePack *triPack; + + ssl->init(); + + for(int a = 0; a < polygon->info.size; a++) { + triPack = &polygon->tri[a]; + + if (triPack->ver1.y <= triPack->ver2.y) { + if (triPack->ver2.y <= triPack->ver3.y) { + vMin = &triPack->ver1; + vMid = &triPack->ver2; + vMax = &triPack->ver3; + } else if (triPack->ver3.y <= triPack->ver1.y) { + vMin = &triPack->ver3; + vMid = &triPack->ver1; + vMax = &triPack->ver2; + } else { + vMin = &triPack->ver1; + vMid = &triPack->ver3; + vMax = &triPack->ver2; + } + } else { + if (triPack->ver1.y <= triPack->ver3.y) { + vMin = &triPack->ver2; + vMid = &triPack->ver1; + vMax = &triPack->ver3; + } else if (triPack->ver3.y <= triPack->ver2.y) { + vMin = &triPack->ver3; + vMid = &triPack->ver2; + vMax = &triPack->ver1; + } else { + vMin = &triPack->ver2; + vMid = &triPack->ver3; + vMax = &triPack->ver1; + } + } + + vMid1(vMid10,vMin,vMid,vMax); + + half_triangle(ssl, triPack->tex_addr, triPack->tex_width, + triPack->tex_height, vMin, vMid, vMid10); + + half_triangle(ssl, polygon->tri[0].tex_addr, polygon->tri[0].tex_width, + polygon->tri[0].tex_height, vMax, vMid, vMid10); + } + + fill(ssl); + + return 0; +}