Rev 5213 | Rev 5278 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5153 | IgorA | 1 | ; fill triangle profile |
2 | ; #define PROFILE |
||
3 | |||
4 | CLIP_XMIN equ (1<<0) |
||
5 | CLIP_XMAX equ (1<<1) |
||
6 | CLIP_YMIN equ (1<<2) |
||
7 | CLIP_YMAX equ (1<<3) |
||
8 | CLIP_ZMIN equ (1<<4) |
||
9 | CLIP_ZMAX equ (1<<5) |
||
10 | |||
11 | offs_X equ 0 |
||
12 | offs_Y equ 4 |
||
13 | offs_Z equ 8 |
||
14 | offs_W equ 12 |
||
15 | |||
16 | align 4 |
||
17 | proc gl_transform_to_viewport uses eax ebx ecx, context:dword,v:dword |
||
18 | locals |
||
19 | point dd ? |
||
20 | endl |
||
21 | mov eax,[context] |
||
22 | mov ebx,[v] |
||
23 | |||
24 | ; coordinates |
||
25 | fld1 |
||
26 | fdiv dword[ebx+offs_vert_pc+offs_W] ;st0 = 1/v.pc.W |
||
27 | |||
28 | fld dword[ebx+offs_vert_pc+offs_X] ;st0 = v.pc.X |
||
29 | fmul st0,st1 |
||
30 | fmul dword[eax+offs_cont_viewport+offs_vpor_scale+offs_X] |
||
31 | fadd dword[eax+offs_cont_viewport+offs_vpor_trans+offs_X] |
||
32 | fistp dword[ebx+offs_vert_zp] ;v.zp.x = st0, st0 = st1 |
||
33 | |||
34 | fld dword[ebx+offs_vert_pc+offs_Y] ;st0 = v.pc.Y |
||
35 | fmul st0,st1 |
||
36 | fmul dword[eax+offs_cont_viewport+offs_vpor_scale+offs_Y] |
||
37 | fadd dword[eax+offs_cont_viewport+offs_vpor_trans+offs_Y] |
||
38 | fistp dword[ebx+offs_vert_zp+offs_zbup_y] ;v.zp.y = st0, st0 = st1 |
||
39 | |||
40 | fld dword[ebx+offs_vert_pc+offs_Z] ;st0 = v.pc.Z |
||
41 | fmul st0,st1 |
||
42 | fmul dword[eax+offs_cont_viewport+offs_vpor_scale+offs_Z] |
||
43 | fadd dword[eax+offs_cont_viewport+offs_vpor_trans+offs_Z] |
||
44 | fistp dword[ebx+offs_vert_zp+offs_zbup_z] ;v.zp.z = st0, st0 = st1 |
||
45 | |||
5187 | IgorA | 46 | ffree st0 |
47 | fincstp |
||
48 | |||
5153 | IgorA | 49 | ; color |
5208 | IgorA | 50 | cmp dword[eax+offs_cont_lighting_enabled],0 ;if (context.lighting_enabled) |
51 | je @f |
||
5153 | IgorA | 52 | mov ecx,ebx |
53 | add ecx,offs_vert_zp+offs_zbup_b |
||
54 | push ecx |
||
55 | add ecx,offs_zbup_g-offs_zbup_b |
||
56 | push ecx |
||
57 | add ecx,offs_zbup_r-offs_zbup_g |
||
58 | push ecx |
||
59 | stdcall RGBFtoRGBI, dword[ebx+offs_vert_color],dword[ebx+offs_vert_color+4],dword[ebx+offs_vert_color+8] |
||
60 | jmp .end_if |
||
61 | @@: |
||
62 | ; no need to convert to integer if no lighting : take current color |
||
63 | mov ecx,[eax+offs_cont_longcurrent_color] |
||
64 | mov dword[ebx+offs_vert_zp+offs_zbup_r],ecx |
||
65 | mov ecx,[eax+offs_cont_longcurrent_color+4] |
||
66 | mov dword[ebx+offs_vert_zp+offs_zbup_g],ecx |
||
67 | mov ecx,[eax+offs_cont_longcurrent_color+8] |
||
68 | mov dword[ebx+offs_vert_zp+offs_zbup_b],ecx |
||
69 | .end_if: |
||
70 | |||
71 | ; texture |
||
72 | bt dword[eax+offs_cont_texture_2d_enabled],0 |
||
73 | jnc @f |
||
74 | mov dword[point],dword(ZB_POINT_S_MAX - ZB_POINT_S_MIN) |
||
75 | fild dword[point] |
||
76 | fmul dword[ebx+offs_vert_tex_coord] ;st0 *= v.tex_coord.X |
||
77 | fistp dword[ebx+offs_vert_zp+offs_zbup_s] |
||
78 | add dword[ebx+offs_vert_zp+offs_zbup_s],ZB_POINT_S_MIN |
||
79 | |||
80 | mov dword[point],dword(ZB_POINT_T_MAX - ZB_POINT_T_MIN) |
||
81 | fild dword[point] |
||
82 | fmul dword[ebx+offs_vert_tex_coord+4] ;st0 *= v.tex_coord.Y |
||
83 | fistp dword[ebx+offs_vert_zp+offs_zbup_t] |
||
84 | add dword[ebx+offs_vert_zp+offs_zbup_s],ZB_POINT_T_MIN |
||
85 | @@: |
||
86 | if DEBUG ;gl_transform_to_viewport |
||
87 | push edi |
||
88 | mov ecx,80 |
||
89 | mov eax,[ebx+offs_vert_zp] |
||
90 | lea edi,[buf_param] |
||
91 | stdcall convert_int_to_str,ecx |
||
92 | stdcall str_n_cat,edi,txt_zp_sp,2 |
||
93 | stdcall str_len,edi |
||
94 | add edi,eax |
||
95 | sub ecx,eax |
||
96 | |||
97 | mov eax,[ebx+offs_vert_zp+offs_zbup_y] |
||
98 | stdcall convert_int_to_str,ecx |
||
99 | stdcall str_n_cat,edi,txt_zp_sp,2 |
||
100 | stdcall str_len,edi |
||
101 | add edi,eax |
||
102 | sub ecx,eax |
||
103 | |||
104 | mov eax,[ebx+offs_vert_zp+offs_zbup_z] |
||
105 | stdcall convert_int_to_str,ecx |
||
106 | |||
107 | stdcall str_n_cat,edi,txt_nl,2 |
||
108 | stdcall dbg_print,f_ttv,buf_param |
||
109 | pop edi |
||
110 | end if |
||
111 | ret |
||
112 | endp |
||
113 | |||
114 | align 4 |
||
115 | proc gl_add_select1 uses eax ebx ecx, context:dword, z1:dword,z2:dword,z3:dword |
||
116 | mov eax,[z1] |
||
117 | mov ebx,eax |
||
118 | cmp [z2],eax |
||
119 | jge @f |
||
120 | mov eax,[z2] |
||
121 | @@: |
||
122 | cmp [z3],eax |
||
123 | jge @f |
||
124 | mov eax,[z3] |
||
125 | @@: |
||
126 | cmp [z2],ebx |
||
127 | jle @f |
||
128 | mov ebx,[z2] |
||
129 | @@: |
||
130 | cmp [z3],ebx |
||
131 | jle @f |
||
132 | mov ebx,[z3] |
||
133 | @@: |
||
134 | mov ecx,0xffffffff |
||
135 | sub ecx,ebx |
||
136 | push ecx |
||
137 | mov ecx,0xffffffff |
||
138 | sub ecx,eax |
||
139 | push ecx |
||
140 | stdcall gl_add_select, [context] ;,0xffffffff-eax,0xffffffff-ebx |
||
141 | ret |
||
142 | endp |
||
143 | |||
144 | ; point |
||
145 | |||
146 | align 4 |
||
147 | proc gl_draw_point uses eax ebx, context:dword, p0:dword |
||
148 | mov ebx,[p0] |
||
149 | cmp dword[ebx+offs_vert_clip_code],0 ;if (p0.clip_code == 0) |
||
150 | jne @f |
||
151 | mov eax,[context] |
||
152 | cmp dword[eax+offs_cont_render_mode],GL_SELECT |
||
153 | jne .els |
||
154 | stdcall gl_add_select, eax,dword[ebx+offs_vert_zp+offs_zbup_z],dword[ebx+offs_vert_zp+offs_zbup_z] ;p0.zp.z,p0.zp.z |
||
155 | jmp @f |
||
156 | .els: |
||
157 | add ebx,offs_vert_zp |
||
158 | stdcall ZB_plot, dword[eax+offs_cont_zb],ebx |
||
159 | @@: |
||
160 | ret |
||
161 | endp |
||
162 | |||
163 | ; line |
||
164 | |||
165 | align 4 |
||
166 | proc interpolate uses eax ebx ecx, q:dword,p0:dword,p1:dword,t:dword |
||
167 | mov eax,[q] |
||
168 | mov ebx,[p0] |
||
169 | mov ecx,[p1] |
||
170 | fld dword[t] |
||
171 | |||
172 | ; интерполяция по координатам |
||
5175 | IgorA | 173 | fld dword[ecx+offs_vert_pc+offs_X] |
174 | fsub dword[ebx+offs_vert_pc+offs_X] |
||
5153 | IgorA | 175 | fmul st0,st1 |
5175 | IgorA | 176 | fadd dword[ebx+offs_vert_pc+offs_X] |
177 | fstp dword[eax+offs_vert_pc+offs_X] |
||
5153 | IgorA | 178 | |
5175 | IgorA | 179 | fld dword[ecx+offs_vert_pc+offs_Y] |
180 | fsub dword[ebx+offs_vert_pc+offs_Y] |
||
5153 | IgorA | 181 | fmul st0,st1 |
5175 | IgorA | 182 | fadd dword[ebx+offs_vert_pc+offs_Y] |
183 | fstp dword[eax+offs_vert_pc+offs_Y] |
||
5153 | IgorA | 184 | |
5175 | IgorA | 185 | fld dword[ecx+offs_vert_pc+offs_Z] |
186 | fsub dword[ebx+offs_vert_pc+offs_Z] |
||
5153 | IgorA | 187 | fmul st0,st1 |
5175 | IgorA | 188 | fadd dword[ebx+offs_vert_pc+offs_Z] |
189 | fstp dword[eax+offs_vert_pc+offs_Z] |
||
5153 | IgorA | 190 | |
5175 | IgorA | 191 | fld dword[ecx+offs_vert_pc+offs_W] |
192 | fsub dword[ebx+offs_vert_pc+offs_W] |
||
5153 | IgorA | 193 | fmul st0,st1 |
5175 | IgorA | 194 | fadd dword[ebx+offs_vert_pc+offs_W] |
195 | fstp dword[eax+offs_vert_pc+offs_W] |
||
5153 | IgorA | 196 | |
197 | ; интерполяция по цвету |
||
198 | fld dword[ecx+offs_vert_color] |
||
199 | fsub dword[ebx+offs_vert_color] |
||
200 | fmul st0,st1 |
||
201 | fadd dword[ebx+offs_vert_color] |
||
202 | fstp dword[eax+offs_vert_color] |
||
203 | |||
204 | fld dword[ecx+offs_vert_color+4] |
||
205 | fsub dword[ebx+offs_vert_color+4] |
||
206 | fmul st0,st1 |
||
207 | fadd dword[ebx+offs_vert_color+4] |
||
208 | fstp dword[eax+offs_vert_color+4] |
||
209 | |||
210 | fld dword[ecx+offs_vert_color+8] |
||
211 | fsub dword[ebx+offs_vert_color+8] |
||
212 | fmul st0,st1 |
||
213 | fadd dword[ebx+offs_vert_color+8] |
||
214 | fstp dword[eax+offs_vert_color+8] |
||
5208 | IgorA | 215 | |
216 | ffree st0 |
||
217 | fincstp |
||
5153 | IgorA | 218 | ret |
219 | endp |
||
220 | |||
221 | ; |
||
222 | ; Line Clipping |
||
223 | ; |
||
224 | |||
225 | ; Line Clipping algorithm from 'Computer Graphics', Principles and |
||
226 | ; Practice |
||
227 | ; tmin,tmax -> &float |
||
228 | align 4 |
||
229 | proc ClipLine1 uses ebx, denom:dword,num:dword,tmin:dword,tmax:dword |
||
230 | fldz |
||
231 | fcom dword[denom] |
||
232 | fstsw ax |
||
233 | sahf |
||
234 | je .u2 |
||
235 | jmp @f |
||
236 | .u2: |
||
237 | fcom dword[num] |
||
238 | fstsw ax |
||
239 | sahf |
||
240 | jb .r0 ;if (denom==0 && num>0) return 0 |
||
241 | jmp .r1 |
||
242 | @@: |
||
243 | |||
244 | fcom dword[denom] |
||
245 | fstsw ax |
||
246 | sahf |
||
247 | ja .els_0 ;if (0 |
||
248 | fld dword[num] |
||
249 | fdiv dword[denom] |
||
250 | |||
251 | mov ebx,[tmax] |
||
252 | fcom dword[ebx] |
||
253 | fstsw ax |
||
254 | sahf |
||
5218 | IgorA | 255 | ja .r0_f2 ;if (t>*tmax) return 0 |
5153 | IgorA | 256 | |
257 | mov ebx,[tmin] |
||
258 | fcom dword[ebx] |
||
259 | fstsw ax |
||
260 | sahf |
||
5218 | IgorA | 261 | jbe .r1_f2 |
5153 | IgorA | 262 | fstp dword[ebx] ;if (t>*tmin) *tmin=t |
263 | jmp .r1 |
||
264 | |||
265 | .els_0: ;else if (0>denom) |
||
266 | fld dword[num] |
||
267 | fdiv dword[denom] |
||
268 | |||
269 | mov ebx,[tmin] |
||
270 | fcom dword[ebx] |
||
271 | fstsw ax |
||
272 | sahf |
||
5218 | IgorA | 273 | jb .r0_f2 ;if (t<*tmin) return 0 |
5153 | IgorA | 274 | |
275 | mov ebx,[tmax] |
||
276 | fcom dword[ebx] |
||
277 | fstsw ax |
||
278 | sahf |
||
5218 | IgorA | 279 | jae .r1_f2 |
5153 | IgorA | 280 | fstp dword[ebx] ;if (t<*tmin) *tmax=t |
281 | jmp .r1 |
||
282 | |||
5218 | IgorA | 283 | .r0_f2: ;return 0 & free st0,st1 |
284 | ffree st0 |
||
285 | fincstp |
||
286 | .r0: ;return 0 & free st0 |
||
5153 | IgorA | 287 | xor eax,eax |
288 | jmp .end_f |
||
5218 | IgorA | 289 | .r1_f2: ;return 1 & free st0,st1 |
290 | ffree st0 |
||
291 | fincstp |
||
292 | .r1: ;return 1 & free st0 |
||
5153 | IgorA | 293 | xor eax,eax |
294 | inc eax |
||
295 | .end_f: |
||
5218 | IgorA | 296 | ffree st0 |
297 | fincstp |
||
5153 | IgorA | 298 | ret |
299 | endp |
||
300 | |||
301 | align 4 |
||
5218 | IgorA | 302 | proc gl_draw_line, context:dword, p1:dword, p2:dword |
5153 | IgorA | 303 | locals |
304 | d_x dd ? |
||
305 | d_y dd ? |
||
306 | d_z dd ? |
||
307 | d_w dd ? |
||
308 | x1 dd ? |
||
309 | y1 dd ? |
||
310 | z1 dd ? |
||
311 | w1 dd ? |
||
312 | q1 GLVertex ? |
||
313 | q2 GLVertex ? |
||
314 | tmin dd ? ;ebp-8 |
||
315 | tmax dd ? ;ebp-4 |
||
316 | endl |
||
5218 | IgorA | 317 | pushad |
5153 | IgorA | 318 | mov edx,[context] |
319 | mov edi,[p1] |
||
320 | mov esi,[p2] |
||
321 | |||
322 | cmp dword[edi+offs_vert_clip_code],0 |
||
323 | jne .els_i |
||
324 | cmp dword[esi+offs_vert_clip_code],0 |
||
325 | jne .els_i |
||
326 | ;if ( (p1.clip_code | p2.clip_code) == 0) |
||
327 | cmp dword[edx+offs_cont_render_mode],GL_SELECT ;if (context.render_mode == GL_SELECT) |
||
328 | jne .els_1 |
||
329 | stdcall gl_add_select1, edx,dword[edi+offs_vert_zp+offs_zbup_z],\ |
||
330 | dword[esi+offs_vert_zp+offs_zbup_z],dword[esi+offs_vert_zp+offs_zbup_z] |
||
331 | jmp .end_f |
||
332 | .els_1: |
||
333 | add edi,offs_vert_zp |
||
334 | add esi,offs_vert_zp |
||
335 | push esi |
||
336 | push edi |
||
337 | push dword[edx+offs_cont_zb] |
||
338 | cmp dword[edx+offs_cont_depth_test],0 |
||
339 | je .els_2 |
||
340 | ;if (context.depth_test) |
||
341 | call ZB_line_z ;, dword[edx+offs_cont_zb],edi,esi |
||
342 | jmp .end_f |
||
343 | .els_2: |
||
344 | call ZB_line ;, dword[edx+offs_cont_zb],edi,esi |
||
345 | jmp .end_f |
||
346 | .els_i: |
||
347 | ;else if ( (p1.clip_code & p2.clip_code) != 0 ) |
||
348 | mov eax,[edi+offs_vert_clip_code] |
||
349 | and eax,[esi+offs_vert_clip_code] |
||
350 | cmp eax,0 |
||
351 | jne .end_f |
||
352 | .els_0: |
||
353 | |||
354 | fld dword[esi+offs_vert_pc+offs_X] |
||
355 | fsub dword[edi+offs_vert_pc+offs_X] |
||
356 | fstp dword[d_x] ;d_x = p2.pc.X - p1.pc.X |
||
357 | fld dword[esi+offs_vert_pc+offs_Y] |
||
358 | fsub dword[edi+offs_vert_pc+offs_Y] |
||
359 | fstp dword[d_y] ;d_y = p2.pc.Y - p1.pc.Y |
||
360 | fld dword[esi+offs_vert_pc+offs_Z] |
||
361 | fsub dword[edi+offs_vert_pc+offs_Z] |
||
362 | fstp dword[d_z] ;d_z = p2.pc.Z - p1.pc.Z |
||
363 | fld dword[esi+offs_vert_pc+offs_W] |
||
364 | fsub dword[edi+offs_vert_pc+offs_W] |
||
365 | fstp dword[d_w] ;d_w = p2.pc.W - p1.pc.W |
||
366 | |||
367 | mov eax,[edi+offs_vert_pc+offs_X] |
||
368 | mov [x1],eax ;x1 = p1.pc.X |
||
369 | mov eax,[edi+offs_vert_pc+offs_Y] |
||
370 | mov [y1],eax ;y1 = p1.pc.Y |
||
371 | mov eax,[edi+offs_vert_pc+offs_Z] |
||
372 | mov [z1],eax ;z1 = p1.pc.Z |
||
373 | mov eax,[edi+offs_vert_pc+offs_W] |
||
374 | mov [w1],eax ;w1 = p1.pc.W |
||
375 | |||
376 | mov dword[tmin],0.0 |
||
377 | mov dword[tmax],1.0 |
||
378 | |||
379 | mov eax,ebp |
||
380 | sub eax,4 |
||
381 | push eax ;толкаем в стек адрес &tmax |
||
382 | sub eax,4 |
||
383 | push eax ;толкаем в стек адрес &tmin |
||
384 | fld dword[x1] |
||
385 | fadd dword[w1] |
||
386 | fchs |
||
387 | fstp dword[esp-4] |
||
388 | fld dword[d_x] |
||
389 | fadd dword[d_w] |
||
390 | fstp dword[esp-8] |
||
391 | sub esp,8 |
||
392 | call ClipLine1 ;d_x+d_w,-x1-w1,&tmin,&tmax |
||
393 | bt eax,0 |
||
394 | jnc .end_f |
||
395 | |||
396 | sub esp,8 ;толкаем в стек адреса переменных &tmin и &tmax |
||
397 | fld dword[x1] |
||
398 | fsub dword[w1] |
||
399 | fstp dword[esp-4] |
||
400 | fld dword[d_w] |
||
401 | fsub dword[d_x] |
||
402 | fstp dword[esp-8] |
||
403 | sub esp,8 |
||
404 | call ClipLine1 ;-d_x+d_w,x1-w1,&tmin,&tmax |
||
405 | bt eax,0 |
||
406 | jnc .end_f |
||
407 | |||
408 | sub esp,8 ;толкаем в стек адреса переменных &tmin и &tmax |
||
409 | fld dword[y1] |
||
410 | fadd dword[w1] |
||
411 | fchs |
||
412 | fstp dword[esp-4] |
||
413 | fld dword[d_y] |
||
414 | fadd dword[d_w] |
||
415 | fstp dword[esp-8] |
||
416 | sub esp,8 |
||
417 | call ClipLine1 ;d_y+d_w,-y1-w1,&tmin,&tmax |
||
418 | bt eax,0 |
||
419 | jnc .end_f |
||
420 | |||
421 | sub esp,8 ;толкаем в стек адреса переменных &tmin и &tmax |
||
422 | fld dword[y1] |
||
423 | fsub dword[w1] |
||
424 | fstp dword[esp-4] |
||
425 | fld dword[d_w] |
||
426 | fsub dword[d_y] |
||
427 | fstp dword[esp-8] |
||
428 | sub esp,8 |
||
429 | call ClipLine1 ;-d_y+d_w,y1-w1,&tmin,&tmax |
||
430 | bt eax,0 |
||
431 | jnc .end_f |
||
432 | |||
433 | sub esp,8 ;толкаем в стек адреса переменных &tmin и &tmax |
||
434 | fld dword[z1] |
||
435 | fadd dword[w1] |
||
436 | fchs |
||
437 | fstp dword[esp-4] |
||
438 | fld dword[d_z] |
||
439 | fadd dword[d_w] |
||
440 | fstp dword[esp-8] |
||
441 | sub esp,8 |
||
442 | call ClipLine1 ;d_z+d_w,-z1-w1,&tmin,&tmax |
||
443 | bt eax,0 |
||
444 | jnc .end_f |
||
445 | |||
446 | sub esp,8 ;толкаем в стек адреса переменных &tmin и &tmax |
||
447 | fld dword[z1] |
||
448 | fsub dword[w1] |
||
449 | fstp dword[esp-4] |
||
450 | fld dword[d_w] |
||
451 | fsub dword[d_z] |
||
452 | fstp dword[esp-8] |
||
453 | sub esp,8 |
||
454 | call ClipLine1 ;-d_z+d_w,z1-w1,&tmin,&tmax |
||
455 | bt eax,0 |
||
456 | jnc .end_f |
||
457 | |||
458 | mov eax,ebp |
||
459 | sub eax,8+2*sizeof.GLVertex ;eax = &q1 |
||
460 | stdcall interpolate, eax,edi,esi,[tmin] |
||
461 | stdcall gl_transform_to_viewport, edx,eax |
||
462 | add eax,sizeof.GLVertex ;eax = &q2 |
||
463 | stdcall interpolate, eax,edi,esi,[tmax] |
||
464 | stdcall gl_transform_to_viewport, edx,eax |
||
465 | |||
466 | sub eax,sizeof.GLVertex ;eax = &q1 |
||
467 | mov ebx,eax |
||
468 | add ebx,offs_vert_zp+offs_zbup_b |
||
469 | push ebx |
||
470 | add ebx,offs_zbup_g-offs_zbup_b |
||
471 | push ebx |
||
472 | add ebx,offs_zbup_r-offs_zbup_g |
||
473 | push ebx |
||
474 | stdcall RGBFtoRGBI, dword[eax+offs_vert_color],dword[eax+offs_vert_color+4],dword[eax+offs_vert_color+8] |
||
475 | |||
476 | add eax,sizeof.GLVertex ;eax = &q2 |
||
477 | mov ebx,eax |
||
478 | add ebx,offs_vert_zp+offs_zbup_b |
||
479 | push ebx |
||
480 | add ebx,offs_zbup_g-offs_zbup_b |
||
481 | push ebx |
||
482 | add ebx,offs_zbup_r-offs_zbup_g |
||
483 | push ebx |
||
484 | stdcall RGBFtoRGBI, dword[eax+offs_vert_color],dword[eax+offs_vert_color+4],dword[eax+offs_vert_color+8] |
||
485 | |||
486 | add eax,offs_vert_zp ;eax = &q2.zp |
||
487 | push eax |
||
488 | sub eax,sizeof.GLVertex ;eax = &q1.zp |
||
489 | push eax |
||
490 | push dword[edx+offs_cont_zb] |
||
491 | cmp dword[edx+offs_cont_depth_test],0 |
||
492 | je .els_3 |
||
493 | call ZB_line_z ;(context.zb,&q1.zp,&q2.zp) |
||
494 | jmp .end_f |
||
495 | .els_3: |
||
496 | call ZB_line ;(context.zb,&q1.zp,&q2.zp) |
||
497 | .end_f: |
||
5218 | IgorA | 498 | popad |
5153 | IgorA | 499 | ret |
500 | endp |
||
501 | |||
502 | ; triangle |
||
503 | |||
504 | ; |
||
505 | ; Clipping |
||
506 | ; |
||
507 | |||
508 | ; We clip the segment [a,b] against the 6 planes of the normal volume. |
||
509 | ; We compute the point 'c' of intersection and the value of the parameter 't' |
||
510 | ; of the intersection if x=a+t(b-a). |
||
511 | ; |
||
512 | ; sign: 0 -> '-', 1 -> '+' |
||
513 | macro clip_func sign,dir,dir1,dir2 |
||
514 | { |
||
515 | locals |
||
516 | t dd ? |
||
517 | d_X dd ? |
||
518 | d_Y dd ? |
||
519 | d_Z dd ? |
||
520 | d_W dd ? |
||
521 | endl |
||
522 | mov edx,[a] |
||
523 | mov ebx,[b] |
||
524 | mov ecx,[c] |
||
5175 | IgorA | 525 | fld dword[ebx+offs_X] |
526 | fsub dword[edx+offs_X] |
||
5153 | IgorA | 527 | fstp dword[d_X] ;d_X = (b.X - a.X) |
5175 | IgorA | 528 | fld dword[ebx+offs_Y] |
529 | fsub dword[edx+offs_Y] |
||
5153 | IgorA | 530 | fstp dword[d_Y] ;d_Y = (b.Y - a.Y) |
5175 | IgorA | 531 | fld dword[ebx+offs_Z] |
532 | fsub dword[edx+offs_Z] |
||
5153 | IgorA | 533 | fstp dword[d_Z] ;d_Z = (b.Z - a.Z) |
5175 | IgorA | 534 | fld dword[ebx+offs_W] |
535 | fsub dword[edx+offs_W] |
||
5153 | IgorA | 536 | fst dword[d_W] ;d_W = (b.W - a.W) |
537 | if sign eq 0 |
||
538 | fadd dword[d#dir] |
||
539 | else |
||
540 | fsub dword[d#dir] |
||
541 | end if |
||
542 | |||
5218 | IgorA | 543 | ftst |
5153 | IgorA | 544 | fstsw ax |
545 | sahf |
||
5208 | IgorA | 546 | jne @f |
547 | fldz |
||
5153 | IgorA | 548 | fst dword[t] ;t=0 |
549 | jmp .e_zero |
||
550 | @@: ;else |
||
551 | fld dword[edx+offs#dir] |
||
552 | if sign eq 0 |
||
553 | fchs |
||
554 | end if |
||
555 | fsub dword[edx+offs_W] |
||
556 | fdiv st0,st1 |
||
557 | fst dword[t] ;t = ( sign a.dir - a.W) / den |
||
558 | .e_zero: |
||
559 | |||
560 | fmul dword[d#dir1] ;st0 = t * d.dir1 |
||
561 | fadd dword[edx+offs#dir1] |
||
562 | fstp dword[ecx+offs#dir1] ;c.dir1 = a.dir1 + t * d.dir1 |
||
563 | |||
5208 | IgorA | 564 | ffree st0 |
565 | fincstp |
||
566 | |||
5153 | IgorA | 567 | fld dword[t] |
568 | fmul dword[d#dir2] ;st0 = t * d.dir2 |
||
569 | fadd dword[edx+offs#dir2] |
||
570 | fstp dword[ecx+offs#dir2] ;c.dir2 = a.dir2 + t * d.dir2 |
||
571 | |||
572 | fld dword[t] |
||
573 | fmul dword[d_W] |
||
574 | fadd dword[edx+offs_W] |
||
575 | fst dword[ecx+offs_W] ;c.W = a.W + t * d_W |
||
576 | |||
577 | if sign eq 0 |
||
578 | fchs |
||
579 | end if |
||
580 | fstp dword[ecx+offs#dir] ;c.dir = sign c.W |
||
581 | mov eax,[t] |
||
582 | } |
||
583 | |||
584 | align 4 |
||
585 | proc clip_xmin uses ebx ecx edx, c:dword, a:dword, b:dword |
||
586 | clip_func 0,_X,_Y,_Z |
||
587 | ret |
||
588 | endp |
||
589 | |||
590 | align 4 |
||
591 | proc clip_xmax uses ebx ecx edx, c:dword, a:dword, b:dword |
||
592 | clip_func 1,_X,_Y,_Z |
||
593 | ret |
||
594 | endp |
||
595 | |||
596 | align 4 |
||
597 | proc clip_ymin uses ebx ecx edx, c:dword, a:dword, b:dword |
||
598 | clip_func 0,_Y,_X,_Z |
||
599 | ret |
||
600 | endp |
||
601 | |||
602 | align 4 |
||
603 | proc clip_ymax uses ebx ecx edx, c:dword, a:dword, b:dword |
||
604 | clip_func 1,_Y,_X,_Z |
||
605 | ret |
||
606 | endp |
||
607 | |||
608 | align 4 |
||
609 | proc clip_zmin uses ebx ecx edx, c:dword, a:dword, b:dword |
||
610 | clip_func 0,_Z,_X,_Y |
||
611 | ret |
||
612 | endp |
||
613 | |||
614 | align 4 |
||
615 | proc clip_zmax uses ebx ecx edx, c:dword, a:dword, b:dword |
||
616 | clip_func 1,_Z,_X,_Y |
||
617 | ret |
||
618 | endp |
||
619 | |||
620 | align 4 |
||
621 | clip_proc dd clip_xmin,clip_xmax, clip_ymin,clip_ymax, clip_zmin,clip_zmax |
||
622 | |||
5175 | IgorA | 623 | align 4 |
5208 | IgorA | 624 | proc updateTmp uses eax ebx ecx edx, context:dword, q:dword, p0:dword, p1:dword, t:dword |
625 | mov ebx,[q] |
||
626 | mov edx,[context] |
||
627 | mov eax,[p0] |
||
5175 | IgorA | 628 | cmp dword[edx+offs_cont_current_shade_model],GL_SMOOTH ;if (context.current_shade_model == GL_SMOOTH) |
629 | jne .els_0 |
||
5208 | IgorA | 630 | mov ecx,[p1] |
631 | fld dword[ecx+offs_vert_color] |
||
632 | fsub dword[eax+offs_vert_color] |
||
633 | fmul dword[t] |
||
634 | fadd dword[eax+offs_vert_color] |
||
635 | fstp dword[ebx+offs_vert_color] ;q.color.v[0]=p0.color.v[0] + (p1.color.v[0]-p0.color.v[0])*t |
||
636 | fld dword[ecx+offs_vert_color+4] |
||
637 | fsub dword[eax+offs_vert_color+4] |
||
638 | fmul dword[t] |
||
639 | fadd dword[eax+offs_vert_color+4] |
||
640 | fstp dword[ebx+offs_vert_color+4] ;q.color.v[1]=p0.color.v[1] + (p1.color.v[1]-p0.color.v[1])*t |
||
641 | fld dword[ecx+offs_vert_color+8] |
||
642 | fsub dword[eax+offs_vert_color+8] |
||
643 | fmul dword[t] |
||
644 | fadd dword[eax+offs_vert_color+8] |
||
645 | fstp dword[ebx+offs_vert_color+8] ;q.color.v[2]=p0.color.v[2] + (p1.color.v[2]-p0.color.v[2])*t |
||
5175 | IgorA | 646 | jmp @f |
647 | .els_0: |
||
5208 | IgorA | 648 | mov ecx,[eax+offs_vert_color] |
649 | mov [ebx+offs_vert_color],ecx ;q.color.v[0]=p0.color.v[0] |
||
650 | mov ecx,[eax+offs_vert_color+4] |
||
651 | mov [ebx+offs_vert_color+4],ecx ;q.color.v[1]=p0.color.v[1] |
||
652 | mov ecx,[eax+offs_vert_color+8] |
||
653 | mov [ebx+offs_vert_color+8],ecx ;q.color.v[2]=p0.color.v[2] |
||
5175 | IgorA | 654 | @@: |
5153 | IgorA | 655 | |
5175 | IgorA | 656 | cmp dword[edx+offs_cont_texture_2d_enabled],0 ;if (context.texture_2d_enabled) |
657 | je @f |
||
5208 | IgorA | 658 | mov ecx,[p1] |
659 | fld dword[ecx+offs_vert_tex_coord+offs_X] |
||
660 | fsub dword[eax+offs_vert_tex_coord+offs_X] |
||
661 | fmul dword[t] |
||
662 | fadd dword[eax+offs_vert_tex_coord+offs_X] |
||
663 | fstp dword[ebx+offs_vert_tex_coord+offs_X] ;q.tex_coord.X=p0.tex_coord.X + (p1.tex_coord.X-p0.tex_coord.X)*t |
||
664 | fld dword[ecx+offs_vert_tex_coord+offs_Y] |
||
665 | fsub dword[eax+offs_vert_tex_coord+offs_Y] |
||
666 | fmul dword[t] |
||
667 | fadd dword[eax+offs_vert_tex_coord+offs_Y] |
||
668 | fstp dword[ebx+offs_vert_tex_coord+offs_Y] ;q.tex_coord.Y=p0.tex_coord.Y + (p1.tex_coord.Y-p0.tex_coord.Y)*t |
||
5175 | IgorA | 669 | @@: |
5153 | IgorA | 670 | |
5208 | IgorA | 671 | stdcall gl_clipcode, [ebx+offs_vert_pc+offs_X],[ebx+offs_vert_pc+offs_Y],\ |
672 | [ebx+offs_vert_pc+offs_Z],[ebx+offs_vert_pc+offs_W] |
||
673 | mov dword[ebx+offs_vert_clip_code],eax |
||
674 | cmp eax,0 ;if (q.clip_code==0) |
||
675 | jne @f |
||
676 | stdcall gl_transform_to_viewport,[context],ebx |
||
677 | mov eax,ebx |
||
678 | add eax,offs_vert_zp+offs_zbup_b |
||
679 | push eax |
||
680 | add eax,offs_zbup_g-offs_zbup_b |
||
681 | push eax |
||
682 | add eax,offs_zbup_r-offs_zbup_g |
||
683 | push eax |
||
684 | stdcall RGBFtoRGBI, dword[ebx+offs_vert_color],dword[ebx+offs_vert_color+4],dword[ebx+offs_vert_color+8] |
||
685 | @@: |
||
5175 | IgorA | 686 | ret |
687 | endp |
||
5153 | IgorA | 688 | |
5175 | IgorA | 689 | align 4 |
690 | proc gl_draw_triangle, context:dword, p0:dword, p1:dword, p2:dword |
||
691 | locals |
||
692 | cc rd 3 |
||
693 | front dd ? |
||
694 | norm dd ? ;float |
||
695 | endl |
||
696 | pushad |
||
697 | mov ebx,[p0] |
||
698 | mov ecx,[p1] |
||
699 | mov edx,[p2] |
||
5213 | IgorA | 700 | |
5175 | IgorA | 701 | mov edi,[ebx+offs_vert_clip_code] |
702 | mov dword[cc],edi |
||
703 | mov eax,[ecx+offs_vert_clip_code] |
||
704 | mov dword[cc+4],eax |
||
705 | or edi,eax |
||
706 | mov eax,[edx+offs_vert_clip_code] |
||
707 | mov dword[cc+8],eax |
||
5208 | IgorA | 708 | or edi,eax ;co = cc[0] | cc[1] | cc[2] |
5153 | IgorA | 709 | |
5175 | IgorA | 710 | ; we handle the non clipped case here to go faster |
5208 | IgorA | 711 | cmp edi,0 ;if (co==0) |
5175 | IgorA | 712 | jne .els_0 |
713 | mov edi,dword[edx+offs_vert_zp+offs_zbup_x] |
||
5208 | IgorA | 714 | sub edi,dword[ebx+offs_vert_zp+offs_zbup_x] |
5175 | IgorA | 715 | mov dword[norm],edi |
716 | fild dword[norm] |
||
5213 | IgorA | 717 | mov edi,dword[ecx+offs_vert_zp+offs_zbup_y] |
718 | sub edi,dword[ebx+offs_vert_zp+offs_zbup_y] |
||
5175 | IgorA | 719 | mov dword[norm],edi |
720 | fimul dword[norm] |
||
721 | mov edi,dword[ecx+offs_vert_zp+offs_zbup_x] |
||
722 | sub edi,dword[ebx+offs_vert_zp+offs_zbup_x] |
||
723 | mov dword[norm],edi |
||
724 | fild dword[norm] |
||
725 | mov edi,dword[edx+offs_vert_zp+offs_zbup_y] |
||
5208 | IgorA | 726 | sub edi,dword[ebx+offs_vert_zp+offs_zbup_y] |
5175 | IgorA | 727 | mov dword[norm],edi |
728 | fimul dword[norm] |
||
5187 | IgorA | 729 | fsubp |
5153 | IgorA | 730 | |
5175 | IgorA | 731 | ;st0 = (p1.zp.x-p0.zp.x)*(p2.zp.y-p0.zp.y) - (p2.zp.x-p0.zp.x)*(p1.zp.y-p0.zp.y) |
5153 | IgorA | 732 | |
5175 | IgorA | 733 | mov dword[front],0 |
734 | fldz |
||
5187 | IgorA | 735 | fcompp |
5175 | IgorA | 736 | fstsw ax |
737 | sahf |
||
738 | je .end_f |
||
739 | jb @f |
||
740 | inc dword[front] ;front = 0.0 > norm |
||
741 | @@: |
||
742 | mov edi,[context] |
||
743 | mov eax,dword[edi+offs_cont_current_front_face] |
||
744 | xor dword[front],eax ;front ^= context.current_front_face |
||
5153 | IgorA | 745 | |
5175 | IgorA | 746 | ; back face culling |
747 | cmp dword[edi+offs_cont_cull_face_enabled],0 |
||
748 | je .els_1 |
||
749 | ; most used case first |
||
750 | cmp dword[edi+offs_cont_current_cull_face],GL_BACK |
||
751 | jne @f |
||
752 | cmp dword[front],0 |
||
753 | je .end_f |
||
754 | stdcall dword[edi+offs_cont_draw_triangle_front], edi,ebx,ecx,edx |
||
755 | jmp .end_f |
||
756 | @@: |
||
757 | cmp dword[edi+offs_cont_current_cull_face],GL_FRONT |
||
758 | jne .end_f |
||
759 | cmp dword[front],0 |
||
760 | jne .end_f |
||
761 | stdcall dword[edi+offs_cont_draw_triangle_back], edi,ebx,ecx,edx |
||
762 | jmp .end_f |
||
763 | .els_1: |
||
764 | ; no culling |
||
765 | cmp dword[front],0 |
||
766 | je @f |
||
767 | stdcall dword[edi+offs_cont_draw_triangle_front], edi,ebx,ecx,edx |
||
5213 | IgorA | 768 | jmp .end_f |
5175 | IgorA | 769 | @@: |
770 | stdcall dword[edi+offs_cont_draw_triangle_back], edi,ebx,ecx,edx |
||
771 | jmp .end_f |
||
772 | .els_0: |
||
5208 | IgorA | 773 | ;eax = cc[2] |
5175 | IgorA | 774 | and eax,[cc] |
5208 | IgorA | 775 | and eax,[cc+4] ;eax = c_and = cc[0] & cc[1] & cc[2] |
776 | cmp eax,0 ;if (c_and==0) |
||
5187 | IgorA | 777 | jne .end_f |
5175 | IgorA | 778 | stdcall gl_draw_triangle_clip, [context],ebx,ecx,edx,0 |
779 | .end_f: |
||
780 | popad |
||
781 | ret |
||
782 | endp |
||
5153 | IgorA | 783 | |
5175 | IgorA | 784 | align 4 |
785 | proc gl_draw_triangle_clip, context:dword, p0:dword, p1:dword, p2:dword, clip_bit:dword |
||
786 | locals |
||
787 | co dd ? |
||
788 | cc rd 3 |
||
789 | edge_flag_tmp dd ? |
||
790 | clip_mask dd ? |
||
5208 | IgorA | 791 | q rd 3 ;GLVertex* |
5175 | IgorA | 792 | tmp1 GLVertex ? |
793 | tmp2 GLVertex ? |
||
794 | endl |
||
795 | pushad |
||
796 | mov ebx,[p0] |
||
797 | mov ecx,[p1] |
||
798 | mov edx,[p2] |
||
5208 | IgorA | 799 | |
5175 | IgorA | 800 | mov edi,[ebx+offs_vert_clip_code] |
5208 | IgorA | 801 | mov [cc],edi |
5175 | IgorA | 802 | mov eax,[ecx+offs_vert_clip_code] |
5208 | IgorA | 803 | mov [cc+4],eax |
5175 | IgorA | 804 | or edi,eax |
805 | mov eax,[edx+offs_vert_clip_code] |
||
5208 | IgorA | 806 | mov [cc+8],eax |
5175 | IgorA | 807 | or edi,eax |
5208 | IgorA | 808 | mov [co],edi ;co = cc[0] | cc[1] | cc[2] |
5175 | IgorA | 809 | |
5208 | IgorA | 810 | cmp edi,0 ;if (co == 0) |
5175 | IgorA | 811 | jne .els_0 |
812 | stdcall gl_draw_triangle, [context],ebx,ecx,edx |
||
813 | jmp .end_f |
||
814 | .els_0: |
||
5208 | IgorA | 815 | ;eax = cc[2] |
5175 | IgorA | 816 | and eax,[cc] |
5208 | IgorA | 817 | and eax,[cc+4] ;c_and = cc[0] & cc[1] & cc[2] |
5175 | IgorA | 818 | |
819 | ; the triangle is completely outside |
||
5208 | IgorA | 820 | cmp eax,0 ;if (c_and!=0) return |
5175 | IgorA | 821 | jne .end_f |
822 | |||
5208 | IgorA | 823 | ; find the next direction to clip |
824 | .cycle_0: ;while (clip_bit < 6 && (co & (1 << clip_bit)) == 0) |
||
825 | cmp dword[clip_bit],6 |
||
826 | jge .cycle_0_end |
||
827 | xor eax,eax |
||
828 | inc eax |
||
829 | mov ecx,[clip_bit] |
||
830 | shl eax,cl |
||
831 | and eax,[co] |
||
832 | cmp eax,0 |
||
833 | jne .cycle_0_end |
||
834 | inc dword[clip_bit] |
||
835 | jmp .cycle_0 |
||
836 | .cycle_0_end: |
||
5153 | IgorA | 837 | |
5175 | IgorA | 838 | ; this test can be true only in case of rounding errors |
839 | cmp dword[clip_bit],6 |
||
840 | if 0 |
||
841 | jne @f |
||
5153 | IgorA | 842 | ; printf("Error:\n"); |
843 | ; printf("%f %f %f %f\n",p0->pc.X,p0->pc.Y,p0->pc.Z,p0->pc.W); |
||
844 | ; printf("%f %f %f %f\n",p1->pc.X,p1->pc.Y,p1->pc.Z,p1->pc.W); |
||
845 | ; printf("%f %f %f %f\n",p2->pc.X,p2->pc.Y,p2->pc.Z,p2->pc.W); |
||
5175 | IgorA | 846 | jmp .end_f |
847 | @@: |
||
5208 | IgorA | 848 | end if |
849 | if 1 |
||
5175 | IgorA | 850 | je .end_f |
851 | end if |
||
5153 | IgorA | 852 | |
5208 | IgorA | 853 | xor eax,eax |
854 | inc eax |
||
855 | mov ecx,[clip_bit] |
||
856 | shl eax,cl |
||
857 | mov [clip_mask],eax ;1 << clip_bit |
||
858 | mov edi,[cc] |
||
859 | xor edi,[cc+4] |
||
860 | xor edi,[cc+8] |
||
861 | and eax,edi ;eax = co1 = (cc[0] ^ cc[1] ^ cc[2]) & clip_mask |
||
5153 | IgorA | 862 | |
5208 | IgorA | 863 | mov ecx,[p1] ;востанавливаем после shl ___,cl |
5153 | IgorA | 864 | |
5208 | IgorA | 865 | cmp eax,0 ;if (co1) |
866 | je .els_1 |
||
867 | ; one point outside |
||
868 | mov eax,[cc] |
||
869 | and eax,[clip_mask] |
||
870 | cmp eax,0 ;if (cc[0] & clip_mask) |
||
871 | je .els_2 |
||
872 | ;q[0]=p0 q[1]=p1 q[2]=p2 |
||
873 | mov [q],ebx |
||
874 | mov [q+4],ecx |
||
875 | mov [q+8],edx |
||
876 | jmp .els_2_end |
||
877 | .els_2: |
||
878 | mov eax,[cc+4] |
||
879 | and eax,[clip_mask] |
||
880 | cmp eax,0 ;else if (cc[1] & clip_mask) |
||
881 | je .els_3 |
||
882 | ;q[0]=p1 q[1]=p2 q[2]=p0 |
||
883 | mov [q],ecx |
||
884 | mov [q+4],edx |
||
885 | mov [q+8],ebx |
||
886 | jmp .els_2_end |
||
887 | .els_3: |
||
888 | ;q[0]=p2 q[1]=p0 q[2]=p1 |
||
889 | mov [q],edx |
||
890 | mov [q+4],ebx |
||
891 | mov [q+8],ecx |
||
892 | .els_2_end: |
||
5153 | IgorA | 893 | |
5208 | IgorA | 894 | mov ebx,[q] |
895 | add ebx,offs_vert_pc |
||
896 | mov ecx,[q+4] |
||
897 | add ecx,offs_vert_pc |
||
898 | mov edx,[q+8] |
||
899 | add edx,offs_vert_pc |
||
5153 | IgorA | 900 | |
5208 | IgorA | 901 | lea eax,[clip_proc] |
902 | mov edi,[clip_bit] |
||
903 | shl edi,2 |
||
904 | add eax,edi |
||
905 | mov edi,ebp |
||
906 | sub edi,(2*sizeof.GLVertex)-offs_vert_pc |
||
907 | stdcall dword[eax],edi,ebx,ecx ;clip_proc[clip_bit](&tmp1.pc,&q[0].pc,&q[1].pc) |
||
908 | sub edi,offs_vert_pc |
||
5153 | IgorA | 909 | |
5208 | IgorA | 910 | sub ebx,offs_vert_pc |
911 | sub ecx,offs_vert_pc |
||
912 | stdcall updateTmp,[context],edi,ebx,ecx,eax ;updateTmp(c,&tmp1,q[0],q[1],tt) |
||
913 | add ebx,offs_vert_pc |
||
5153 | IgorA | 914 | |
5208 | IgorA | 915 | lea eax,[clip_proc] |
916 | mov edi,[clip_bit] |
||
917 | shl edi,2 |
||
918 | add eax,edi |
||
919 | mov edi,ebp |
||
920 | sub edi,sizeof.GLVertex-offs_vert_pc |
||
921 | stdcall dword[eax],edi,ebx,edx ;clip_proc[clip_bit](&tmp2.pc,&q[0].pc,&q[2].pc) |
||
922 | sub edi,offs_vert_pc |
||
923 | sub ebx,offs_vert_pc |
||
924 | sub edx,offs_vert_pc |
||
925 | stdcall updateTmp,[context],edi,ebx,edx,eax ;updateTmp(c,&tmp2,q[0],q[2],tt) |
||
926 | |||
927 | mov eax,[ebx+offs_vert_edge_flag] |
||
928 | mov [tmp1+offs_vert_edge_flag],eax ;q[0].edge_flag |
||
929 | mov eax,[edx+offs_vert_edge_flag] |
||
930 | mov [edge_flag_tmp],eax ;q[2].edge_flag |
||
931 | mov dword[edx+offs_vert_edge_flag],0 ;q[2].edge_flag=0 |
||
932 | mov eax,[clip_bit] |
||
933 | inc eax |
||
934 | push eax ;для вызова нижней функции |
||
935 | mov edi,ebp |
||
936 | sub edi,2*sizeof.GLVertex |
||
937 | stdcall gl_draw_triangle_clip,[context],edi,ecx,edx,eax ;gl_draw_triangle_clip(c,&tmp1,q[1],q[2],clip_bit+1) |
||
938 | |||
939 | mov dword[tmp2.edge_flag],0 |
||
940 | mov dword[tmp1.edge_flag],0 |
||
941 | mov eax,[edge_flag_tmp] |
||
942 | mov [edx+offs_vert_edge_flag],eax ;q[2].edge_flag=edge_flag_tmp |
||
943 | push edx |
||
944 | push edi |
||
945 | add edi,sizeof.GLVertex ;edi = &tmp2 |
||
946 | stdcall gl_draw_triangle_clip,[context],edi ;gl_draw_triangle_clip(c,&tmp2,&tmp1,q[2],clip_bit+1) |
||
947 | jmp .end_f |
||
948 | .els_1: |
||
949 | ; two points outside |
||
950 | mov eax,[cc] |
||
951 | and eax,[clip_mask] |
||
952 | cmp eax,0 ;if (cc[0] & clip_mask)==0 |
||
953 | jne .els_4 |
||
954 | ;q[0]=p0 q[1]=p1 q[2]=p2 |
||
955 | mov [q],ebx |
||
956 | mov [q+4],ecx |
||
957 | mov [q+8],edx |
||
958 | jmp .els_4_end |
||
959 | .els_4: |
||
960 | mov eax,[cc+4] |
||
961 | and eax,[clip_mask] |
||
962 | cmp eax,0 ;else if (cc[1] & clip_mask)==0 |
||
963 | jne .els_5 |
||
964 | ;q[0]=p1 q[1]=p2 q[2]=p0 |
||
965 | mov [q],ecx |
||
966 | mov [q+4],edx |
||
967 | mov [q+8],ebx |
||
968 | jmp .els_4_end |
||
969 | .els_5: |
||
970 | ;q[0]=p2 q[1]=p0 q[2]=p1 |
||
971 | mov [q],edx |
||
972 | mov [q+4],ebx |
||
973 | mov [q+8],ecx |
||
974 | .els_4_end: |
||
975 | |||
976 | mov ebx,[q] |
||
977 | add ebx,offs_vert_pc |
||
978 | mov ecx,[q+4] |
||
979 | add ecx,offs_vert_pc |
||
980 | mov edx,[q+8] |
||
981 | add edx,offs_vert_pc |
||
982 | |||
983 | lea eax,[clip_proc] |
||
984 | mov edi,[clip_bit] |
||
985 | shl edi,2 |
||
986 | add eax,edi |
||
987 | mov edi,ebp |
||
988 | sub edi,(2*sizeof.GLVertex)-offs_vert_pc |
||
989 | stdcall dword[eax],edi,ebx,ecx ;clip_proc[clip_bit](&tmp1.pc,&q[0].pc,&q[1].pc) |
||
990 | sub edi,offs_vert_pc |
||
991 | stdcall updateTmp,[context],edi,[q],[q+4],eax |
||
992 | |||
993 | lea eax,[clip_proc] |
||
994 | mov edi,[clip_bit] |
||
995 | shl edi,2 |
||
996 | add eax,edi |
||
997 | mov edi,ebp |
||
998 | sub edi,sizeof.GLVertex-offs_vert_pc |
||
999 | stdcall dword[eax],edi,ebx,edx ;clip_proc[clip_bit](&tmp2.pc,&q[0].pc,&q[2].pc) |
||
1000 | sub edi,offs_vert_pc |
||
1001 | stdcall updateTmp,[context],edi,[q],[q+8],eax |
||
1002 | |||
1003 | mov edx,[q+8] |
||
1004 | |||
1005 | mov dword[tmp1+offs_vert_edge_flag],1 |
||
1006 | mov eax,[edx+offs_vert_edge_flag] |
||
1007 | mov dword[tmp1+offs_vert_edge_flag],eax ;tmp2.edge_flag = q[2].edge_flag |
||
1008 | mov eax,[clip_bit] |
||
1009 | inc eax |
||
1010 | push eax |
||
1011 | push edi |
||
1012 | sub edi,sizeof.GLVertex |
||
1013 | stdcall gl_draw_triangle_clip,[context],[q],edi ;gl_draw_triangle_clip(c,q[0],&tmp1,&tmp2,clip_bit+1) |
||
5175 | IgorA | 1014 | .end_f: |
1015 | popad |
||
1016 | ret |
||
1017 | endp |
||
5153 | IgorA | 1018 | |
1019 | align 4 |
||
1020 | proc gl_draw_triangle_select uses eax, context:dword, p0:dword,p1:dword,p2:dword |
||
1021 | mov eax,[p2] |
||
1022 | push dword[eax+offs_vert_zp+offs_Z] |
||
1023 | mov eax,[p1] |
||
1024 | push dword[eax+offs_vert_zp+offs_Z] |
||
1025 | mov eax,[p0] |
||
1026 | push dword[eax+offs_vert_zp+offs_Z] |
||
1027 | stdcall gl_add_select1, [context] ;,p0.zp.z, p1.zp.z, p2.zp.z |
||
1028 | ret |
||
1029 | endp |
||
1030 | |||
5175 | IgorA | 1031 | if PROFILE eq 1 |
1032 | count_triangles dd ? |
||
1033 | count_triangles_textured dd ? |
||
1034 | count_pixels dd ? |
||
1035 | end if |
||
5153 | IgorA | 1036 | |
1037 | align 4 |
||
5175 | IgorA | 1038 | proc gl_draw_triangle_fill, context:dword, p0:dword,p1:dword,p2:dword |
1039 | pushad |
||
1040 | if PROFILE eq 1 |
||
5153 | IgorA | 1041 | ; int norm; |
1042 | ; assert(p0->zp.x >= 0 && p0->zp.x < c->zb->xsize); |
||
1043 | ; assert(p0->zp.y >= 0 && p0->zp.y < c->zb->ysize); |
||
1044 | ; assert(p1->zp.x >= 0 && p1->zp.x < c->zb->xsize); |
||
1045 | ; assert(p1->zp.y >= 0 && p1->zp.y < c->zb->ysize); |
||
1046 | ; assert(p2->zp.x >= 0 && p2->zp.x < c->zb->xsize); |
||
1047 | ; assert(p2->zp.y >= 0 && p2->zp.y < c->zb->ysize); |
||
1048 | |||
1049 | ; norm=(p1->zp.x-p0->zp.x)*(p2->zp.y-p0->zp.y)- |
||
1050 | ; (p2->zp.x-p0->zp.x)*(p1->zp.y-p0->zp.y); |
||
1051 | ; count_pixels+=abs(norm)/2; |
||
5175 | IgorA | 1052 | inc dword[count_triangles] |
1053 | end if |
||
5153 | IgorA | 1054 | |
5175 | IgorA | 1055 | mov ebx,[p1] |
1056 | add ebx,offs_vert_zp |
||
1057 | mov ecx,[p2] |
||
1058 | add ecx,offs_vert_zp |
||
5153 | IgorA | 1059 | mov edx,[context] |
1060 | cmp dword[edx+offs_cont_texture_2d_enabled],0 |
||
1061 | je .els_i |
||
1062 | ;if (context.texture_2d_enabled) |
||
5175 | IgorA | 1063 | if PROFILE eq 1 |
1064 | inc dword[count_triangles_textured] |
||
1065 | end if |
||
5153 | IgorA | 1066 | mov eax,dword[edx+offs_cont_current_texture] |
1067 | mov eax,[eax] ;переход по указателю |
||
1068 | ;так как offs_text_images+offs_imag_pixmap = 0 то context.current_texture.images[0].pixmap = [eax] |
||
1069 | stdcall ZB_setTexture, dword[edx+offs_cont_zb],dword[eax] |
||
5175 | IgorA | 1070 | mov eax,[p0] |
1071 | add eax,offs_vert_zp |
||
1072 | stdcall ZB_fillTriangleMappingPerspective, dword[edx+offs_cont_zb],eax,ebx,ecx |
||
5153 | IgorA | 1073 | jmp .end_f |
1074 | .els_i: |
||
5175 | IgorA | 1075 | mov eax,[p0] |
1076 | add eax,offs_vert_zp |
||
1077 | cmp dword[edx+offs_cont_current_shade_model],GL_SMOOTH |
||
1078 | jne .els |
||
1079 | ;else if (context.current_shade_model == GL_SMOOTH) |
||
1080 | stdcall ZB_fillTriangleSmooth, dword[edx+offs_cont_zb],eax,ebx,ecx |
||
1081 | jmp .end_f |
||
1082 | .els: |
||
1083 | stdcall ZB_fillTriangleFlat, dword[edx+offs_cont_zb],eax,ebx,ecx |
||
5153 | IgorA | 1084 | .end_f: |
5175 | IgorA | 1085 | popad |
5153 | IgorA | 1086 | ret |
1087 | endp |
||
1088 | |||
1089 | ; Render a clipped triangle in line mode |
||
1090 | |||
1091 | align 4 |
||
1092 | proc gl_draw_triangle_line uses eax ebx ecx edx, context:dword, p0:dword,p1:dword,p2:dword |
||
1093 | mov edx,[context] |
||
1094 | cmp dword[edx+offs_cont_depth_test],0 |
||
1095 | je .els |
||
1096 | lea ecx,[ZB_line_z] |
||
1097 | jmp @f |
||
1098 | .els: |
||
1099 | lea ecx,[ZB_line] |
||
1100 | @@: |
||
1101 | |||
1102 | ;if (p0.edge_flag) ZB_line_z(context.zb,&p0.zp,&p1.zp) |
||
1103 | mov eax,[p0] |
||
1104 | cmp dword[eax+offs_vert_edge_flag],0 |
||
1105 | je @f |
||
1106 | mov ebx,eax |
||
1107 | add ebx,offs_vert_zp |
||
1108 | mov eax,[p1] |
||
1109 | add eax,offs_vert_zp |
||
1110 | stdcall ecx,dword[edx+offs_cont_zb],ebx,eax |
||
1111 | @@: |
||
1112 | ;if (p1.edge_flag) ZB_line_z(context.zb,&p1.zp,&p2.zp) |
||
1113 | mov eax,[p1] |
||
1114 | cmp dword[eax+offs_vert_edge_flag],0 |
||
1115 | je @f |
||
1116 | mov ebx,eax |
||
1117 | add ebx,offs_vert_zp |
||
1118 | mov eax,[p2] |
||
1119 | add eax,offs_vert_zp |
||
1120 | stdcall ecx,dword[edx+offs_cont_zb],ebx,eax |
||
1121 | @@: |
||
1122 | ;if (p2.edge_flag) ZB_line_z(context.zb,&p2.zp,&p0.zp); |
||
1123 | mov eax,[p2] |
||
1124 | cmp dword[eax+offs_vert_edge_flag],0 |
||
1125 | je @f |
||
1126 | mov ebx,eax |
||
1127 | add ebx,offs_vert_zp |
||
1128 | mov eax,[p0] |
||
1129 | add eax,offs_vert_zp |
||
1130 | stdcall ecx,dword[edx+offs_cont_zb],ebx,eax |
||
1131 | @@: |
||
1132 | |||
1133 | ret |
||
1134 | endp |
||
1135 | |||
1136 | ; Render a clipped triangle in point mode |
||
1137 | align 4 |
||
1138 | proc gl_draw_triangle_point uses eax ebx edx, context:dword, p0:dword,p1:dword,p2:dword |
||
1139 | mov edx,[context] |
||
1140 | mov eax,[p0] |
||
1141 | cmp dword[eax+offs_vert_edge_flag],0 |
||
1142 | je @f |
||
1143 | mov ebx,eax |
||
1144 | add ebx,offs_vert_zp |
||
1145 | stdcall ZB_plot,dword[edx+offs_cont_zb],ebx |
||
1146 | @@: |
||
5187 | IgorA | 1147 | mov eax,[p1] |
5153 | IgorA | 1148 | cmp dword[eax+offs_vert_edge_flag],0 |
1149 | je @f |
||
1150 | mov ebx,eax |
||
1151 | add ebx,offs_vert_zp |
||
1152 | stdcall ZB_plot,dword[edx+offs_cont_zb],ebx |
||
1153 | @@: |
||
5187 | IgorA | 1154 | mov eax,[p2] |
5153 | IgorA | 1155 | cmp dword[eax+offs_vert_edge_flag],0 |
1156 | je @f |
||
1157 | mov ebx,eax |
||
1158 | add ebx,offs_vert_zp |
||
1159 | stdcall ZB_plot,dword[edx+offs_cont_zb],ebx |
||
1160 | @@: |
||
1161 | ret |
||
1162 | endp>>>>>>><>><>>*tmin)>*tmin)> |
||
1163 | |||
1164 | |||
1165 | |||
1166 |