Subversion Repositories Kolibri OS

Rev

Rev 6619 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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