Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
31 halyavin 1
;
2
; 9 Ver Screen saver
3
; 5 Ver 24 bit texture.
4
; 23/8/2004
5
; Pavlushin Evgeni 3d cube screen saver
6
; mail: waptap@mail.ru       site: www.deck4.narod.ru
7
;
8
; This programm develop on sample text3d to Mikolaj Felix 25/5/2001
9
; mfelix@polbox.com
10
;
11
 
12
use32
13
               org     0x0
14
               db     'MENUET01'              ; 8 byte id
15
               dd     0x01                    ; header version
16
               dd     START                   ; start of code
17
               dd     I_END                   ; size of image
18
               dd     0x200000                ; memory for app
19
               dd     0x200000                ; esp
20
               dd     0x0 , 0x0               ; I_Param , I_Icon
21
 
22
include 'lang.inc'
485 heavyiron 23
include '..\..\..\macros.inc'
31 halyavin 24
MAX_DEGS equ 512 ;quantity of angels 2^n.Minimize for speedup
25
MAX_POINTS equ 8 ;quantity of points
26
MAX_FACES equ 6  ;quantity of points
27
 
28
START:
29
    finit
30
    call draw_window
31
    call clear_screen
32
    call init_sincos
33
 
34
still:
35
    mov eax,23  ; wait for system event with 2 ms timeout
36
    mov ebx,2   ; wait 2 ms, then continue
485 heavyiron 37
    mcall
31 halyavin 38
 
39
;    mov eax,11 ;If you want maximum speed! :)
485 heavyiron 40
;    mcall
31 halyavin 41
 
42
    dec  eax                  ; window redraw request ?
43
    je   red
44
    dec  eax                  ; key in buffer ?
45
    je   key
46
    dec  eax                  ; button in buffer ?
47
    je   button
48
 
49
main_loop:
50
 call fade_texture
51
 
52
	mov esi,cube
53
	mov edi,cube_rotated
54
	mov ecx,MAX_POINTS*3
55
copy_object:
56
 fild word [esi]
57
 fstp dword [edi]
58
 add esi,2
59
 add edi,4
60
 dec ecx
61
 jnz copy_object
62
 
63
 mov esi,angle_x
64
 mov edi,cube_rotated
65
 mov ecx,MAX_POINTS
66
 call rotate_points
67
 
68
 mov esi,cube_rotated
69
 mov edi,coord2d
70
 mov ecx,MAX_POINTS
71
 call translate_points
72
 
73
 call draw_textured_faces
74
 call clear_screen_buffer
75
 
76
 add [angle_x],1
77
 add [angle_y],3
78
 add [angle_z],1
79
 
80
 jmp still
81
 
82
red:
83
     call draw_window
84
     jmp still
85
key:
86
     mov eax,2
87
     jmp exit
88
button:
89
     mov eax,17
485 heavyiron 90
     mcall
31 halyavin 91
     cmp ah,1
92
     jne still
93
exit:
94
     mov eax,-1
485 heavyiron 95
     mcall
31 halyavin 96
 
97
;Draw window
98
draw_window:
99
    mov eax,12  ;Start
100
    mov ebx,1
485 heavyiron 101
    mcall
31 halyavin 102
 
103
    mov eax,0   ;Draw window
104
    mov ebx,0*65536+(799) ;x start*65536+x size
105
    mov ecx,0*65536+(599) ;y start*65536+y size
106
    mov edx,0x00000000         ;0x03 use skinned window
485 heavyiron 107
    mcall
31 halyavin 108
 
109
    call clear_screen
110
 
111
    mov eax,12  ;End
112
    mov ebx,2
485 heavyiron 113
    mcall
31 halyavin 114
    ret
115
 
116
head_label: db "3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR MENUETOS. USE "
117
            db "800x600 SCREEN MODE FROM VIEW. PRESS ANY KEY FOR EXIT"
118
hl_end:
119
 
120
;FADE IN FADE OUT TEXTURE
121
 
122
x_step db 0
123
x_num  db 1
124
 
125
fade_texture:
126
 mov ecx,0
127
loox:
128
 mov al,[file_texture+ecx]
129
 mov [texture+ecx],al
130
 inc ecx
131
 cmp ecx,128*128*3
132
 jnae loox
133
 
134
 mov ecx,0
135
loox2:
136
 mov al,[file_texture+ecx]
137
 cmp [x_step],al
138
 jae xxx
139
 sub al,[x_step]
140
 jmp nnn
141
xxx:
142
 mov al,0
143
nnn:
144
 mov [texture+ecx],al
145
 inc ecx
146
 cmp ecx,128*128*3
147
 jnae loox2
148
 
149
 cmp [x_step],255
150
 jne no_max
151
 mov [x_num],-1
152
no_max:
153
 cmp [x_step],0
154
 jne no_min
155
 mov [x_num],1
156
no_min:
157
 mov al,[x_num]
158
 add [x_step],al
159
 ret
160
 
161
; Clear Screen
162
clear_screen:
163
 mov eax,13
164
 mov ebx,0*65536+800
165
 mov ecx,0*65536+600
166
 mov edx,0
485 heavyiron 167
 mcall
31 halyavin 168
 
169
 mov eax,4   ;Out Text
170
 mov ebx,8*65536+8          ;x start*65536+y start
171
 mov ecx,0x00ffffff         ;color White
172
 mov edx,head_label
173
 mov esi,hl_end-head_label
485 heavyiron 174
 mcall
31 halyavin 175
 ret
176
 
177
clear_screen_buffer:
178
 mov ebx,scrbuf
179
 mov ecx,800*65536+(600-40)  ;sub 40 for antiflickering title
180
 mov edx,0*65536+40
181
 mov eax,7
485 heavyiron 182
 mcall
31 halyavin 183
 
184
 mov eax,4   ;Out Text
185
 mov ebx,8*65536+580          ;x start*65536+y start
186
 mov ebp,[n_step]
187
 shl ebp,16
188
 sub ebx,ebp
189
 mov ecx,0x0000ff00         ;color White
190
 mov edx,move_text
191
 add edx,[step]
192
 mov esi,130 ;mt_end-move_text
485 heavyiron 193
 mcall
31 halyavin 194
 
195
 inc [n_step]
196
 cmp [n_step],6
197
 jna t_ok
198
 mov [n_step],0
199
 inc [step]
200
 cmp [step],mt_end-move_text-130
201
 jng t_ok
202
 mov [step],0
203
t_ok:
204
 
205
 mov edi,scrbuf
206
 mov eax,0  ;black background
207
 mov ecx,800*600*3/4 ; 16000
208
 cld
209
 rep stosd
210
 ret
211
 
212
n_step dd 0
213
step dd 0
214
 
215
move_text: db "                                            "
216
           db "                                            "
217
           db "                                            "
218
           db "***** 3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR "
219
           db "MENUET OS. SET 800x600 SCREEN MODE FROM VIEW THIS SCREEN "
220
           db "SAVER *****                                        "
221
           db "SITE OF THE RUSSIAN DEVELOPERS TO MENUETOS: "
222
           db "www.menuet.narod.ru                         "
223
           db "RUSSIAN MENUET APLICATION ARCHIVE PAGE ON: "
224
           db "www.meosfiles.narod.ru                      "
225
           db "AUTOR OF THIS SCREEN SAVER Pavlushin Evgeni "
226
           db "MY SITE: www.deck4.narod.ru (Slow update)   "
227
           db "AND MAIL BOX: waptap@mail.ru                "
228
           db "THANK YOU FOR USE!                          "
229
           db "                                            "
230
           db "                                            "
231
           db "                                            "
232
mt_end:
233
 
234
 
235
;include graphlib.asm Mikolaj Felix 9/12/2000 mfelix@polbox.com
236
;Draw textured faces proc
237
 
238
@@rx1 dw 0 ;equ [bp-2]
239
@@ry1 dw 0 ;equ [bp-4]
240
@@rx2 dw 0 ;equ [bp-6]
241
@@ry2 dw 0 ;equ [bp-8]
242
@@rx3 dw 0 ;equ [bp-10]
243
@@ry3 dw 0 ;equ [bp-12]
244
@@rx4 dw 0 ;equ [bp-14]
245
@@ry4 dw 0 ;equ [bp-16]
246
 
247
draw_textured_faces:
248
 
249
 mov esi,link
250
 mov ecx,MAX_FACES
251
dtf_loop:
252
 push ecx
253
 
254
 xor ebx,ebx
255
 mov bl,byte [esi]		; point 1
256
 shl bx,2
257
 mov eax,dword [coord2d+bx] ;COPY 1 FOURANGLE POINT
258
 mov dword [@@rx1],eax
259
 
260
 xor ebx,ebx
261
 mov bl,byte [esi+1]		; point 2
262
 shl bx,2
263
 mov eax,dword [coord2d+bx] ;COPY 2 FOURANGLE POINT
264
 mov dword [@@rx2],eax
265
 
266
 xor ebx,ebx
267
 mov bl,byte [esi+2]		; point 3
268
 shl bx,2
269
 mov eax,dword [coord2d+bx] ;COPY 3 FOURANGLE POINT
270
 mov dword [@@rx3],eax
271
 
272
 xor bh,bh			; point 4
273
 mov bl,byte [esi+3]
274
 shl bx,2
275
 mov eax,dword [coord2d+bx] ;COPY 4 FOURANGLE POINT
276
 mov dword [@@rx4],eax
277
 
278
 mov ax,[@@ry1]
279
 sub ax,[@@ry3]
280
 mov bx,[@@rx2]
281
 sub bx,[@@rx1]
282
 imul bx
283
 shl edx,16
284
 mov dx,ax
285
 push edx
286
 mov ax,[@@rx1]
287
 sub ax,[@@rx3]
288
 mov bx,[@@ry2]
289
 sub bx,[@@ry1]
290
 imul bx
291
 shl edx,16
292
 mov dx,ax
293
 pop ebx
294
 sub ebx,edx			; normal_z = (y1-y3)*(x2-x1)-(x1-x3)*(y2-y1)
295
 or ebx,ebx
296
 jl dtf_next_face		; normal_z < 0
297
 
298
 ; FIRST PICE OF FOUR ANGLE
299
 
300
 ; Set 3 triangel puts for texture ycoord*65536+xcoord
301
 mov dword [@@tex_x3],127*65536+127 ;3 point
302
 mov dword [@@tex_x2],0*65536+127   ;2 point
303
 mov dword [@@tex_x1],0*65536+0     ;1 point
304
 ; Set texture bitmap offset
305
 mov [@@tex_off],texture
306
 ; Set 3 triangel puts coordinates
307
 mov eax,dword [@@rx3]
308
 mov dword [@@x3],eax
309
 mov eax,dword [@@rx2]
310
 mov dword [@@x2],eax
311
 mov eax,dword [@@rx1]
312
 mov dword [@@x1],eax
313
 call textured_triangle
314
 
315
 ; SECOND PICE OF FOUR ANGLE
316
 
317
 ; Set 3 triangel puts for texture ycoord*65536+xcoord
318
 mov dword [@@tex_x3],127*65536+0   ;3 point
319
 mov dword [@@tex_x2],127*65536+127 ;2 point
320
 mov dword [@@tex_x1],0*65536+0     ;1 point
321
 ; Set texture bitmap offset
322
 mov [@@tex_off],texture
323
 ; Set 3 triangel puts coordinates
324
 mov eax,dword [@@rx4]
325
 mov dword [@@x3],eax
326
 mov eax,dword [@@rx3]
327
 mov dword [@@x2],eax
328
 mov eax,dword [@@rx1]
329
 mov dword [@@x1],eax
330
 call textured_triangle
331
 
332
dtf_next_face:
333
 add esi,4
334
 pop ecx
335
 dec ecx
336
 jnz dtf_loop
337
 ret
338
 
339
;include tex3.asm Mikolaj Felix 15/5/2001 mfelix@polbox.com
340
 
341
@@x1 dw 0 ;equ [bp+4]
342
@@y1 dw 0 ;equ [bp+6]
343
@@x2 dw 0 ;equ [bp+8]
344
@@y2 dw 0 ;equ [bp+10]
345
@@x3 dw 0 ;equ [bp+12]
346
@@y3 dw 0 ;equ [bp+14]
347
 
348
@@tex_off dd 0 ;equ [bp+16]
349
@@tex_x1 dw 0 ;equ [bp+18]
350
@@tex_y1 dw 0 ;equ [bp+20]
351
@@tex_x2 dw 0 ;equ [bp+22]
352
@@tex_y2 dw 0 ;equ [bp+24]
353
@@tex_x3 dw 0 ;equ [bp+26]
354
@@tex_y3 dw 0 ;equ [bp+28]
355
 
356
@@dx12 dw 0 ;equ [bp-2]
357
@@dx13 dw 0 ;equ [bp-4]
358
@@dx23 dw 0 ;equ [bp-6]
359
 
360
@@tex_dx12 dw 0 ;equ [bp-8]
361
@@tex_dy12 dw 0 ;equ [bp-10]
362
@@tex_dx13 dw 0 ;equ [bp-12]
363
@@tex_dy13 dw 0 ;equ [bp-14]
364
@@tex_dx23 dw 0 ;equ [bp-16]
365
@@tex_dy23 dw 0 ;equ [bp-18]
366
 
367
@@scan_x1 dw 0 ;equ [bp-20]
368
@@scan_y1 dw 0 ;equ [bp-22]
369
@@scan_x2 dw 0 ;equ [bp-24]
370
@@scan_y2 dw 0 ;equ [bp-26]
371
 
372
 
373
textured_triangle:
374
 
375
	mov ax,[@@y1]
376
	cmp ax,[@@y3]
377
	jb tt_check1
378
 
379
	xchg ax,[@@y3]
380
	mov [@@y1],ax
381
 
382
	mov ax,[@@x1]
383
	xchg ax,[@@x3]
384
	mov [@@x1],ax
385
 
386
	mov ax,[@@tex_y1]
387
	xchg ax,[@@tex_y3]
388
	mov [@@tex_y1],ax
389
 
390
	mov ax,[@@tex_x1]
391
	xchg ax,[@@tex_x3]
392
	mov [@@tex_x1],ax
393
tt_check1:
394
	mov ax,[@@y2]
395
	cmp ax,[@@y3]
396
	jb tt_check2
397
 
398
	xchg ax,[@@y3]
399
	mov [@@y2],ax
400
 
401
	mov ax,[@@x2]
402
	xchg ax,[@@x3]
403
	mov [@@x2],ax
404
 
405
	mov ax,[@@tex_y2]
406
	xchg ax,[@@tex_y3]
407
	mov [@@tex_y2],ax
408
 
409
	mov ax,[@@tex_x2]
410
	xchg ax,[@@tex_x3]
411
	mov [@@tex_x2],ax
412
tt_check2:
413
	mov ax,[@@y1]
414
	cmp ax,[@@y2]
415
	jb tt_check3
416
 
417
	xchg ax,[@@y2]
418
	mov [@@y1],ax
419
 
420
	mov ax,[@@x1]
421
	xchg ax,[@@x2]
422
	mov [@@x1],ax
423
 
424
	mov ax,[@@tex_y1]
425
	xchg ax,[@@tex_y2]
426
	mov [@@tex_y1],ax
427
 
428
	mov ax,[@@tex_x1]
429
	xchg ax,[@@tex_x2]
430
	mov [@@tex_x1],ax
431
tt_check3:
432
 
433
	mov bx,[@@y2]
434
	sub bx,[@@y1]
435
	jnz tt_dx12_make
436
 
437
	mov word [@@dx12],0
438
	mov word [@@tex_dx12],0
439
	mov word [@@tex_dy12],0
440
	jmp tt_dx12_done
441
tt_dx12_make:
442
	mov ax,[@@x2]
443
	sub ax,[@@x1]
444
	shl ax,7
445
	cwd
446
	idiv bx
447
	mov [@@dx12],ax			; dx12 = (x2-x1)/(y2-y1)
448
 
449
	mov ax,[@@tex_x2]
450
	sub ax,[@@tex_x1]
451
	shl ax,7
452
	cwd
453
	idiv bx
454
	mov [@@tex_dx12],ax		; tex_dx12 = (tex_x2-tex_x1)/(y2-y1)
455
 
456
	mov ax,[@@tex_y2]
457
	sub ax,[@@tex_y1]
458
	shl ax,7
459
	cwd
460
	idiv bx
461
	mov [@@tex_dy12],ax		; tex_dy12 = (tex_y2-tex_y1)/(y2-y1)
462
tt_dx12_done:
463
 
464
	mov bx,[@@y3]
465
	sub bx,[@@y1]
466
	jnz tt_dx13_make
467
 
468
	mov word [@@dx13],0
469
	mov word [@@tex_dx13],0
470
	mov word [@@tex_dy13],0
471
	jmp tt_dx13_done
472
tt_dx13_make:
473
	mov ax,[@@x3]
474
	sub ax,[@@x1]
475
	shl ax,7
476
	cwd
477
	idiv bx
478
	mov [@@dx13],ax			; dx13 = (x3-x1)/(y3-y1)
479
 
480
	mov ax,[@@tex_x3]
481
	sub ax,[@@tex_x1]
482
	shl ax,7
483
	cwd
484
	idiv bx
485
	mov [@@tex_dx13],ax		; tex_dx13 = (tex_x3-tex_x1)/(y3-y1)
486
 
487
	mov ax,[@@tex_y3]
488
	sub ax,[@@tex_y1]
489
	shl ax,7
490
	cwd
491
	idiv bx
492
	mov [@@tex_dy13],ax		; tex_dy13 = (tex_y3-tex_x1)/(y3-y1)
493
tt_dx13_done:
494
 
495
	mov bx,[@@y3]
496
	sub bx,[@@y2]
497
	jnz tt_dx23_make
498
 
499
	mov word [@@dx23],0
500
	mov word [@@tex_dx23],0
501
	mov word [@@tex_dy23],0
502
	jmp tt_dx23_done
503
tt_dx23_make:
504
	mov ax,[@@x3]
505
	sub ax,[@@x2]
506
	shl ax,7
507
	cwd
508
	idiv bx
509
	mov [@@dx23],ax			; dx23 = (x3-x2)/(y3-y2)
510
 
511
	mov ax,[@@tex_x3]
512
	sub ax,[@@tex_x2]
513
	shl ax,7
514
	cwd
515
	idiv bx
516
	mov [@@tex_dx23],ax		; tex_dx23 = (tex_x3-tex_x2)/(y3-y2)
517
 
518
	mov ax,[@@tex_y3]
519
	sub ax,[@@tex_y2]
520
	shl ax,7
521
	cwd
522
	idiv bx
523
	mov [@@tex_dy23],ax		; tex_dy23 = (tex_y3-tex_y2)/(y3-y2)
524
tt_dx23_done:
525
 
526
 
527
	mov ax,[@@x1]
528
	shl ax,7
529
	mov bx,ax
530
	mov cx,[@@y1]
531
 
532
	mov dx,[@@tex_x1]
533
	shl dx,7
534
	mov [@@scan_x1],dx
535
	mov [@@scan_x2],dx
536
	mov dx,[@@tex_y1]
537
	shl dx,7
538
	mov [@@scan_y1],dx
539
	mov [@@scan_y2],dx
540
tt_loop1:
541
 pushad
542
;	push ax
543
;	push bx
544
;	push cx
545
 
546
	mov dx,[@@scan_y2]
547
	shr dx,7
548
	mov [@@tex_ly2],dx ;push dx
549
	mov dx,[@@scan_x2]
550
	shr dx,7
551
	mov [@@tex_lx2],dx ;push dx
552
	mov dx,[@@scan_y1]
553
	shr dx,7
554
	mov [@@tex_ly1],dx ;push dx
555
	mov dx,[@@scan_x1]
556
	shr dx,7
557
	mov [@@tex_lx1],dx ;push dx
558
	mov ebp,dword [@@tex_off]  ;push word ptr @@tex_off
559
 mov [@@tex_loff],ebp
560
 
561
	mov [@@ly],cx ;push cx
562
	mov dx,bx
563
	shr dx,7
564
	mov [@@lx2],dx ;push dx
565
	mov dx,ax
566
	shr dx,7
567
	mov [@@lx1],dx ; push dx
568
	call textured_horizontal_line
569
 
570
;	pop cx
571
;	pop bx
572
;	pop ax
573
 popad
574
 
575
	mov dx,[@@tex_dx13]
576
	add [@@scan_x1],dx
577
	mov dx,[@@tex_dx12]
578
	add [@@scan_x2],dx
579
	mov dx,[@@tex_dy13]
580
	add [@@scan_y1],dx
581
	mov dx,[@@tex_dy12]
582
	add [@@scan_y2],dx
583
 
584
	add ax,[@@dx13]
585
	add bx,[@@dx12]
586
	inc cx
587
	cmp cx,[@@y2]
588
	jb tt_loop1
589
 
590
	mov bx,[@@x2]
591
	shl bx,7
592
	mov cx,[@@y2]
593
 
594
	mov dx,[@@tex_x2]
595
	shl dx,7
596
	mov [@@scan_x2],dx
597
	mov dx,[@@tex_y2]
598
	shl dx,7
599
	mov [@@scan_y2],dx
600
tt_loop2:
601
 
602
 pushad
603
;	push ax
604
;	push bx
605
;	push cx
606
 
607
	mov dx,[@@scan_y2]
608
	shr dx,7
609
	mov [@@tex_ly2],dx ;push dx
610
	mov dx,[@@scan_x2]
611
	shr dx,7
612
	mov [@@tex_lx2],dx ;push dx
613
	mov dx,[@@scan_y1]
614
	shr dx,7
615
	mov [@@tex_ly1],dx ;push dx
616
	mov dx,[@@scan_x1]
617
	shr dx,7
618
	mov [@@tex_lx1],dx ;push dx
619
	mov ebp,dword [@@tex_off]  ;push word ptr @@tex_off
620
 mov [@@tex_loff],ebp
621
 
622
	mov [@@ly],cx ;push cx
623
	mov dx,bx
624
	shr dx,7
625
	mov [@@lx2],dx ;push dx
626
	mov dx,ax
627
	shr dx,7
628
	mov [@@lx1],dx ; push dx
629
	call textured_horizontal_line
630
 
631
;	pop cx
632
;	pop bx
633
;	pop ax
634
 popad
635
 
636
	mov dx,[@@tex_dx13]
637
	add [@@scan_x1],dx
638
	mov dx,[@@tex_dx23]
639
	add [@@scan_x2],dx
640
	mov dx,[@@tex_dy13]
641
	add [@@scan_y1],dx
642
	mov dx,[@@tex_dy23]
643
	add [@@scan_y2],dx
644
 
645
	add ax,[@@dx13]
646
	add bx,[@@dx23]
647
	inc cx
648
	cmp cx,[@@y3]
649
	jb tt_loop2
650
	ret
651
 
652
@@lx1 dw 0 ;equ [bp+4]
653
@@lx2 dw 0 ;equ [bp+6]
654
@@ly dw 0 ;equ [bp+8]
655
 
656
@@tex_loff dd 0 ;equ [bp+10]
657
@@tex_lx1 dw 0 ;equ [bp+12]
658
@@tex_ly1 dw 0 ;equ [bp+14]
659
@@tex_lx2 dw 0 ;equ [bp+16]
660
@@tex_ly2 dw 0 ;equ [bp+18]
661
 
662
@@tex_ldx dw 0 ;equ [bp-2]
663
@@tex_ldy dw 0 ;equ [bp-4]
664
 
665
textured_horizontal_line:
666
 
667
	mov ax,[@@lx1]
668
	cmp ax,[@@lx2]
669
	je thl_quit
670
	jb thl_ok
671
 
672
	xchg ax,[@@lx2]
673
	mov [@@lx1],ax
674
 
675
	mov ax,[@@tex_lx1]
676
	xchg ax,[@@tex_lx2]
677
	mov [@@tex_lx1],ax
678
 
679
	mov ax,[@@tex_ly1]
680
	xchg ax,[@@tex_ly2]
681
	mov [@@tex_ly1],ax
682
thl_ok:
683
 
684
 ; Fast method
685
; mov edi,0
686
;	mov di,[@@ly]  ;edi = calculating start of line
687
;	mov ax,di
688
;	shl di,6  ;ly*64
689
;	shl ax,8  ;ly*256
690
;	add di,ax    ;di = (ly*64)+(ly*256)
691
;	add di,[@@lx1] ;di = ly*320+lx1
692
; mov eax,edi
693
; shl eax,1
694
; add edi,eax
695
; add edi,scrbuf
696
 
697
 ; Uneversal method
698
 movsx edi,[@@ly]
699
 mov eax,800   ;di = ly*320+lx1
700
 mul edi
701
 movsx ebx,[@@lx1]
702
 add eax,ebx ;[@@lx1]
703
 mov edi,3
704
 mul edi
705
 mov edi,eax
706
 add edi,scrbuf
707
 
708
	mov cx,[@@lx2]
709
	sub cx,[@@lx1]
710
 
711
	mov ax,[@@tex_lx2]
712
	sub ax,[@@tex_lx1]
713
	shl ax,7
714
	cwd
715
	idiv cx
716
	mov [@@tex_ldx],ax			; tex_dx = (tex_x2-tex_x1)/(x2-x1)
717
 
718
	mov ax,[@@tex_ly2]
719
	sub ax,[@@tex_ly1]
720
	shl ax,7
721
	cwd
722
	idiv cx
723
	mov [@@tex_ldy],ax			; tex_dy = (tex_y2-tex_y1)/(x2-x1)
724
 
725
	cld
726
	inc cx
727
	mov ax,[@@tex_lx1]
728
	shl ax,7
729
	mov bx,[@@tex_ly1]
730
	shl bx,7
731
 
732
thl_loop:
733
	mov dx,ax
734
	push bx
735
 
736
	and bx,0ff80h
737
	shr ax,7
738
	add bx,ax
739
 mov ebp,0
740
 mov bp,bx
741
 mov eax,ebp
742
 shl eax,1
743
 add ebp,eax
744
	add ebp,[@@tex_loff]
745
 
746
	mov al,byte [ebp+2]
747
	stosb
748
	mov al,byte [ebp+1]
749
	stosb
750
	mov al,byte [ebp]
751
	stosb
752
 
753
	pop bx
754
	mov ax,dx
755
 
756
	add ax,[@@tex_ldx]
757
	add bx,[@@tex_ldy]
758
	dec cx
759
	jnz thl_loop
760
thl_quit:
761
	ret
762
 
763
;include math3d_2.asm
764
; Mikolaj Felix 20/06/2001
765
; mfelix@polbox.com
766
 
767
;------------------------------------------------------------
768
;	ds:si	- offset to angles (int)
769
;	ds:di	- offset to array of 3d points
770
;	cx	- number of points
771
;------------------------------------------------------------
772
 
773
@@sin_x dd 0 ;equ dword ptr [bp-4]
774
@@cos_x dd 0 ;equ dword ptr [bp-8]
775
@@sin_y dd 0 ;equ dword ptr [bp-12]
776
@@cos_y dd 0 ;equ dword ptr [bp-16]
777
@@sin_z dd 0 ;equ dword ptr [bp-20]
778
@@cos_z dd 0 ;equ dword ptr [bp-24]
779
 
780
@@x equ dword [edi]
781
@@y equ dword [edi+4]
782
@@z equ dword [edi+8]
783
 
784
rotate_points:
785
 
786
	push edi
787
	mov edi,@@sin_x
788
	mov edx,3
789
rp_sin_cos:
790
	mov bx,word [esi]
791
	and bx,MAX_DEGS-1
792
	shl bx,2
793
	mov eax,dword [sintab+bx]
794
	mov dword [edi],eax
795
	mov eax,dword [costab+bx]
796
	mov dword [edi+4],eax
797
	add edi,8
798
	add esi,2
799
	dec edx
800
	jnz rp_sin_cos
801
	pop edi
802
 
803
rp_rotate:
804
	fld @@y
805
	fmul [@@cos_x]
806
	fld @@z
807
	fmul [@@sin_x]
808
	fsubp st1,st
809
	fld @@y
810
	fxch st1
811
	fstp @@y			; Yrotated = Cos (A)*Y - Sin (A)*Z
812
	fmul [@@sin_x]
813
	fld @@z
814
	fmul [@@cos_x]
815
	faddp st1,st
816
	fstp @@z			; Zrotated = Sin (A)*Y + Cos (A)*Z
817
 
818
	fld @@x
819
	fmul [@@cos_y]
820
	fld @@z
821
	fmul [@@sin_y]
822
	fsubp st1,st
823
	fld @@x
824
	fxch st1
825
	fstp @@x			; Xrotated = Cos (A)*X - Sin (A)*Z
826
	fmul [@@sin_y]
827
	fld @@z
828
	fmul [@@cos_y]
829
	faddp st1,st
830
	fstp @@z			; Zrotated = Sin (A)*X + Cos (A)*Z
831
 
832
	fld @@x
833
	fmul [@@cos_z]
834
	fld @@y
835
	fmul [@@sin_z]
836
	fsubp st1,st
837
	fld @@x
838
	fxch st1
839
	fstp @@x			; Xrotated = Cos (A)*X - Sin (A)*Y
840
	fmul [@@sin_z]
841
	fld @@y
842
	fmul [@@cos_z]
843
	faddp st1,st
844
	fstp @@y			; Yrotated = Sin (A)*X + Cos (A)*Y
845
 
846
	add edi,12
847
	dec ecx
848
	jnz rp_rotate
849
	ret
850
 
851
;------------------------------------------------------------
852
;	ds:si	- offset to array of 3d points
853
;	ds:di	- offset to 2d points
854
;	cx	- number of points
855
;------------------------------------------------------------
856
 
857
translate_points:
858
 
859
	fld dword [esi+8]
860
	fadd [perspective]
861
 
862
	fld dword [esi]
863
	fmul [perspective]
864
	fdiv st,st1
865
	fadd [correct_x]
866
	fistp word [edi]		; x2d = (x*persp)/(z+persp)+correct_x
867
 
868
	fld dword [esi+4]
869
	fmul [perspective]
870
	fdivrp st1,st
871
	fadd [correct_y]
872
	fistp word [edi+2]		; y2d = (y*persp)/(z+persp)+correct_y
873
 
874
	add esi,12
875
	add edi,4
876
 dec ecx
877
 jnz translate_points
878
 ret
879
 
880
; initalize SIN&COS table
881
 
882
@@temp1 dd 0 ;dword ptr [bp-4]
883
@@temp2 dd 0 ;dword ptr [bp-8]
884
 
885
init_sincos:
886
	mov [@@temp1],0
887
	fldpi
888
	mov [@@temp2],MAX_DEGS/2
889
	fidiv [@@temp2]
890
	fstp [@@temp2]
891
 
892
	xor edi,edi
893
	mov ecx,MAX_DEGS
894
isc_loop:
895
	fld [@@temp1]
896
	fld st0
897
	fld st0
898
	fsin
899
	fstp dword [sintab+edi]
900
	fcos
901
	fstp dword [costab+edi]
902
	fadd [@@temp2]
903
	fstp [@@temp1]
904
 
905
	add edi,4
906
	dec ecx
907
	jnz isc_loop
908
	ret
909
 
910
perspective dd 256.0
911
correct_x dd 400.0
912
correct_y dd 300.0
913
 
914
angle_x dw 0
915
angle_y dw 0
916
angle_z dw 0
917
 
918
file_texture:
919
file 'texture.raw'
920
 
921
cube	dw -50,-50,50, 50,-50,50, 50,50,50, -50,50,50
922
    	dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50
923
 
924
link db 0,1,2,3, 5,4,7,6, 1,5,6,2, 4,0,3,7, 4,5,1,0, 3,2,6,7
925
 
926
sintab:
927
rd MAX_DEGS
928
costab:
929
rd MAX_DEGS
930
 
931
cube_rotated:
932
rd MAX_POINTS*3
933
coord2d:
934
rw MAX_POINTS*2
935
texture:
936
rb 128*128*3
937
scrbuf:
938
 
939
I_END: