Subversion Repositories Kolibri OS

Rev

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