Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1245 hidnplayr 1
;------- Big thanks to majuma (www.majuma.xt.pl) for absolutelly great--
2
;------- 13h mode demos ------------------------------------------------
3
 
4
bump_triangle:
5
;------------------in - eax - x1 shl 16 + y1 -----------
6
;---------------------- ebx - x2 shl 16 + y2 -----------
7
;---------------------- ecx - x3 shl 16 + y3 -----------
8
;---------------------- edx - pointer to bump map ------
9
;---------------------- esi - pointer to environment map
10
;---------------------- edi - pointer to screen buffer--
11
;---------------------- stack : bump coordinates--------
12
;----------------------         environment coordinates-
13
.b_x1 equ ebp+4     ; procedure don't save registers !!!
14
.b_y1 equ ebp+6     ; each coordinate as word
15
.b_x2 equ ebp+8
16
.b_y2 equ ebp+10
17
.b_x3 equ ebp+12
18
.b_y3 equ ebp+14
19
.e_x1 equ ebp+16
20
.e_y1 equ ebp+18
21
.e_x2 equ ebp+20
22
.e_y2 equ ebp+22
23
.e_x3 equ ebp+24
24
.e_y3 equ ebp+26
25
 
26
.t_bmap equ dword[ebp-4]
27
.t_emap equ dword[ebp-8]
28
.x1	equ word[ebp-10]
29
.y1	equ word[ebp-12]
30
.x2	equ word[ebp-14]
31
.y2	equ word[ebp-16]
32
.x3	equ word[ebp-18]
33
.y3	equ word[ebp-20]
34
 
35
.dx12  equ dword[ebp-24]
36
.dbx12 equ dword[ebp-28]
37
.dby12 equ dword[ebp-32]
38
.dex12 equ dword[ebp-36]
39
.dey12 equ dword[ebp-40]
40
 
41
.dx13  equ dword[ebp-44]
42
.dbx13 equ dword[ebp-48]
43
.dby13 equ dword[ebp-52]
44
.dex13 equ dword[ebp-56]
45
.dey13 equ dword[ebp-60]
46
 
47
.dx23  equ dword[ebp-64]
48
.dbx23 equ dword[ebp-68]
49
.dby23 equ dword[ebp-72]
50
.dex23 equ dword[ebp-76]
51
.dey23 equ dword[ebp-80]
52
 
53
.cx1   equ dword[ebp-84]   ; current variables
54
.cx2   equ dword[ebp-88]
55
.cbx1  equ dword[ebp-92]
56
.cbx2  equ dword[ebp-96]
57
.cby1  equ dword[ebp-100]
58
.cby2  equ dword[ebp-104]
59
.cex1  equ dword[ebp-108]
60
.cex2  equ dword[ebp-112]
61
.cey1  equ dword[ebp-116]
62
.cey2  equ dword[ebp-120]
63
 
64
       mov     ebp,esp
65
       push    edx	  ; store bump map
66
       push    esi	  ; store e. map
67
     ; sub     esp,120
68
 .sort3:		  ; sort triangle coordinates...
69
       cmp     ax,bx
70
       jle     .sort1
71
       xchg    eax,ebx
72
       mov     edx,dword[.b_x1]
73
       xchg    edx,dword[.b_x2]
74
       mov     dword[.b_x1],edx
75
       mov     edx,dword[.e_x1]
76
       xchg    edx,dword[.e_x2]
77
       mov     dword[.e_x1],edx
78
 .sort1:
79
       cmp	bx,cx
80
       jle	.sort2
81
       xchg	ebx,ecx
82
       mov	edx,dword[.b_x2]
83
       xchg	edx,dword[.b_x3]
84
       mov	dword[.b_x2],edx
85
       mov	edx,dword[.e_x2]
86
       xchg	edx,dword[.e_x3]
87
       mov	dword[.e_x2],edx
88
       jmp	.sort3
89
 .sort2:
90
       push	eax	; store triangle coords in variables
91
       push	ebx
92
       push	ecx
93
 
94
       mov     edx,eax	       ; eax,ebx,ecx are ORd together into edx which means that
95
       or      edx,ebx	       ; if any *one* of them is negative a sign flag is raised
96
       or      edx,ecx
97
       test    edx,80000000h   ; Check only X
98
       jne     .loop23_done
99
 
6619 leency 100
       mov     dx,[size_x_var]
101
       cmp     .x1,dx  ;SIZE_X    ; {
1245 hidnplayr 102
       jg      .loop23_done
6619 leency 103
       cmp     .x2,dx  ;SIZE_X     ; This can be optimized with effort
1245 hidnplayr 104
       jg      .loop23_done
6619 leency 105
       cmp     .x3,dx  ;SIZE_X
1245 hidnplayr 106
       jg      .loop23_done    ; {
107
 
108
 
109
       mov	bx,.y2	     ; calc delta 12
110
       sub	bx,.y1
111
       jnz	.bt_dx12_make
112
       mov	ecx,5
113
       xor	edx,edx
114
     @@:
115
       push	edx   ;dword 0
116
       loop	@b
117
       jmp	.bt_dx12_done
118
 .bt_dx12_make:
119
       mov	ax,.x2
120
       sub	ax,.x1
121
       cwde
122
       movsx	ebx,bx
123
       shl	eax,ROUND
124
       cdq
125
       idiv	ebx
126
 ;      mov      .dx12,eax
127
       push	 eax
128
 
129
       mov	ax,word[.b_x2]
130
       sub	ax,word[.b_x1]
131
       cwde
132
       shl	eax,ROUND
133
       cdq
134
       idiv	ebx
135
 ;      mov      .dbx12,eax
136
       push	 eax
137
 
138
       mov	ax,word[.b_y2]
139
       sub	ax,word[.b_y1]
140
       cwde
141
       shl	eax,ROUND
142
       cdq
143
       idiv	ebx
144
 ;      mov      .dby12,eax
145
       push	 eax
146
 
147
       mov	ax,word[.e_x2]
148
       sub	ax,word[.e_x1]
149
       cwde
150
       shl	eax,ROUND
151
       cdq
152
       idiv	ebx
153
 ;      mov      .dex12,eax
154
       push	 eax
155
 
156
       mov	ax,word[.e_y2]
157
       sub	ax,word[.e_y1]
158
       cwde
159
       shl	eax,ROUND
160
       cdq
161
       idiv	ebx
162
 ;      mov      .dey12,eax
163
       push	 eax
164
   .bt_dx12_done:
165
 
166
       mov	bx,.y3	     ; calc delta13
167
       sub	bx,.y1
168
       jnz	.bt_dx13_make
169
       mov	ecx,5
170
       xor	edx,edx
171
     @@:
172
       push	edx   ;dword 0
173
       loop	@b
174
       jmp	.bt_dx13_done
175
 .bt_dx13_make:
176
       mov	ax,.x3
177
       sub	ax,.x1
178
       cwde
179
       movsx	ebx,bx
180
       shl	eax,ROUND
181
       cdq
182
       idiv	ebx
183
 ;      mov      .dx13,eax
184
       push	 eax
185
 
186
       mov	ax,word[.b_x3]
187
       sub	ax,word[.b_x1]
188
       cwde
189
       shl	eax,ROUND
190
       cdq
191
       idiv	ebx
192
 ;      mov      .dbx13,eax
193
       push	 eax
194
 
195
       mov	ax,word[.b_y3]
196
       sub	ax,word[.b_y1]
197
       cwde
198
       shl	eax,ROUND
199
       cdq
200
       idiv	ebx
201
 ;      mov      .dby13,eax
202
       push	 eax
203
 
204
       mov	ax,word[.e_x3]
205
       sub	ax,word[.e_x1]
206
       cwde
207
       shl	eax,ROUND
208
       cdq
209
       idiv	ebx
210
 ;      mov      .dex13,eax
211
       push	 eax
212
 
213
       mov	ax,word[.e_y3]
214
       sub	ax,word[.e_y1]
215
       cwde
216
       shl	eax,ROUND
217
       cdq
218
       idiv	ebx
219
 ;      mov      .dey13,eax
220
       push	 eax
221
   .bt_dx13_done:
222
 
223
       mov	bx,.y3	     ; calc delta23
224
       sub	bx,.y2
225
       jnz	.bt_dx23_make
226
       mov	ecx,5
227
       xor	edx,edx
228
     @@:
229
       push	edx   ;dword 0
230
       loop	@b
231
       jmp	.bt_dx23_done
232
 .bt_dx23_make:
233
       mov	ax,.x3
234
       sub	ax,.x2
235
       cwde
236
       movsx	ebx,bx
237
       shl	eax,ROUND
238
       cdq
239
       idiv	ebx
240
 ;      mov      .dx23,eax
241
       push	 eax
242
 
243
       mov	ax,word[.b_x3]
244
       sub	ax,word[.b_x2]
245
       cwde
246
       shl	eax,ROUND
247
       cdq
248
       idiv	ebx
249
 ;      mov      .dbx23,eax
250
       push	 eax
251
 
252
       mov	ax,word[.b_y3]
253
       sub	ax,word[.b_y2]
254
       cwde
255
       shl	eax,ROUND
256
       cdq
257
       idiv	ebx
258
 ;      mov      .dby23,eax
259
       push	 eax
260
 
261
       mov	ax,word[.e_x3]
262
       sub	ax,word[.e_x2]
263
       cwde
264
       shl	eax,ROUND
265
       cdq
266
       idiv	ebx
267
 ;      mov      .dex23,eax
268
       push	 eax
269
 
270
       mov	ax,word[.e_y3]
271
       sub	ax,word[.e_y2]
272
       cwde
273
       shl	eax,ROUND
274
       cdq
275
       idiv	ebx
276
 ;      mov      .dey23,eax
277
       push	 eax
278
 
279
      ;  sub     esp,40
280
   .bt_dx23_done:
281
 
282
       movsx	eax,.x1
283
       shl	eax,ROUND
284
     ; mov      .cx1,eax
285
     ; mov      .cx2,eax
286
       push	eax
287
       push	eax
288
 
289
       movsx	eax,word[.b_x1]
290
       shl	eax,ROUND
291
     ; mov      .cbx1,eax
292
     ; mov      .cbx2,eax
293
       push	eax
294
       push	eax
295
 
296
       movsx	eax,word[.b_y1]
297
       shl	eax,ROUND
298
     ; mov      .cby1,eax
299
     ; mov      .cby2,eax
300
       push	eax
301
       push	eax
302
 
303
       movsx	eax,word[.e_x1]
304
       shl	eax,ROUND
305
      ;mov      .cex1,eax
306
      ;mov      .cex2,eax
307
       push	eax
308
       push	eax
309
 
310
       movsx	eax,word[.e_y1]
311
       shl	eax,ROUND
312
      ;mov      .cey1,eax
313
      ;mov      .cey2,eax
314
       push	eax
315
       push	eax
316
 
317
       movzx	ecx,.y1
318
       cmp	cx,.y2
319
       jge	.loop12_done
320
  .loop12:
321
       call	.call_bump_line
322
 
323
       mov	eax,.dx13
324
       add	.cx1,eax
325
       mov	eax,.dx12
326
       add	.cx2,eax
327
 
328
       mov	eax,.dbx13
329
       add	.cbx1,eax
330
       mov	eax,.dbx12
331
       add	.cbx2,eax
332
       mov	eax,.dby13
333
       add	.cby1,eax
334
       mov	eax,.dby12
335
       add	.cby2,eax
336
 
337
       mov	eax,.dex13
338
       add	.cex1,eax
339
       mov	eax,.dex12
340
       add	.cex2,eax
341
       mov	eax,.dey13
342
       add	.cey1,eax
343
       mov	eax,.dey12
344
       add	.cey2,eax
345
 
346
       inc	ecx
347
       cmp	cx,.y2
348
       jl	.loop12
349
   .loop12_done:
350
       movzx	ecx,.y2
351
       cmp	cx,.y3
352
       jge	.loop23_done
353
 
354
       movzx	eax,.x2
355
       shl	eax,ROUND
356
       mov	.cx2,eax
357
 
358
       movzx	eax,word[.b_x2]
359
       shl	eax,ROUND
360
       mov	.cbx2,eax
361
 
362
       movzx	eax,word[.b_y2]
363
       shl	eax,ROUND
364
       mov	.cby2,eax
365
 
366
       movzx	eax,word[.e_x2]
367
       shl	eax,ROUND
368
       mov	.cex2,eax
369
 
370
       movzx	eax,word[.e_y2]
371
       shl	eax,ROUND
372
       mov	.cey2,eax
373
 
374
     .loop23:
375
       call	.call_bump_line
376
 
377
       mov	eax,.dx13
378
       add	.cx1,eax
379
       mov	eax,.dx23
380
       add	.cx2,eax
381
 
382
       mov	eax,.dbx13
383
       add	.cbx1,eax
384
       mov	eax,.dbx23
385
       add	.cbx2,eax
386
       mov	eax,.dby13
387
       add	.cby1,eax
388
       mov	eax,.dby23
389
       add	.cby2,eax
390
 
391
       mov	eax,.dex13
392
       add	.cex1,eax
393
       mov	eax,.dex23
394
       add	.cex2,eax
395
       mov	eax,.dey13
396
       add	.cey1,eax
397
       mov	eax,.dey23
398
       add	.cey2,eax
399
 
400
       inc	ecx
401
       cmp	cx,.y3
402
       jl	.loop23
403
    .loop23_done:
404
       mov	esp,ebp
405
ret   24
406
 
407
.call_bump_line:
408
 
409
      ; push     ebp
410
      ; push     ecx
411
       pushad
412
 
413
       push	.t_emap
414
       push	.t_bmap
415
       push	.cey2
416
       push	.cex2
417
       push	.cey1
418
       push	.cex1
419
       push	.cby2
420
       push	.cbx2
421
       push	.cby1
422
       push	.cbx1
423
       push	ecx
424
 
425
       mov	eax,.cx1
426
       sar	eax,ROUND
427
       mov	ebx,.cx2
428
       sar	ebx,ROUND
429
 
430
       call	bump_line
431
 
432
       popad
433
ret
434
bump_line:
435
;--------------in: eax - x1
436
;--------------    ebx - x2
437
;--------------    edi - pointer to screen buffer
438
;stack - another parameters :
439
.y    equ dword [ebp+4]
1776 yogev_ezra 440
.bx1  equ	[ebp+8]   ;   ---
1245 hidnplayr 441
.by1  equ dword [ebp+12]  ;       |
1776 yogev_ezra 442
.bx2  equ	[ebp+16]  ;       |
1245 hidnplayr 443
.by2  equ dword [ebp+20]  ;       |>   bump and env coords
1776 yogev_ezra 444
.ex1  equ	[ebp+24]  ;       |>   shifted shl ROUND
1245 hidnplayr 445
.ey1  equ dword [ebp+28]  ;       |
1776 yogev_ezra 446
.ex2  equ	[ebp+32]  ;       |
1245 hidnplayr 447
.ey2  equ dword [ebp+36]  ;   ---
448
.bmap equ dword [ebp+40]
449
.emap equ dword [ebp+44]
450
 
451
.x1   equ dword [ebp-4]
452
.x2   equ dword [ebp-8]
453
.dbx  equ dword [ebp-12]
1776 yogev_ezra 454
.dby  equ	[ebp-16]
1245 hidnplayr 455
.dex  equ dword [ebp-20]
1776 yogev_ezra 456
.dey  equ	[ebp-24]
1245 hidnplayr 457
.cbx  equ dword [ebp-28]
1776 yogev_ezra 458
.cby  equ	[ebp-32]
1245 hidnplayr 459
.cex  equ dword [ebp-36]
1776 yogev_ezra 460
.cey  equ	[ebp-40]
1245 hidnplayr 461
	mov	ebp,esp
462
 
463
	mov	ecx,.y
464
	or	ecx,ecx
465
	jl	.bl_end
6619 leency 466
	movzx	edx,word[size_y_var]
467
	cmp	ecx,edx  ;SIZE_Y
1245 hidnplayr 468
	jge	.bl_end
469
 
470
	cmp	eax,ebx
471
	jl	.bl_ok
472
	je	.bl_end
473
 
474
	xchg	eax,ebx
1776 yogev_ezra 475
if Ext = NON
1245 hidnplayr 476
	mov	edx,.bx1
477
	xchg	edx,.bx2
478
	mov	.bx1,edx
479
	mov	edx,.by1
480
	xchg	edx,.by2
481
	mov	.by1,edx
482
 
483
	mov	edx,.ex1
484
	xchg	edx,.ex2
485
	mov	.ex1,edx
486
	mov	edx,.ey1
487
	xchg	edx,.ey2
488
	mov	.ey1,edx
1776 yogev_ezra 489
else
490
	movq	mm0,.bx1
491
	movq	mm1,.bx2
492
	movq	mm2,.ex1
493
	movq	mm3,.ex2
494
	movq	.bx2,mm0
495
	movq	.bx1,mm1
496
	movq	.ex1,mm3
497
	movq	.ex2,mm2
498
end if
1245 hidnplayr 499
  .bl_ok:
500
	push	eax
501
	push	ebx	      ;store x1, x2
6619 leency 502
	movzx	eax,word[size_x_var]
503
	lea	eax,[eax*3]
1245 hidnplayr 504
 
6619 leency 505
     ;   mov     eax,SIZE_X*3
1245 hidnplayr 506
	mov	ebx,.y
507
	mul	ebx
508
	mov	ecx,.x1
509
	lea	ecx,[ecx*3]
510
	add	eax,ecx
511
	add	edi,eax
512
 
513
	mov	ecx,.x2
514
	sub	ecx,.x1
515
 
516
	mov	eax,.bx2       ; calc .dbx
517
	sub	eax,.bx1
518
	cdq
519
	idiv	ecx
520
	push	eax
521
 
522
	mov	eax,.by2       ; calc .dby
523
	sub	eax,.by1
524
	cdq
525
	idiv	ecx
526
	push	eax
527
 
528
	mov	eax,.ex2       ; calc .dex
529
	sub	eax,.ex1
530
	cdq
531
	idiv	ecx
532
	push	eax
533
 
534
	mov	eax,.ey2       ; calc .dey
535
	sub	eax,.ey1
536
	cdq
537
	idiv	ecx
538
	push	eax
539
 
1776 yogev_ezra 540
	push	dword .bx1
1245 hidnplayr 541
	push	.by1
1776 yogev_ezra 542
	push	dword .ex1
1245 hidnplayr 543
	push	.ey1
544
     .draw:
545
    ; if TEX = SHIFTING   ;bump drawing only in shifting mode
546
 
547
	mov	eax,.cby
548
	sar	eax,ROUND
549
	shl	eax,TEX_SHIFT
550
	mov	esi,.cbx
551
	sar	esi,ROUND
552
	add	esi,eax
553
 
554
	mov	ebx,esi
555
	dec	ebx
556
	and	ebx,TEXTURE_SIZE
557
	add	ebx,.bmap
558
	movzx	eax,byte [ebx]
559
 
560
	mov	ebx,esi
561
	inc	ebx
562
	and	ebx,TEXTURE_SIZE
563
	add	ebx,.bmap
564
	movzx	ebx,byte [ebx]
565
	sub	eax,ebx
566
 
567
	mov	ebx,esi
568
	sub	ebx,TEX_X
569
	and	ebx,TEXTURE_SIZE
570
	add	ebx,.bmap
571
	movzx	edx,byte [ebx]
572
 
573
	mov	ebx,esi
574
	add	ebx,TEX_X
575
	and	ebx,TEXTURE_SIZE
576
	add	ebx,.bmap
577
	movzx	ebx,byte [ebx]
578
	sub	edx,ebx
579
 
580
	mov	ebx,.cex       ;.cex - current env map X
581
	sar	ebx,ROUND
582
	add	eax,ebx        ; eax - modified x coord
583
 
584
	mov	ebx,.cey       ;.cey - current  env map y
585
	sar	ebx,ROUND
586
	add	edx,ebx        ; edx - modified y coord
587
 
588
	or	eax,eax
589
	jl	.black
590
	cmp	eax,TEX_X
591
	jg	.black
592
	or	edx,edx
593
	jl	.black
594
	cmp	edx,TEX_Y
595
	jg	.black
596
 
597
	shl	edx,TEX_SHIFT
598
	add	edx,eax
599
	lea	edx,[edx*3]
600
	add	edx,.emap
601
	mov	eax,dword[edx]
602
	jmp	.put_pixel
603
     .black:
604
	xor	eax,eax
605
     .put_pixel:
606
	stosd
607
	dec	edi
1776 yogev_ezra 608
;if Ext >= MMX
609
;        movq    mm0,.cby
610
;        movq    mm1,.cey
611
;        paddd   mm0,.dby
612
;        paddd   mm1,.dey
613
;        movq    .cby,mm0
614
;        movq    .cey,mm1
615
;else
1245 hidnplayr 616
	mov	eax,.dbx
617
	add	.cbx,eax
618
	mov	eax,.dby
619
	add	.cby,eax
620
	mov	eax,.dex
621
	add	.cex,eax
622
	mov	eax,.dey
623
	add	.cey,eax
1776 yogev_ezra 624
;end if
1245 hidnplayr 625
	dec	ecx
626
	jnz	.draw
627
   ;   end if
628
  .bl_end:
629
	mov	esp,ebp
630
ret 44