Mercurial > hg > Members > kono > Cerium
changeset 172:c09f506bf5c9
CreateSpan に getScale を追加
author | gongo@localhost.localdomain |
---|---|
date | Thu, 11 Dec 2008 12:04:14 +0900 |
parents | d1f2ce3bdb2f |
children | d949e590da26 |
files | TaskManager/Test/test_render/spe/CreateSpan.cpp TaskManager/Test/test_render/spe/CreateSpan.h TaskManager/Test/test_render/task/CreateSpan.cpp TaskManager/Test/test_render/task/CreateSpan.h |
diffstat | 4 files changed, 156 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- a/TaskManager/Test/test_render/spe/CreateSpan.cpp Thu Dec 11 11:18:44 2008 +0900 +++ b/TaskManager/Test/test_render/spe/CreateSpan.cpp Thu Dec 11 12:04:14 2008 +0900 @@ -123,17 +123,40 @@ return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY; } -#if 0 +/** + * span の width,height と texture の width,height を比べて + * span を描画する際に使う texture の比率を求める + * + * @param width Width of span + * @param height Height of span + * @param tex_width Width of 1/1 texture that span use + * @param tex_height Height of 1/1 texture that span use + * @return 描画に使う texture の比率 + * width と height は 1/scale の画像を使う + * + * @todo scale_max を設定するべき + * 縮小は 1/8 までしかやってなくて、scale が 16 になる場合もある + */ static int -getScale(SpanPtr span) +getScale(int width, int height, int tex_width, int tex_height) { - int tex_width = span->texture_width; - int tex_height = span->texture_height; - int width = span->length_x; + int base, tex_base; int scale = 1; - - if (tex_width > width) { - int t_scale = tex_width/width; + + /** + * width と height で、長い方を基準に、 + * texture の scale を決める + */ + if (width > height) { + base = width; + tex_base = tex_width; + } else { + base = height; + tex_base = tex_height; + } + + if (tex_base > base) { + int t_scale = tex_base/base; while (t_scale >>= 1) { scale <<= 1; @@ -142,17 +165,29 @@ return scale; } -#endif /** * x軸に水平な辺を持つ三角形ポリゴンから、 * Span を抜き出す + * + * @param spackList triangle から生成された span を格納する List + * @param charge_y_top 担当する y の範囲開始地点 + * @param charge_y_end 担当する y の範囲終了地点 + * @param tex_addr triangle が参照するテクスチャの先頭アドレス + * @param tex_width テクスチャの width + * @param tex_height テクスチャの height + * @param vMin triangle の座標 + * @param vMid triangle の座標。triangle を二つに分けて出来た新しい座標 + * @param vMid10 triangle の座標 + * @param y_length 分割する前の Triangle の y の長さ + * */ void CreateSpan::half_triangle(SpanPackPtr *spackList, int charge_y_top, int charge_y_end, uint32 *tex_addr, int tex_width, int tex_height, - VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10) + VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10, + int y_length) { float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2; float tmp_xpos,tmp_end,tmp_zpos; @@ -178,7 +213,6 @@ /** * 三角形ポリゴンをx軸に水平に二つに分けようとして * ある一辺がすでに水平だった場合、つまり - * (環境によっては、back slash が 円マークかも) * * |\ * | \ @@ -299,16 +333,9 @@ 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; - /** - * +1 は要らない気がする・・・ - */ - //length = (int)(tmp_xpos)-(int)(tmp_end)+1; - length = (int)(tmp_xpos)-(int)(tmp_end); + length = (int)(tmp_xpos)-(int)(tmp_end)+1; start_z = tmp_zpos; end_z = tmp_z; start_tex_x = tmp_tex2; @@ -317,8 +344,7 @@ end_tex_y = tmp_tey1; } else { x = (int)tmp_xpos; - //length = (int)(tmp_end)-(int)(tmp_xpos)+1; - length = (int)(tmp_end)-(int)(tmp_xpos); + length = (int)(tmp_end)-(int)(tmp_xpos)+1; start_z = tmp_z; end_z = tmp_zpos; start_tex_x = tmp_tex1; @@ -343,6 +369,9 @@ span->tex_x2 = end_tex_x; span->tex_y1 = start_tex_y; span->tex_y2 = end_tex_y; + + int scale = getScale(span->length_x, y_length, + span->tex_width, span->tex_height); } } @@ -422,13 +451,31 @@ /** * ポリゴンを、x軸に水平に分割して二つの三角形を作り、 * それぞれから Span を求める + * + * vMax + * |\ + * | \ + * | \ + * | \ + * vMid10 ------ vMid + * | / + * | / + * | / + * |/ + * vMin + * + * (vMax, vMid, vMin) という triangle を + * (vMax, vMid, vMid10) (vMin, vMid, vMid10) という + * 二つの Triangle に分けている */ half_triangle(spackList, charge_y_top, charge_y_end, triPack->tex_addr, triPack->tex_width, - triPack->tex_height, vMin, vMid, vMid10); + triPack->tex_height, vMin, vMid, vMid10, + (int)(vMax->y - vMin->y)); half_triangle(spackList, charge_y_top, charge_y_end, pp->tri[0].tex_addr, pp->tri[0].tex_width, - pp->tri[0].tex_height, vMax, vMid, vMid10); + pp->tri[0].tex_height, vMax, vMid, vMid10, + (int)(vMax->y - vMin->y)); } smanager->dma_wait(POLYGON_PACK_LOAD);
--- a/TaskManager/Test/test_render/spe/CreateSpan.h Thu Dec 11 11:18:44 2008 +0900 +++ b/TaskManager/Test/test_render/spe/CreateSpan.h Thu Dec 11 12:04:14 2008 +0900 @@ -21,7 +21,8 @@ void half_triangle(SpanPackPtr *spackList, int charge_y_top, int charge_y_end, uint32 *tex_addr, int tex_width, int tex_height, - VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1); + VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1, + int y_length); void setTileInfoList(SpanPtr span); void setTileInfo(TileInfoPtr tile, int xpos, int ypos, int tex_width, uint32* tex_addr_top);
--- a/TaskManager/Test/test_render/task/CreateSpan.cpp Thu Dec 11 11:18:44 2008 +0900 +++ b/TaskManager/Test/test_render/task/CreateSpan.cpp Thu Dec 11 12:04:14 2008 +0900 @@ -124,14 +124,70 @@ } /** + * span の width,height と texture の width,height を比べて + * span を描画する際に使う texture の比率を求める + * + * @param width Width of span + * @param height Height of span + * @param tex_width Width of 1/1 texture that span use + * @param tex_height Height of 1/1 texture that span use + * @return 描画に使う texture の比率 + * width と height は 1/scale の画像を使う + * + * @todo scale_max を設定するべき + * 縮小は 1/8 までしかやってなくて、scale が 16 になる場合もある + */ +static int +getScale(int width, int height, int tex_width, int tex_height) +{ + int base, tex_base; + int scale = 1; + + /** + * width と height で、長い方を基準に、 + * texture の scale を決める + */ + if (width > height) { + base = width; + tex_base = tex_width; + } else { + base = height; + tex_base = tex_height; + } + + if (tex_base > base) { + int t_scale = tex_base/base; + + while (t_scale >>= 1) { + scale <<= 1; + } + } + + return scale; +} + +/** * x軸に水平な辺を持つ三角形ポリゴンから、 * Span を抜き出す + * + * @param spackList triangle から生成された span を格納する List + * @param charge_y_top 担当する y の範囲開始地点 + * @param charge_y_end 担当する y の範囲終了地点 + * @param tex_addr triangle が参照するテクスチャの先頭アドレス + * @param tex_width テクスチャの width + * @param tex_height テクスチャの height + * @param vMin triangle の座標 + * @param vMid triangle の座標。triangle を二つに分けて出来た新しい座標 + * @param vMid10 triangle の座標 + * @param y_length 分割する前の Triangle の y の長さ + * */ void CreateSpan::half_triangle(SpanPackPtr *spackList, int charge_y_top, int charge_y_end, uint32 *tex_addr, int tex_width, int tex_height, - VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10) + VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10, + int y_length) { float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2; float tmp_xpos,tmp_end,tmp_zpos; @@ -157,7 +213,6 @@ /** * 三角形ポリゴンをx軸に水平に二つに分けようとして * ある一辺がすでに水平だった場合、つまり - * (環境によっては、back slash が 円マークかも) * * |\ * | \ @@ -280,11 +335,7 @@ if (tmp_xpos > tmp_end) { x = (int)tmp_end; - /** - * +1 は要らない気がする・・・ - */ - //length = (int)(tmp_xpos)-(int)(tmp_end)+1; - length = (int)(tmp_xpos)-(int)(tmp_end); + length = (int)(tmp_xpos)-(int)(tmp_end)+1; start_z = tmp_zpos; end_z = tmp_z; start_tex_x = tmp_tex2; @@ -293,8 +344,7 @@ end_tex_y = tmp_tey1; } else { x = (int)tmp_xpos; - //length = (int)(tmp_end)-(int)(tmp_xpos)+1; - length = (int)(tmp_end)-(int)(tmp_xpos); + length = (int)(tmp_end)-(int)(tmp_xpos)+1; start_z = tmp_z; end_z = tmp_zpos; start_tex_x = tmp_tex1; @@ -319,6 +369,9 @@ span->tex_x2 = end_tex_x; span->tex_y1 = start_tex_y; span->tex_y2 = end_tex_y; + + int scale = getScale(span->length_x, y_length, + span->tex_width, span->tex_height); } } @@ -398,13 +451,31 @@ /** * ポリゴンを、x軸に水平に分割して二つの三角形を作り、 * それぞれから Span を求める + * + * vMax + * |\ + * | \ + * | \ + * | \ + * vMid10 ------ vMid + * | / + * | / + * | / + * |/ + * vMin + * + * (vMax, vMid, vMin) という triangle を + * (vMax, vMid, vMid10) (vMin, vMid, vMid10) という + * 二つの Triangle に分けている */ half_triangle(spackList, charge_y_top, charge_y_end, triPack->tex_addr, triPack->tex_width, - triPack->tex_height, vMin, vMid, vMid10); + triPack->tex_height, vMin, vMid, vMid10, + (int)(vMax->y - vMin->y)); half_triangle(spackList, charge_y_top, charge_y_end, pp->tri[0].tex_addr, pp->tri[0].tex_width, - pp->tri[0].tex_height, vMax, vMid, vMid10); + pp->tri[0].tex_height, vMax, vMid, vMid10, + (int)(vMax->y - vMin->y)); } smanager->dma_wait(POLYGON_PACK_LOAD);
--- a/TaskManager/Test/test_render/task/CreateSpan.h Thu Dec 11 11:18:44 2008 +0900 +++ b/TaskManager/Test/test_render/task/CreateSpan.h Thu Dec 11 12:04:14 2008 +0900 @@ -21,7 +21,8 @@ void half_triangle(SpanPackPtr *spackList, int charge_y_top, int charge_y_end, uint32 *tex_addr, int tex_width, int tex_height, - VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1); + VertexPack *vMin,VertexPack *vMid,VertexPack *vMid1, + int y_length); void setTileInfoList(SpanPtr span); void setTileInfo(TileInfoPtr tile, int xpos, int ypos, int tex_width, uint32* tex_addr_top);