Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1245 hidnplayr 1
 
2
;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1
3
;ROUND equ 8
4
;Ext = NON
5
;MMX = 1
6
;NON = 0
7
;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great---
8
;------- DOS 13h mode demos --------------------------------------------
9
;------- Procedure draws bump triangle with texture, I use -------------
10
;--------Catmull Z-buffer algorithm- (Z coordinate interpolation)-------
11
;--------I calc texture pixel by this way: col1*col2/256 ---------------
12
bump_tex_triangle_z:
13
;------------------in - eax - x1 shl 16 + y1 -----------
14
;---------------------- ebx - x2 shl 16 + y2 -----------
15
;---------------------- ecx - x3 shl 16 + y3 -----------
16
;---------------------- edx - pointer to bump map-------
17
;---------------------- esi - pointer to env map--------
18
;---------------------- edi - pointer to screen buffer--
19
;---------------------- stack : bump coordinates--------
20
;----------------------         environment coordinates-
21
;----------------------         Z position coordinates--
22
;----------------------         pointer to Z buffer-----
23
;----------------------         pointer to texture------
24
;----------------------         texture coordinates-----
25
;-- Z-buffer - filled with coordinates as dword --------
26
;-- (Z coor. as word) shl CATMULL_SHIFT ----------------
27
.b_x1	equ ebp+4   ; procedure don't save registers !!!
28
.b_y1	equ ebp+6   ; each coordinate as word
29
.b_x2	equ ebp+8
30
.b_y2	equ ebp+10	 ; b - bump map coords
31
.b_x3	equ ebp+12	 ; e - env map coords
32
.b_y3	equ ebp+14
33
.e_x1	equ ebp+16
34
.e_y1	equ ebp+18
35
.e_x2	equ ebp+20
36
.e_y2	equ ebp+22
37
.e_x3	equ ebp+24
38
.e_y3	equ ebp+26
39
.z1	equ word[ebp+28]
40
.z2	equ word[ebp+30]
41
.z3	equ word[ebp+32]
42
.z_buff equ dword[ebp+34]	; pointer to Z-buffer
43
.tex_ptr equ dword[ebp+38]	; ptr to texture
44
.t_x1	equ ebp+42		; texture coords
45
.t_y1	equ ebp+44
46
.t_x2	equ ebp+46
47
.t_y2	equ ebp+48
48
.t_x3	equ ebp+50
49
.t_y3	equ ebp+52
50
51
 
52
 
53
 
54
.t_emap equ dword[ebp-8]	; pointer to env map
55
.x1	equ word[ebp-10]
56
.y1	equ word[ebp-12]
57
.x2	equ word[ebp-14]
58
.y2	equ word[ebp-16]
59
.x3	equ word[ebp-18]
60
.y3	equ word[ebp-20]
61
62
 
63
.dz12	equ	 [ebp-28]
64
.dbx12	equ dword[ebp-32]
65
.dby12	equ	 [ebp-36]
66
.dex12	equ dword[ebp-40]
67
.dey12	equ	 [ebp-44]
68
.dtx12	equ dword[ebp-48]
69
.dty12	equ	 [ebp-52]
70
71
 
72
.dz13  equ	[ebp-52-4*2]
73
.dbx13 equ dword[ebp-52-4*3]
74
.dby13 equ	[ebp-52-4*4]
75
.dex13 equ dword[ebp-52-4*5]
76
.dey13 equ	[ebp-52-4*6]
77
.dtx13 equ dword[ebp-52-4*7]
78
.dty13 equ	[ebp-52-4*8]
79
80
 
81
 
82
.dz23  equ	[ebp-(52+4*10)]
83
.dbx23 equ dword[ebp-(52+4*11)]
84
.dby23 equ	[ebp-(52+4*12)]
85
.dex23 equ dword[ebp-(52+4*13)]
86
.dey23 equ	[ebp-(52+4*14)]
87
.dtx23 equ dword[ebp-(52+4*15)]
88
.dty23 equ	[ebp-(52+4*16)]
89
90
 
91
.cz1   equ	[ebp-(52+4*18)]
92
.cx2   equ dword[ebp-(52+4*19)]
93
.cz2   equ	[ebp-(52+4*20)]
94
.cbx1  equ dword[ebp-(52+4*21)]
95
.cby1  equ	[ebp-(52+4*22)]
96
.cbx2  equ dword[ebp-(52+4*23)]
97
.cby2  equ	[ebp-(52+4*24)]
98
.cex1  equ dword[ebp-(52+4*25)]
99
.cey1  equ	[ebp-(52+4*26)]
100
.cex2  equ dword[ebp-(52+4*27)]
101
.cey2  equ	[ebp-(52+4*28)]
102
103
 
104
.cty1  equ	[ebp-(52+4*30)]
105
.ctx2  equ dword[ebp-(52+4*31)]
106
.cty2  equ	[ebp-(52+4*32)]
107
108
 
109
       mov     ebp,esp
110
       push    edx	  ; store bump map
111
       push    esi	  ; store e. map
112
     ; sub     esp,120
113
 .sort3:		  ; sort triangle coordinates...
114
       cmp     ax,bx
115
       jle     .sort1
116
       xchg    eax,ebx
117
       mov     edx,dword[.b_x1]
118
       xchg    edx,dword[.b_x2]
119
       mov     dword[.b_x1],edx
120
       mov     edx,dword[.e_x1]
121
       xchg    edx,dword[.e_x2]
122
       mov     dword[.e_x1],edx
123
       mov     edx,dword[.t_x1]
124
       xchg    edx,dword[.t_x2]
125
       mov     dword[.t_x1],edx
126
       mov     dx,.z1
127
       xchg    dx,.z2
128
       mov     .z1,dx
129
 .sort1:
130
       cmp	bx,cx
131
       jle	.sort2
132
       xchg	ebx,ecx
133
       mov	edx,dword[.b_x2]
134
       xchg	edx,dword[.b_x3]
135
       mov	dword[.b_x2],edx
136
       mov	edx,dword[.e_x2]
137
       xchg	edx,dword[.e_x3]
138
       mov	dword[.e_x2],edx
139
       mov	edx,dword[.t_x2]
140
       xchg	edx,dword[.t_x3]
141
       mov	dword[.t_x2],edx
142
       mov     dx,.z2
143
       xchg    dx,.z3
144
       mov     .z2,dx
145
       jmp	.sort3
146
 .sort2:
147
       push	eax	; store triangle coords in variables
148
       push	ebx
149
       push	ecx
150
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
151
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
152
	 and	  edx,ecx
153
	 and	  edx,eax
154
	 test	  edx,80008000h  ; Check both X&Y at once
155
	 jne	  .loop23_done
156
    ;   mov     edx,eax         ; eax,ebx,ecx are ORd together into edx which means that
157
    ;   or      edx,ebx         ; if any *one* of them is negative a sign flag is raised
158
    ;   or      edx,ecx
159
    ;   test    edx,80000000h   ; Check only X
160
    ;   jne     .loop23_done
161
162
 
163
    ;   jg      .loop23_done
164
    ;   cmp     .x2,SIZE_X     ; This can be optimized with effort
165
    ;   jg      .loop23_done
166
    ;   cmp     .x3,SIZE_X
167
    ;   jg      .loop23_done    ; {
168
169
 
170
 
171
       sub	bx,.y1
172
       jnz	.bt_dx12_make
173
       mov	ecx,8
174
       xor	edx,edx
175
     @@:
176
       push	edx   ;dword 0
177
       loop	@b
178
       jmp	.bt_dx12_done
179
 .bt_dx12_make:
180
181
 
182
       sub	ax,.x1
183
       cwde
184
       movsx	ebx,bx
185
       shl	eax,ROUND
186
       cdq
187
       idiv	ebx
188
 ;     mov      .dx12,eax
189
       push	 eax
190
191
 
192
       sub     ax,.z1
193
       cwde
194
       shl     eax,CATMULL_SHIFT
195
       cdq
196
       idiv    ebx
197
       push    eax
198
199
 
200
201
 
202
   ;    mov       eax,256
203
       cvtsi2ss  xmm4,[i255d]
204
       cvtsi2ss  xmm3,ebx	     ;rcps
205
       divss	 xmm3,xmm4
206
       shufps	 xmm3,xmm3,0
207
208
 
209
       movd	 mm1,[.b_x2]
210
       movd	 mm2,[.e_x1]
211
       movd	 mm3,[.e_x2]
212
213
 
214
       punpcklwd  mm0,mm4
215
       punpcklwd  mm1,mm4
216
       punpcklwd  mm2,mm4
217
       punpcklwd  mm3,mm4
218
219
 
220
       psubd	  mm3,mm2
221
222
 
223
       movlhps	 xmm1,xmm1
224
       cvtpi2ps  xmm1,mm3
225
226
 
227
228
 
229
			     ;xmm1--> | dbx | dby | dex | dey |
230
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
231
       movhlps	 xmm1,xmm1
232
       cvtps2pi  mm1,xmm1
233
       movq	 .dey12,mm0
234
       movq	 .dby12,mm1
235
;-------------
236
;       mov       ax,.z2
237
;       sub       ax,.z1
238
;       cwde
239
;       mov       bx,.x2
240
;       sub       bx,.x1
241
;       movsx     ebx,bx
242
;       movd      mm1,eax
243
;       psllq     mm1,32
244
;       movd      mm1,ebx
245
;;       push      ebx
246
;;       push      eax
247
;;       movq      mm1,[esp]
248
;;       add       esp,8
249
;;;       mov       ax,.z1
250
;;;       mov       bx,.z2
251
;;;       shl       eax,16
252
;;;       shl       ebx,16
253
;;;       mov       ax,.x1
254
;;;       mov       bx,.x2
255
;       movd       mm2,[.t_x1]
256
;       movd       mm3,[.t_x2]
257
;;       movd      mm0,eax
258
;;       movd      mm1,ebx
259
260
 
261
;;       punpcklwd  mm0,mm4
262
;;       punpcklwd  mm1,mm4
263
;       punpcklwd  mm2,mm4
264
;       punpcklwd  mm3,mm4
265
266
 
267
;       psubd      mm3,mm2
268
269
 
270
 
271
;       movlhps   xmm1,xmm1
272
;       cvtpi2ps  xmm1,mm3
273
274
 
275
276
 
277
			     ; xmm1--> | dx | dz | dtx | dty |
278
;       cvtps2pi  mm0,xmm1    ; mm0 -> 2 delta dwords  | dtx | dty |
279
;       movhlps   xmm1,xmm1
280
;       cvtps2pi  mm1,xmm1    ; mm1 --> 2 delta dwords | dx | dz |
281
;       movq      .dty12,mm0
282
;       movq      .dz12,mm1
283
else
284
285
 
286
       sub	ax,word[.b_x1]
287
       cwde
288
       shl	eax,ROUND
289
       cdq
290
       idiv	ebx
291
 ;     mov      .dbx12,eax
292
       push	 eax
293
294
 
295
       sub	ax,word[.b_y1]
296
       cwde
297
       shl	eax,ROUND
298
       cdq
299
       idiv	ebx
300
 ;     mov      .dby12,eax
301
       push	 eax
302
303
 
304
       sub	ax,word[.e_x1]
305
       cwde
306
       shl	eax,ROUND
307
       cdq
308
       idiv	ebx
309
 ;     mov      .dex12,eax
310
       push	 eax
311
312
 
313
       sub	ax,word[.e_y1]
314
       cwde
315
       shl	eax,ROUND
316
       cdq
317
       idiv	ebx
318
 ;     mov      .dey12,eax
319
       push	 eax
320
321
 
322
323
 
324
       sub	ax,word[.t_x1]
325
       cwde
326
       shl	eax,ROUND
327
       cdq
328
       idiv	ebx
329
 ;     mov      .dtx12,eax
330
       push	 eax
331
332
 
333
       sub	ax,word[.t_y1]
334
       cwde
335
       shl	eax,ROUND
336
       cdq
337
       idiv	ebx
338
 ;     mov      .dty12,eax
339
       push	 eax
340
341
 
342
343
 
344
       sub	bx,.y1
345
       jnz	.bt_dx13_make
346
       mov	ecx,8
347
       xor	edx,edx
348
     @@:
349
       push	edx   ;dword 0
350
       loop	@b
351
       jmp	.bt_dx13_done
352
 .bt_dx13_make:
353
       mov	ax,.x3
354
       sub	ax,.x1
355
       cwde
356
       movsx	ebx,bx
357
       shl	eax,ROUND
358
       cdq
359
       idiv	ebx
360
 ;     mov      .dx13,eax
361
       push	 eax
362
363
 
364
       sub     ax,.z1
365
       cwde
366
       shl     eax,CATMULL_SHIFT
367
       cdq
368
       idiv    ebx
369
  ;    mov    .dz13,eax
370
       push    eax
371
372
 
373
374
 
375
   ;    mov       eax,255
376
       cvtsi2ss  xmm4,[i255d]
377
       cvtsi2ss  xmm3,ebx	     ;rcps
378
       divss	 xmm3,xmm4
379
       shufps	 xmm3,xmm3,0
380
381
 
382
       movd	 mm1,[.b_x3]
383
       movd	 mm2,[.e_x1]
384
       movd	 mm3,[.e_x3]
385
386
 
387
       punpcklwd  mm0,mm4
388
       punpcklwd  mm1,mm4
389
       punpcklwd  mm2,mm4
390
       punpcklwd  mm3,mm4
391
392
 
393
       psubd	  mm3,mm2
394
395
 
396
       movlhps	 xmm1,xmm1
397
       cvtpi2ps  xmm1,mm3
398
399
 
400
401
 
402
			     ;xmm1--> | dbx | dby | dex | dey |
403
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
404
       movhlps	 xmm1,xmm1
405
       cvtps2pi  mm1,xmm1
406
       movq	 .dey13,mm0
407
       movq	 .dby13,mm1
408
else
409
       mov	ax,word[.b_x3]
410
       sub	ax,word[.b_x1]
411
       cwde
412
       shl	eax,ROUND
413
       cdq
414
       idiv	ebx
415
 ;     mov      .dbx13,eax
416
       push	 eax
417
418
 
419
       sub	ax,word[.b_y1]
420
       cwde
421
       shl	eax,ROUND
422
       cdq
423
       idiv	ebx
424
 ;     mov      .dby13,eax
425
       push	 eax
426
427
 
428
       sub	ax,word[.e_x1]
429
       cwde
430
       shl	eax,ROUND
431
       cdq
432
       idiv	ebx
433
 ;     mov      .dex13,eax
434
       push	 eax
435
436
 
437
       sub	ax,word[.e_y1]
438
       cwde
439
       shl	eax,ROUND
440
       cdq
441
       idiv	ebx
442
 ;     mov      .dey13,eax
443
       push	 eax
444
end if
445
446
 
447
       sub	ax,word[.t_x1]
448
       cwde
449
       shl	eax,ROUND
450
       cdq
451
       idiv	ebx
452
 ;     mov      .dtx13,eax
453
       push	 eax
454
455
 
456
       sub	ax,word[.t_y1]
457
       cwde
458
       shl	eax,ROUND
459
       cdq
460
       idiv	ebx
461
 ;     mov      .dty13,eax
462
       push	 eax
463
464
 
465
466
 
467
       sub	bx,.y2
468
       jnz	.bt_dx23_make
469
       mov	ecx,8
470
       xor	edx,edx
471
     @@:
472
       push	edx   ;dword 0
473
       loop	@b
474
       jmp	.bt_dx23_done
475
 .bt_dx23_make:
476
       mov	ax,.x3
477
       sub	ax,.x2
478
       cwde
479
       movsx	ebx,bx
480
       shl	eax,ROUND
481
       cdq
482
       idiv	ebx
483
 ;     mov      .dx23,eax
484
       push	 eax
485
486
 
487
       sub     ax,.z2
488
       cwde
489
       shl     eax,CATMULL_SHIFT
490
       cdq
491
       idiv    ebx
492
     ; mov     .dz23,eax
493
       push    eax
494
495
 
496
497
 
498
    ;   mov       eax,255
499
       cvtsi2ss  xmm4,[i255d]
500
       cvtsi2ss  xmm3,ebx	     ;rcps
501
       divss	 xmm3,xmm4
502
       shufps	 xmm3,xmm3,0
503
504
 
505
       movd	 mm1,[.b_x3]
506
       movd	 mm2,[.e_x2]
507
       movd	 mm3,[.e_x3]
508
509
 
510
       punpcklwd  mm0,mm4
511
       punpcklwd  mm1,mm4
512
       punpcklwd  mm2,mm4
513
       punpcklwd  mm3,mm4
514
515
 
516
       psubd	  mm3,mm2
517
518
 
519
       movlhps	 xmm1,xmm1
520
       cvtpi2ps  xmm1,mm3
521
522
 
523
524
 
525
			     ;xmm1--> | dbx | dby | dex | dey |
526
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
527
       movhlps	 xmm1,xmm1
528
       cvtps2pi  mm1,xmm1
529
       movq	 .dey23,mm0
530
       movq	 .dby23,mm1
531
else
532
       mov	ax,word[.b_x3]
533
       sub	ax,word[.b_x2]
534
       cwde
535
       shl	eax,ROUND
536
       cdq
537
       idiv	ebx
538
 ;     mov      .dbx23,eax
539
       push	 eax
540
541
 
542
       sub	ax,word[.b_y2]
543
       cwde
544
       shl	eax,ROUND
545
       cdq
546
       idiv	ebx
547
 ;     mov      .dby23,eax
548
       push	 eax
549
550
 
551
       sub	ax,word[.e_x2]
552
       cwde
553
       shl	eax,ROUND
554
       cdq
555
       idiv	ebx
556
 ;     mov      .dex23,eax
557
       push	 eax
558
559
 
560
       sub	ax,word[.e_y2]
561
       cwde
562
       shl	eax,ROUND
563
       cdq
564
       idiv	ebx
565
 ;     mov      .dey23,eax
566
       push	 eax
567
end if
568
569
 
570
       sub	ax,word[.t_x2]
571
       cwde
572
       shl	eax,ROUND
573
       cdq
574
       idiv	ebx
575
 ;     mov      .dtx23,eax
576
       push	 eax
577
578
 
579
       sub	ax,word[.t_y2]
580
       cwde
581
       shl	eax,ROUND
582
       cdq
583
       idiv	ebx
584
 ;     mov      .dty23,eax
585
       push	 eax
586
587
 
588
   .bt_dx23_done:
589
       sub	 esp,64
590
       movsx	eax,.x1
591
       shl	eax,ROUND
592
       mov	.cx1,eax
593
       mov	.cx2,eax
594
  ;     push     eax
595
  ;     push     eax
596
597
 
598
       shl	ebx,ROUND
599
       mov	.cbx1,ebx
600
       mov	.cbx2,ebx
601
      ; push     ebx
602
      ; push     ebx
603
604
 
605
       shl	ecx,ROUND
606
       mov	.cby1,ecx
607
       mov	.cby2,ecx
608
      ; push     ecx
609
      ; push     ecx
610
611
 
612
       shl	edx,ROUND
613
       mov	.cex1,edx
614
       mov	.cex2,edx
615
    ;   push     edx
616
    ;   push     edx
617
618
 
619
       shl	eax,ROUND
620
       mov	.cey1,eax
621
       mov	.cey2,eax
622
    ;   push     eax
623
    ;   push     eax
624
625
 
626
       shl	ebx,CATMULL_SHIFT
627
       mov	.cz1,ebx
628
       mov	.cz2,ebx
629
   ;    push     ebx
630
   ;    push     ebx
631
632
 
633
       movsx	ecx,word[.t_x1]
634
       shl	ecx,ROUND
635
       mov	.ctx1,ecx
636
       mov	.ctx2,ecx
637
       ;push     ecx
638
       ;push     ecx
639
640
 
641
       shl	edx,ROUND
642
       mov	.cty1,edx
643
       mov	.cty2,edx
644
      ; push     edx
645
      ; push     edx
646
647
 
648
 
649
       cmp	cx,.y2
650
       jge	.loop12_done
651
  .loop12:
652
       call	.call_line
653
654
 
655
       movq	mm0,.cby2
656
       movq	mm1,.cby1
657
       movq	mm2,.cey2
658
       movq	mm3,.cey1
659
       movq	mm4,.cty1
660
       movq	mm5,.cty2
661
       movq	mm6,.cz1
662
       movq	mm7,.cz2
663
       paddd	mm0,.dby12
664
       paddd	mm1,.dby13
665
       paddd	mm2,.dey12
666
       paddd	mm3,.dey13
667
       paddd	mm4,.dty13
668
       paddd	mm5,.dty12
669
       paddd	mm6,.dz13
670
       paddd	mm7,.dz12
671
       movq	.cby2,mm0
672
       movq	.cby1,mm1
673
       movq	.cey1,mm3
674
       movq	.cey2,mm2
675
       movq	.cty1,mm4
676
       movq	.cty2,mm5
677
       movq	.cz1,mm6
678
       movq	.cz2,mm7
679
else
680
       mov	edx,.dbx13
681
       add	.cbx1,edx
682
       mov	eax,.dbx12
683
       add	.cbx2,eax
684
       mov	ebx,.dby13
685
       add	.cby1,ebx
686
       mov	edx,.dby12
687
       add	.cby2,edx
688
689
 
690
       add	.cex1,eax
691
       mov	ebx,.dex12
692
       add	.cex2,ebx
693
       mov	edx,.dey13
694
       add	.cey1,edx
695
       mov	eax,.dey12
696
       add	.cey2,eax
697
698
 
699
       add	.ctx1,eax
700
       mov	ebx,.dtx12
701
       add	.ctx2,ebx
702
       mov	edx,.dty13
703
       add	.cty1,edx
704
       mov	eax,.dty12
705
       add	.cty2,eax
706
707
 
708
       add	.cx1,eax
709
       mov	ebx,.dx12
710
       add	.cx2,ebx
711
       mov	ebx,.dz13
712
       add	.cz1,ebx
713
       mov	edx,.dz12
714
       add	.cz2,edx
715
end if
716
       inc	ecx
717
       cmp	cx,.y2
718
       jl	.loop12
719
    .loop12_done:
720
721
 
722
       cmp	cx,.y3
723
       jge	.loop23_done
724
725
 
726
       shl	eax,CATMULL_SHIFT
727
       mov	.cz2,eax
728
729
 
730
       shl	ebx,ROUND
731
       mov	.cx2,ebx
732
733
 
734
       shl	edx,ROUND
735
       mov	.cbx2,edx
736
737
 
738
       shl	eax,ROUND
739
       mov	.cby2,eax
740
741
 
742
       shl	ebx,ROUND
743
       mov	.cex2,ebx
744
745
 
746
       shl	edx,ROUND
747
       mov	.cey2,edx
748
749
 
750
       shl	eax,ROUND
751
       mov	.ctx2,eax
752
753
 
754
       shl	ebx,ROUND
755
       mov	.cty2,ebx
756
757
 
758
       call	.call_line
759
760
 
761
       movq	mm0,.cby2
762
       movq	mm1,.cby1
763
       movq	mm2,.cey2
764
       movq	mm3,.cey1
765
       movq	mm4,.cty1
766
       movq	mm5,.cty2
767
       movq	mm6,.cz1
768
       movq	mm7,.cz2
769
       paddd	mm0,.dby23
770
       paddd	mm1,.dby13
771
       paddd	mm2,.dey23
772
       paddd	mm3,.dey13
773
       paddd	mm4,.dty13
774
       paddd	mm5,.dty23
775
       paddd	mm6,.dz13
776
       paddd	mm7,.dz23
777
       movq	.cby2,mm0
778
       movq	.cby1,mm1
779
       movq	.cey2,mm2
780
       movq	.cey1,mm3
781
       movq	.cty1,mm4
782
       movq	.cty2,mm5
783
       movq	.cz1,mm6
784
       movq	.cz2,mm7
785
else
786
       mov	edx,.dbx13
787
       add	.cbx1,edx
788
       mov	eax,.dbx23
789
       add	.cbx2,eax
790
       mov	ebx,.dby13
791
       add	.cby1,ebx
792
       mov	edx,.dby23
793
       add	.cby2,edx
794
795
 
796
       add	.cex1,eax
797
       mov	ebx,.dex23
798
       add	.cex2,ebx
799
       mov	edx,.dey13
800
       add	.cey1,edx
801
       mov	eax,.dey23
802
       add	.cey2,eax
803
804
 
805
       add	.cx1,eax
806
       mov	ebx,.dx23
807
       add	.cx2,ebx
808
       mov	ebx,.dz13
809
       add	.cz1,ebx
810
       mov	edx,.dz23
811
       add	.cz2,edx
812
813
 
814
       add	.ctx1,eax
815
       mov	ebx,.dtx23
816
       add	.ctx2,ebx
817
       mov	edx,.dty13
818
       add	.cty1,edx
819
       mov	eax,.dty23
820
       add	.cty2,eax
821
822
 
823
       inc	ecx
824
       cmp	cx,.y3
825
       jl	.loop23
826
    .loop23_done:
827
828
 
829
ret   50
830
831
 
832
833
 
834
       push	.tex_ptr
835
       push	dword .cty2
836
       push	.ctx2
837
       push	dword .cty1
838
       push	.ctx1
839
       push	dword .cz1
840
       push	dword .cz2
841
       push	.z_buff
842
       push	.t_emap
843
       push	.t_bmap
844
       push	dword .cey2
845
       push	.cex2
846
       push	dword .cey1
847
       push	.cex1
848
       push	dword .cby2
849
       push	.cbx2
850
       push	dword .cby1
851
       push	.cbx1
852
       push	ecx
853
854
 
855
       sar	eax,ROUND
856
       mov	ebx,.cx2
857
       sar	ebx,ROUND
858
859
 
860
861
 
862
ret
863
bump_tex_line_z:
864
;--------------in: eax - x1
865
;--------------    ebx - x2
866
;--------------    edi - pointer to screen buffer
867
;stack - another parameters :
868
.y	equ dword [ebp+4]
869
.bx1q	equ	  [ebp+8]
870
.bx2q	equ	  [ebp+16]
871
.ex1q	equ	  [ebp+24]
872
.ex2q	equ	  [ebp+32]
873
.tx1q	equ	  [ebp+60]
874
.tx2q	equ	  [ebp+68]
875
;.bx1q   equ       [ebp+8]
876
;.bx2q   equ       [ebp+16]
877
;.ex1q   equ       [ebp+24]
878
;.exyq   equ       [ebp+32]
879
.bx1	equ dword [ebp+8]   ;   ---
880
.by1	equ dword [ebp+12]  ;       |
881
.bx2	equ dword [ebp+16]  ;       |
882
.by2	equ dword [ebp+20]  ;       |>   b. map and e. map coords
883
.ex1	equ dword [ebp+24]  ;       |>   shifted shl ROUND
884
.ey1	equ dword [ebp+28]  ;       |
885
.ex2	equ dword [ebp+32]  ;       |
886
.ey2	equ dword [ebp+36]  ;   ---
887
.bmap	equ dword [ebp+40]  ; bump map offset
888
.emap	equ dword [ebp+44]  ; env map offset
889
.z_buff equ dword [ebp+48]
890
.z2	equ dword [ebp+52]  ;   -- |>   z coords shifted
891
.z1	equ dword [ebp+56]  ;   --       shl  CATMULL_SHIFT
892
893
 
894
.ty1	equ dword [ebp+64]  ;       |>   shifted shl ROUND
895
.tx2	equ dword [ebp+68]  ;       |
896
.ty2	equ dword [ebp+72]  ;   ---
897
.tex_map equ dword [ebp+76]  ; texture offset  ( pointer )
898
899
 
900
 
901
.x2	equ dword [ebp-8]
902
.dbx	equ dword [ebp-12]
903
.dby	equ dword [ebp-16]
904
.dbyq	equ qword [ebp-16]  ; - new
905
.dex	equ dword [ebp-20]
906
.dey	equ dword [ebp-24]
907
.deyq	equ qword [ebp-24]  ; - new
908
.dz	equ dword [ebp-28]
909
.dtx	equ dword [ebp-32]
910
.dty	equ dword [ebp-36]
911
.dtyq	equ qword [ebp-36]
912
913
 
914
.cby	equ dword [ebp-44]
915
.cbyq	equ qword [ebp-44]  ; - new
916
.cex	equ dword [ebp-48]
917
.cey	equ dword [ebp-52]
918
.ceyq	equ qword [ebp-52]  ; - new
919
.cz	equ dword [ebp-56]
920
.czbuff equ dword [ebp-60]
921
.ctx	equ dword [ebp-64]
922
.cty	equ dword [ebp-68]
923
.ctyq	equ qword [ebp-68]
924
.c_scr	equ dword [ebp-72]
925
926
 
927
.temp2	equ	   ebp-88
928
.temp3	equ	   ebp-76
929
.temp4	equ	   ebp-84
930
.temp5	equ	   ebp-92
931
932
 
933
934
 
935
 
936
 
937
	or	ecx,ecx
938
	jl	.bl_end
939
	cmp	ecx,SIZE_Y
940
	jge	.bl_end
941
942
 
943
	jl	.bl_ok
944
	je	.bl_end
945
946
 
947
if Ext=NON
948
	mov	edx,.bx1
949
	xchg	edx,.bx2
950
	mov	.bx1,edx
951
	mov	edx,.by1
952
	xchg	edx,.by2
953
	mov	.by1,edx
954
955
 
956
	xchg	edx,.ex2
957
	mov	.ex1,edx
958
	mov	edx,.ey1
959
	xchg	edx,.ey2
960
	mov	.ey1,edx
961
962
 
963
	xchg	edx,.tx2
964
	mov	.tx1,edx
965
	mov	edx,.ty1
966
	xchg	edx,.ty2
967
	mov	.ty1,edx
968
else
969
	movq	mm0,.bx1q
970
	movq	mm1,.bx2q
971
	movq	mm2,.ex1q
972
	movq	mm3,.ex2q
973
	movq	mm4,.tx1q
974
	movq	mm5,.tx2q
975
	movq	.bx2q,mm0
976
	movq	.bx1q,mm1
977
	movq	.ex1q,mm3
978
	movq	.ex2q,mm2
979
	movq	.tx1q,mm5
980
	movq	.tx2q,mm4
981
end if
982
983
 
984
	xchg	edx,.z2
985
	mov	.z1,edx
986
  .bl_ok:
987
	push	eax
988
	push	ebx	      ;store x1, x2
989
	cmp	.x1,SIZE_X
990
	jge	.bl_end
991
	cmp	.x2,0
992
	jle	.bl_end
993
994
 
995
	sub	ebx,.x1
996
997
 
998
999
 
1000
       cvtsi2ss  xmm3,ebx	     ;rcps
1001
       shufps	 xmm3,xmm3,0
1002
1003
 
1004
       movlhps	 xmm0,xmm0
1005
       cvtpi2ps  xmm0,.ex1q ;mm2
1006
       cvtpi2ps  xmm1,.bx2q ;mm1
1007
       movlhps	 xmm1,xmm1
1008
       cvtpi2ps  xmm1,.ex2q ;mm3
1009
       subps	 xmm1,xmm0
1010
1011
 
1012
1013
 
1014
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
1015
       movhlps	 xmm1,xmm1
1016
       cvtps2pi  mm1,xmm1
1017
       movq	 .deyq,mm0
1018
       movq	 .dbyq,mm1
1019
1020
 
1021
       movd	 mm3,.z2
1022
1023
 
1024
       movlhps	 xmm0,xmm0
1025
       cvtpi2ps  xmm0,mm2
1026
       cvtpi2ps  xmm1,.tx2q ;mm1
1027
       movlhps	 xmm1,xmm1
1028
       cvtpi2ps  xmm1,mm3
1029
       subps	 xmm1,xmm0
1030
1031
 
1032
1033
 
1034
       cvtps2pi  mm0,xmm1	   ; mm0 -> 2 delta dwords
1035
       movhlps	 xmm1,xmm1
1036
       cvtps2pi  mm1,xmm1
1037
       movd	 .dz,mm0
1038
       movq	 .dtyq,mm1
1039
1040
 
1041
1042
 
1043
	sub	eax,.bx1
1044
	cdq
1045
	idiv	ebx
1046
	push	eax
1047
1048
 
1049
	sub	eax,.by1
1050
	cdq
1051
	idiv	ebx
1052
	push	eax
1053
1054
 
1055
	sub	eax,.ex1
1056
	cdq
1057
	idiv	ebx
1058
	push	eax
1059
1060
 
1061
	sub	eax,.ey1
1062
	cdq
1063
	idiv	ebx
1064
	push	eax
1065
1066
 
1067
 
1068
	sub	eax,.z1
1069
	cdq
1070
	idiv	ebx
1071
	push	eax
1072
1073
 
1074
	sub	eax,.tx1
1075
	cdq
1076
	idiv	ebx
1077
	push	eax
1078
1079
 
1080
	sub	eax,.ty1
1081
	cdq
1082
	idiv	ebx
1083
	push	eax
1084
1085
 
1086
	cmp	.x1,0	      ; set correctly begin variable
1087
	jge	@f	      ; CLIPPING ON FUNCTION
1088
			      ; cutting triangle exceedes screen
1089
	mov	ebx,.x1
1090
	neg	ebx
1091
	imul	ebx	      ; eax = .dz * abs(.x1)
1092
	add	.z1,eax
1093
	mov	.x1,0
1094
1095
 
1096
	imul	ebx
1097
	add    .bx1,eax
1098
1099
 
1100
	imul	ebx
1101
	add	.by1,eax
1102
1103
 
1104
	imul	ebx
1105
	add	.ex1,eax
1106
1107
 
1108
	imul	ebx
1109
	add	.ey1,eax
1110
1111
 
1112
	imul	ebx
1113
	add	.tx1,eax
1114
1115
 
1116
	imul	ebx
1117
	add	.ty1,eax
1118
1119
 
1120
	cmp	.x2,SIZE_X
1121
	jl	@f
1122
	mov	.x2,SIZE_X
1123
      @@:
1124
	mov	eax,SIZE_X	 ;calc memory begin in buffers
1125
	mul	.y
1126
	add	eax,.x1
1127
	lea	esi,[4*eax]
1128
	add	esi,.z_buff	  ; z-buffer filled with dd variables
1129
	lea	eax,[eax*3]
1130
	add	edi,eax
1131
1132
 
1133
 
1134
	sub	ecx,.x1
1135
	; init current variables
1136
	push	.bx1   ; current b, e and t shifted shl ROUND   .cbx
1137
	push	.by1					     ;  .cby
1138
	push	.ex1					     ;  .cex
1139
	push	.ey1					     ;  .cey
1140
1141
 
1142
	push	esi					     ; .czbuff
1143
1144
 
1145
	push	.ty1	  ;         .cty
1146
	push	edi	  ;         .c_scr
1147
if Ext>=MMX
1148
	movq	mm7,.ctyq
1149
	movq	mm6,.cbyq
1150
	movq	mm5,.ceyq
1151
;        movq    mm4,.dtyq
1152
;        movq    mm3,.dbyq
1153
end if
1154
1155
 
1156
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
1157
	mov	esi,.czbuff	 ; .czbuff current address in buffer
1158
	mov	ebx,.cz 	 ; .cz - cur z position
1159
	cmp	ebx,dword[esi]
1160
	jge	.skip
1161
if Ext=NON
1162
	mov	eax,.cby
1163
	shr	eax,ROUND
1164
	mov	esi,.cbx
1165
	shr	esi,ROUND
1166
else
1167
	movq	mm1,mm6
1168
	psrld	mm1,ROUND
1169
	movd	eax,mm1
1170
	psrlq	mm1,32
1171
	movd	esi,mm1
1172
end if
1173
1174
 
1175
 
1176
 
1177
	add	esi,eax 	;-  ; esi - current bump map index
1178
1179
 
1180
	dec	ebx
1181
	and	ebx,TEXTURE_SIZE
1182
	add	ebx,.bmap
1183
	movzx	eax,byte [ebx]
1184
1185
 
1186
	inc	ebx
1187
	and	ebx,TEXTURE_SIZE
1188
	add	ebx,.bmap
1189
	movzx	ebx,byte [ebx]
1190
	sub	eax,ebx
1191
1192
 
1193
	sub	ebx,TEX_X
1194
	and	ebx,TEXTURE_SIZE
1195
	add	ebx,.bmap
1196
	movzx	edx,byte [ebx]
1197
1198
 
1199
	add	ebx,TEX_X
1200
	and	ebx,TEXTURE_SIZE
1201
	add	ebx,.bmap
1202
	movzx	ebx,byte [ebx]
1203
	sub	edx,ebx
1204
1205
 
1206
     ;  edx - vertical   sub    modificated y coord
1207
if Ext=NON
1208
	mov	ebx,.cex       ;.cex - current env map X
1209
	shr	ebx,ROUND
1210
	add	eax,ebx
1211
1212
 
1213
 
1214
	shr	ebx,ROUND
1215
	add	edx,ebx
1216
1217
 
1218
	movq	mm1,mm5        ; mm5 - copy of cur env coords
1219
	psrld	mm1,ROUND
1220
	movd	ebx,mm1
1221
	psrlq	mm1,32
1222
	add	eax,ebx
1223
	movd	ebx,mm1
1224
	add	edx,ebx
1225
;        movq    qword[.temp1],mm3
1226
;        add     eax,dword [.temp1]
1227
;        add     edx,dword [.temp1+4]
1228
end if
1229
1230
 
1231
	jl	.black
1232
	cmp	eax,TEX_X
1233
	jg	.black
1234
	or	edx,edx
1235
	jl	.black
1236
	cmp	edx,TEX_Y
1237
	jg	.black
1238
1239
 
1240
	add	edx,eax 	; proponuje nie stawiac czarnego pixela tylko
1241
	lea	esi,[edx*3]	; niezaburzony.
1242
	add	esi,.emap	;
1243
	lodsd
1244
1245
 
1246
	mov	edx,.cty
1247
	shr	edx,ROUND  ; sar
1248
1249
 
1250
	shr	edi,ROUND  ; sar
1251
else
1252
	movq	mm1,mm7
1253
	psrld	mm1,ROUND
1254
	movd	edx,mm1
1255
	psrlq	mm1,32
1256
	movd	edi,mm1
1257
1258
 
1259
1260
 
1261
	add	edi,edx
1262
	and	edi,TEXTURE_SIZE
1263
	lea	esi,[edi*3]
1264
	add	esi,.tex_map
1265
1266
 
1267
	mov	edx,eax
1268
	lodsd
1269
	push	ax
1270
	mul	dl
1271
	mov	dl,ah
1272
	pop	ax
1273
	shr	ax,8
1274
	mul	dh
1275
	mov	al,dl
1276
	mov	edi,.c_scr
1277
	stosw
1278
	shr	edx,16
1279
	shr	eax,16
1280
	mul	dl
1281
	shr	ax,8
1282
	stosb
1283
else
1284
	movd	   mm0,eax
1285
	pxor	   mm1,mm1
1286
	punpcklbw  mm0,mm1
1287
	movd	   mm2,[esi]
1288
	punpcklbw  mm2,mm1
1289
	pmullw	   mm0,mm2
1290
	psrlw	   mm0,8
1291
	packuswb   mm0,mm1
1292
	mov	   edi,.c_scr
1293
	movd	   [edi],mm0
1294
1295
 
1296
1297
 
1298
     @@:
1299
     .black:
1300
	xor	eax,eax
1301
	mov	edi,.c_scr
1302
	stosd
1303
     .actual_zbuff:
1304
	mov	eax,.cz
1305
	mov	edi,.czbuff
1306
	stosd
1307
1308
 
1309
	add	.czbuff,4
1310
	add	.c_scr,3
1311
1312
 
1313
	mov	eax,.dbx
1314
	add	.cbx,eax
1315
	mov	ebx,.dby
1316
	add	.cby,ebx
1317
1318
 
1319
	add	.cex,edx
1320
	mov	eax,.dey
1321
	add	.cey,eax
1322
1323
 
1324
	add	.ctx,ebx
1325
	mov	edx,.dty
1326
	add	.cty,edx
1327
1328
 
1329
	paddd	mm7,.dtyq
1330
	paddd	mm6,.dbyq
1331
	paddd	mm5,.deyq
1332
end if
1333
	mov	eax,.dz
1334
	add	.cz,eax
1335
1336
 
1337
	jnz	.draw
1338
1339
 
1340
	mov	esp,ebp
1341
ret 76
1342
;Ext = MMX
1343
1344
 
1345
;        movq    mm5, qword[.temp1]  ;-
1346
;        paddd   mm5, qword[.temp5]  ; .temp5 == low dword = TEX_X, high dword = -TEX_X
1347
;        pand    mm5, qword[.temp3]  ; .temp3 == low = high dword = TEX_SIZE
1348
;        paddd   mm5, qword[.temp4]  ; .temp4 == low = high dword = offset .bmap
1349
;        movd    ebx,mm5
1350
;        psrlq   mm5,32
1351
;     end if
1352