Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8047 leency 1
; Glass like rendering triangle by Maciej Guba.
2
; http://macgub.hekko.pl, macgub3@wp.pl
3
 
4
ROUND2 equ 10
5
glass_tri:
6
;----procedure render glass like triangle with z coord --
7
;----interpolation ( Catmull alghoritm )-----------------
8
;----I normalize normal vector in every pixel -----------
9
;------------------in - eax - x1 shl 16 + y1 ------------
10
;---------------------- ebx - x2 shl 16 + y2 ------------
11
;---------------------- ecx - x3 shl 16 + y3 ------------
12
;---------------------- edx - ptr to stencil_buff -------
13
;---------------------- esi - pointer to Z-buffer filled-
14
;----------------------   with dd float variables--------
15
;---------------------- edi - pointer to screen buffer---
16
;---------------------- xmm0 - 1st normal vector --------
17
;---------------------- xmm1 - 2cond normal vector ------
18
;---------------------- xmm2 - 3rd normal vector --------
19
;---------------------- xmm3 - normalized light vector --
20
;---------------------- xmm4 - lo -> hi z1, z2, z3 coords
21
;----------------------  as dwords floats ---------------
22
;---------------------- xmm5 - lo -> hi y_min, y_max, ---
23
;----------------------  x_min, x_max as dword integers -
24
;---------------------- stack - no parameters -----------
25
;--------------------------------------------------------
26
;----------------- procedure don't save registers !! ----
27
 
28
 
29
 
30
 
31
  push	ebp
32
  mov	ebp,esp
33
  sub	esp,512
34
  sub	ebp,16
35
  and	ebp,0xfffffff0
36
 
37
  .1_nv equ [ebp-16]
38
  .2_nv equ [ebp-32]
39
  .3_nv equ [ebp-48]
40
  .l_v	equ [ebp-64]
41
  .z3	equ [ebp-72]
42
  .z2	equ [ebp-76]
43
  .z1	equ [ebp-80]
44
  .x1	equ [ebp-82]
45
  .y1	equ [ebp-84]
46
  .x2	equ [ebp-86]
47
  .y2	equ [ebp-88]
48
  .x3	equ [ebp-90]
49
  .y3	equ [ebp-92]
50
  .Zbuf equ [ebp-96]
51
  .x_max equ  [ebp-100]
52
  .x_min equ  [ebp-104]
53
  .y_max equ  [ebp-108]
54
  .y_min equ  [ebp-112]
55
  .screen equ [ebp-116]
56
  .dx12   equ [ebp-120]
57
  .dx13   equ [ebp-124]
58
  .dx23   equ [ebp-128]
59
  .dn12   equ [ebp-144]
60
  .dn13   equ [ebp-160]
61
  .dn23   equ [ebp-176]
62
  .dz12   equ [ebp-180]
63
  .dz13   equ [ebp-184]
64
  .dz23   equ [ebp-188]
65
 
66
  .cnv1   equ [ebp-208]  ; cur normal vectors
67
  .cnv2   equ [ebp-224]
68
  .cz2	  equ [ebp-228]
69
  .cz1	  equ [ebp-232]
70
  .stencil_buff equ [ebp-236]
71
 
72
 
73
 
74
 
75
 .sort3:		  ; sort triangle coordinates...
76
       cmp     ax,bx
77
       jle     .sort1
78
       xchg    eax,ebx
79
       shufps  xmm4,xmm4,11100001b
80
       movaps  xmm6,xmm0
81
       movaps  xmm0,xmm1
82
       movaps  xmm1,xmm6
83
 
84
 
85
 .sort1:
86
       cmp	bx,cx
87
       jle	.sort2
88
       xchg	ebx,ecx
89
       shufps	xmm4,xmm4,11011000b
90
       movaps	xmm6,xmm1
91
       movaps	xmm1,xmm2
92
       movaps	xmm2,xmm6
93
 
94
       jmp .sort3
95
 
96
 .sort2:
97
 
98
   movaps .z1,xmm4
99
   mov	  .y1,eax
100
   mov	  .y2,ebx
101
   mov	  .y3,ecx
102
   mov	  .stencil_buff, edx
103
 
104
   movdqa   .y_min,xmm5
105
if 1				; check if at last only fragment
106
   packssdw xmm5,xmm5	    ; of triangle is in visable area
107
   pshuflw  xmm5,xmm5,11011000b
108
   movdqu   xmm7,.y3
109
   movdqa   xmm6,xmm5
110
   pshufd   xmm5,xmm5,0  ; xmm5 lo-hi -> broadcasted y_min, x_min
111
   pshufd   xmm6,xmm6,01010101b ;xmm6 -> brd y_max x_max
112
   movdqa   xmm4,xmm7
113
   pcmpgtw  xmm7,xmm5
114
   pcmpgtw  xmm4,xmm6
115
   pxor     xmm7,xmm4
116
   pmovmskb eax,xmm7
117
   and	    eax,0x00aaaaaa
118
   or	    eax,eax
119
   jz	    .rpt_loop2_end
120
end if
121
   movaps   .1_nv,xmm0
122
   movaps   .2_nv,xmm1
123
   movaps   .3_nv,xmm2
124
   movaps   .l_v,xmm3
125
 ;  mov      .Zbuf,esi
126
   mov	    .screen,edi
127
 
128
 
129
 
130
       mov	bx,.y2	     ; calc deltas
131
       sub	bx,.y1
132
       jnz	.rpt_dx12_make
133
 
134
       xorps	xmm7,xmm7
135
       mov	dword .dx12,0
136
       mov	dword .dz12,0
137
       movaps	.dn12,xmm7
138
       jmp	.rpt_dx12_done
139
 
140
  .rpt_dx12_make:
141
       mov	ax,.x2
142
       sub	ax,.x1
143
       cwde
144
       movsx	ebx,bx
145
       shl	eax,ROUND2
146
       cdq
147
       idiv	ebx
148
       mov	.dx12,eax
149
 
150
       cvtsi2ss xmm6,ebx
151
       movss	xmm5,.z2
152
       subss	xmm5,.z1
153
       divss	xmm5,xmm6
154
       movss	.dz12,xmm5
155
 
156
       movaps	xmm0,.2_nv
157
       subps	xmm0,.1_nv
158
       shufps	xmm6,xmm6,0
159
       divps	xmm0,xmm6
160
       movaps	.dn12,xmm0
161
 
162
 
163
   .rpt_dx12_done:
164
 
165
       mov	bx,.y3	     ; calc deltas
166
       sub	bx,.y1
167
       jnz	.rpt_dx13_make
168
 
169
       xorps	xmm7,xmm7
170
       mov	dword .dx13,0
171
       mov	dword .dz13,0
172
       movaps	.dn13,xmm7
173
       jmp	.rpt_dx13_done
174
 
175
  .rpt_dx13_make:
176
       mov	ax,.x3
177
       sub	ax,.x1
178
       cwde
179
       movsx	ebx,bx
180
       shl	eax,ROUND2
181
       cdq
182
       idiv	ebx
183
       mov	.dx13,eax
184
 
185
       cvtsi2ss xmm6,ebx
186
       movss	xmm5,.z3
187
       subss	xmm5,.z1
188
       divss	xmm5,xmm6
189
       movss	.dz13,xmm5
190
 
191
       movaps	xmm0,.3_nv
192
       subps	xmm0,.1_nv
193
       shufps	xmm6,xmm6,0
194
       divps	xmm0,xmm6
195
       movaps	.dn13,xmm0
196
 
197
   .rpt_dx13_done:
198
 
199
       mov	bx,.y3	     ; calc deltas
200
       sub	bx,.y2
201
       jnz	.rpt_dx23_make
202
 
203
       xorps	xmm7,xmm7
204
       mov	dword .dx23,0
205
       mov	dword .dz23,0
206
       movaps	.dn23,xmm7
207
       jmp	.rpt_dx23_done
208
 
209
  .rpt_dx23_make:
210
       mov	ax,.x3
211
       sub	ax,.x2
212
       cwde
213
       movsx	ebx,bx
214
       shl	eax,ROUND2
215
       cdq
216
       idiv	ebx
217
       mov	.dx23,eax
218
 
219
       cvtsi2ss xmm6,ebx
220
       movss	xmm5,.z3
221
       subss	xmm5,.z2
222
       divss	xmm5,xmm6
223
       movss	.dz23,xmm5
224
 
225
       movaps	xmm0,.3_nv
226
       subps	xmm0,.2_nv
227
       shufps	xmm6,xmm6,0
228
       divps	xmm0,xmm6
229
       movaps	.dn23,xmm0
230
 
231
   .rpt_dx23_done:
232
 
233
 
234
       movsx   eax,word .x1
235
       shl     eax,ROUND2
236
       mov     ebx,eax
237
       mov     edx,.z1
238
       mov     .cz1,edx
239
       mov     .cz2,edx
240
       movaps  xmm0,.1_nv
241
       movaps  .cnv1,xmm0
242
       movaps  .cnv2,xmm0
243
 
244
 
245
       movsx	ecx,word .y1
246
       cmp	cx,.y2
247
 
248
       jge	.rpt_loop1_end
249
 
250
    .rpt_loop1:
251
       pushad
252
 
253
       movaps	xmm2,.y_min
254
       movaps	xmm0,.cnv1
255
       movaps	xmm1,.cnv2
256
       movlps	xmm3,.cz1
257
       movaps	xmm4,.l_v
258
       sar	ebx,ROUND2
259
       sar	eax,ROUND2
260
       mov	edx,.stencil_buff
261
       mov	edi,.screen
262
   ;	mov	 esi,.Zbuf
263
 
264
       call	glass_line
265
 
266
       popad
267
       movaps	xmm0,.cnv1
268
       movaps	xmm1,.cnv2
269
       movss	xmm2,.cz1
270
       movss	xmm3,.cz2
271
       addps	xmm0,.dn13
272
       addps	xmm1,.dn12
273
       addss	xmm2,.dz13
274
       addss	xmm3,.dz12
275
       add	eax,.dx13
276
       add	ebx,.dx12
277
 
278
       movaps	.cnv1,xmm0
279
       movaps	.cnv2,xmm1
280
       movss	.cz1,xmm2
281
       movss	.cz2,xmm3
282
 
283
       add	ecx,1
284
       cmp	cx,.y2
285
       jl	.rpt_loop1
286
 
287
 
288
 
289
 
290
 
291
   .rpt_loop1_end:
292
       movsx	ecx,word .y2
293
       cmp	cx,.y3
294
       jge	.rpt_loop2_end
295
 
296
       movsx	ebx,word .x2			; eax - cur x1
297
       shl	ebx,ROUND2		   ; ebx - cur x2
298
       push	dword .z2
299
       pop	dword .cz2
300
       movaps	xmm0,.2_nv
301
       movaps	.cnv2,xmm0
302
 
303
 
304
     .rpt_loop2:
305
       pushad
306
 
307
       movaps	xmm2,.y_min
308
       movaps	xmm0,.cnv1
309
       movaps	xmm1,.cnv2
310
       movlps	xmm3,.cz1
311
       movaps	xmm4,.l_v
312
       sar	ebx,ROUND2
313
       sar	eax,ROUND2
314
       mov	edx,.stencil_buff
315
       mov	edi,.screen
316
  ;	mov	 esi,.Zbuf
317
 
318
       call	glass_line
319
 
320
       popad
321
       movaps	xmm0,.cnv1
322
       movaps	xmm1,.cnv2
323
       movss	xmm2,.cz1
324
       movss	xmm3,.cz2
325
       addps	xmm0,.dn13
326
       addps	xmm1,.dn23
327
       addss	xmm2,.dz13
328
       addss	xmm3,.dz23
329
       add	eax,.dx13
330
       add	ebx,.dx23
331
 
332
       movaps	.cnv1,xmm0
333
       movaps	.cnv2,xmm1
334
       movss	.cz1,xmm2
335
       movss	.cz2,xmm3
336
 
337
       add	ecx,1
338
       cmp	cx,.y3
339
       jl	.rpt_loop2
340
 
341
    .rpt_loop2_end:
342
 
343
      add   esp,512
344
      pop   ebp
345
 
346
ret
347
align 16
348
glass_line:
349
; in:
350
;    xmm0 - normal vector 1
351
;    xmm1 - normal vect 2
352
;    xmm3 - lo -> hi z1, z2 coords as dwords floats
353
;    xmm2 - lo -> hi y_min, y_max, x_min, x_max
354
;	    as dword integers
355
;    xmm4 - normalized light vector
356
;    eax - x1
357
;    ebx - x2
358
;    ecx - y
359
;    edx - stencil buff ptr
360
;    edi - screen buffer
361
;    esi - z buffer ===> not needed in glass rendering
362
 
363
   push  ebp
364
   mov	 ebp,esp
365
   sub	 esp,256
366
   sub	 ebp,16
367
   and	 ebp,0xfffffff0
368
 
369
 .n1 equ [ebp-16]
370
 .n2 equ [ebp-32]
371
 .lv equ [ebp-48]
372
 .lx1 equ [ebp-52]
373
 .lx2 equ [ebp-56]
374
 .z2 equ [ebp-60]
375
 .z1 equ [ebp-64]
376
 .screen equ [ebp-68]
377
 .zbuff  equ [ebp-72]
378
 .x_max  equ [ebp-74]
379
 .x_min  equ [ebp-76]
380
 .y_max  equ [ebp-78]
381
 .y_min  equ [ebp-80]
382
 .dn	 equ [ebp-96]
383
 .dz	 equ [ebp-100]
384
 .y	 equ [ebp-104]
385
 .cnv	 equ [ebp-128]
386
 .col_sum_b  equ [ebp-136]
387
 .col_sum_g  equ [ebp-140]
388
 .col_sum_r  equ [ebp-144]
389
 .cur_col equ [ebp-160]
390
 .stencil_buf equ [ebp-164]
391
 
392
	mov    .y,ecx
393
	packssdw xmm2,xmm2
394
	movq   .y_min,xmm2
395
	cmp    cx,.y_min
396
	jl     .end_rp_line
397
	cmp    cx,.y_max
398
	jge    .end_rp_line	     ;
399
 
400
	cmp	eax,ebx
401
	je	.end_rp_line
402
	jl	@f
403
	xchg	eax,ebx
404
	movaps	xmm7,xmm0
405
	movaps	xmm0,xmm1
406
	movaps	xmm1,xmm7
407
	shufps	xmm3,xmm3,11100001b
408
   @@:
409
 
410
	cmp	ax,.x_max
411
	jge	.end_rp_line
412
	cmp	bx,.x_min
413
	jle	.end_rp_line
414
	movaps	.lv,xmm4
415
	movaps	.n1,xmm0
416
	movaps	.n2,xmm1
417
	mov	.lx1,eax
418
	mov	.lx2,ebx
419
	mov	.stencil_buf,edx
420
	movlps	.z1,xmm3
421
 
422
	sub	ebx,eax
423
	cvtsi2ss xmm7,ebx
424
	shufps	xmm7,xmm7,0
425
	subps	xmm1,xmm0
426
	divps	xmm1,xmm7
427
	movaps	.dn,xmm1
428
	psrldq	xmm3,4
429
	subss	xmm3,.z1
430
	divss	xmm3,xmm7
431
	movss	.dz,xmm3
432
 
433
 
434
 
435
	mov	 ebx,.lx1
436
	cmp	 bx,.x_min     ; clipping on function4
437
	jge	 @f
438
	movzx	 eax,word .x_min
439
	sub	 eax,ebx
440
	cvtsi2ss xmm7,eax
441
	shufps	 xmm7,xmm7,0
442
	mulss	 xmm3,xmm7
443
	mulps	 xmm1,xmm7
444
	addss	 xmm3,.z1
445
	addps	 xmm1,.n1
446
	movsx	 eax,word .x_min
447
	movss	 .z1,xmm3
448
	movaps	 .n1,xmm1
449
	mov	 dword .lx1,eax
450
 
451
      @@:
452
	movzx	eax,word .x_max
453
	cmp	.lx2,eax
454
	jl	@f
455
	mov	.lx2,eax
456
      @@:
457
	movzx	eax,word[xres_var]
458
	mul	dword .y
459
 
460
 
461
	add	eax,.lx1
462
	shl	eax,2
463
	add	edi,eax
464
	mov	ebx,eax
465
	add	ebx,.stencil_buf
466
 
467
 
468
	mov	ecx,.lx2
469
	sub	ecx,.lx1
470
 
471
 
472
	movaps	xmm0,.n1
473
	movss	xmm2,.z1
474
align 16
475
   .ddraw:
476
	movaps	 xmm7,xmm0
477
	mulps	 xmm7,xmm7 ; normalize
478
	haddps	 xmm7,xmm7
479
	haddps	 xmm7,xmm7
480
	rsqrtps  xmm7,xmm7
481
	mulps	 xmm7,xmm0
482
	maxps	 xmm7,[the_zero]
483
	movups	 .cnv,xmm7
484
 
485
	mov	 edx,lights_aligned  ; lights_aligned - global variable
486
	xorps	 xmm1,xmm1	     ; instead global can be used .lv - light vect.
487
 
488
      .again_col:
489
	movups	  xmm7,.cnv
490
	mulps	  xmm7,[edx]
491
	haddps	  xmm7,xmm7
492
	haddps	  xmm7,xmm7
493
    if 0
494
	cmp	  [bump_flag],1   ; on/off temporaly
495
				  ; depend on bump button
496
	je	  @f
497
	; stencil
498
	movss	  xmm5,xmm2
499
	movss	  xmm6,xmm2
500
	addss	  xmm5,[aprox]
501
	subss	  xmm6,[aprox]
502
      ; Stencil buffer for now not work as I expected,
503
      ; moreover - it not work at all.
504
	cmpnltss  xmm5,dword[ebx]
505
	cmpnltss  xmm6,dword[ebx]
506
	xorps	  xmm5,xmm6
507
	xorps	  xmm6,xmm6
508
	movd	  eax,xmm5
509
	cmp	  eax,-1
510
	jne	  .no_reflective
511
   end if
512
     @@:
513
	movaps	  xmm6,xmm7
514
	mulps	  xmm6,xmm6
515
	mulps	  xmm6,xmm6
516
 
517
	mulps	  xmm6,xmm6
518
	mulps	  xmm6,[edx+48]
519
      .no_reflective:
520
	mulps	  xmm7,[edx+16]
521
	addps	  xmm7,xmm6
522
	addps	  xmm7,[edx+32]
523
	minps	  xmm7,[mask_255f]   ; global
524
 
525
 
526
	maxps	  xmm1,xmm7
527
	add	  edx,64     ; size of one light in aligned list
528
	cmp	  edx,lights_aligned_end
529
	jl	  .again_col
530
	cvtps2dq  xmm1,xmm1
531
	movd	  xmm6,[edi]
532
	packssdw  xmm1,xmm1
533
	packuswb  xmm1,xmm1
534
	paddusb   xmm1,xmm6
535
	movd	  [edi],xmm1
536
 
537
 
538
     .skip:
539
	add	 edi,4
540
	add	 ebx,4	; stencil_buff
541
	addps	 xmm0,.dn
542
	addss	 xmm2,.dz
543
	sub	 ecx,1
544
	jnz	 .ddraw
545
 
546
  .end_rp_line:
547
	add	 esp,256
548
	pop	 ebp
549
 
550
ret