Mercurial > hg > Members > kono > Cerium
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 } |