Mercurial > hg > Members > kono > Cerium
comparison TaskManager/Test/test_render/SpanC.cpp @ 354:81b25e5d5379
add example/get_segment and change spe/DrawSpan.cpp
author | koba |
---|---|
date | Wed, 15 Jul 2009 17:39:51 +0900 |
parents | 5c194c71eca8 |
children | 7efc5ede2c03 |
comparison
equal
deleted
inserted
replaced
284:6ceb40aec7fb | 354:81b25e5d5379 |
---|---|
3 #include "triangle.h" | 3 #include "triangle.h" |
4 #include "polygon.h" | 4 #include "polygon.h" |
5 using namespace std; | 5 using namespace std; |
6 | 6 |
7 | 7 |
8 // f1:x$B$NA}2CNL(B f2:y$B$NA}2CNL(B i:....... base:$B4pK\$H$J$kD:E@$N(By$B:BI8(B | 8 // f1:xの増加量 f2:yの増加量 i:....... base:基本となる頂点のy座標 |
9 static float calc(float f1, float f2,int i, float base){ | 9 static float calc(float f1, float f2,int i, float base){ |
10 float ans; | 10 float ans; |
11 ans = f1/f2*i + base; | 11 ans = f1/f2*i + base; |
12 return ans; | 12 return ans; |
13 } | 13 } |
76 //cout << vMin->x << vMin->y << vMin->z << endl; | 76 //cout << vMin->x << vMin->y << vMin->z << endl; |
77 int start_y = (int)vMid->y; | 77 int start_y = (int)vMid->y; |
78 int end_y = (int)vMin->y; | 78 int end_y = (int)vMin->y; |
79 | 79 |
80 if (start_y<end_y) { | 80 if (start_y<end_y) { |
81 int i; i=end_y; end_y=start_y; start_y = i; //y$B$NF~$lBX$((B | 81 int i; i=end_y; end_y=start_y; start_y = i; //yの入れ替え |
82 //Vertex *v; v = vMin; vMin = vMid; vMid = v; | 82 //Vertex *v; v = vMin; vMin = vMid; vMid = v; |
83 /* | 83 /* |
84 incli_x1 = vMin->x - vMid->x; incli_x2 = vMin->x - vMid1->x; | 84 incli_x1 = vMin->x - vMid->x; incli_x2 = vMin->x - vMid1->x; |
85 incli_z1 = vMin->z - vMid->z; incli_z2 = vMin->z - vMid1->z; | 85 incli_z1 = vMin->z - vMid->z; incli_z2 = vMin->z - vMid1->z; |
86 base_z1 = vMid->z; base_z2 = vMid1->z; | 86 base_z1 = vMid->z; base_z2 = vMid1->z; |
94 | 94 |
95 div_y = start_y - end_y; // > 0 | 95 div_y = start_y - end_y; // > 0 |
96 | 96 |
97 //if(div_y < 1 && div_y > -1) div_y = 1; | 97 //if(div_y < 1 && div_y > -1) div_y = 1; |
98 for(i = k; i < div_y+1; i++) { | 98 for(i = k; i < div_y+1; i++) { |
99 //$B$3$3$G(Bspan$B$N:8C<$H1&C<$N(Bx,z$B$r5a$a$F$k(B | 99 //ここでspanの左端と右端のx,zを求めてる |
100 tmp_xpos = calc(vMid1->x - vMin->x ,div_y, i, vMin->x); | 100 tmp_xpos = calc(vMid1->x - vMin->x ,div_y, i, vMin->x); |
101 tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x); | 101 tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x); |
102 tmp_z = calc(vMid1->z - vMin->z ,div_y, i, vMin->z); | 102 tmp_z = calc(vMid1->z - vMin->z ,div_y, i, vMin->z); |
103 tmp_zpos = calc(vMid->z - vMin->z ,div_y, i, vMin->z); | 103 tmp_zpos = calc(vMid->z - vMin->z ,div_y, i, vMin->z); |
104 //printf("x:%f end:%f z:%f zpos:%f\n",tmp_xpos,tmp_end,tmp_z,tmp_zpos); | 104 //printf("x:%f end:%f z:%f zpos:%f\n",tmp_xpos,tmp_end,tmp_z,tmp_zpos); |
105 //$B$3$3$+$i(Bspan$B$N:8C<$H1&C<$KBP1~$9$k%F%/%9%A%c$r7W;;$9$k(B | 105 //ここからspanの左端と右端に対応するテクスチャを計算する |
106 tmp_tex1 =((i/(div_y)) * vMid1->tex_x) + \ | 106 tmp_tex1 =((i/(div_y)) * vMid1->tex_x) + \ |
107 ( ((div_y - i)/(div_y)) * vMin->tex_x); | 107 ( ((div_y - i)/(div_y)) * vMin->tex_x); |
108 tmp_tex2 =( (i/(div_y)) * vMid->tex_x) + \ | 108 tmp_tex2 =( (i/(div_y)) * vMid->tex_x) + \ |
109 ( ((div_y - i)/(div_y)) * vMin->tex_x); | 109 ( ((div_y - i)/(div_y)) * vMin->tex_x); |
110 | 110 |
111 tmp_tey1 =( (i/(div_y)) * vMid1->tex_y) + \ | 111 tmp_tey1 =( (i/(div_y)) * vMid1->tex_y) + \ |
112 ( ((div_y - i)/(div_y)) * vMin->tex_y); | 112 ( ((div_y - i)/(div_y)) * vMin->tex_y); |
113 tmp_tey2 =( (i/(div_y)) * vMid->tex_y) + \ | 113 tmp_tey2 =( (i/(div_y)) * vMid->tex_y) + \ |
114 ( ((div_y - i)/(div_y)) * vMin->tex_y); | 114 ( ((div_y - i)/(div_y)) * vMin->tex_y); |
115 | 115 |
116 //$B$3$3$G:8C<$,(Bxpos$B$+(Bend$B$rH=CG$7!"IA2h$9$k(Bspan$B$r:n$k(B | 116 //ここで左端がxposかendを判断し、描画するspanを作る |
117 if(tmp_xpos > tmp_end) { | 117 if(tmp_xpos > tmp_end) { |
118 x = (int)tmp_end; | 118 x = (int)tmp_end; |
119 y = (int)vMin->y + i*l; | 119 y = (int)vMin->y + i*l; |
120 end = (int)(tmp_xpos)-(int)(tmp_end)+1; | 120 end = (int)(tmp_xpos)-(int)(tmp_end)+1; |
121 z = tmp_zpos; | 121 z = tmp_zpos; |
234 if(div_x < 1 && div_x > -1) div_x = 1; | 234 if(div_x < 1 && div_x > -1) div_x = 1; |
235 div_y = (int)vMax->y - (int)vMin->y; | 235 div_y = (int)vMax->y - (int)vMin->y; |
236 if(div_y < 1 && div_y > -1) div_y = 1; | 236 if(div_y < 1 && div_y > -1) div_y = 1; |
237 | 237 |
238 for(i = 0; i < div_x+1; i++) { | 238 for(i = 0; i < div_x+1; i++) { |
239 //$B$3$3$G(Bspan$B$N:8C<$H1&C<$N(Bx,z$B$r5a$a$F$k(B | 239 //ここでspanの左端と右端のx,zを求めてる |
240 tmp_xpos = calc(vMax->x - vMin->x,div_y, i, vMin->x); | 240 tmp_xpos = calc(vMax->x - vMin->x,div_y, i, vMin->x); |
241 tmp_end = calc(vMid->x - vMin->x,div_x, i, vMin->x); | 241 tmp_end = calc(vMid->x - vMin->x,div_x, i, vMin->x); |
242 tmp_z = calc(vMax->z - vMin->z,div_y, i, vMin->z); | 242 tmp_z = calc(vMax->z - vMin->z,div_y, i, vMin->z); |
243 tmp_zpos = calc(vMid->z - vMin->z,div_x, i, vMin->z); | 243 tmp_zpos = calc(vMid->z - vMin->z,div_x, i, vMin->z); |
244 | 244 |
245 //$B$3$3$+$i(Bspan$B$N:8C<$H1&C<$KBP1~$9$k%F%/%9%A%c$r7W;;$9$k(B | 245 //ここからspanの左端と右端に対応するテクスチャを計算する |
246 tmp_tex1 =( (i/(div_y)) * vMax->tex_x) + \ | 246 tmp_tex1 =( (i/(div_y)) * vMax->tex_x) + \ |
247 ( ((div_y - i)/(div_y)) * vMin->tex_x); | 247 ( ((div_y - i)/(div_y)) * vMin->tex_x); |
248 tmp_tex2 =( (i/(div_x)) * vMid->tex_x) + \ | 248 tmp_tex2 =( (i/(div_x)) * vMid->tex_x) + \ |
249 ( ((div_x - i)/(div_x)) * vMin->tex_x); | 249 ( ((div_x - i)/(div_x)) * vMin->tex_x); |
250 | 250 |
251 tmp_tey1 =( (i/(div_y)) * vMax->tex_y) + \ | 251 tmp_tey1 =( (i/(div_y)) * vMax->tex_y) + \ |
252 ( ((div_y - i)/(div_y)) * vMin->tex_y); | 252 ( ((div_y - i)/(div_y)) * vMin->tex_y); |
253 tmp_tey2 =( (i/(div_x)) * vMid->tex_y) + \ | 253 tmp_tey2 =( (i/(div_x)) * vMid->tex_y) + \ |
254 ( ((div_x - i)/(div_x)) * vMin->tex_y); | 254 ( ((div_x - i)/(div_x)) * vMin->tex_y); |
255 | 255 |
256 //$B$3$3$G:8C<$,(Bxpos$B$+(Bend$B$rH=CG$7!"IA2h$9$k(Bspan$B$r:n$k(B | 256 //ここで左端がxposかendを判断し、描画するspanを作る |
257 if(tmp_xpos > tmp_end) { | 257 if(tmp_xpos > tmp_end) { |
258 x = (int)tmp_end; | 258 x = (int)tmp_end; |
259 y = (int)vMin->y + i; | 259 y = (int)vMin->y + i; |
260 end = (int)(tmp_xpos)-(int)(tmp_end)+1; | 260 end = (int)(tmp_xpos)-(int)(tmp_end)+1; |
261 z = tmp_z; | 261 z = tmp_z; |
313 if(div_x < 1 && div_x > -1) div_x = 1; | 313 if(div_x < 1 && div_x > -1) div_x = 1; |
314 div_y = (int)vMax->y - (int)vMin->y; | 314 div_y = (int)vMax->y - (int)vMin->y; |
315 if(div_y < 1 && div_y > -1) div_y = 1; | 315 if(div_y < 1 && div_y > -1) div_y = 1; |
316 | 316 |
317 for(i = 0; i < div_x; i++) { | 317 for(i = 0; i < div_x; i++) { |
318 //$B$3$3$G(Bspan$B$N:8C<$H1&C<$N(Bx,z$B$r5a$a$F$k(B | 318 //ここでspanの左端と右端のx,zを求めてる |
319 tmp_xpos = calc(vMax->x-vMin->x, div_y, (i+1+top_triangle), vMin->x); | 319 tmp_xpos = calc(vMax->x-vMin->x, div_y, (i+1+top_triangle), vMin->x); |
320 tmp_end = calc(vMax->x-vMid->x, div_x, (i+1), vMid->x); | 320 tmp_end = calc(vMax->x-vMid->x, div_x, (i+1), vMid->x); |
321 tmp_z = calc(vMax->z-vMin->z, div_y, (i+1+top_triangle), vMin->z); | 321 tmp_z = calc(vMax->z-vMin->z, div_y, (i+1+top_triangle), vMin->z); |
322 tmp_zpos = calc(vMax->z-vMid->z, div_x, (i+1), vMid->z); | 322 tmp_zpos = calc(vMax->z-vMid->z, div_x, (i+1), vMid->z); |
323 | 323 |
387 } | 387 } |
388 } | 388 } |
389 #endif | 389 #endif |
390 } | 390 } |
391 | 391 |
392 // i:$BJ,;R!"(Bf1:$BD9$5(B f2:$BBP1~$9$kD:E@(B1 f3:$BBP1~$9$kD:E@(B2 | 392 // i:分子、f1:長さ f2:対応する頂点1 f3:対応する頂点2 |
393 /* | 393 /* |
394 float Span::calc2(int i, float f1, float f2, float f3) { | 394 float Span::calc2(int i, float f1, float f2, float f3) { |
395 float ans; | 395 float ans; |
396 ans = i/f1 * f2 + (f1-i)/f1 * f3; | 396 ans = i/f1 * f2 + (f1-i)/f1 * f3; |
397 | 397 |