Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Test/test_render/task/CreateSpan.cpp @ 137:6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
author | gongo@gendarme.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Fri, 28 Nov 2008 10:07:48 +0900 |
parents | c65aee1528ef |
children | fc314f28b66e |
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; | |
7 | |
8 static SpanPackPtr spack = NULL; | |
9 static SpanPackPtr send_spack = NULL; | |
10 static int prev_index = 0; | |
11 | |
12 SchedDefineTask(CreateSpan); | |
13 | |
14 static float | |
15 calc(float f1, float f2,int i, float base) | |
16 { | |
17 float ans; | |
18 ans = f1/f2*i + base; | |
19 return ans; | |
20 } | |
21 | |
22 | |
23 /** | |
24 * TrianglePack から、vMin, vMid, vMax を求める | |
25 * | |
26 * @param [triPack] TrianglePack | |
27 * @param [vMin] [vMid] [vMax] | |
28 */ | |
29 static void | |
30 make_vertex(TrianglePack *triPack, | |
31 VertexPackPtr *vMin, VertexPackPtr *vMid, VertexPackPtr *vMax) | |
32 { | |
33 if (triPack->ver1.y <= triPack->ver2.y) { | |
34 if (triPack->ver2.y <= triPack->ver3.y) { | |
35 *vMin = &triPack->ver1; | |
36 *vMid = &triPack->ver2; | |
37 *vMax = &triPack->ver3; | |
38 } else if (triPack->ver3.y <= triPack->ver1.y) { | |
39 *vMin = &triPack->ver3; | |
40 *vMid = &triPack->ver1; | |
41 *vMax = &triPack->ver2; | |
42 } else { | |
43 *vMin = &triPack->ver1; | |
44 *vMid = &triPack->ver3; | |
45 *vMax = &triPack->ver2; | |
46 } | |
47 } else { | |
48 if (triPack->ver1.y <= triPack->ver3.y) { | |
49 *vMin = &triPack->ver2; | |
50 *vMid = &triPack->ver1; | |
51 *vMax = &triPack->ver3; | |
52 } else if (triPack->ver3.y <= triPack->ver2.y) { | |
53 *vMin = &triPack->ver3; | |
54 *vMid = &triPack->ver2; | |
55 *vMax = &triPack->ver1; | |
56 } else { | |
57 *vMin = &triPack->ver2; | |
58 *vMid = &triPack->ver3; | |
59 *vMax = &triPack->ver1; | |
60 } | |
61 } | |
62 } | |
63 | |
64 static void | |
65 make_vMid10(VertexPack *v, VertexPack *vMin, | |
66 VertexPack *vMid, VertexPack *vMax) | |
67 { | |
68 int d, d1; | |
69 | |
70 d = (int)(vMax->y - vMin->y); | |
71 d1 = (int)(vMid->y - vMin->y); | |
72 | |
73 v->tex_x = calc(vMax->tex_x - vMin->tex_x, d, d1, vMin->tex_x); | |
74 v->tex_y = calc(vMax->tex_y - vMin->tex_y, d, d1, vMin->tex_y); | |
75 v->x = calc(vMax->x - vMin->x, d, d1, vMin->x); | |
76 v->y = vMid->y; | |
77 v->z = calc(vMax->z - vMin->z, d, d1, vMin->z); | |
78 } | |
79 | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
80 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
81 /** |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
82 * x軸に水平な辺を持つ三角形ポリゴンから、 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
83 * Span を抜き出す |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
84 */ |
109 | 85 void |
86 CreateSpan::half_triangle(SpanPackPtr *spackList, | |
87 int charge_y_top, int charge_y_end, | |
88 long *tex_addr, long tex_width, long tex_height, | |
89 VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10) | |
90 { | |
91 float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2; | |
92 float tmp_xpos,tmp_end,tmp_zpos; | |
93 float start_z, end_z; | |
94 float start_tex_x, end_tex_x, start_tex_y, end_tex_y; | |
95 int x, y, length; | |
96 | |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
97 #if 1 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
98 // これじゃないと |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
99 // テクスチャの貼りに微妙に隙間が。謎だ |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
100 int start_y = (int)vMid->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
101 int end_y = (int)vMin->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
102 #else |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
103 float start_y = vMid->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
104 float end_y = vMin->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
105 #endif |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
106 float div_y = start_y - end_y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
107 int k = 0; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
108 int l = 1; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
109 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
110 SpanPackPtr tmp_spack; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
111 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
112 |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
113 /** |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
114 * 三角形ポリゴンをx軸に水平に二つに分けようとして |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
115 * ある一辺がすでに水平だった場合、つまり |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
116 * (環境によっては、back slash が 円マークかも) |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
117 * |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
118 * |\ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
119 * | \ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
120 * | \ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
121 * ----- |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
122 * |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
123 * |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
124 * 上のようなポリゴンだった場合は、本来なら上の部分の三角形にだけ |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
125 * half_triangle の処理をするべきだが、現在の処理だと |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
126 * この half_triangle に「上の部分の三角形」と、 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
127 * 「『下の部分の三角形と判断してしまった』直線」が来てしまう。 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
128 * 直線の部分が来ると、calc() で 0 除算とかで、値不定で暴走するので |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
129 * 現在はこれで代用。 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
130 * half_triangle 呼ぶ前にこれを判断できれば良いかもしれない。 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
131 * てかこんなんでいいのかよ。。。 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
132 * |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
133 */ |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
134 #if 1 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
135 if ((int)div_y == 0) { |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
136 return; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
137 } |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
138 #else |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
139 if (vMid10->x == vMin->x && vMid10->y == vMin->y) { |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
140 return; |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
141 } |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
142 #endif |
109 | 143 |
144 if (div_y < 0) { | |
145 div_y = -div_y; | |
146 k = 1; | |
147 l = -1; | |
148 } | |
149 | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
150 for (int i = k; i < (int)div_y+1; i++) { |
109 | 151 y = (int)vMin->y + i*l; |
152 | |
153 /** | |
154 * 担当 y 範囲内 | |
155 */ | |
156 if (charge_y_top <= y && y <= charge_y_end) { | |
157 // 1..8 を index0, 9..16 を index1 にするために y を -1 | |
158 int index = (y-1) / split_screen_h; | |
159 | |
160 /** | |
161 * 違う SpanPack を扱う場合、 | |
162 * 現在の SpanPack をメインメモリに送り、 | |
163 * 新しい SpanPack を取ってくる | |
164 */ | |
165 if (index != prev_index) { | |
166 tmp_spack = spack; | |
167 spack = send_spack; | |
168 send_spack = tmp_spack; | |
169 | |
170 smanager->dma_wait(SPAN_PACK_STORE); | |
171 smanager->dma_store(send_spack, (uint32)spackList[prev_index], | |
172 sizeof(SpanPack), SPAN_PACK_STORE); | |
173 | |
174 smanager->dma_load(spack, (uint32)spackList[index], | |
175 sizeof(SpanPack), SPAN_PACK_LOAD); | |
176 prev_index = index; | |
177 smanager->dma_wait(SPAN_PACK_LOAD); | |
178 } | |
179 | |
180 /** | |
181 * 書き込む SpanPack が満杯だったら | |
182 * メインメモリで allocate した領域 (next) を持ってきて | |
183 * 現在の spack->next につなぎ、next を次の spack とする。 | |
184 */ | |
185 if (spack->info.size >= MAX_SIZE_SPAN) { | |
186 SpanPackPtr next; | |
187 | |
188 mainMem_alloc(0, sizeof(SpanPack)); | |
189 mainMem_wait(); | |
190 next = (SpanPackPtr)mainMem_get(0); | |
191 | |
192 spack->next = next; | |
193 | |
194 tmp_spack = spack; | |
195 spack = send_spack; | |
196 send_spack = tmp_spack; | |
197 | |
198 smanager->dma_wait(SPAN_PACK_STORE); | |
199 smanager->dma_store(send_spack, (uint32)spackList[index], | |
200 sizeof(SpanPack), SPAN_PACK_STORE); | |
201 | |
202 spackList[index] = next; | |
203 | |
204 smanager->dma_load(spack, (uint32)spackList[index], | |
205 sizeof(SpanPack), SPAN_PACK_LOAD); | |
206 smanager->dma_wait(SPAN_PACK_LOAD); | |
207 spack->init((index+1)*split_screen_h); | |
208 } | |
209 } else { | |
210 /** | |
211 * 担当範囲外だったら無視 | |
212 */ | |
213 continue; | |
214 } | |
215 | |
216 tmp_xpos = calc(vMid10->x - vMin->x ,div_y, i, vMin->x); | |
217 tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x); | |
218 tmp_z = calc(vMid10->z - vMin->z ,div_y, i, vMin->z); | |
219 tmp_zpos = calc(vMid->z - vMin->z ,div_y, i, vMin->z); | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
220 |
109 | 221 tmp_tex1 =((i/(div_y)) * vMid10->tex_x) + |
222 ( ((div_y - i)/(div_y)) * vMin->tex_x); | |
223 tmp_tex2 =( (i/(div_y)) * vMid->tex_x) + | |
224 ( ((div_y - i)/(div_y)) * vMin->tex_x); | |
225 | |
226 tmp_tey1 =( (i/(div_y)) * vMid10->tex_y) + | |
227 ( ((div_y - i)/(div_y)) * vMin->tex_y); | |
228 tmp_tey2 =( (i/(div_y)) * vMid->tex_y) + | |
229 ( ((div_y - i)/(div_y)) * vMin->tex_y); | |
230 | |
231 if (tmp_xpos > tmp_end) { | |
232 x = (int)tmp_end; | |
134
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 * +1 は要らない気がする・・・ |
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 //length = (int)(tmp_xpos)-(int)(tmp_end)+1; |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
237 length = (int)(tmp_xpos)-(int)(tmp_end); |
109 | 238 start_z = tmp_zpos; |
239 end_z = tmp_z; | |
240 start_tex_x = tmp_tex2; | |
241 end_tex_x = tmp_tex1; | |
242 start_tex_y = tmp_tey2; | |
243 end_tex_y = tmp_tey1; | |
244 } else { | |
245 x = (int)tmp_xpos; | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
246 //length = (int)(tmp_end)-(int)(tmp_xpos)+1; |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
247 length = (int)(tmp_end)-(int)(tmp_xpos); |
109 | 248 start_z = tmp_z; |
249 end_z = tmp_zpos; | |
250 start_tex_x = tmp_tex1; | |
251 end_tex_x = tmp_tex2; | |
252 start_tex_y = tmp_tey1; | |
253 end_tex_y = tmp_tey2; | |
254 } | |
255 | |
256 smanager->dma_wait(SPAN_PACK_LOAD); | |
257 | |
258 Span *span = &spack->span[spack->info.size++]; | |
259 | |
260 span->tex_addr = tex_addr; | |
261 span->tex_width = tex_width; | |
262 span->tex_height = tex_height; | |
263 span->x = x; | |
264 span->y = y; | |
265 span->length_x = length; | |
266 span->start_z = start_z; | |
267 span->end_z = end_z; | |
268 span->tex_x1 = start_tex_x; | |
269 span->tex_x2 = end_tex_x; | |
270 span->tex_y1 = start_tex_y; | |
271 span->tex_y2 = end_tex_y; | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
272 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
273 // TilePtr の計算 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
274 // tix, tiy (Tile 内での x, y) |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
275 // |
109 | 276 } |
277 } | |
278 | |
279 | |
280 int | |
281 CreateSpan::run(void *rbuf, void *wbuf) | |
282 { | |
283 PolygonPack *pp = (PolygonPack*)smanager->get_input(0); | |
284 PolygonPack *next_pp = | |
285 (PolygonPack*)smanager->allocate(sizeof(PolygonPack)); | |
286 PolygonPack *free_pp = next_pp; | |
287 PolygonPack *tmp_pp; | |
288 | |
289 TrianglePackPtr triPack; | |
290 VertexPackPtr vMin, vMid, vMax; | |
291 VertexPackPtr vMid10 | |
292 = (VertexPackPtr)smanager->allocate(sizeof(VertexPack)); | |
293 | |
294 SpanPackPtr *spackList = (SpanPackPtr*)smanager->get_input(1); | |
295 spack = (SpanPackPtr)smanager->get_input(2); | |
296 send_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
297 prev_index = get_param(0); | |
298 | |
299 // spack と send_spack は swap しながら DMA を繰り返すので | |
300 // 自分で allocate した send_spack を覚えてないといけない | |
301 SpanPackPtr free_spack = send_spack; | |
302 | |
303 int charge_y_top = get_param(1); | |
304 int charge_y_end = get_param(2); | |
305 | |
306 do { | |
307 if (pp->next != NULL) { | |
308 smanager->dma_load(next_pp, (uint32)pp->next, | |
309 sizeof(PolygonPack), POLYGON_PACK_LOAD); | |
310 } else { | |
311 next_pp = NULL; | |
312 } | |
313 | |
314 for (int i = 0; i < pp->info.size; i++) { | |
315 triPack = &pp->tri[i]; | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
316 |
109 | 317 #if 0 |
318 make_vertex(triPack, &vMin, &vMid, &vMax); | |
319 #else | |
320 if (triPack->ver1.y <= triPack->ver2.y) { | |
321 if (triPack->ver2.y <= triPack->ver3.y) { | |
322 vMin = &triPack->ver1; | |
323 vMid = &triPack->ver2; | |
324 vMax = &triPack->ver3; | |
325 } else if (triPack->ver3.y <= triPack->ver1.y) { | |
326 vMin = &triPack->ver3; | |
327 vMid = &triPack->ver1; | |
328 vMax = &triPack->ver2; | |
329 } else { | |
330 vMin = &triPack->ver1; | |
331 vMid = &triPack->ver3; | |
332 vMax = &triPack->ver2; | |
333 } | |
334 } else { | |
335 if (triPack->ver1.y <= triPack->ver3.y) { | |
336 vMin = &triPack->ver2; | |
337 vMid = &triPack->ver1; | |
338 vMax = &triPack->ver3; | |
339 } else if (triPack->ver3.y <= triPack->ver2.y) { | |
340 vMin = &triPack->ver3; | |
341 vMid = &triPack->ver2; | |
342 vMax = &triPack->ver1; | |
343 } else { | |
344 vMin = &triPack->ver2; | |
345 vMid = &triPack->ver3; | |
346 vMax = &triPack->ver1; | |
347 } | |
348 } | |
349 #endif | |
350 make_vMid10(vMid10, vMin, vMid, vMax); | |
134
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
351 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
352 /** |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
353 * ポリゴンを、x軸に水平に分割して二つの三角形を作り、 |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
354 * それぞれから Span を求める |
92fcce4330f3
CreateSpan で、三角形を二つに割る時、
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
109
diff
changeset
|
355 */ |
109 | 356 half_triangle(spackList, charge_y_top, charge_y_end, |
357 triPack->tex_addr, triPack->tex_width, | |
358 triPack->tex_height, vMin, vMid, vMid10); | |
359 half_triangle(spackList, charge_y_top, charge_y_end, | |
360 pp->tri[0].tex_addr, pp->tri[0].tex_width, | |
361 pp->tri[0].tex_height, vMax, vMid, vMid10); | |
362 } | |
363 | |
364 smanager->dma_wait(POLYGON_PACK_LOAD); | |
365 | |
366 tmp_pp = pp; | |
367 pp = next_pp; | |
368 next_pp = tmp_pp; | |
369 } while (pp); | |
370 | |
371 smanager->dma_wait(SPAN_PACK_STORE); | |
372 smanager->dma_store(spack, (uint32)spackList[prev_index], | |
373 sizeof(SpanPack), SPAN_PACK_STORE); | |
374 smanager->dma_wait(SPAN_PACK_STORE); | |
375 | |
376 free(free_pp); | |
377 free(free_spack); | |
378 free(vMid10); | |
379 | |
380 return 0; | |
381 } |