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