86
|
1 #include <iostream>
|
109
|
2 #include "viewer.h"
|
86
|
3 #include "polygon_pack.h"
|
109
|
4 #include "SpuSpan.h"
|
86
|
5 using namespace std;
|
|
6
|
|
7 static float calc(float f1, float f2,int i, float base){
|
92
|
8 float ans;
|
|
9 ans = f1/f2*i + base;
|
|
10 return ans;
|
86
|
11 }
|
|
12
|
|
13
|
109
|
14 static VertexPack*
|
|
15 vMid1(VertexPack *vMid1, VertexPack *vMin, VertexPack *vMid, VertexPack *vMax)
|
|
16 {
|
|
17 int d, d1;
|
|
18
|
321
|
19 // float2int のマクロとか書く?
|
109
|
20 #if 0
|
|
21 d = (int)vMax->y - (int)vMin->y;
|
92
|
22 d1 = (int)vMid->y - (int)vMin->y;
|
109
|
23 #else
|
|
24 d = (int)(vMax->y - vMin->y);
|
|
25 d1 = (int)(vMid->y - vMin->y);
|
|
26 #endif
|
|
27
|
|
28 vMid1->tex_x = calc(vMax->tex_x - vMin->tex_x, d, d1, vMin->tex_x);
|
|
29 vMid1->tex_y = calc(vMax->tex_y - vMin->tex_y, d, d1, vMin->tex_y);
|
|
30 vMid1->x = calc(vMax->x - vMin->x, d, d1, vMin->x);
|
92
|
31 vMid1->y = vMid->y;
|
109
|
32 vMid1->z = calc(vMax->z - vMin->z, d, d1, vMin->z);
|
|
33
|
92
|
34 return vMid1;
|
86
|
35 }
|
|
36
|
109
|
37 void
|
|
38 half_triangle(SpuSpan *ssl,
|
|
39 long *tex_addr, long tex_width, long tex_height,
|
|
40 VertexPack *vMin, VertexPack *vMid, VertexPack *vMid1)
|
|
41 {
|
92
|
42 float tmp_z,tmp_tex1, tmp_tex2 ,tmp_tey1,tmp_tey2;
|
|
43 float tmp_xpos,tmp_end,tmp_zpos;
|
|
44 int i;
|
|
45 //int j;
|
|
46 float div_y;
|
|
47 float start_z,end_z;
|
|
48 float start_tex_x,end_tex_x,start_tex_y,end_tex_y;
|
|
49 int x,y,length;
|
|
50 int k =0;
|
|
51 int l = 1;
|
|
52 int start_y = (int)vMid->y;
|
|
53 int end_y = (int)vMin->y;
|
109
|
54 int real_x, real_y;
|
|
55
|
92
|
56 if (start_y<end_y) {
|
|
57 int i; i=end_y; end_y=start_y; start_y = i;
|
|
58 k = 1;
|
|
59 l = -1;
|
|
60 }
|
86
|
61
|
92
|
62 div_y = start_y - end_y; // > 0
|
86
|
63
|
92
|
64 for(i = k; i < div_y+1; i++) {
|
|
65 tmp_xpos = calc(vMid1->x - vMin->x ,div_y, i, vMin->x);
|
|
66 tmp_end = calc(vMid->x - vMin->x ,div_y, i, vMin->x);
|
|
67 tmp_z = calc(vMid1->z - vMin->z ,div_y, i, vMin->z);
|
|
68 tmp_zpos = calc(vMid->z - vMin->z ,div_y, i, vMin->z);
|
86
|
69
|
109
|
70 tmp_tex1 =((i/(div_y)) * vMid1->tex_x) +
|
|
71 ( ((div_y - i)/(div_y)) * vMin->tex_x);
|
|
72 tmp_tex2 =( (i/(div_y)) * vMid->tex_x) +
|
|
73 ( ((div_y - i)/(div_y)) * vMin->tex_x);
|
92
|
74
|
109
|
75 tmp_tey1 =( (i/(div_y)) * vMid1->tex_y) +
|
|
76 ( ((div_y - i)/(div_y)) * vMin->tex_y);
|
|
77 tmp_tey2 =( (i/(div_y)) * vMid->tex_y) +
|
|
78 ( ((div_y - i)/(div_y)) * vMin->tex_y);
|
|
79
|
92
|
80 if (tmp_xpos > tmp_end) {
|
|
81 x = (int)tmp_end;
|
|
82 y = (int)vMin->y + i*l;
|
|
83 length = (int)(tmp_xpos)-(int)(tmp_end)+1;
|
|
84 start_z = tmp_zpos;
|
|
85 end_z = tmp_z;
|
|
86 start_tex_x = tmp_tex2;
|
|
87 end_tex_x = tmp_tex1;
|
|
88 start_tex_y = tmp_tey2;
|
|
89 end_tex_y = tmp_tey1;
|
|
90 } else {
|
|
91 x = (int)tmp_xpos;
|
|
92 y = (int)vMin->y + i*l;
|
|
93 length = (int)(tmp_end)-(int)(tmp_xpos)+1;
|
|
94 start_z = tmp_z;
|
|
95 end_z = tmp_zpos;
|
|
96 start_tex_x = tmp_tex1;
|
|
97 end_tex_x = tmp_tex2;
|
|
98 start_tex_y = tmp_tey1;
|
|
99 end_tex_y = tmp_tey2;
|
|
100 }
|
99
|
101
|
321
|
102 // 画面外のものはここで
|
|
103 // この判定で当たってるのかな?
|
109
|
104 #if 0
|
|
105 real_x = x + Viewer::width/2;
|
|
106 real_y = y + Viewer::height/2;
|
92
|
107
|
109
|
108 if (real_x < 0 || real_x > Viewer::width ||
|
|
109 real_y < 0 || real_y > Viewer::height) {
|
|
110 continue;
|
|
111 }
|
86
|
112
|
109
|
113 int line_set = (y + (Viewer::height/2))/TEXTURE_SPLIT_PIXEL;
|
|
114 #else
|
|
115 if (x < 0 || x > Viewer::width ||
|
|
116 y < 0 || y > Viewer::height) {
|
|
117 continue;
|
|
118 }
|
99
|
119
|
109
|
120 int line_set = y / TEXTURE_SPLIT_PIXEL;
|
|
121 #endif
|
|
122
|
|
123 int spu_no = line_set % SPE_NUM_MAX;
|
|
124 int spp_no = line_set / SPE_NUM_MAX;
|
|
125
|
|
126 SpanPack *spack = &ssl->list[spu_no].packs[spp_no];
|
|
127
|
|
128 while (spack->next) spack = spack->next;
|
86
|
129
|
109
|
130 if (spack->info.size >= MAX_SIZE_SPAN) {
|
|
131 SpanPack *pack_new = new SpanPack();
|
|
132 //SpanPack *pack_new;
|
|
133 //posix_memalign((void**)&pack_new, 16, sizeof(SpanPack));
|
|
134 pack_new->init();
|
|
135 spack->next = pack_new;
|
|
136 spack = pack_new;
|
|
137 }
|
|
138
|
|
139 int span_no = spack->info.size++;
|
|
140 Span *span = &spack->span[span_no];
|
86
|
141
|
92
|
142 span->tex_addr = tex_addr;
|
|
143 span->tex_width = tex_width;
|
|
144 span->tex_height = tex_height;
|
|
145 span->x = x;
|
|
146 span->y = y;
|
|
147 span->length_x = length;
|
|
148 span->start_z = start_z;
|
|
149 span->end_z = end_z;
|
|
150 span->tex_x1 = start_tex_x;
|
|
151 span->tex_x2 = end_tex_x;
|
|
152 span->tex_y1 = start_tex_y;
|
|
153 span->tex_y2 = end_tex_y;
|
|
154 }
|
86
|
155 }
|
|
156
|
109
|
157 void
|
|
158 fill(SpuSpan *ssl)
|
|
159 {
|
|
160 for (int y = 0; y < Viewer::height; y = y + TEXTURE_SPLIT_PIXEL) {
|
|
161 int line_set = y / TEXTURE_SPLIT_PIXEL;
|
|
162 int spu_no = line_set % SPE_NUM_MAX;
|
|
163 int spp_no = line_set / SPE_NUM_MAX;
|
|
164
|
|
165 SpanPack *spack = &ssl->list[spu_no].packs[spp_no];
|
|
166
|
321
|
167 // 既に Span がある場合はスルー
|
109
|
168 if (spack->info.size > 0) continue;
|
|
169
|
321
|
170 // 塗りつぶし用 Span は info.size = -1
|
109
|
171 //
|
321
|
172 // ってことにしたけど、わかりづらいか・・・・
|
109
|
173 spack->info.size = -1;
|
|
174 Span *span = &spack->span[0];
|
|
175 span->y = y;
|
|
176 }
|
|
177 }
|
86
|
178
|
89
|
179 int create_span(void *rbuf,void *wbuf) {
|
92
|
180 PolygonPack *polygon = (PolygonPack*)rbuf;
|
109
|
181 SpuSpan *ssl = polygon->ssl;
|
92
|
182 VertexPack *vMin, *vMid, *vMax, *vMid10;
|
|
183 VertexPack ver;
|
|
184 vMid10 = &ver;
|
109
|
185 TrianglePack *triPack;
|
86
|
186
|
109
|
187 ssl->init();
|
92
|
188
|
|
189 for(int a = 0; a < polygon->info.size; a++) {
|
109
|
190 triPack = &polygon->tri[a];
|
|
191
|
|
192 if (triPack->ver1.y <= triPack->ver2.y) {
|
|
193 if (triPack->ver2.y <= triPack->ver3.y) {
|
|
194 vMin = &triPack->ver1;
|
|
195 vMid = &triPack->ver2;
|
|
196 vMax = &triPack->ver3;
|
|
197 } else if (triPack->ver3.y <= triPack->ver1.y) {
|
|
198 vMin = &triPack->ver3;
|
|
199 vMid = &triPack->ver1;
|
|
200 vMax = &triPack->ver2;
|
92
|
201 } else {
|
109
|
202 vMin = &triPack->ver1;
|
|
203 vMid = &triPack->ver3;
|
|
204 vMax = &triPack->ver2;
|
92
|
205 }
|
|
206 } else {
|
109
|
207 if (triPack->ver1.y <= triPack->ver3.y) {
|
|
208 vMin = &triPack->ver2;
|
|
209 vMid = &triPack->ver1;
|
|
210 vMax = &triPack->ver3;
|
|
211 } else if (triPack->ver3.y <= triPack->ver2.y) {
|
|
212 vMin = &triPack->ver3;
|
|
213 vMid = &triPack->ver2;
|
|
214 vMax = &triPack->ver1;
|
92
|
215 } else {
|
109
|
216 vMin = &triPack->ver2;
|
|
217 vMid = &triPack->ver3;
|
|
218 vMax = &triPack->ver1;
|
92
|
219 }
|
|
220 }
|
|
221
|
|
222 vMid1(vMid10,vMin,vMid,vMax);
|
109
|
223
|
|
224 half_triangle(ssl, triPack->tex_addr, triPack->tex_width,
|
|
225 triPack->tex_height, vMin, vMid, vMid10);
|
92
|
226
|
109
|
227 half_triangle(ssl, polygon->tri[0].tex_addr, polygon->tri[0].tex_width,
|
|
228 polygon->tri[0].tex_height, vMax, vMid, vMid10);
|
86
|
229 }
|
109
|
230
|
|
231 fill(ssl);
|
|
232
|
92
|
233 return 0;
|
86
|
234 }
|