comparison TaskManager/Test/test_render/SpanC.cpp @ 321:f64d75473f95

merge 317
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 10 Jun 2009 15:23:25 +0900
parents 7efc5ede2c03
children
comparison
equal deleted inserted replaced
320:776c125af0b2 321:f64d75473f95
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