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);