Mercurial > hg > Members > kono > Cerium
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 |