comparison old/simple_render/task/create_span.cpp @ 507:735f76483bb2

Reorganization..
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 12 Oct 2009 09:39:35 +0900
parents TaskManager/Test/simple_render/task/create_span.cpp@f64d75473f95
children
comparison
equal deleted inserted replaced
506:1d4a8a86f26b 507:735f76483bb2
1 #include <iostream>
2 #include "viewer.h"
3 #include "polygon_pack.h"
4 #include "SpuSpan.h"
5 using namespace std;
6
7 static float calc(float f1, float f2,int i, float base){
8 float ans;
9 ans = f1/f2*i + base;
10 return ans;
11 }
12
13
14 static VertexPack*
15 vMid1(VertexPack *vMid1, VertexPack *vMin, VertexPack *vMid, VertexPack *vMax)
16 {
17 int d, d1;
18
19 // float2int のマクロとか書く?
20 #if 0
21 d = (int)vMax->y - (int)vMin->y;
22 d1 = (int)vMid->y - (int)vMin->y;
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);
31 vMid1->y = vMid->y;
32 vMid1->z = calc(vMax->z - vMin->z, d, d1, vMin->z);
33
34 return vMid1;
35 }
36
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 {
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;
54 int real_x, real_y;
55
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 }
61
62 div_y = start_y - end_y; // > 0
63
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);
69
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);
74
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
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 }
101
102 // 画面外のものはここで
103 // この判定で当たってるのかな?
104 #if 0
105 real_x = x + Viewer::width/2;
106 real_y = y + Viewer::height/2;
107
108 if (real_x < 0 || real_x > Viewer::width ||
109 real_y < 0 || real_y > Viewer::height) {
110 continue;
111 }
112
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 }
119
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;
129
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];
141
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 }
155 }
156
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
167 // 既に Span がある場合はスルー
168 if (spack->info.size > 0) continue;
169
170 // 塗りつぶし用 Span は info.size = -1
171 //
172 // ってことにしたけど、わかりづらいか・・・・
173 spack->info.size = -1;
174 Span *span = &spack->span[0];
175 span->y = y;
176 }
177 }
178
179 int create_span(void *rbuf,void *wbuf) {
180 PolygonPack *polygon = (PolygonPack*)rbuf;
181 SpuSpan *ssl = polygon->ssl;
182 VertexPack *vMin, *vMid, *vMax, *vMid10;
183 VertexPack ver;
184 vMid10 = &ver;
185 TrianglePack *triPack;
186
187 ssl->init();
188
189 for(int a = 0; a < polygon->info.size; a++) {
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;
201 } else {
202 vMin = &triPack->ver1;
203 vMid = &triPack->ver3;
204 vMax = &triPack->ver2;
205 }
206 } else {
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;
215 } else {
216 vMin = &triPack->ver2;
217 vMid = &triPack->ver3;
218 vMax = &triPack->ver1;
219 }
220 }
221
222 vMid1(vMid10,vMin,vMid,vMax);
223
224 half_triangle(ssl, triPack->tex_addr, triPack->tex_width,
225 triPack->tex_height, vMin, vMid, vMid10);
226
227 half_triangle(ssl, polygon->tri[0].tex_addr, polygon->tri[0].tex_width,
228 polygon->tri[0].tex_height, vMax, vMid, vMid10);
229 }
230
231 fill(ssl);
232
233 return 0;
234 }