comparison 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
comparison
equal deleted inserted replaced
160:d5cca23ed50c 161:1f4c3f3238e6
81 v->y = vMid->y; 81 v->y = vMid->y;
82 v->z = calc(vMax->z - vMin->z, d, d1, vMin->z); 82 v->z = calc(vMax->z - vMin->z, d, d1, vMin->z);
83 } 83 }
84 84
85 /** 85 /**
86 * テクスチャの座標 (pos1, pos2) を 86 * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する
87 * TEXTURE_SPLIT_PIXEL x TEXTURE_SPLIT_PIXEL の中に入るように変換
88 * 87 *
89 * 例: 88 * +---+---+---+---+---+---+
90 * (450, 318) -> 分割されたブロックの (2, 6) になる 89 * | 0 | 1 | 2 | 3 | 4 | 5 |
90 * +---+---+---+---+---+---+
91 * | | | | | |11 |
92 * +---+---+---+---+---+---+
93 * | | | | | |17 |
94 * +---+---+---+---+---+---+
95 * | | | | | |23 |
96 * +---+---+---+---+---+---+
97 * | | | | | |29 |
98 * +---+---+---+---+---+---+
99 * | | | | | |35 |
100 * +---+---+---+---+---+---+
101 *
102 * 一辺を TEXTURE_SPLIT とする
103 * 各ブロックの数字がブロックIDとなる。
104 */
105
106 /**
107 * テクスチャの座標から、
108 * テクスチャのどのブロックかを求める
109 *
110 * @param[in] tx X coordinates of texture
111 * @param[in] tx Y coordinates of texture
112 * @param[in] twidth Width of texture
113 * @return block ID
91 */ 114 */
92 static int 115 static int
93 get_tex_pos(int pos, int screen) 116 get_tex_block(int tx, int ty, int twidth)
94 { 117 {
95 if (pos < 0) pos = 0; 118 int blockX, blockY;
96 if (screen - 1 < pos) pos = screen - 1 ; 119
97 120 blockX = tx / TEXTURE_SPLIT_PIXEL;
98 return pos % TEXTURE_SPLIT_PIXEL; 121 blockY = ty / TEXTURE_SPLIT_PIXEL;
122
123 return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY;
124 }
125
126 void
127 CreateSpan::setTileInfo(TileInfoPtr tile, int xpos, int ypos,
128 int tex_width, uint32* tex_addr_top)
129 {
130 /*
131 * テクスチャの座標 (tex_xpos, tex_ypos) の
132 * 分割したブロック内での座標
133 * 例:
134 * (450, 318) -> 分割されたブロックの (2, 6) になる
135 */
136 tile->tix = xpos % TEXTURE_SPLIT_PIXEL;
137 tile->tiy = ypos % TEXTURE_SPLIT_PIXEL;
138
139 /**
140 * ブロックIDから、あらかじめ分割したテクスチャの
141 * 先頭addressの addr からの距離を求める。
142 * それがこの 1 pixel が使うテクスチャのブロックになる
143 */
144 int block = get_tex_block(xpos, ypos, tex_width);
145 tile->tile = (void*)(tex_addr_top + block*TEXTURE_BLOCK_SIZE);
99 } 146 }
100 147
101 /** 148 /**
102 * Span の1ドットずつ、必要なテクスチャのブロック(Tile)を求めていく 149 * Span の1ドットずつ、必要なテクスチャのブロック(Tile)を求めていく
103 *
104 */ 150 */
105 void 151 void
106 CreateSpan::setTile(SpanPtr span) 152 CreateSpan::setTileInfoList(SpanPtr span)
107 { 153 {
108 TileInfoListPtr tilelist = 154 TileInfoListPtr tilelist =
109 (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList)); 155 (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
110 TileInfoListPtr send_tilelist = 156 TileInfoListPtr send_tilelist =
111 (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList)); 157 (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
128 int tex_ypos; 174 int tex_ypos;
129 int end = span->length_x; 175 int end = span->length_x;
130 176
131 if (span->length_x == 1) { 177 if (span->length_x == 1) {
132 tilelist->init(); 178 tilelist->init();
133 tile = &tilelist->tileinfo[tilelist->size++];
134 179
135 tex_xpos = (int)((span->tex_width-1) * tex1); 180 tex_xpos = (int)((span->tex_width-1) * tex1);
136 tex_ypos = (int)((span->tex_height-1) * tey1); 181 tex_ypos = (int)((span->tex_height-1) * tey1);
137 182
138 tile->tix = get_tex_pos(tex_xpos, span->tex_width); 183 tile = &tilelist->tileinfo[tilelist->size++];
139 tile->tiy = get_tex_pos(tex_ypos, span->tex_height); 184 setTileInfo(tile, tex_xpos, tex_ypos, span->tex_width,
140 tile->tile = span->tex_addr; 185 (uint32*)span->tex_addr);
141 } else { 186 } else {
142 while (cur_x <= span->length_x) { 187 while (cur_x <= span->length_x) {
143 if (cur_x + MAX_TILE_LIST - 1 < span->length_x) { 188 if (cur_x + MAX_TILE_LIST - 1 < span->length_x) {
144 len = MAX_TILE_LIST - 1; 189 len = MAX_TILE_LIST - 1;
145 smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList)); 190 smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList));
157 if (tex_x > 1) tex_x = 1; 202 if (tex_x > 1) tex_x = 1;
158 if (tex_y > 1) tex_y = 1; 203 if (tex_y > 1) tex_y = 1;
159 tex_xpos = (int)((span->tex_width-1) * tex_x); 204 tex_xpos = (int)((span->tex_width-1) * tex_x);
160 tex_ypos = (int)((span->tex_height-1) * tex_y); 205 tex_ypos = (int)((span->tex_height-1) * tex_y);
161 206
207 /**
208 * 座標が [0..MAX-1] を超えない様に
209 * なんかもっと良い書き方ありそうだけど
210 */
211 if (tex_xpos < 0) tex_xpos = 0;
212 if (span->tex_width - 1 < tex_xpos) {
213 tex_xpos = span->tex_width - 1;
214 }
215 if (tex_ypos < 0) tex_ypos = 0;
216 if (span->tex_height - 1 < tex_ypos) {
217 tex_ypos = span->tex_height - 1;
218 }
219
162 tile = &tilelist->tileinfo[tilelist->size++]; 220 tile = &tilelist->tileinfo[tilelist->size++];
163 tile->tix = get_tex_pos(tex_xpos, span->tex_width); 221 setTileInfo(tile, tex_xpos, tex_ypos, span->tex_width,
164 tile->tiy = get_tex_pos(tex_ypos, span->tex_height); 222 (uint32*)span->tex_addr);
165
166 int blockX = tex_xpos / TEXTURE_SPLIT_PIXEL;
167 int blockY = tex_ypos / TEXTURE_SPLIT_PIXEL;
168 int block = blockX +
169 (span->tex_width/TEXTURE_SPLIT_PIXEL)*blockY;
170 uint32 *addr = (uint32*)span->tex_addr;
171 tile->tile = (void*)(addr + block*64);
172 } 223 }
173 224
174 if (cur_x + MAX_TILE_LIST - 1 < span->length_x) { 225 if (cur_x + MAX_TILE_LIST - 1 < span->length_x) {
175 TileInfoListPtr tmp = tilelist; 226 TileInfoListPtr tmp = tilelist;
176 tilelist = send_tilelist; 227 tilelist = send_tilelist;
408 span->tex_y1 = start_tex_y; 459 span->tex_y1 = start_tex_y;
409 span->tex_y2 = end_tex_y; 460 span->tex_y2 = end_tex_y;
410 461
411 // TilePtr の計算 462 // TilePtr の計算
412 // tix, tiy (Tile 内での x, y) 463 // tix, tiy (Tile 内での x, y)
413 // 464 setTileInfoList(span);
414 //smanager->mainMem_wait();
415 setTile(span);
416 } 465 }
417 } 466 }
418 467
419 468
420 int 469 int