Mercurial > hg > Members > kono > Cerium
diff TaskManager/Test/test_render/task/CreateSpan.cpp @ 161:1f4c3f3238e6 fullHD_omedetou
texture の座標がマイナスになったあと、それを 0 にし忘れてた
author | gongo@localhost.localdomain |
---|---|
date | Mon, 08 Dec 2008 16:37:02 +0900 |
parents | cd5ad7adc5e1 |
children | 38cbb7aecc70 |
line wrap: on
line diff
--- a/TaskManager/Test/test_render/task/CreateSpan.cpp Mon Dec 08 10:56:58 2008 +0900 +++ b/TaskManager/Test/test_render/task/CreateSpan.cpp Mon Dec 08 16:37:02 2008 +0900 @@ -83,27 +83,73 @@ } /** - * テクスチャの座標 (pos1, pos2) を - * TEXTURE_SPLIT_PIXEL x TEXTURE_SPLIT_PIXEL の中に入るように変換 + * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する * - * 例: - * (450, 318) -> 分割されたブロックの (2, 6) になる + * +---+---+---+---+---+---+ + * | 0 | 1 | 2 | 3 | 4 | 5 | + * +---+---+---+---+---+---+ + * | | | | | |11 | + * +---+---+---+---+---+---+ + * | | | | | |17 | + * +---+---+---+---+---+---+ + * | | | | | |23 | + * +---+---+---+---+---+---+ + * | | | | | |29 | + * +---+---+---+---+---+---+ + * | | | | | |35 | + * +---+---+---+---+---+---+ + * + * 一辺を TEXTURE_SPLIT とする + * 各ブロックの数字がブロックIDとなる。 + */ + +/** + * テクスチャの座標から、 + * テクスチャのどのブロックかを求める + * + * @param[in] tx X coordinates of texture + * @param[in] tx Y coordinates of texture + * @param[in] twidth Width of texture + * @return block ID */ static int -get_tex_pos(int pos, int screen) +get_tex_block(int tx, int ty, int twidth) +{ + int blockX, blockY; + + blockX = tx / TEXTURE_SPLIT_PIXEL; + blockY = ty / TEXTURE_SPLIT_PIXEL; + + return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY; +} + +void +CreateSpan::setTileInfo(TileInfoPtr tile, int xpos, int ypos, + int tex_width, uint32* tex_addr_top) { - if (pos < 0) pos = 0; - if (screen - 1 < pos) pos = screen - 1 ; - - return pos % TEXTURE_SPLIT_PIXEL; + /* + * テクスチャの座標 (tex_xpos, tex_ypos) の + * 分割したブロック内での座標 + * 例: + * (450, 318) -> 分割されたブロックの (2, 6) になる + */ + tile->tix = xpos % TEXTURE_SPLIT_PIXEL; + tile->tiy = ypos % TEXTURE_SPLIT_PIXEL; + + /** + * ブロックIDから、あらかじめ分割したテクスチャの + * 先頭addressの addr からの距離を求める。 + * それがこの 1 pixel が使うテクスチャのブロックになる + */ + int block = get_tex_block(xpos, ypos, tex_width); + tile->tile = (void*)(tex_addr_top + block*TEXTURE_BLOCK_SIZE); } /** * Span の1ドットずつ、必要なテクスチャのブロック(Tile)を求めていく - * */ void -CreateSpan::setTile(SpanPtr span) +CreateSpan::setTileInfoList(SpanPtr span) { TileInfoListPtr tilelist = (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList)); @@ -130,14 +176,13 @@ if (span->length_x == 1) { tilelist->init(); - tile = &tilelist->tileinfo[tilelist->size++]; tex_xpos = (int)((span->tex_width-1) * tex1); tex_ypos = (int)((span->tex_height-1) * tey1); - tile->tix = get_tex_pos(tex_xpos, span->tex_width); - tile->tiy = get_tex_pos(tex_ypos, span->tex_height); - tile->tile = span->tex_addr; + tile = &tilelist->tileinfo[tilelist->size++]; + setTileInfo(tile, tex_xpos, tex_ypos, span->tex_width, + (uint32*)span->tex_addr); } else { while (cur_x <= span->length_x) { if (cur_x + MAX_TILE_LIST - 1 < span->length_x) { @@ -159,16 +204,22 @@ tex_xpos = (int)((span->tex_width-1) * tex_x); tex_ypos = (int)((span->tex_height-1) * tex_y); - tile = &tilelist->tileinfo[tilelist->size++]; - tile->tix = get_tex_pos(tex_xpos, span->tex_width); - tile->tiy = get_tex_pos(tex_ypos, span->tex_height); + /** + * 座標が [0..MAX-1] を超えない様に + * なんかもっと良い書き方ありそうだけど + */ + if (tex_xpos < 0) tex_xpos = 0; + if (span->tex_width - 1 < tex_xpos) { + tex_xpos = span->tex_width - 1; + } + if (tex_ypos < 0) tex_ypos = 0; + if (span->tex_height - 1 < tex_ypos) { + tex_ypos = span->tex_height - 1; + } - int blockX = tex_xpos / TEXTURE_SPLIT_PIXEL; - int blockY = tex_ypos / TEXTURE_SPLIT_PIXEL; - int block = blockX + - (span->tex_width/TEXTURE_SPLIT_PIXEL)*blockY; - uint32 *addr = (uint32*)span->tex_addr; - tile->tile = (void*)(addr + block*64); + tile = &tilelist->tileinfo[tilelist->size++]; + setTileInfo(tile, tex_xpos, tex_ypos, span->tex_width, + (uint32*)span->tex_addr); } if (cur_x + MAX_TILE_LIST - 1 < span->length_x) { @@ -410,9 +461,7 @@ // TilePtr の計算 // tix, tiy (Tile 内での x, y) - // - //smanager->mainMem_wait(); - setTile(span); + setTileInfoList(span); } }