Mercurial > hg > Members > kono > Cerium
annotate TaskManager/Test/test_render/spe/CreateSpan.cpp @ 172:c09f506bf5c9
CreateSpan に getScale を追加
author | gongo@localhost.localdomain |
---|---|
date | Thu, 11 Dec 2008 12:04:14 +0900 |
parents | d1f2ce3bdb2f |
children | 559b48b69b76 |
rev | line source |
---|---|
109 | 1 #include "CreateSpan.h" |
2 #include "viewer_types.h" | |
3 | |
164
38cbb7aecc70
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
4 static const int SPAN_PACK_LOAD = 5; |
38cbb7aecc70
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
5 static const int SPAN_PACK_STORE = 6; |
38cbb7aecc70
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
6 static const int POLYGON_PACK_LOAD = 7; |
38cbb7aecc70
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
7 static const int TILE_ALLOCATE = 8; |
38cbb7aecc70
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
8 static const int TILE_LOAD = 9; |
38cbb7aecc70
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
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 { | |
146 | 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 | |
156 | 85 /** |
161
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
86 * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する |
156 | 87 * |
161
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
88 * +---+---+---+---+---+---+ |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
89 * | 0 | 1 | 2 | 3 | 4 | 5 | |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
90 * +---+---+---+---+---+---+ |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
91 * | | | | | |11 | |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
92 * +---+---+---+---+---+---+ |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
93 * | | | | | |17 | |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
94 * +---+---+---+---+---+---+ |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
95 * | | | | | |23 | |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
96 * +---+---+---+---+---+---+ |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
97 * | | | | | |29 | |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
98 * +---+---+---+---+---+---+ |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
99 * | | | | | |35 | |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
100 * +---+---+---+---+---+---+ |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
101 * |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
102 * 一辺を TEXTURE_SPLIT とする |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
103 * 各ブロックの数字がブロックIDとなる。 |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
104 */ |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
105 |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
106 /** |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
107 * テクスチャの座標から、 |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
108 * テクスチャのどのブロックかを求める |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
109 * |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
110 * @param[in] tx X coordinates of texture |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
111 * @param[in] tx Y coordinates of texture |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
112 * @param[in] twidth Width of texture |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
113 * @return block ID |
156 | 114 */ |
115 static int | |
161
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
116 get_tex_block(int tx, int ty, int twidth) |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
117 { |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
118 int blockX, blockY; |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
119 |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
120 blockX = tx / TEXTURE_SPLIT_PIXEL; |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
121 blockY = ty / TEXTURE_SPLIT_PIXEL; |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
122 |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
123 return blockX + (twidth/TEXTURE_SPLIT_PIXEL)*blockY; |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
124 } |
1f4c3f3238e6
texture の座標がマイナスになったあと、それを 0 にし忘れてた
gongo@localhost.localdomain
parents:
156
diff
changeset
|
125 |
172 | 126 /** |
127 * span の width,height と texture の width,height を比べて | |
128 * span を描画する際に使う texture の比率を求める | |
129 * | |
130 * @param width Width of span | |
131 * @param height Height of span | |
132 * @param tex_width Width of 1/1 texture that span use | |
133 * @param tex_height Height of 1/1 texture that span use | |
134 * @return 描画に使う texture の比率 | |
135 * width と height は 1/scale の画像を使う | |
136 * | |
137 * @todo scale_max を設定するべき | |
138 * 縮小は 1/8 までしかやってなくて、scale が 16 になる場合もある | |
139 */ | |
169 | 140 static int |
172 | 141 getScale(int width, int height, int tex_width, int tex_height) |
169 | 142 { |
172 | 143 int base, tex_base; |
169 | 144 int scale = 1; |
172 | 145 |
146 /** | |
147 * width と height で、長い方を基準に、 | |
148 * texture の scale を決める | |
149 */ | |
150 if (width > height) { | |
151 base = width; | |
152 tex_base = tex_width; | |
153 } else { | |
154 base = height; | |
155 tex_base = tex_height; | |
156 } | |
157 | |
158 if (tex_base > base) { | |
159 int t_scale = tex_base/base; | |
169 | 160 |
161 while (t_scale >>= 1) { | |
162 scale <<= 1; | |
163 } | |
164 } | |
165 | |
166 return scale; | |
167 } | |
168 | |
141 | 169 /** |
133
435e0d24db39
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
113
diff
changeset
|
170 * x軸に水平な辺を持つ三角形ポリゴンから、 |
435e0d24db39
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
113
diff
changeset
|
171 * Span を抜き出す |
172 | 172 * |
173 * @param spackList triangle から生成された span を格納する List | |
174 * @param charge_y_top 担当する y の範囲開始地点 | |
175 * @param charge_y_end 担当する y の範囲終了地点 | |
176 * @param tex_addr triangle が参照するテクスチャの先頭アドレス | |
177 * @param tex_width テクスチャの width | |
178 * @param tex_height テクスチャの height | |
179 * @param vMin triangle の座標 | |
180 * @param vMid triangle の座標。triangle を二つに分けて出来た新しい座標 | |
181 * @param vMid10 triangle の座標 | |
182 * @param y_length 分割する前の Triangle の y の長さ | |
183 * | |
133
435e0d24db39
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
113
diff
changeset
|
184 */ |
109 | 185 void |
186 CreateSpan::half_triangle(SpanPackPtr *spackList, | |
187 int charge_y_top, int charge_y_end, | |
164
38cbb7aecc70
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
188 uint32 *tex_addr, int tex_width, int tex_height, |
172 | 189 VertexPack *vMin,VertexPack *vMid,VertexPack *vMid10, |
190 int y_length) | |
109 | 191 { |
192 float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2; | |
193 float tmp_xpos,tmp_end,tmp_zpos; | |
194 float start_z, end_z; | |
195 float start_tex_x, end_tex_x, start_tex_y, end_tex_y; | |
196 int x, y, length; | |
197 | |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
198 #if 1 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
199 // これじゃないと |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
200 // テクスチャの貼りに微妙に隙間が。謎だ |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
201 int start_y = (int)vMid->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
202 int end_y = (int)vMin->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
203 #else |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
204 float start_y = vMid->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
205 float end_y = vMin->y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
206 #endif |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
207 float div_y = start_y - end_y; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
208 int k = 0; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
209 int l = 1; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
210 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
211 SpanPackPtr tmp_spack; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
212 |
135 | 213 /** |
214 * 三角形ポリゴンをx軸に水平に二つに分けようとして | |
215 * ある一辺がすでに水平だった場合、つまり | |
216 * | |
217 * |\ | |
218 * | \ | |
219 * | \ | |
220 * ----- | |
221 * | |
222 * | |
223 * 上のようなポリゴンだった場合は、本来なら上の部分の三角形にだけ | |
224 * half_triangle の処理をするべきだが、現在の処理だと | |
225 * この half_triangle に「上の部分の三角形」と、 | |
226 * 「『下の部分の三角形と判断してしまった』直線」が来てしまう。 | |
227 * 直線の部分が来ると、calc() で 0 除算とかで、値不定で暴走するので | |
228 * 現在はこれで代用。 | |
229 * half_triangle 呼ぶ前にこれを判断できれば良いかもしれない。 | |
230 * てかこんなんでいいのかよ。。。 | |
231 * | |
232 */ | |
137
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
233 #if 1 |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
234 if ((int)div_y == 0) { |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
235 return; |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
236 } |
6cf991f28c6c
SceneGraphPack の代わりに、今は SceneGraph をそのまま使う様に設定。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
135
diff
changeset
|
237 #else |
135 | 238 if (vMid10->x == vMin->x && vMid10->y == vMin->y) { |
239 return; | |
240 } | |
241 #endif | |
109 | 242 |
243 if (div_y < 0) { | |
244 div_y = -div_y; | |
245 k = 1; | |
246 l = -1; | |
247 } | |
248 | |
135 | 249 for (int i = k; i < (int)div_y+1; i++) { |
109 | 250 y = (int)vMin->y + i*l; |
251 | |
252 /** | |
253 * 担当 y 範囲内 | |
254 */ | |
255 if (charge_y_top <= y && y <= charge_y_end) { | |
256 // 1..8 を index0, 9..16 を index1 にするために y を -1 | |
257 int index = (y-1) / split_screen_h; | |
164
38cbb7aecc70
TilePtr は SPE で計算した方がいいと判断して変更。
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents:
161
diff
changeset
|
258 |
109 | 259 /** |
260 * 違う SpanPack を扱う場合、 | |
261 * 現在の SpanPack をメインメモリに送り、 | |
262 * 新しい SpanPack を取ってくる | |
263 */ | |
264 if (index != prev_index) { | |
265 tmp_spack = spack; | |
266 spack = send_spack; | |
267 send_spack = tmp_spack; | |
268 | |
269 smanager->dma_wait(SPAN_PACK_STORE); | |
270 smanager->dma_store(send_spack, (uint32)spackList[prev_index], | |
271 sizeof(SpanPack), SPAN_PACK_STORE); | |
272 | |
273 smanager->dma_load(spack, (uint32)spackList[index], | |
274 sizeof(SpanPack), SPAN_PACK_LOAD); | |
275 prev_index = index; | |
276 smanager->dma_wait(SPAN_PACK_LOAD); | |
277 } | |
278 | |
279 /** | |
280 * 書き込む SpanPack が満杯だったら | |
281 * メインメモリで allocate した領域 (next) を持ってきて | |
282 * 現在の spack->next につなぎ、next を次の spack とする。 | |
283 */ | |
284 if (spack->info.size >= MAX_SIZE_SPAN) { | |
285 SpanPackPtr next; | |
286 | |
141 | 287 smanager->mainMem_alloc(0, sizeof(SpanPack)); |
288 smanager->mainMem_wait(); | |
289 next = (SpanPackPtr)smanager->mainMem_get(0); | |
109 | 290 |
291 spack->next = next; | |
292 | |
293 tmp_spack = spack; | |
294 spack = send_spack; | |
295 send_spack = tmp_spack; | |
296 | |
297 smanager->dma_wait(SPAN_PACK_STORE); | |
298 smanager->dma_store(send_spack, (uint32)spackList[index], | |
299 sizeof(SpanPack), SPAN_PACK_STORE); | |
300 | |
301 spackList[index] = next; | |
141 | 302 |
109 | 303 smanager->dma_load(spack, (uint32)spackList[index], |
304 sizeof(SpanPack), SPAN_PACK_LOAD); | |
305 smanager->dma_wait(SPAN_PACK_LOAD); | |
306 spack->init((index+1)*split_screen_h); | |
307 } | |
308 } else { | |
309 /** | |
310 * 担当範囲外だったら無視 | |
311 */ | |
312 continue; | |
313 } | |
146 | 314 |
315 tmp_xpos = calc(vMid10->x - vMin->x ,div_y, i, vMin->x); | |
316 tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x); | |
317 tmp_z = calc(vMid10->z - vMin->z ,div_y, i, vMin->z); | |
318 tmp_zpos = calc(vMid->z - vMin->z ,div_y, i, vMin->z); | |
319 | |
320 length = (tmp_xpos > tmp_end) | |
321 ? (int)tmp_xpos - (int)tmp_end : (int)tmp_end - (int)tmp_xpos; | |
322 if (length == 0) { | |
323 continue; | |
324 } | |
109 | 325 |
326 tmp_tex1 =((i/(div_y)) * vMid10->tex_x) + | |
327 ( ((div_y - i)/(div_y)) * vMin->tex_x); | |
328 tmp_tex2 =( (i/(div_y)) * vMid->tex_x) + | |
329 ( ((div_y - i)/(div_y)) * vMin->tex_x); | |
330 | |
331 tmp_tey1 =( (i/(div_y)) * vMid10->tex_y) + | |
332 ( ((div_y - i)/(div_y)) * vMin->tex_y); | |
333 tmp_tey2 =( (i/(div_y)) * vMid->tex_y) + | |
334 ( ((div_y - i)/(div_y)) * vMin->tex_y); | |
335 | |
336 if (tmp_xpos > tmp_end) { | |
337 x = (int)tmp_end; | |
172 | 338 length = (int)(tmp_xpos)-(int)(tmp_end)+1; |
109 | 339 start_z = tmp_zpos; |
340 end_z = tmp_z; | |
341 start_tex_x = tmp_tex2; | |
342 end_tex_x = tmp_tex1; | |
343 start_tex_y = tmp_tey2; | |
344 end_tex_y = tmp_tey1; | |
345 } else { | |
346 x = (int)tmp_xpos; | |
172 | 347 length = (int)(tmp_end)-(int)(tmp_xpos)+1; |
109 | 348 start_z = tmp_z; |
349 end_z = tmp_zpos; | |
350 start_tex_x = tmp_tex1; | |
351 end_tex_x = tmp_tex2; | |
352 start_tex_y = tmp_tey1; | |
353 end_tex_y = tmp_tey2; | |
354 } | |
355 | |
356 smanager->dma_wait(SPAN_PACK_LOAD); | |
357 | |
358 Span *span = &spack->span[spack->info.size++]; | |
359 | |
360 span->tex_addr = tex_addr; | |
361 span->tex_width = tex_width; | |
362 span->tex_height = tex_height; | |
363 span->x = x; | |
364 span->y = y; | |
365 span->length_x = length; | |
366 span->start_z = start_z; | |
367 span->end_z = end_z; | |
368 span->tex_x1 = start_tex_x; | |
369 span->tex_x2 = end_tex_x; | |
370 span->tex_y1 = start_tex_y; | |
371 span->tex_y2 = end_tex_y; | |
172 | 372 |
373 int scale = getScale(span->length_x, y_length, | |
374 span->tex_width, span->tex_height); | |
109 | 375 } |
376 } | |
377 | |
378 | |
379 int | |
380 CreateSpan::run(void *rbuf, void *wbuf) | |
381 { | |
382 PolygonPack *pp = (PolygonPack*)smanager->get_input(0); | |
383 PolygonPack *next_pp = | |
384 (PolygonPack*)smanager->allocate(sizeof(PolygonPack)); | |
385 PolygonPack *free_pp = next_pp; | |
386 PolygonPack *tmp_pp; | |
387 | |
388 TrianglePackPtr triPack; | |
389 VertexPackPtr vMin, vMid, vMax; | |
390 VertexPackPtr vMid10 | |
391 = (VertexPackPtr)smanager->allocate(sizeof(VertexPack)); | |
392 | |
393 SpanPackPtr *spackList = (SpanPackPtr*)smanager->get_input(1); | |
394 spack = (SpanPackPtr)smanager->get_input(2); | |
395 send_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack)); | |
396 prev_index = get_param(0); | |
397 | |
398 // spack と send_spack は swap しながら DMA を繰り返すので | |
399 // 自分で allocate した send_spack を覚えてないといけない | |
400 SpanPackPtr free_spack = send_spack; | |
401 | |
402 int charge_y_top = get_param(1); | |
403 int charge_y_end = get_param(2); | |
404 | |
405 do { | |
406 if (pp->next != NULL) { | |
407 smanager->dma_load(next_pp, (uint32)pp->next, | |
408 sizeof(PolygonPack), POLYGON_PACK_LOAD); | |
409 } else { | |
410 next_pp = NULL; | |
411 } | |
412 | |
413 for (int i = 0; i < pp->info.size; i++) { | |
414 triPack = &pp->tri[i]; | |
415 | |
416 #if 0 | |
417 make_vertex(triPack, &vMin, &vMid, &vMax); | |
418 #else | |
419 if (triPack->ver1.y <= triPack->ver2.y) { | |
420 if (triPack->ver2.y <= triPack->ver3.y) { | |
421 vMin = &triPack->ver1; | |
422 vMid = &triPack->ver2; | |
423 vMax = &triPack->ver3; | |
424 } else if (triPack->ver3.y <= triPack->ver1.y) { | |
425 vMin = &triPack->ver3; | |
426 vMid = &triPack->ver1; | |
427 vMax = &triPack->ver2; | |
428 } else { | |
429 vMin = &triPack->ver1; | |
430 vMid = &triPack->ver3; | |
431 vMax = &triPack->ver2; | |
432 } | |
433 } else { | |
434 if (triPack->ver1.y <= triPack->ver3.y) { | |
435 vMin = &triPack->ver2; | |
436 vMid = &triPack->ver1; | |
437 vMax = &triPack->ver3; | |
438 } else if (triPack->ver3.y <= triPack->ver2.y) { | |
439 vMin = &triPack->ver3; | |
440 vMid = &triPack->ver2; | |
441 vMax = &triPack->ver1; | |
442 } else { | |
443 vMin = &triPack->ver2; | |
444 vMid = &triPack->ver3; | |
445 vMax = &triPack->ver1; | |
446 } | |
447 } | |
448 #endif | |
449 make_vMid10(vMid10, vMin, vMid, vMax); | |
133
435e0d24db39
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
113
diff
changeset
|
450 |
435e0d24db39
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
113
diff
changeset
|
451 /** |
435e0d24db39
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
113
diff
changeset
|
452 * ポリゴンを、x軸に水平に分割して二つの三角形を作り、 |
435e0d24db39
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
113
diff
changeset
|
453 * それぞれから Span を求める |
172 | 454 * |
455 * vMax | |
456 * |\ | |
457 * | \ | |
458 * | \ | |
459 * | \ | |
460 * vMid10 ------ vMid | |
461 * | / | |
462 * | / | |
463 * | / | |
464 * |/ | |
465 * vMin | |
466 * | |
467 * (vMax, vMid, vMin) という triangle を | |
468 * (vMax, vMid, vMid10) (vMin, vMid, vMid10) という | |
469 * 二つの Triangle に分けている | |
133
435e0d24db39
DrawSpan のテクスチャ座標を求める部分で、width と height が逆に使われてた。
gongo@charles.cr.ie.u-ryukyu.ac.jp
parents:
113
diff
changeset
|
470 */ |
109 | 471 half_triangle(spackList, charge_y_top, charge_y_end, |
472 triPack->tex_addr, triPack->tex_width, | |
172 | 473 triPack->tex_height, vMin, vMid, vMid10, |
474 (int)(vMax->y - vMin->y)); | |
109 | 475 half_triangle(spackList, charge_y_top, charge_y_end, |
476 pp->tri[0].tex_addr, pp->tri[0].tex_width, | |
172 | 477 pp->tri[0].tex_height, vMax, vMid, vMid10, |
478 (int)(vMax->y - vMin->y)); | |
109 | 479 } |
480 | |
481 smanager->dma_wait(POLYGON_PACK_LOAD); | |
482 | |
483 tmp_pp = pp; | |
484 pp = next_pp; | |
485 next_pp = tmp_pp; | |
486 } while (pp); | |
487 | |
488 smanager->dma_wait(SPAN_PACK_STORE); | |
489 smanager->dma_store(spack, (uint32)spackList[prev_index], | |
490 sizeof(SpanPack), SPAN_PACK_STORE); | |
491 smanager->dma_wait(SPAN_PACK_STORE); | |
492 | |
493 free(free_pp); | |
494 free(free_spack); | |
495 free(vMid10); | |
496 | |
497 return 0; | |
498 } |