Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Test/test_render/task/CreateSpan.cpp @ 154:f4673e790675
task/ と spe/ の同期し忘れ。
こういうのめんどくさいからなんとかしたいんだけど
author | gongo@gendarme.local |
---|---|
date | Wed, 03 Dec 2008 20:14:23 +0900 |
parents | 9642aeef298d |
children | 77dac07efd79 |
rev | line source |
---|---|
109 | 1 #include "CreateSpan.h" |
2 #include "viewer_types.h" | |
3 | |
4 static const int SPAN_PACK_LOAD = 5; | |
5 static const int SPAN_PACK_STORE = 6; | |
6 static const int POLYGON_PACK_LOAD = 7; | |
141 | 7 static const int TILE_ALLOCATE = 8; |
8 static const int TILE_LOAD = 9; | |
9 static const int TILE_STORE = 10; | |
109 | 10 |
11 static SpanPackPtr spack = NULL; | |
12 static SpanPackPtr send_spack = NULL; | |
13 static int prev_index = 0; | |
14 | |
15 SchedDefineTask(CreateSpan); | |
16 | |
17 static float | |
18 calc(float f1, float f2,int i, float base) | |
19 { | |
20 float ans; | |
21 ans = f1/f2*i + base; | |
22 return ans; | |
23 } | |
24 | |
25 | |
26 /** | |
27 * TrianglePack から、vMin, vMid, vMax を求める | |
28 * | |
29 * @param [triPack] TrianglePack | |
30 * @param [vMin] [vMid] [vMax] | |
31 */ | |
32 static void | |
33 make_vertex(TrianglePack *triPack, | |
34 VertexPackPtr *vMin, VertexPackPtr *vMid, VertexPackPtr *vMax) | |
35 { | |
36 if (triPack->ver1.y <= triPack->ver2.y) { | |
37 if (triPack->ver2.y <= triPack->ver3.y) { | |
38 *vMin = &triPack->ver1; | |
39 *vMid = &triPack->ver2; | |
40 *vMax = &triPack->ver3; | |
41 } else if (triPack->ver3.y <= triPack->ver1.y) { | |
42 *vMin = &triPack->ver3; | |
43 *vMid = &triPack->ver1; | |
44 *vMax = &triPack->ver2; | |
45 } else { | |
46 *vMin = &triPack->ver1; | |
47 *vMid = &triPack->ver3; | |
48 *vMax = &triPack->ver2; | |
49 } | |
50 } else { | |
51 if (triPack->ver1.y <= triPack->ver3.y) { | |
52 *vMin = &triPack->ver2; | |
53 *vMid = &triPack->ver1; | |
54 *vMax = &triPack->ver3; | |
55 } else if (triPack->ver3.y <= triPack->ver2.y) { | |
56 *vMin = &triPack->ver3; | |
57 *vMid = &triPack->ver2; | |
58 *vMax = &triPack->ver1; | |
59 } else { | |
60 *vMin = &triPack->ver2; | |
61 *vMid = &triPack->ver3; | |
62 *vMax = &triPack->ver1; | |
63 } | |
64 } | |
65 } | |
66 | |
67 static void | |
68 make_vMid10(VertexPack *v, VertexPack *vMin, | |
69 VertexPack *vMid, VertexPack *vMax) | |
70 { | |
142 | 71 //int d, d1; |
72 float d; | |
73 int d1; | |
74 | |
75 d = vMax->y - vMin->y; | |
109 | 76 d1 = (int)(vMid->y - vMin->y); |
77 | |
78 v->tex_x = calc(vMax->tex_x - vMin->tex_x, d, d1, vMin->tex_x); | |
79 v->tex_y = calc(vMax->tex_y - vMin->tex_y, d, d1, vMin->tex_y); | |
80 v->x = calc(vMax->x - vMin->x, d, d1, vMin->x); | |
81 v->y = vMid->y; | |
82 v->z = calc(vMax->z - vMin->z, d, d1, vMin->z); | |
83 } | |
84 | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
85 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
86 /** |
141 | 87 * Span の1ドットずつ、必要なテクスチャのブロック(Tile)を求めていく |
88 * | |
89 */ | |
90 void | |
91 CreateSpan::setTile(SpanPtr span) | |
92 { | |
142 | 93 TileInfoListPtr tilelist = |
94 (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList)); | |
95 TileInfoListPtr send_tilelist = | |
96 (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList)); | |
141 | 97 TileInfoListPtr tilelist_addr; |
142 | 98 TileInfoListPtr send_tilelist_addr; |
99 TileInfoPtr tile; | |
141 | 100 |
142 | 101 int cur_x = 0; |
141 | 102 int len = 0; |
103 | |
142 | 104 smanager->mainMem_wait(); |
141 | 105 tilelist_addr = (TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE); |
106 span->tilelist = tilelist_addr; | |
107 | |
142 | 108 float tex1 = span->tex_x1; |
109 float tex2 = span->tex_x2; | |
110 float tey1 = span->tex_y1; | |
111 float tey2 = span->tex_y2; | |
112 int tex_xpos; | |
113 int tex_ypos; | |
114 int end = span->length_x; | |
141 | 115 |
142 | 116 if (span->length_x == 1) { |
117 tilelist->init(); | |
118 tile = &tilelist->tileinfo[tilelist->size++]; | |
119 | |
120 tex_xpos = (int)((span->tex_width-1) * tex1); | |
121 tex_ypos = (int)((span->tex_height-1) * tey1); | |
141 | 122 |
142 | 123 tile->tix = tex_xpos; |
124 tile->tiy = tex_ypos; | |
154 | 125 tile->tile = span->tex_addr; |
126 tile->padding = 1; | |
142 | 127 } else { |
154 | 128 while (cur_x <= span->length_x) { |
129 if (cur_x + MAX_TILE_LIST - 1 < span->length_x) { | |
130 len = MAX_TILE_LIST - 1; | |
148
9642aeef298d
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
146
diff
changeset
|
131 smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList)); |
146 | 132 } else { |
133 len = span->length_x - cur_x; | |
134 } | |
141 | 135 |
136 float tex_x, tex_y; | |
137 | |
142 | 138 tilelist->init(); |
139 | |
154 | 140 for (int i = cur_x; i <= cur_x + len; i++) { |
142 | 141 tex_x = tex1*(end-1-i)/(end-1) + tex2*i/(end-1); |
142 tex_y = tey1*(end-1-i)/(end-1) + tey2*i/(end-1); | |
141 | 143 if (tex_x > 1) tex_x = 1; |
144 if (tex_y > 1) tex_y = 1; | |
154 | 145 tex_xpos = (int)((span->tex_width-1) * tex_x); |
146 tex_ypos = (int)((span->tex_height-1) * tex_y); | |
141 | 147 |
154 | 148 tile = &tilelist->tileinfo[tilelist->size++]; |
141 | 149 tile->tix = tex_xpos; |
150 tile->tiy = tex_ypos; | |
154 | 151 tile->padding = i; |
152 | |
153 int blockX = tex_xpos / TEXTURE_SPLIT_PIXEL; | |
154 int blockY = tex_ypos / TEXTURE_SPLIT_PIXEL; | |
155 int block = blockX + (span->tex_width/TEXTURE_SPLIT_PIXEL)*blockY; | |
156 uint32 *addr = (uint32*)span->tex_addr; | |
157 tile->tile = (void*)(addr + block*64); | |
158 //tile->tile = span->tex_addr; | |
141 | 159 } |
142 | 160 |
154 | 161 if (cur_x + MAX_TILE_LIST - 1 < span->length_x) { |
142 | 162 TileInfoListPtr tmp = tilelist; |
163 tilelist = send_tilelist; | |
164 send_tilelist = tmp; | |
146 | 165 |
142 | 166 send_tilelist_addr = tilelist_addr; |
141 | 167 |
142 | 168 smanager->mainMem_wait(); |
169 tilelist_addr = | |
170 (TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE); | |
171 | |
172 send_tilelist->next = tilelist_addr; | |
173 | |
174 smanager->dma_wait(TILE_STORE); | |
175 smanager->dma_store(send_tilelist, (uint32)send_tilelist_addr, | |
176 sizeof(TileInfoList), TILE_STORE); | |
177 } | |
141 | 178 |
142 | 179 cur_x += MAX_TILE_LIST; |
141 | 180 } |
181 } | |
182 | |
183 smanager->dma_wait(TILE_STORE); | |
142 | 184 tilelist->next = 0; // ? |
141 | 185 smanager->dma_store(tilelist, (uint32)tilelist_addr, |
186 sizeof(TileInfoList), TILE_STORE); | |
142 | 187 free(send_tilelist); |
188 | |
141 | 189 smanager->dma_wait(TILE_STORE); |
190 | |
191 free(tilelist); | |
192 } | |
193 | |
194 /** | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
195 * x軸に水平な辺を持つ三角形ポリゴンから、 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
196 * Span を抜き出す |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
197 */ |
109 | 198 void |
199 CreateSpan::half_triangle(SpanPackPtr *spackList, | |
200 int charge_y_top, int charge_y_end, | |
201 long *tex_addr, long tex_width, long tex_height, | |
202 VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10) | |
203 { | |
204 float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2; | |
205 float tmp_xpos,tmp_end,tmp_zpos; | |
206 float start_z, end_z; | |
207 float start_tex_x, end_tex_x, start_tex_y, end_tex_y; | |
208 int x, y, length; | |
209 | |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
210 #if 1 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
211 // これじゃないと |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
212 // テクスチャの貼りに微妙に隙間が。謎だ |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
213 int start_y = (int)vMid->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
214 int end_y = (int)vMin->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
215 #else |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
216 float start_y = vMid->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
217 float end_y = vMin->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
218 #endif |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
219 float div_y = start_y - end_y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
220 int k = 0; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
221 int l = 1; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
222 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
223 SpanPackPtr tmp_spack; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
224 |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
225 /** |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
226 * 三角形ポリゴンをx軸に水平に二つに分けようとして |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
227 * ある一辺がすでに水平だった場合、つまり |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
228 * (環境によっては、back slash が 円マークかも) |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
229 * |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
230 * |\ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
231 * | \ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
232 * | \ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
233 * ----- |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
234 * |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
235 * |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
236 * 上のようなポリゴンだった場合は、本来なら上の部分の三角形にだけ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
237 * half_triangle の処理をするべきだが、現在の処理だと |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
238 * この half_triangle に「上の部分の三角形」と、 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
239 * 「『下の部分の三角形と判断してしまった』直線」が来てしまう。 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
240 * 直線の部分が来ると、calc() で 0 除算とかで、値不定で暴走するので |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
241 * 現在はこれで代用。 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
242 * half_triangle 呼ぶ前にこれを判断できれば良いかもしれない。 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
243 * てかこんなんでいいのかよ。。。 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
244 * |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
245 */ |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
246 #if 1 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
247 if ((int)div_y == 0) { |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
248 return; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
249 } |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
250 #else |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
251 if (vMid10->x == vMin->x && vMid10->y == vMin->y) { |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
252 return; |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
253 } |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
254 #endif |
109 | 255 |
256 if (div_y < 0) { | |
257 div_y = -div_y; | |
258 k = 1; | |
259 l = -1; | |
260 } | |
261 | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
262 for (int i = k; i < (int)div_y+1; i++) { |
109 | 263 y = (int)vMin->y + i*l; |
264 | |
265 /** | |
266 * 担当 y 範囲内 | |
267 */ | |
268 if (charge_y_top <= y && y <= charge_y_end) { | |
269 // 1..8 を index0, 9..16 を index1 にするために y を -1 | |
270 int index = (y-1) / split_screen_h; | |
271 | |
272 /** | |
273 * 違う SpanPack を扱う場合、 | |
274 * 現在の SpanPack をメインメモリに送り、 | |
275 * 新しい SpanPack を取ってくる | |
276 */ | |
277 if (index != prev_index) { | |
278 tmp_spack = spack; | |
279 spack = send_spack; | |
280 send_spack = tmp_spack; | |
281 | |
282 smanager->dma_wait(SPAN_PACK_STORE); | |
283 smanager->dma_store(send_spack, (uint32)spackList[prev_index], | |
284 sizeof(SpanPack), SPAN_PACK_STORE); | |
285 | |
286 smanager->dma_load(spack, (uint32)spackList[index], | |
287 sizeof(SpanPack), SPAN_PACK_LOAD); | |
288 prev_index = index; | |
289 smanager->dma_wait(SPAN_PACK_LOAD); | |
290 } | |
291 | |
292 /** | |
293 * 書き込む SpanPack が満杯だったら | |
294 * メインメモリで allocate した領域 (next) を持ってきて | |
295 * 現在の spack->next につなぎ、next を次の spack とする。 | |
296 */ | |
297 if (spack->info.size >= MAX_SIZE_SPAN) { | |
298 SpanPackPtr next; | |
299 | |
141 | 300 smanager->mainMem_alloc(0, sizeof(SpanPack)); |
301 smanager->mainMem_wait(); | |
302 next = (SpanPackPtr)smanager->mainMem_get(0); | |
109 | 303 |
304 spack->next = next; | |
305 | |
306 tmp_spack = spack; | |
307 spack = send_spack; | |
308 send_spack = tmp_spack; | |
309 | |
310 smanager->dma_wait(SPAN_PACK_STORE); | |
311 smanager->dma_store(send_spack, (uint32)spackList[index], | |
312 sizeof(SpanPack), SPAN_PACK_STORE); | |
313 | |
314 spackList[index] = next; | |
141 | 315 |
109 | 316 smanager->dma_load(spack, (uint32)spackList[index], |
317 sizeof(SpanPack), SPAN_PACK_LOAD); | |
318 smanager->dma_wait(SPAN_PACK_LOAD); | |
319 spack->init((index+1)*split_screen_h); | |
320 } | |
321 } else { | |
322 /** | |
323 * 担当範囲外だったら無視 | |
324 */ | |
325 continue; | |
326 } | |
146 | 327 |
328 tmp_xpos = calc(vMid10->x - vMin->x ,div_y, i, vMin->x); | |
329 tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x); | |
330 tmp_z = calc(vMid10->z - vMin->z ,div_y, i, vMin->z); | |
331 tmp_zpos = calc(vMid->z - vMin->z ,div_y, i, vMin->z); | |
332 | |
333 length = (tmp_xpos > tmp_end) | |
334 ? (int)tmp_xpos - (int)tmp_end : (int)tmp_end - (int)tmp_xpos; | |
335 if (length == 0) { | |
336 continue; | |
337 } | |
109 | 338 |
141 | 339 /** |
340 * メインメモリに、Tile 用の領域確保をここで指定しておく | |
142 | 341 */ |
342 // ちと仕様変更によりここでは使わない | |
343 // 予めやっておいて、その間に処理、だとちょっと動作が怪しいらしい | |
146 | 344 smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList)); |
345 | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
346 |
109 | 347 tmp_tex1 =((i/(div_y)) * vMid10->tex_x) + |
348 ( ((div_y - i)/(div_y)) * vMin->tex_x); | |
349 tmp_tex2 =( (i/(div_y)) * vMid->tex_x) + | |
350 ( ((div_y - i)/(div_y)) * vMin->tex_x); | |
351 | |
352 tmp_tey1 =( (i/(div_y)) * vMid10->tex_y) + | |
353 ( ((div_y - i)/(div_y)) * vMin->tex_y); | |
354 tmp_tey2 =( (i/(div_y)) * vMid->tex_y) + | |
355 ( ((div_y - i)/(div_y)) * vMin->tex_y); | |
356 | |
357 if (tmp_xpos > tmp_end) { | |
358 x = (int)tmp_end; | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
359 /** |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
360 * +1 は要らない気がする・・・ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
361 */ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
362 //length = (int)(tmp_xpos)-(int)(tmp_end)+1; |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
363 length = (int)(tmp_xpos)-(int)(tmp_end); |
109 | 364 start_z = tmp_zpos; |
365 end_z = tmp_z; | |
366 start_tex_x = tmp_tex2; | |
367 end_tex_x = tmp_tex1; | |
368 start_tex_y = tmp_tey2; | |
369 end_tex_y = tmp_tey1; | |
370 } else { | |
371 x = (int)tmp_xpos; | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
372 //length = (int)(tmp_end)-(int)(tmp_xpos)+1; |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
373 length = (int)(tmp_end)-(int)(tmp_xpos); |
109 | 374 start_z = tmp_z; |
375 end_z = tmp_zpos; | |
376 start_tex_x = tmp_tex1; | |
377 end_tex_x = tmp_tex2; | |
378 start_tex_y = tmp_tey1; | |
379 end_tex_y = tmp_tey2; | |
380 } | |
381 | |
382 smanager->dma_wait(SPAN_PACK_LOAD); | |
383 | |
384 Span *span = &spack->span[spack->info.size++]; | |
385 | |
386 span->tex_addr = tex_addr; | |
387 span->tex_width = tex_width; | |
388 span->tex_height = tex_height; | |
389 span->x = x; | |
390 span->y = y; | |
391 span->length_x = length; | |
392 span->start_z = start_z; | |
393 span->end_z = end_z; | |
394 span->tex_x1 = start_tex_x; | |
395 span->tex_x2 = end_tex_x; | |
396 span->tex_y1 = start_tex_y; | |
397 span->tex_y2 = end_tex_y; | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
398 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
399 // TilePtr の計算 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
400 // tix, tiy (Tile 内での x, y) |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
401 // |
148
9642aeef298d
Span への Texture List の渡し。じゃっかん texture がバグってるので
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
146
diff
changeset
|
402 //smanager->mainMem_wait(); |
146 | 403 setTile(span); |
109 | 404 } |
405 } | |
406 | |
407 | |
408 int | |
409 CreateSpan::run(void *rbuf, void *wbuf) | |
410 { | |
411 PolygonPack *pp = (PolygonPack*)smanager->get_input(0); | |
412 PolygonPack *next_pp = | |
413 (PolygonPack*)smanager->allocate(sizeof(PolygonPack)); | |
414 PolygonPack *free_pp = next_pp; | |
415 PolygonPack *tmp_pp; | |
416 | |
417 TrianglePackPtr triPack; | |
418 VertexPackPtr vMin, vMid, vMax; | |
419 VertexPackPtr vMid10 | |
420 = (VertexPackPtr)smanager->allocate(sizeof(VertexPack)); | |
421 | |
422 SpanPackPtr *spackList = (SpanPackPtr*)smanager->get_input(1); | |
423 spack = (SpanPackPtr)smanager->get_input(2); | |
424 send_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
425 prev_index = get_param(0); | |
426 | |
427 // spack と send_spack は swap しながら DMA を繰り返すので | |
428 // 自分で allocate した send_spack を覚えてないといけない | |
429 SpanPackPtr free_spack = send_spack; | |
430 | |
431 int charge_y_top = get_param(1); | |
432 int charge_y_end = get_param(2); | |
433 | |
434 do { | |
435 if (pp->next != NULL) { | |
436 smanager->dma_load(next_pp, (uint32)pp->next, | |
437 sizeof(PolygonPack), POLYGON_PACK_LOAD); | |
438 } else { | |
439 next_pp = NULL; | |
440 } | |
441 | |
442 for (int i = 0; i < pp->info.size; i++) { | |
443 triPack = &pp->tri[i]; | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
444 |
109 | 445 #if 0 |
446 make_vertex(triPack, &vMin, &vMid, &vMax); | |
447 #else | |
448 if (triPack->ver1.y <= triPack->ver2.y) { | |
449 if (triPack->ver2.y <= triPack->ver3.y) { | |
450 vMin = &triPack->ver1; | |
451 vMid = &triPack->ver2; | |
452 vMax = &triPack->ver3; | |
453 } else if (triPack->ver3.y <= triPack->ver1.y) { | |
454 vMin = &triPack->ver3; | |
455 vMid = &triPack->ver1; | |
456 vMax = &triPack->ver2; | |
457 } else { | |
458 vMin = &triPack->ver1; | |
459 vMid = &triPack->ver3; | |
460 vMax = &triPack->ver2; | |
461 } | |
462 } else { | |
463 if (triPack->ver1.y <= triPack->ver3.y) { | |
464 vMin = &triPack->ver2; | |
465 vMid = &triPack->ver1; | |
466 vMax = &triPack->ver3; | |
467 } else if (triPack->ver3.y <= triPack->ver2.y) { | |
468 vMin = &triPack->ver3; | |
469 vMid = &triPack->ver2; | |
470 vMax = &triPack->ver1; | |
471 } else { | |
472 vMin = &triPack->ver2; | |
473 vMid = &triPack->ver3; | |
474 vMax = &triPack->ver1; | |
475 } | |
476 } | |
477 #endif | |
478 make_vMid10(vMid10, vMin, vMid, vMax); | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
479 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
480 /** |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
481 * ポリゴンを、x軸に水平に分割して二つの三角形を作り、 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
482 * それぞれから Span を求める |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
483 */ |
109 | 484 half_triangle(spackList, charge_y_top, charge_y_end, |
485 triPack->tex_addr, triPack->tex_width, | |
486 triPack->tex_height, vMin, vMid, vMid10); | |
487 half_triangle(spackList, charge_y_top, charge_y_end, | |
488 pp->tri[0].tex_addr, pp->tri[0].tex_width, | |
489 pp->tri[0].tex_height, vMax, vMid, vMid10); | |
490 } | |
491 | |
492 smanager->dma_wait(POLYGON_PACK_LOAD); | |
493 | |
494 tmp_pp = pp; | |
495 pp = next_pp; | |
496 next_pp = tmp_pp; | |
497 } while (pp); | |
498 | |
499 smanager->dma_wait(SPAN_PACK_STORE); | |
500 smanager->dma_store(spack, (uint32)spackList[prev_index], | |
501 sizeof(SpanPack), SPAN_PACK_STORE); | |
502 smanager->dma_wait(SPAN_PACK_STORE); | |
503 | |
504 free(free_pp); | |
505 free(free_spack); | |
506 free(vMid10); | |
507 | |
508 return 0; | |
509 } |