Mercurial > hg > Members > kono > Cerium
diff TaskManager/Test/simple_render/task/create_span.cpp @ 109:5c194c71eca8
Cerium cvs version
author | gongo@gendarme.local |
---|---|
date | Wed, 12 Nov 2008 17:39:33 +0900 |
parents | 57bac9e07662 |
children | 58fd16298954 |
line wrap: on
line diff
--- a/TaskManager/Test/simple_render/task/create_span.cpp Wed Nov 12 17:29:35 2008 +0900 +++ b/TaskManager/Test/simple_render/task/create_span.cpp Wed Nov 12 17:39:33 2008 +0900 @@ -1,9 +1,9 @@ #include <iostream> +#include "viewer.h" #include "polygon_pack.h" -#include "spu_span.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; @@ -11,23 +11,34 @@ } -static VertexPack *vMid1(VertexPack *vMid1,VertexPack *vMin, VertexPack *vMid, VertexPack *vMax) { - float d,d1; - d = (int)vMax->y-(int)vMin->y; +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; - vMid1->tex_x = calc(vMax->tex_x - vMin->tex_x, d, (int)d1 , vMin->tex_x - ); - vMid1->tex_y = calc(vMax->tex_y - vMin->tex_y, d, (int)d1 , vMin->tex_y - ); - vMid1->x = calc(vMax->x - vMin->x, d, (int)d1 , vMin->x); +#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, (int)d1 , vMin->z); - //printf("x:%f y:%f z:%f tex_x:%f tex_y:%f\n",vMid1->x,vMid1->y,vMid1->z,vMid1->tex_x, vMid1->tex_y); + vMid1->z = calc(vMax->z - vMin->z, d, d1, vMin->z); + return vMid1; } -void half_triangle(SPUSPANLIST *ssl, long *tex_addr, long tex_width, long tex_height, VertexPack *vMin, VertexPack *vMid, VertexPack *vMid1) { -//void half_triangle(SPANPACK *sp, long *tex_addr, long tex_width, long tex_height, VertexPack *vMin, VertexPack *vMid, VertexPack *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; @@ -40,7 +51,8 @@ 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; @@ -49,24 +61,22 @@ div_y = start_y - end_y; // > 0 - //cout << "div_y : " << div_y+1 << endl; - 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); - //printf("x:%f end:%f z:%f zpos:%f\n",tmp_xpos,tmp_end,tmp_z,tmp_zpos); - 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_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); + 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; @@ -89,41 +99,45 @@ end_tex_y = tmp_tey2; } - //printf("x:%d y:%d end:%d z:%f zpos:%f\n",x,y,length,start_z , end_z); - //printf("start_tex_x:%f end_tex_x:%f start_tex_y:%f end_tex_y:%fn",start_tex_x,end_tex_x,start_tex_y,end_tex_y); - - //add(tex_addr,tex_width,tex_height,x,y,length,start_z,end_z,start_tex_x,end_tex_x,start_tex_y,end_tex_y); + // 画面外のものはここで + // この判定で当たってるのかな? +#if 0 + real_x = x + Viewer::width/2; + real_y = y + Viewer::height/2; - //y += 540; // window_height = 1080 (1080/2 = 540) - y += 240; // window_height = 480 (480/2 = 240) - - int line_set = y/8; + if (real_x < 0 || real_x > Viewer::width || + real_y < 0 || real_y > Viewer::height) { + continue; + } - //y -= 540; // window_height = 1080 (1080/2 = 540) - y -= 240; // window_height = 480 (480/2 = 240) - - //if (x < 0 || x > 576 || y > 384 || y < 0 ) 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 spu_no = line_set%6; - - int spp_no = line_set/6; - int span_no = ssl->ss[spu_no].spp[spp_no].info.size; + 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 0 - ssl->ss[spu_no].spp[spp_no].span[span_no].tex_addr = tex_addr; - ssl->ss[spu_no].spp[spp_no].span[span_no].tex_width = tex_width; - ssl->ss[spu_no].spp[spp_no].span[span_no].tex_height = tex_height; - ssl->ss[spu_no].spp[spp_no].span[span_no].x = x; - ssl->ss[spu_no].spp[spp_no].span[span_no].y = y; - ssl->ss[spu_no].spp[spp_no].span[span_no].length_x = length; - ssl->ss[spu_no].spp[spp_no].span[span_no].start_z = start_z; - ssl->ss[spu_no].spp[spp_no].span[span_no].end_z = end_z; - ssl->ss[spu_no].spp[spp_no].span[span_no].tex_x1 = start_tex_x; - ssl->ss[spu_no].spp[spp_no].span[span_no].tex_x2 = end_tex_x; - ssl->ss[spu_no].spp[spp_no].span[span_no].tex_y1 = start_tex_y; - ssl->ss[spu_no].spp[spp_no].span[span_no].tex_y2 = end_tex_y; -#else // 配列アクセスを無くしたつもり - SPAN_PTR span = &ssl->ss[spu_no].spp[spp_no].span[span_no]; + 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; @@ -137,86 +151,84 @@ span->tex_x2 = end_tex_x; span->tex_y1 = start_tex_y; span->tex_y2 = end_tex_y; -#endif - ssl->ss[spu_no].spp[spp_no].info.size++; } } +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; PolygonPack *polygon = (PolygonPack*)rbuf; - //SPANPACK *sp = (SPANPACK*)wbuf; - //SPANPACKLIST *spl = (SPANPACKLIST*)wbuf; - //SPANPACKLIST *spl = polygon->spl; - SPUSPANLIST *ssl = polygon->ssl; + SpuSpan *ssl = polygon->ssl; VertexPack *vMin, *vMid, *vMax, *vMid10; VertexPack ver; vMid10 = &ver; - - //cout << "create_span:spl->size = " << spl->size << endl; - //cout << "create_span:spl->dline[0].span = " << spl->dline[0].span << endl; + TrianglePack *triPack; - //for(int i=0; i<spl->size; i++) - for(int i=0; i<6; i++) // 6 = number of SPU - { - ssl->ss[i].length = 0; - //for(int t=0; t<10; t++) // window_height = 1080 ( 1080/8/6 = 22.5 ) - for(int t=0; t<10; t++) // window_height = 480 (480/8/6 = 10) - { - ssl->ss[i].spp[t].info.size = 0; - } - } - - //sp->info.size = 0; - - //cout << sizeof(SPANPACK) << endl; - //cout << "polygon size : " << polygon->info.size << endl; + ssl->init(); for(int a = 0; a < polygon->info.size; a++) { - //cout << "a = " << a << endl; - //cout << "polygon size : " << polygon->info.size << endl; - if (polygon->tri[a].ver1.y <= polygon->tri[a].ver2.y) { - if (polygon->tri[a].ver2.y <= polygon->tri[a].ver3.y) { - vMin = &polygon->tri[a].ver1; - vMid = &polygon->tri[a].ver2; - vMax = &polygon->tri[a].ver3; - } else if (polygon->tri[a].ver3.y <= polygon->tri[a].ver1.y) { - vMin = &polygon->tri[a].ver3; - vMid = &polygon->tri[a].ver1; - vMax = &polygon->tri[a].ver2; + 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 = &polygon->tri[a].ver1; - vMid = &polygon->tri[a].ver3; - vMax = &polygon->tri[a].ver2; + vMin = &triPack->ver1; + vMid = &triPack->ver3; + vMax = &triPack->ver2; } } else { - if (polygon->tri[a].ver1.y <= polygon->tri[a].ver3.y) { - vMin = &polygon->tri[a].ver2; - vMid = &polygon->tri[a].ver1; - vMax = &polygon->tri[a].ver3; - } else if (polygon->tri[a].ver3.y <= polygon->tri[a].ver2.y) { - vMin = &polygon->tri[a].ver3; - vMid = &polygon->tri[a].ver2; - vMax = &polygon->tri[a].ver1; + 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 = &polygon->tri[a].ver2; - vMid = &polygon->tri[a].ver3; - vMax = &polygon->tri[a].ver1; + vMin = &triPack->ver2; + vMid = &triPack->ver3; + vMax = &triPack->ver1; } } - //cout << vMid->y << endl; - //cout << vMin->y << endl; - 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[a].tex_addr,polygon->tri[a].tex_width,polygon->tri[a].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); - //printf("x:%d y:%d end:%d z:%f zpos:%f\n",sp->span[0].x,sp->span[0].y,sp->span[0].length_x,sp->span[0].start_z , sp->span[0].end_z); + half_triangle(ssl, polygon->tri[0].tex_addr, polygon->tri[0].tex_width, + polygon->tri[0].tex_height, vMax, vMid, vMid10); } - //printf("create_span x:%d y:%d end:%d z:%f zpos:%f\n",sp->span[0].x,sp->span[0].y,sp->span[0].length_x,sp->span[0].start_z , sp->span[0].end_z); + + fill(ssl); + return 0; - - //return sizeof(SPANPACKLIST); }