Mercurial > hg > Members > kono > Cerium
diff TaskManager/Test/test_render/task/CreateSpan.cpp @ 141:fc314f28b66e
TileList を作ろうとしたがに動かない。
今はTileList 無しver
author | gongo@charles.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Sat, 29 Nov 2008 01:18:32 +0900 |
parents | 6cf991f28c6c |
children | ff3fb47c2553 |
line wrap: on
line diff
--- a/TaskManager/Test/test_render/task/CreateSpan.cpp Fri Nov 28 15:24:55 2008 +0900 +++ b/TaskManager/Test/test_render/task/CreateSpan.cpp Sat Nov 29 01:18:32 2008 +0900 @@ -4,6 +4,9 @@ static const int SPAN_PACK_LOAD = 5; static const int SPAN_PACK_STORE = 6; static const int POLYGON_PACK_LOAD = 7; +static const int TILE_ALLOCATE = 8; +static const int TILE_LOAD = 9; +static const int TILE_STORE = 10; static SpanPackPtr spack = NULL; static SpanPackPtr send_spack = NULL; @@ -79,6 +82,101 @@ /** + * Span の1ドットずつ、必要なテクスチャのブロック(Tile)を求めていく + * + */ +void +CreateSpan::setTile(SpanPtr span) +{ + TileInfoListPtr tilelist = (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList)); + TileInfoListPtr send_tilelist = (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));; + TileInfoListPtr tilelist_addr; + TileInfoListPtr tmp = NULL; + + TileInfoPtr tile; + int remain = span->length_x; // 残りのドット(Tile)数 + int len = 0; + + //smanager->mainMem_wait(); + tilelist_addr = (TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE); + span->tilelist = tilelist_addr; + smanager->dma_load(tilelist, (uint32)tilelist_addr, + sizeof(TileInfoList), TILE_LOAD); + + uint32 hoge = (uint32)tilelist_addr; + + while (remain > 0) { + if (remain > MAX_TILE_LIST) { + smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList)); + len = MAX_TILE_LIST; + } else { + len = remain; + } + + float tex1 = span->tex_x1; + float tex2 = span->tex_x2; + float tey1 = span->tex_y1; + float tey2 = span->tex_y2; + int tex_xpos; + int tex_ypos; + + smanager->dma_wait(TILE_LOAD); + + if (len == 1) { + tile = &tilelist->tileinfo[tilelist->size++]; + tex_xpos = (int)((span->tex_width-1) * tex1); + tex_ypos = (int)((span->tex_height-1) * tey1); + } else { + float tex_x, tex_y; + + for (int i = 0; i < len; i++) { + tile = &tilelist->tileinfo[tilelist->size++]; + + tex_x = tex1*(len-1-i)/(len-1) + tex2*i/(len-1); + tex_y = tey1*(len-1-i)/(len-1) + tey2*i/(len-1); + if (tex_x > 1) tex_x = 1; + if (tex_y > 1) tex_y = 1; + tex_xpos = (int)((span->tex_height-1) * tex_x); + tex_ypos = (int)((span->tex_width-1) * tex_y); + + tile->tix = tex_xpos; + tile->tiy = tex_ypos; + } + } + + if (remain > MAX_TILE_LIST) { + TileInfoListPtr send = tilelist_addr; + + tmp = tilelist; + tilelist = send_tilelist; + send_tilelist = tmp; + + smanager->mainMem_wait(); + tilelist_addr = + (TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE); + + send_tilelist->next = tilelist_addr; + + smanager->dma_wait(TILE_STORE); + smanager->dma_store(send_tilelist, (uint32)send, + sizeof(TileInfoList),TILE_STORE); + + smanager->dma_load(tilelist, (uint32)tilelist_addr, + sizeof(TileInfoList), TILE_LOAD); + } + remain -= MAX_TILE_LIST; + } + + smanager->dma_wait(TILE_STORE); + smanager->dma_store(tilelist, (uint32)tilelist_addr, + sizeof(TileInfoList), TILE_STORE); + smanager->dma_wait(TILE_STORE); + + free(tilelist); + free(send_tilelist); +} + +/** * x軸に水平な辺を持つ三角形ポリゴンから、 * Span を抜き出す */ @@ -109,7 +207,6 @@ SpanPackPtr tmp_spack; - /** * 三角形ポリゴンをx軸に水平に二つに分けようとして * ある一辺がすでに水平だった場合、つまり @@ -185,9 +282,9 @@ if (spack->info.size >= MAX_SIZE_SPAN) { SpanPackPtr next; - mainMem_alloc(0, sizeof(SpanPack)); - mainMem_wait(); - next = (SpanPackPtr)mainMem_get(0); + smanager->mainMem_alloc(0, sizeof(SpanPack)); + smanager->mainMem_wait(); + next = (SpanPackPtr)smanager->mainMem_get(0); spack->next = next; @@ -200,7 +297,7 @@ sizeof(SpanPack), SPAN_PACK_STORE); spackList[index] = next; - + smanager->dma_load(spack, (uint32)spackList[index], sizeof(SpanPack), SPAN_PACK_LOAD); smanager->dma_wait(SPAN_PACK_LOAD); @@ -213,6 +310,11 @@ continue; } + /** + * メインメモリに、Tile 用の領域確保をここで指定しておく + */ + smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList)); + tmp_xpos = calc(vMid10->x - vMin->x ,div_y, i, vMin->x); tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x); tmp_z = calc(vMid10->z - vMin->z ,div_y, i, vMin->z); @@ -273,6 +375,8 @@ // TilePtr の計算 // tix, tiy (Tile 内での x, y) // + smanager->mainMem_wait(); + setTile(span); } }