11
|
1 #include <iostream>
|
|
2 #include "polygonpack.h"
|
|
3 using namespace std;
|
|
4
|
|
5 static float calc(float f1, float f2,int i, float base){
|
|
6 float ans;
|
|
7 ans = f1/f2*i + base;
|
|
8 return ans;
|
|
9 }
|
|
10
|
|
11
|
|
12 static vertex *vMid1(Vertex *vMid1,Vertex *vMin, Vertex *vMid, Vertex *vMax) {
|
|
13 float d,d1;
|
|
14 d = (int)vMax->y-(int)vMin->y;
|
|
15 d1 = (int)vMid->y - (int)vMin->y;
|
|
16 vMid1->tex_x = calc(vMax->tex_x - vMin->tex_x, d, (int)d1 , vMin->tex_x);
|
|
17 vMid1->tex_y = calc(vMax->tex_y - vMin->tex_y, d, (int)d1 , vMin->tex_y);
|
|
18 vMid1->x = calc(vMax->x - vMin->x, d, (int)d1 , vMin->x);
|
|
19 vMid1->y = vMid->y;
|
|
20 vMid1->z = calc(vMax->z - vMin->z, d, (int)d1 , vMin->z);
|
|
21 printf("x:%f y:%f z:%f tex_x:%f tex_y:%f\n",vMid1->x,vMid1->y,vMid1->z,vMid1->tex_x, vMid1->tex_y);
|
|
22 return vMid1;
|
|
23
|
|
24 }
|
|
25
|
|
26
|
|
27 int Polygon_Pack::create_span(void *wbuf,void *rbuf) {
|
|
28 POLYGONPACK *polygon = (POLYGONPACK*)wbuf;
|
|
29 SPANPACK *span = (SPANPACK*)rbuf;
|
|
30 Vertex *vMin, *vMid, *vMax, *vMid10;
|
|
31 Vertex ver;
|
|
32 vMid10 = &ver;
|
|
33 if(polygon->tri[0].ver1.y <= polygon->tri[0].ver2.y) {
|
|
34 if(polygon->tri[0].ver2.y <= polygon->tri[0].ver3.y) {
|
|
35 vMin = &polygon->tri[0].ver1;
|
|
36 vMid = &polygon->tri[0].ver2;
|
|
37 vMax = &polygon->tri[0].ver3;
|
|
38 } else if(polygon->tri[0].ver3.y <= polygon->tri[0].ver1.y) {
|
|
39 vMin = &polygon->tri[0].ver3;
|
|
40 vMid = &polygon->tri[0].ver1;
|
|
41 vMax = &polygon->tri[0].ver2;
|
|
42 } else {
|
|
43 vMin = &polygon->tri[0].ver1;
|
|
44 vMid = &polygon->tri[0].ver3;
|
|
45 vMax = &polygon->tri[0].ver2;
|
|
46 }
|
|
47 } else {
|
|
48 if(polygon->tri[0].ver1.y <= polygon->tri[0].ver3.y) {
|
|
49 vMin = &polygon->tri[0].ver2;
|
|
50 vMid = &polygon->tri[0].ver1;
|
|
51 vMax = &polygon->tri[0].ver3;
|
|
52 } else if(polygon->tri[0].ver3.y <= polygon->tri[0].ver2.y) {
|
|
53 vMin = &polygon->tri[0].ver3;
|
|
54 vMid = &polygon->tri[0].ver2;
|
|
55 vMax = &polygon->tri[0].ver1;
|
|
56 } else {
|
|
57 vMin = &polygon->tri[0].ver2;
|
|
58 vMid = &polygon->tri[0].ver3;
|
|
59 vMax = &polygon->tri[0].ver1;
|
|
60 }
|
|
61 }
|
|
62
|
|
63 cout << vMid->y << endl;
|
|
64
|
|
65 vMid1(vMid10,vMin,vMid,vMax);
|
|
66
|
|
67 half_triangle(polygon->tri[0].tex_addr,polygon->tri[0].tex_width,polygon->tri[0].tex_height,vMin,vMid,vMid10);
|
|
68 half_triangle(polygon->tri[0].tex_addr,polygon->tri[0].tex_width,polygon->tri[0].tex_height,vMax,vMid,vMid10);
|
|
69 return 0;
|
|
70 }
|
|
71
|
|
72
|
|
73 void Polygon_Pack::half_triangle(long *tex_addr,long tex_width,long tex_height,Vertex *vMin, Vertex *vMid, Vertex *vMid1) {
|
|
74 float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2;
|
|
75 float tmp_xpos,tmp_end,tmp_zpos;
|
|
76 int i,j;
|
|
77 float div_y;
|
|
78 float start_z,end_z;
|
|
79 float start_tex_x,end_tex_x,start_tex_y,end_tex_y;
|
|
80 int x,y,length;
|
|
81 int k =0;
|
|
82 int l = 1;
|
|
83 int start_y = (int)vMid->y;
|
|
84 int end_y = (int)vMin->y;
|
|
85
|
|
86 if (start_y<end_y) {
|
321
|
87 int i; i=end_y; end_y=start_y; start_y = i; //yの入れ替え
|
11
|
88 k = 1;
|
|
89 l = -1;
|
|
90 }
|
|
91
|
|
92 div_y = start_y - end_y; // > 0
|
|
93
|
|
94 for(i = k; i < div_y+1; i++) {
|
321
|
95 //ここでspanの左端と右端のx,zを求めてる
|
11
|
96 tmp_xpos = calc(vMid1->x - vMin->x ,div_y, i, vMin->x);
|
|
97 tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x);
|
|
98 tmp_z = calc(vMid1->z - vMin->z ,div_y, i, vMin->z);
|
|
99 tmp_zpos = calc(vMid->z - vMin->z ,div_y, i, vMin->z);
|
|
100 //printf("x:%f end:%f z:%f zpos:%f\n",tmp_xpos,tmp_end,tmp_z,tmp_zpos);
|
321
|
101 //ここからspanの左端と右端に対応するテクスチャを計算する
|
11
|
102 tmp_tex1 =((i/(div_y)) * vMid1->tex_x) + \
|
|
103 ( ((div_y - i)/(div_y)) * vMin->tex_x);
|
|
104 tmp_tex2 =( (i/(div_y)) * vMid->tex_x) + \
|
|
105 ( ((div_y - i)/(div_y)) * vMin->tex_x);
|
|
106
|
|
107 tmp_tey1 =( (i/(div_y)) * vMid1->tex_y) + \
|
|
108 ( ((div_y - i)/(div_y)) * vMin->tex_y);
|
|
109 tmp_tey2 =( (i/(div_y)) * vMid->tex_y) + \
|
|
110 ( ((div_y - i)/(div_y)) * vMin->tex_y);
|
|
111 if(tmp_xpos > tmp_end) {
|
|
112 x = (int)tmp_end;
|
|
113 y = (int)vMin->y + i*l;
|
|
114 length = (int)(tmp_xpos)-(int)(tmp_end)+1;
|
|
115 start_z = tmp_zpos;
|
|
116 end_z = tmp_z;
|
|
117 start_tex_x = tmp_tex2;
|
|
118 end_tex_x = tmp_tex1;
|
|
119 start_tex_y = tmp_tey2;
|
|
120 end_tex_y = tmp_tey1;
|
|
121 } else {
|
|
122 x = (int)tmp_xpos;
|
|
123 y = (int)vMin->y + i*l;
|
|
124 length = (int)(tmp_end)-(int)(tmp_xpos)+1;
|
|
125 start_z = tmp_z;
|
|
126 end_z = tmp_zpos;
|
|
127 start_tex_x = tmp_tex1;
|
|
128 end_tex_x = tmp_tex2;
|
|
129 start_tex_y = tmp_tey1;
|
|
130 end_tex_y = tmp_tey2;
|
|
131 }
|
|
132 printf("x:%d y:%d end:%d z:%f zpos:%f\n",x,y,length,start_z , end_z);
|
|
133 printf("start_tex_x:%f end_tex_x:%f start_tex_y:%f end_tex_y:%f\n",start_tex_x,end_tex_x,start_tex_y,end_tex_y);
|
|
134
|
|
135 //add(tex_addr,tex_width,tex_height,x,y,length,start_z,end_z,start_tex_x,end_tex_x,start_tex_y,end_tex_y);
|
|
136 }
|
|
137 }
|
|
138
|
|
139
|