Mercurial > hg > Members > kono > Cerium
diff TaskManager/Test/test_render/task/DrawSpan.cpp @ 360:716b87bce32a
add vacuum "-sg 16"
author | aaa |
---|---|
date | Fri, 17 Jul 2009 22:50:06 +0900 |
parents | 953811245b63 |
children | f88744ee9350 |
line wrap: on
line diff
--- a/TaskManager/Test/test_render/task/DrawSpan.cpp Fri Jul 17 17:16:42 2009 +0900 +++ b/TaskManager/Test/test_render/task/DrawSpan.cpp Fri Jul 17 22:50:06 2009 +0900 @@ -132,67 +132,32 @@ return hash->get(addr); } -void +TilePtr DrawSpan::set_rgb(uint32 *addr, int tag) { TilePtr tile; -#if 0 - if (isAvailableTile(addr)) { - return; - } -#endif tile = tileList->nextTile(); + uint32 *old_addr = tile->texture_addr; + smanager->dma_load(tile->pixel, (uint32)addr, + sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag); /** * FIFO なので、もし前のが残っていれば削除 */ - hash->remove(tile->texture_addr); + + hash->remove(old_addr); tile->texture_addr = addr; hash->put(tile->texture_addr, tile); - smanager->dma_load(tile->pixel, (uint32)addr, - sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag); + + return tile; } -#if 0 -/** - * - */ -void -DrawSpan::set_rgbs(uint32 *cur_addr, uint32 *max_addr, int wait_tag) +uint32 +DrawSpan::get_rgb(int tx, int ty, TilePtr tile) { - uint32 curp = (uint32)cur_addr; - uint32 maxp = (uint32)max_addr; - uint32 startp = curp; - uint32 diff = sizeof(int)*TEXTURE_BLOCK_SIZE; - int length = (int)maxp-(int)curp; - - int cmp = (length < 0); - -#if 1 - length += cmp*(-1)*length*2; - startp = cmp*maxp + !cmp*curp; -#else - if (length < 0) { - length = -length; - startp = maxp; - } -#endif - - for (int i = 0; i <= length; i += diff) { - set_rgb((uint32*)(startp + i), wait_tag); - } -} -#endif - -uint32 -DrawSpan::get_rgb(int tx, int ty, uint32 *addr) -{ - TilePtr tile; - - tile = hash->get(addr); return tile->pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx]; } @@ -269,10 +234,10 @@ */ void DrawSpan::updateBuffer(float zpos, int rangex, int x, int y, int tex_x, int tex_y, - float normal_x, float normal_y, float normal_z, uint32 *tex_addr) + float normal_x, float normal_y, float normal_z, TilePtr tile) { - int color = get_rgb(tex_x, tex_y, tex_addr); + int color = get_rgb(tex_x, tex_y, tile); /*下位4bitを抽出*/ int alpha = color & 0x000F; /*完全に透けているか判断*/ @@ -337,15 +302,16 @@ tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; - if (!isAvailableTile(tex_addr)) { - set_rgb(tex_addr, wait_tag); + TilePtr tile; + if (!(tile = isAvailableTile(tex_addr))) { + tile = set_rgb(tex_addr, wait_tag); smanager->dma_wait(wait_tag); //return startx; } updateBuffer(zpos, rangex, localx, localy, tex_localx, tex_localy, - normal_x,normal_y,normal_z,tex_addr); + normal_x,normal_y,normal_z,tile); } return -1; @@ -438,118 +404,21 @@ tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; - if (!isAvailableTile(tex_addr)) { -#if 0 - // span が必要とするであろう tile を予想紙 - // set_rgbs で複数同時に load しようとしている図 - // まあ上手くいかなかったんだけど。。 - tex_x = tex1*(x_len-1-js)/(x_len-1) + tex2*js/(x_len-1); - if (tex_x > 1) tex_x = 1; - if (tex_x < 0) tex_x = 0; - tex_xpos = (int)((span->tex_width-1) * tex_x); - - uint32 *max_addr = getTile(tex_xpos, tex_ypos, - span->tex_width, span->tex_addr); - - set_rgbs(tex_addr, max_addr, wait_tag); - return js; -#else - set_rgb(tex_addr, wait_tag); + TilePtr tile; + if (!(tile = isAvailableTile(tex_addr))) { + tile = set_rgb(tex_addr, wait_tag); smanager->dma_wait(wait_tag); -#endif } updateBuffer(tex_z, rangex, localx, localy, tex_localx, tex_localy, - normal_x, normal_y, normal_z,tex_addr); + normal_x, normal_y, normal_z, tile); } } return ret; } -/** - * 長さが 1 より大きい Span の描画 (2段階目) - * - * 上にあるように、drawLine2 は今は動いてないです - * 正確には、js が startx ~ endx 範囲外にあり開始されないってところ - * - * @param span Span - * @param startx 描画開始範囲 - * @param endx 描画終了範囲 - * @param js 前回(drawLine1) で span のどこまで終わっているか - */ -void -DrawSpan::drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag) -{ - int x = span->x; - int rangex = endx - startx + 1; - int x_len = span->length_x; - - float normal_x = span->normal_x; - float normal_y = span->normal_y; - float normal_z = span->normal_z; - - - //int js = startx; - int je = (x + x_len > endx) ? endx - x : x_len; - - /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */ - int tex_xpos, tex_ypos; - - // span の始点に対応する座標 (tex1, tey1) - float tex1 = span->tex_x1; - float tey1 = span->tex_y1; - - // span の終点に対応する座標 (tex2, tey2) - float tex2 = span->tex_x2; - float tey2 = span->tex_y2; - - // span の始点、終点に対応する z 座標 - float zpos1 = span->start_z; - float zpos2 = span->end_z; - - // Tile 内での座標 - int localx, localy = getLocalY(span->y-1); - - // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と - // そのブロックのアドレス(MainMemory) - int tex_localx; - int tex_localy; - uint32 *tex_addr; - - float tex_x, tex_y, tex_z; - - smanager->dma_wait(wait_tag); - - for (int j = js; j <= je; j++) { - localx = getLocalX(x-1+j); - - tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1); - - tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); - tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); - if (tex_x > 1) tex_x = 1; - if (tex_x < 0) tex_x = 0; - if (tex_y > 1) tex_y = 1; - if (tex_y < 0) tex_y = 0; - tex_xpos = (int)((span->tex_width-1) * tex_x); - tex_ypos = (int)((span->tex_height-1) * tex_y); - - if (tex_z < zRow[localx + (rangex*localy)]) { - tex_addr = getTile(tex_xpos, tex_ypos, - span->tex_width, span->tex_addr); - tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; - tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; - - updateBuffer(tex_z, rangex, localx, localy, - tex_localx, tex_localy, - normal_x, normal_y, normal_z,tex_addr); - } - } -} - - int DrawSpan::infinity_light_calc(int color,float normal_x, float normal_y, float normal_z) { @@ -599,10 +468,6 @@ &DrawSpan::drawDot1, &DrawSpan::drawLine1 }; - void (DrawSpan::*drawFunc2[2])(SpanPtr, int, int, int, int) = { - &DrawSpan::drawDot2, &DrawSpan::drawLine2 - }; - uint32 display = smanager->get_param(0); int screen_width = smanager->get_param(1); int rangex_start = smanager->get_param(2); @@ -657,10 +522,6 @@ span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]); next_span = span; - (this->*drawFunc2[(resume_span->length_x != 1)])( - resume_span, rangex_start, rangex_end, resume_span_x, - tl_tag[tl_tag_flg2]); - resume_span = next_span; resume_span_x = next_span_x;