Mercurial > hg > Game > Cerium
annotate TaskManager/Test/test_render/spe/DrawSpan.cpp @ 184:a19d3ed4ce5b draft
fix
author | gongo@gendarme.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Tue, 06 Jan 2009 15:39:48 +0900 |
parents | 8e9ada0c1ed0 |
children | 06cdf8baa989 |
rev | line source |
---|---|
109 | 1 #include <stdlib.h> |
2 #include <string.h> | |
3 #include "DrawSpan.h" | |
4 #include "polygon_pack.h" | |
5 #include "texture.h" | |
6 #include "viewer_types.h" | |
184 | 7 #include "Func.h" |
109 | 8 |
9 #define SPAN_PACK_LOAD 0 | |
120 | 10 #define TEX_LOAD 1 |
109 | 11 |
12 SchedDefineTask(DrawSpan); | |
13 | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
14 /** |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
15 * ƥϡTEXTURE_SPLIT_PIXEL^2 Υ֥åʬ䤹 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
16 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
17 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
18 * | 0 | 1 | 2 | 3 | 4 | 5 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
19 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
20 * | | | | | |11 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
21 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
22 * | | | | | |17 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
23 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
24 * | | | | | |23 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
25 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
26 * | | | | | |29 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
27 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
28 * | | | | | |35 | |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
29 * +---+---+---+---+---+---+ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
30 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
31 * դ TEXTURE_SPLIT Ȥ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
32 * ƥ֥åο֥åIDȤʤ롣 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
33 */ |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
34 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
35 /** |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
36 * ƥκɸ顢 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
37 * ƥΤɤΥ֥å |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
38 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
39 * @param[in] tx X coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
40 * @param[in] tx Y coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
41 * @param[in] twidth Width of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
42 * @return block ID |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
43 */ |
184 | 44 int |
45 DrawSpan::getTexBlock(int tx, int ty, int twidth) | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
46 { |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
47 int blockX, blockY; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
48 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
49 blockX = tx / TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
50 blockY = ty / TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
51 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
52 return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
53 } |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
54 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
55 /** |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
56 * block ID ȡƥ TOP address |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
57 * (tx,ty) ǻȤƥ Tile addres |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
58 * |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
59 * @param[in] tx X coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
60 * @param[in] tx Y coordinates of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
61 * @param[in] tw Width of texture |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
62 * @param[in] tex_addr_top (tx,ty) ǻȤƥƬaddress |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
63 * @return block ID |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
64 */ |
184 | 65 uint32* |
66 DrawSpan::getTile(int tx, int ty, int tw, uint32 *tex_addr_top) | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
67 { |
184 | 68 int block = getTexBlock(tx, ty, tw); |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
69 return tex_addr_top + block*TEXTURE_BLOCK_SIZE; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
70 } |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
71 |
109 | 72 void |
73 DrawSpan::linebuf_init(int *buf, int x, int rgb) | |
74 { | |
75 for (int i = 0; i < x; i++) { | |
76 buf[i] = rgb; | |
77 } | |
78 } | |
79 | |
184 | 80 /** |
81 * Span Ȥ Texture Tile 뤫 | |
82 * | |
83 * @retval != NULL ¸ߤ | |
84 * @retval NULL ¸ߤʤ | |
85 */ | |
86 TilePtr | |
87 DrawSpan::isAvailableTile(uint32 *addr) | |
88 { | |
89 return hash->get(addr); | |
90 } | |
91 | |
92 void | |
93 DrawSpan::set_rgb(uint32 *addr) | |
94 { | |
95 TilePtr tile; | |
96 | |
97 if (!isAvailableTile(addr)) { | |
98 tile = tileList->nextTile(); | |
99 /** | |
100 * FIFO ʤΤǡ⤷ΤĤäƤк | |
101 */ | |
102 hash->remove(tile->texture_addr); | |
103 | |
104 tile->texture_addr = addr; | |
105 | |
106 hash->put(tile->texture_addr, tile); | |
107 | |
108 smanager->dma_load(tile->pixel, (uint32)addr, | |
109 sizeof(uint32)*TEXTURE_BLOCK_SIZE, TEX_LOAD); | |
110 | |
111 smanager->dma_wait(TEX_LOAD); | |
112 } | |
113 } | |
114 | |
115 void | |
116 DrawSpan::set_rgbs(uint32 *addr, uint32 *max_addr) | |
117 { | |
118 uint32 start = (uint32)addr; | |
119 uint32 end = (uint32)max_addr; | |
120 uint32 length = end-start; | |
121 uint32 diff = sizeof(uint32)*TEXTURE_BLOCK_SIZE; | |
122 uint32 max_tile = 8; | |
123 | |
124 for (uint32 i = 0, j = 0; i <= length && j < max_tile; i += diff, j++) { | |
125 set_rgb((uint32*)(start + i)); | |
126 } | |
127 } | |
128 | |
109 | 129 Uint32 |
166 | 130 DrawSpan::get_rgb(int tx, int ty, uint32 *addr) |
109 | 131 { |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
132 TilePtr tile; |
109 | 133 |
167
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
134 tile = hash->get(addr); |
168 | 135 return tile->pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx]; |
109 | 136 } |
137 | |
184 | 138 /** |
139 * DrawSpan κƵư (DrawSpanRenew ) | |
140 * | |
141 * @param[in] spack ߽Ƥ SpanPack | |
142 * @param[in] cur_span_x span->length_x != 1 λ Span ν | |
143 * ɤޤǿʤǤ뤫 | |
144 */ | |
145 void | |
146 DrawSpan::reboot(SpanPackPtr spack, int cur_span_x) | |
147 { | |
148 TaskPtr renew_task = smanager->create_task(TASK_DRAW_SPAN2); | |
149 int rangey = smanager->get_param(2); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
150 |
184 | 151 /** |
152 * ̤ outData, param ϤΤޤϤ | |
153 */ | |
154 for (int i = 0; i < rangey; i++) { | |
155 renew_task->add_outData(smanager->get_outputAddr(i), | |
156 smanager->get_outputSize(i)); | |
157 } | |
158 | |
159 // rangex_start, rangex_end, rangey | |
160 renew_task->add_param(smanager->get_param(0)); | |
161 renew_task->add_param(smanager->get_param(1)); | |
162 renew_task->add_param(smanager->get_param(2)); | |
163 | |
164 /** | |
165 * SpanPack ³鳫ϤΤǡ | |
166 * ߤξ֤ԡƤ | |
167 * spack rbuf Ƥǽ | |
168 * rbuf ϥƥबưŪ free() 뤿 | |
169 * ɥ쥹ϤΤNG | |
170 */ | |
171 SpanPackPtr curr = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
172 memcpy(curr, spack, sizeof(SpanPack)); | |
173 renew_task->add_param((int)curr); | |
174 | |
175 renew_task->add_param(cur_span_x); | |
176 | |
177 /** | |
178 * ƵưԤ | |
179 */ | |
180 smanager->wait_task(renew_task); | |
181 | |
182 // next_spack free() Τ wait | |
183 smanager->dma_wait(SPAN_PACK_LOAD); | |
184 } | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
185 |
109 | 186 int |
187 DrawSpan::run(void *rbuf, void *wbuf) | |
188 { | |
167
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
189 hash = (TileHashPtr)smanager->global_get(GLOBAL_TEXTURE_HASH); |
508beb59e0eb
DrawSpan で使う Tile の Hash の扱いは class TileHash を生成する事に。
gongo@localhost.localdomain
parents:
166
diff
changeset
|
190 tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST); |
128
95e2046eb46f
texture load use hash table
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
126
diff
changeset
|
191 |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
192 int rangex_start = smanager->get_param(0); |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
193 int rangex_end = smanager->get_param(1); |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
194 |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
195 // Υô x ϰ |
109 | 196 int rangex = rangex_end - rangex_start + 1; |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
197 |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
198 // y ϰ (render_y + rangey - 1) |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
199 int rangey = smanager->get_param(2); |
177 | 200 |
184 | 201 float *zRow = (float*)smanager->allocate(sizeof(float)*rangex*rangey); |
202 | |
203 for (int i = 0; i < rangex*rangey; i++) { | |
204 zRow[i] = 65535.0f; | |
205 } | |
206 | |
109 | 207 int **linebuf = (int**)smanager->allocate(sizeof(int*)*rangey); |
208 | |
209 for (int i = 0; i < rangey; i++) { | |
210 linebuf[i] = (int*)smanager->get_output(i); | |
170 | 211 linebuf_init(linebuf[i], rangex, 0xffffffff); |
109 | 212 } |
213 | |
184 | 214 SpanPackPtr spack = (SpanPackPtr)smanager->get_input(0); |
215 SpanPackPtr next_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
216 SpanPackPtr free_spack = next_spack; // next_spack free() | |
217 Span *span; | |
218 | |
109 | 219 do { |
220 /** | |
221 * SpanPack->next ¸ߤ硢 | |
222 * ߤ SpanPack Ƥ֤ | |
223 * SpanPack DMA žԤ | |
224 */ | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
225 if (spack->next != NULL) { |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
226 smanager->dma_load(next_spack, (uint32)spack->next, |
109 | 227 sizeof(SpanPack), SPAN_PACK_LOAD); |
228 } else { | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
229 next_spack = NULL; |
109 | 230 } |
231 | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
232 for (int t = 0; t < spack->info.size; t++) { |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
233 span = &spack->span[t]; |
109 | 234 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
235 Uint32 rgb = 0x00ff00; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
236 float tex1 = span->tex_x1; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
237 float tex2 = span->tex_x2; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
238 float tey1 = span->tex_y1; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
239 float tey2 = span->tex_y2; |
147 | 240 |
166 | 241 /** |
242 * Span 1 pixel | |
243 * ƥκɸ | |
244 */ | |
109 | 245 int tex_xpos; |
246 int tex_ypos; | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
247 |
166 | 248 /** |
249 * (tex_xpos, tex_ypos) Ρ֥å(ο)Ǥκɸ | |
250 * Υ֥åΥɥ쥹(MainMemory) | |
251 */ | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
252 int tex_localx; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
253 int tex_localy; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
254 uint32 *tex_addr; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
255 |
109 | 256 int x = span->x; |
257 int y = span->y; | |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
258 int x_len = span->length_x; |
109 | 259 float z = span->start_z; |
260 float zpos = span->end_z; | |
261 | |
262 // ɸ [0 .. split_screen_w-1] 褦 x,y -1 | |
263 int localx = getLocalX(x-1); | |
264 int localy = getLocalY(y-1); | |
131 | 265 |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
266 if (x_len == 1) { |
109 | 267 if (x < rangex_start || rangex_end < x) { |
268 continue; | |
269 } | |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
270 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
271 tex_xpos = (int)((span->tex_width-1) * tex1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
272 tex_ypos = (int)((span->tex_height-1) * tey1); |
109 | 273 |
274 if (zpos < zRow[localx + (rangex * localy)]) { | |
166 | 275 tex_addr = getTile(tex_xpos, tex_ypos, |
276 span->tex_width, span->tex_addr); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
277 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
278 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
166 | 279 |
184 | 280 /** |
281 * Tile ̵硢öϤǤ | |
282 * Tile ɤ륿餻˺Ƶư | |
283 */ | |
284 if (!isAvailableTile(tex_addr)) { | |
285 spack->info.start = t; | |
286 //set_rgb(tex_addr); | |
287 set_rgbs(tex_addr, | |
288 getTile(span->tex_width-1, tex_ypos, | |
289 span->tex_width, span->tex_addr)); | |
290 reboot(spack, 0); | |
291 goto FINISH; | |
292 } | |
293 | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
294 rgb = get_rgb(tex_localx, tex_localy, tex_addr); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
295 |
109 | 296 zRow[localx + (rangex * localy)] = zpos; |
297 linebuf[localy][localx] = rgb; | |
298 } | |
299 } else { | |
300 int js = (x < rangex_start) ? rangex_start - x : 0; | |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
301 int je = (x + x_len > rangex_end) ? rangex_end - x : x_len; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
302 float tex_x, tex_y, tex_z; |
109 | 303 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
304 for (int j = js; j <= je; j++) { |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
305 localx = getLocalX(x-1+j); |
148
74341c8bf935
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
147
diff
changeset
|
306 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
307 tex_z = z*(x_len-1-j)/(x_len-1) + zpos*j/(x_len-1); |
133
8f1419174cdf
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
131
diff
changeset
|
308 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
309 tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
310 tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
311 if (tex_x > 1) tex_x = 1; |
165 | 312 if (tex_x < 0) tex_x = 0; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
313 if (tex_y > 1) tex_y = 1; |
165 | 314 if (tex_y < 0) tex_y = 0; |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
315 tex_xpos = (int)((span->tex_width-1) * tex_x); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
316 tex_ypos = (int)((span->tex_height-1) * tex_y); |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
317 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
318 if (tex_z < zRow[localx + (rangex*localy)]) { |
166 | 319 tex_addr = getTile(tex_xpos, tex_ypos, |
320 span->tex_width, span->tex_addr); | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
321 tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
322 tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL; |
184 | 323 |
324 if (!isAvailableTile(tex_addr)) { | |
325 spack->info.start = t; | |
326 //set_rgb(tex_addr); | |
327 set_rgbs(tex_addr, | |
328 getTile(span->tex_width-1, tex_ypos, | |
329 span->tex_width, span->tex_addr)); | |
330 reboot(spack, j); | |
331 goto FINISH; | |
332 } | |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
333 |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
334 rgb = get_rgb(tex_localx, tex_localy, tex_addr); |
168 | 335 |
164
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
336 zRow[localx + (rangex*localy)] = tex_z; |
dc7d10ae7460
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
337 linebuf[localy][localx] = rgb; |
147 | 338 } |
109 | 339 } |
340 } | |
341 } | |
147 | 342 |
109 | 343 smanager->dma_wait(SPAN_PACK_LOAD); |
344 | |
184 | 345 SpanPackPtr tmp_spack = spack; |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
346 spack = next_spack; |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
347 next_spack = tmp_spack; |
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
348 } while (spack); |
109 | 349 |
184 | 350 |
351 FINISH: | |
182
8e9ada0c1ed0
add get_inputAddr, get_outputAddr
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
180
diff
changeset
|
352 free(free_spack); |
109 | 353 free(linebuf); |
354 | |
355 return 0; | |
356 } |