Subversion Repositories Kolibri OS

Rev

Rev 485 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 halyavin 1
;
2
;    3D ТЕКСТУРИРОВАНЫЙ ДВИЖОК  3D TEXTURED ENGINE
3
;    АВТОР: Павлюшин Евгений    AUTOR: Pavlushin Evgeni
4
;
5
;    Компилируется с помощью FASM ассемблера для MenuetOS
6
;    Compile with FASM assembler for MenuetOS
7
;
8
; 20.11.04   Fast point calc & triangle draw
9
;            Little matrix no (trangle massive)
10
;            Fast triangle, del triangle out of screen
11
; 16.12.04   Fast triangle with MMX
12
; 20.12.04   Out triangle fatal bug's deleted, "black zones" deleted
13
;            Matrix move support
14
; 24.12.04   Fast keyboard scanning
15
;            Z-ground level map work
16
;            Texture draw correction deleted "black zones"
17
; 04.01.05   Moveing texture
18
; 05.01.05   Water dynamic texture
19
; 06.01.05   Texture pack (many textures in one file)
20
; 07.01.05   Z-sorting
21
; 08.01.05   Triangle good clipping calculating (speed up)
22
;            4 byte Z-sorting, more dynamic of water
23
; 09.01.05   Texture map from 256 color bmp file
24
;            Pixel Z-buffer, good speed!
25
; 21.01.05   Models buffer add.
26
; 25.01.05   Models buffer update, Add 2 new models.
27
; 29.01.05   Dynamic model array
28
; 01.02.05   1 picture MipMap calculation
29
; 04.02.05   All picture MipMap calculation, proc speed up.
30
;            Simple Triangel MipMap chose.
31
; 05.02.05   Normal Triangel MipMap chose.
32
; 12.02.05   Best QUALITY of Textured TRIANGEL!
33
; 13.02.05   add new models. All camera axis calculating
34
; 16.02.05   Simple model turning
35
; 17.02.05   Advanced model turning, model tmpoints massive deleted
36
;            New map size 128, add new models.
37
; 25.02.05   Left side clipping bug deleted
38
; 26.02.05   Optimization of textured line algorythm
39
; 24.04.05   Test pixel z-buffer it's work. Use new textri algorythm
40
; 30.04.05   Fast Y-clipping
41
 
42
use32
43
 
44
SCREEN_X equ 800 ;320  ;Screen size easy change
45
SCREEN_Y equ 600 ;200
46
DSCREEN_X equ SCREEN_X-1 ;320  ;For triangle clipping
47
DSCREEN_Y equ SCREEN_Y-1 ;200
48
MATRIX_XSIZE equ 64;32;64;100  ;Ground matrix size
49
MATRIX_YSIZE equ 64;32;64;100
50
SECTOR_SIZE  equ 100           ;Size of matrix sector
51
MAP_XSIZE equ 128               ;Rezolution of map file
52
MAP_YSIZE equ 128
53
 
54
    org    0x0
55
    db     'MENUET01'              ; 8 байт интдефикатор
56
    dd     0x01                    ; версия заголовка
57
    dd     START                   ; адресс начала кода
58
    dd     I_END                   ; размер программы
59
    dd     I_END+(SCREEN_X*SCREEN_Y*3+50000)   ; размер памяти для прогграммы
60
    dd     I_END+(SCREEN_X*SCREEN_Y*3+10000)   ; esp
61
    dd     0x0 , 0x0               ; I_Param , I_Icon
62
 
63
include 'lang.inc'
485 heavyiron 64
include '..\..\..\macros.inc'
31 halyavin 65
include 'ascgl.inc'
66
include 'ascl.inc'
67
 
68
START:                          ; начало приложения
69
; Draw window at first
70
     call draw_window
71
 
72
     ; Decoding groud texture and ground level map
73
     gif_hash_offset = gif_hash_area
74
     ;texture's
75
     giftoimg texpack_gif,texpack_img-8
76
     ;ground level map
77
     giftoimg gif_file_area5,glm_img_area
78
 
79
;get 8bitmap from 256 colors bmp file
80
     mov ebp,128;64
81
     mov esi,0x043a+128*128-4;64*64-4
82
     sub esi,128;64
83
     mov edi,0
84
     mov ecx,128;64
85
texmap_unp:
86
     mov al,[bmp_texmap+esi]
87
     mov [img_area+edi],al
88
     inc esi
89
     inc edi
90
     dec ecx
91
     jnz texmap_unp
92
     mov ecx,128;64
93
     sub esi,256;128
94
     dec ebp
95
     jnz texmap_unp
96
 
97
 
98
;Unpack textures
99
 
100
     mov esi,texpack_img
101
     mov edi,texture_img
102
     mov edx,16
103
     mov ecx,16
104
tpuckloop:
105
     pushad
106
     call unpuck
107
     popad
108
     add esi,32*3
109
     add edi,4095
110
     dec ecx
111
     jnz tpuckloop
112
     add esi,31*32*16*3
113
     mov ecx,16
114
     dec edx
115
     jnz tpuckloop
116
 
117
;
118
; Unpuck one texture procendure
119
;
120
     jmp skip_unpuck
121
unpuck:
122
     mov ecx,32
123
     mov edx,32
124
tunploop:
125
     mov ax,[esi]
126
     mov [edi],ax
127
     mov al,[esi+2]
128
     mov [edi+2],al
129
     add esi,3
130
     add edi,3
131
     dec ecx
132
     jnz tunploop
133
     mov ecx,32
134
     add esi,(32*16*3)-(32*3)
135
     dec edx
136
     jnz tunploop
137
     ret
138
skip_unpuck:
139
 
140
 
141
;calculating all mipmaps
142
    mov esi,texture_img
143
    mov ecx,256   ;quantity of textures
144
mmaploop:
145
    mov ebp,32    ;max mipmap texture
146
    pusha
147
    call texgen
148
    popa
149
    add esi,4095  ;next mipmap block
150
    dec ecx
151
    jnz mmaploop
152
 
153
    jmp skip_texgen
154
 
155
;********************************
156
;   MIPMAP TEXTURE GENERATION
157
;
158
; in put:
159
;   esi - offset to texture
160
;   ebp - mipmap max size (32 for this sample)
161
;********************************
162
 
163
texgen:
164
    push esi
165
    mov eax,ebp
166
    imul eax,ebp
167
    imul eax,3
168
    add eax,esi
169
    mov edi,eax
170
 
171
    mov eax,ebp
172
    shr eax,1
173
    mov dh,al
174
    mov dl,al
175
    mov cl,dl
176
 
177
    mov ecx,ebp
178
    mov eax,ebp
179
    shl eax,1
180
    add ecx,eax
181
 
182
miploop:
183
; Red
184
    xor bx,bx  ;for add
185
    xor ax,ax  ;for add
186
    mov al,[esi+0]
187
    add bx,ax
188
    mov al,[esi+3+0]
189
    add bx,ax
190
    mov al,[esi+ecx+0]
191
    add bx,ax
192
    mov al,[esi+ecx+3+0]
193
    add bx,ax
194
    shr bx,2   ;/4
195
    mov [edi+0],bl
196
;Green
197
    xor bx,bx  ;for add
198
    xor ax,ax  ;for add
199
    mov al,[esi+1]
200
    add bx,ax
201
    mov al,[esi+3+1]
202
    add bx,ax
203
    mov al,[esi+ecx+1]
204
    add bx,ax
205
    mov al,[esi+ecx+3+1]
206
    add bx,ax
207
    shr bx,2   ;/4
208
    mov [edi+1],bl
209
;Blue
210
    xor bx,bx  ;for add
211
    xor ax,ax  ;for add
212
    mov al,[esi+2]
213
    add bx,ax
214
    mov al,[esi+3+2]
215
    add bx,ax
216
    mov al,[esi+ecx+2]
217
    add bx,ax
218
    mov al,[esi+ecx+3+2]
219
    add bx,ax
220
    shr bx,2   ;/4
221
    mov [edi+2],bl
222
 
223
    add esi,6
224
    add edi,3
225
    dec dl
226
    jnz miploop
227
    mov ax,bp
228
    shr ax,1
229
    mov dl,al
230
    add esi,ecx
231
    dec dh
232
    jnz miploop
233
    pop esi
234
 
235
    mov eax,ebp
236
    imul eax,ebp
237
    imul eax,3
238
    add esi,eax
239
    shr ebp,1
240
    cmp ebp,1
241
    jne texgen
242
    ret
243
skip_texgen:
244
 
245
 
246
;Copy dynamic water texture
247
; ????????????
248
    mov ecx,32*32*3
249
    mov esi,texture_img+4095 ;32*32*3
250
    mov edi,texture_limg
251
    cld
252
    rep movsb
253
 
254
	; init sine wave for dynamic water texture
255
    finit
256
    mov	edi,sinwave
257
    mov	ecx,32;256
258
    isv_loop:
259
    fld	[angle]
260
    fld	st
261
    fsin
262
    fmul	[mul_wave]
263
    fistp	word [edi]
264
    fadd	[d_angle]
265
    fstp	[angle]
266
    add	edi,2
267
    dec	ecx
268
    jnz	isv_loop
269
 
270
 
271
;Initalize keyboard
272
    mov  eax,66
273
    mov  ebx,1
274
    mov  ecx,1
485 heavyiron 275
    mcall
31 halyavin 276
 
277
    mov  eax,26
278
    mov  ebx,2
279
    mov  ecx,1
280
    mov  edx,keymap+100
485 heavyiron 281
    mcall
31 halyavin 282
 
283
;Build triangle matrix
284
    mov  esi,points
285
    mov  eax,-(MATRIX_XSIZE/2)*SECTOR_SIZE
286
    mov  ebx,-(MATRIX_YSIZE/2)*SECTOR_SIZE
287
    mov  ebp,img_area+8
288
loomat:
289
    mov  [esi],eax        ;x-set
290
    mov  [esi+4],ebx      ;y-set
291
    mov  [esi+8],ecx      ;z-set
292
    add  ebp,3
293
    add  esi,4*3
294
    add  eax,SECTOR_SIZE
295
    cmp  eax,((MATRIX_YSIZE/2)+1)*SECTOR_SIZE
296
    jnge loomat
297
    mov  eax,-(MATRIX_YSIZE/2)*SECTOR_SIZE
298
    add  ebx,SECTOR_SIZE
299
    cmp  ebx,((MATRIX_XSIZE/2)+1)*SECTOR_SIZE
300
    jnge loomat
301
 
302
; Create z-ground good algorythm not already yet (64x64 map)
303
    mov esi,glm_img_area+8
304
    mov edi,ground_level_map
305
loox:
306
; draw_courner_points
307
    mov eax,[esi]
308
    call get_z
309
;    mov [edi],eax
310
 
311
    mov eax,[esi+((MATRIX_XSIZE-1)*4)]
312
    call get_z
313
;    mov [edi+((MATRIX_XSIZE)*4)],eax
314
 
315
    mov eax,[esi+(((MATRIX_XSIZE)*(MATRIX_YSIZE-1)+1)*4)]
316
    call get_z
317
;    mov [edi+(((MATRIX_XSIZE+1)*(MATRIX_YSIZE)-0)*4)],eax
318
 
319
    mov eax,[esi+(((MATRIX_XSIZE)*(MATRIX_YSIZE)-1)*4)]
320
    call get_z
321
;    mov [edi+(((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)-1)*4)],eax
322
 
323
 
324
    jmp skip_gz
325
get_z:
326
    xor ebx,ebx
327
    xor ecx,ecx
328
    mov bl,al
329
    add ecx,ebx
330
    mov bl,ah
331
    add ecx,ebx
332
    shr eax,16
333
    mov bl,al
334
    add ecx,ebx
335
    mov eax,ecx
336
    xor edx,edx
337
    mov ebx,3
338
    cdq
339
    div ebx
340
    neg eax
341
    ret
342
skip_gz:
343
 
344
; z-ground livel facking method (65x65 map)
345
    mov esi,glm_img_area+8
346
    mov edi,ground_level_map
347
    mov ebp,(MAP_XSIZE+1)*(MAP_YSIZE+1)
348
looglm:
349
    mov eax,[esi]
350
;    and eax,0x000000ff
351
    call get_z
352
    mov [edi],eax
353
    add esi,3
354
    add edi,1
355
    dec ebp
356
    jnz looglm
357
 
358
;Fill model massive
359
    mov ecx,[model_mas_start]
360
    imul ecx,8
361
    add ecx,4
362
    mov esi,model_mas_start
363
    mov edi,model_mas
364
    cld
365
    rep movsd
366
 
367
    jmp skip_moddata
368
model_mas_start:
369
dd 12               ;quantity of models
370
dd 0,0,-150,0,0,0,0,bunker
371
dd 60,-250,-190,0,0,64,0,tank
372
dd 0,180,-150,0,0,0,0,cannon
373
dd 0,480,-150,0,0,0,0,outpost
374
dd 260,60,-150,0,0,0,0,bunker
375
dd 60,260,-150,0,0,0,0,outpost
376
dd 210,410,-150,0,0,0,0,cannon
377
dd 160,260,-150,0,0,0,0,tree
378
dd 100,-360,-150,0,0,192,0,gqfa
379
dd 10,580,-150,0,0,0,0,repear
380
dd 460,160,-100,0,0,0,0,red_flag
381
dd 60,360,-170,0,0,40,0,cannon
382
skip_moddata:
383
 
384
 
385
;Main loop
386
still:                          ; основной цикл
387
    mov  eax,11                 ; проверка состояния окна
485 heavyiron 388
    mcall
31 halyavin 389
 
390
    cmp  eax,1                  ; окно сдвинули его нужно перерисовать
391
    je   red
392
    cmp  eax,2                  ; нажата клавиша на клавиатуре
393
    je   key
394
    cmp  eax,3                  ; нажата кнопка в окне
395
    je   button
396
 
397
;    delay 10
398
;    cmp  [autorot],0  ;frize no fps show when autorot off
399
;    je   still
400
 
401
cycle:
402
    call clrscr                 ; clear screen buffer
403
    call clrzbuf                ; clear z-buffer
404
    call render_scene           ; calculating scene
405
    call dispimg                ; show buffer
406
 
407
    fps_show_frequency=0
408
    fps 10,10,cl_White,cl_Black
409
 
410
 
411
;turn model on z-axis
412
    inc dword [model_mas+4*6]
413
    and dword [model_mas+4*6],011111111b
414
 
415
 
416
; Sin wave dynamic texture for water
417
; jmp ndt
418
 xor edi,edi
419
	mov	dx,32
420
	mov	bp,word [sin_pos]
421
dp_ver:
422
	mov	cx,32 ;320
423
	mov	si,word [sin_pos]
424
dp_hor:
425
 and ebp,0000ffffh
426
	mov	ax,word [sinwave+ebp]
427
	add	ax,cx
428
	and	ax,31
429
 
430
 and esi,0000ffffh
431
	mov	bx,word [sinwave+esi]
432
	add	bx,dx
433
	and	bx,31
434
	shl	bx,5
435
	add	bx,ax
436
 
437
 push bx
438
 imul bx,3
439
 and ebx,0000ffffh
440
	mov	ax,[texture_limg+ebx]
441
 mov [texture_img2+edi],ax
442
	mov	al,[texture_limg+ebx+2]
443
 mov [texture_img2+edi+2],al
444
 pop bx
445
 
446
 add edi,3
447
	add	si,2
448
	and	si,63;511
449
 
450
	dec	cx
451
	jnz	dp_hor
452
	add	bp,2
453
	and	bp,63;511
454
	dec	dx
455
	jnz	dp_ver
456
 
457
; update sine position for next frame
458
	add	word [sin_pos],2
459
	and	word [sin_pos],63;511
460
 
461
;Move water texture
462
    jmp ndt
463
    mov  esi,texture_limg
464
    mov  ecx,32*32-1
465
loodt:
466
    mov  al,byte [esi]
467
    mov  bl,byte [esi+1]
468
    mov  dl,byte [esi+2]
469
    mov  ah,byte [esi+3]
470
    mov  bh,byte [esi+4]
471
    mov  dh,byte [esi+5]
472
    mov  byte [esi],ah
473
    mov  byte [esi+1],bh
474
    mov  byte [esi+2],dh
475
    mov  byte [esi+3],al
476
    mov  byte [esi+4],bl
477
    mov  byte [esi+5],dl
478
    add  esi,3
479
    dec  ecx
480
    jnz  loodt
481
ndt:
482
 
483
;Creat mipmap pack for dynamic texture
484
    mov ebp,32
485
    mov esi,texture_img+4095
486
    call texgen
487
 
488
 
489
    mov  eax,4                     ; function 4 : write text to window
490
    mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
491
    mov  ecx,0x0000ff00            ; font 1 & color ( 0xF0RRGGBB )
492
    mov  edx,keymap                ; pointer to text beginning
493
    mov  esi,100       ; text length
485 heavyiron 494
    mcall
31 halyavin 495
    add  edx,100
496
    add  ebx,10
497
    mov  esi,60       ; text length
498
    mov  ecx,0x00dddddd            ; font 1 & color ( 0xF0RRGGBB )
485 heavyiron 499
    mcall
31 halyavin 500
    mov  edx,usemap
501
    mov  esi,60       ; text length
502
    mov  ecx,0x0000ff00
485 heavyiron 503
    mcall
31 halyavin 504
    jmp rx
505
          ;01234567890123456789012345678901234567890123456789
506
usemap db ' E               wer  u   []  asd           zxc   '
507
       db '                                                  '
508
rx:
509
 
510
    cmp byte [keymap+1],0
511
    je  n_esc
512
    jmp exit
513
n_esc:
514
 
515
    cmp byte [keymap+22],0
516
    je  n_u
517
    mov [Xangle],0
518
    mov [Yangle],0
519
    mov [Zangle],0
520
n_u:
521
 
522
; t,y - mipmap cntrol
523
    cmp byte [keymap+20],0
524
    je  n_t
525
    inc [mipzoom]
526
n_t:
527
    cmp byte [keymap+21],0
528
    je  n_y
529
    dec [mipzoom]
530
n_y:
531
    cmp byte [keymap+23],0
532
    je  n_i
533
    mov byte [keymap+23],0 ; reset key
534
    cmp [mipmapwork],1
535
    je  i_1
536
i_0:
537
    mov [mipmapwork],1
538
    jmp n_i
539
i_1:
540
    mov [mipmapwork],0
541
n_i:
542
 
543
 
544
    cmp byte [keymap+26],0
545
    je  n_lsk
546
    add [Xcam],1
547
n_lsk:
548
    cmp byte [keymap+27],0
549
    je  n_rsk
550
    sub [Xcam],1
551
n_rsk:
552
    cmp byte [keymap+18],0
553
    je  n_e
554
    add [Yangle],1
555
n_e:
556
    cmp byte [keymap+45],0
557
    je  n_x
558
    sub [Yangle],1
559
n_x:
560
    cmp byte [keymap+31],0
561
    je  n_s
562
    add [Xangle],1
563
n_s:
564
    cmp byte [keymap+32],0
565
    je  n_d
566
    sub [Xangle],1
567
n_d:
568
    cmp byte [keymap+44],0
569
    je  n_z
570
    add [Zangle],1
571
n_z:
572
    cmp byte [keymap+46],0
573
    je  n_c
574
    sub [Zangle],1
575
n_c:
576
    cmp byte [keymap+17],0
577
    je  n_w
578
    add [Zcam],25 ;250
579
n_w:
580
    cmp byte [keymap+19],0
581
    je  n_r
582
    sub [Zcam],25 ;250
583
n_r:
584
 
585
    cmp byte [keymap+75],0
586
    je  n_lk
587
    add [Zcamangle],1
588
    and [Zcamangle],011111111b
589
n_lk:
590
    cmp byte [keymap+77],0
591
    je  n_rk
592
    sub [Zcamangle],1
593
    and [Zcamangle],011111111b
594
n_rk:
595
 
596
    cmp byte [keymap+79],0
597
    je  n_num1
598
    add [Xcamangle],1
599
    and [Xcamangle],011111111b
600
n_num1:
601
    cmp byte [keymap+81],0
602
    je  n_num3
603
    sub [Xcamangle],1
604
    and [Xcamangle],011111111b
605
n_num3:
606
    cmp byte [keymap+71],0
607
    je  n_num7
608
    add [Ycamangle],1
609
    and [Ycamangle],011111111b
610
n_num7:
611
    cmp byte [keymap+73],0
612
    je  n_num9
613
    sub [Ycamangle],1
614
    and [Ycamangle],011111111b
615
n_num9:
616
 
617
 
618
 
619
    cmp byte [keymap+30],0
620
    je  n_a
621
    mov byte [keymap+30],0 ; reset key
622
    cmp [autorot],1
623
    je  a_1
624
a_0:
625
    mov [autorot],1
626
    jmp n_a
627
a_1:
628
    mov [autorot],0
629
n_a:
630
 
631
; for camera
632
;    mov     ebx,[Xcamangle]
633
;    call    GetSinCos
634
;    mov     [Xcamsin],eax
635
;    mov     [Xcamcos],ebx
636
 
637
;    mov     ebx,[Ycamangle]
638
;    call    GetSinCos
639
;    mov     [Ycamsin],eax
640
;    mov     [Ycamcos],ebx
641
 
642
    mov     ebx,[Zcamangle]
643
    call    GetSinCos
644
    mov     [Zcamsin],eax
645
    mov     [Zcamcos],ebx
646
 
647
    mov eax,[Zcamsin]
648
    mov ebx,[Zcamcos]
649
;    mov ecx,[Xcamsin]
650
;    mov edx,[Xcamcos]
651
;    mov esi,[Ycamsin]
652
;    mov edi,[Ycamcos]
653
 
654
    sar eax,4
655
    sar ebx,4
656
;    sar ecx,4
657
;    sar edx,4
658
;    sar esi,4
659
;    sar edi,4
660
 
661
    cmp byte [keymap+72],0
662
    je  n_uk
663
    sub [Xcam],eax
664
    sub [Ycam],ebx
665
 
666
;    sub [Zcam],ecx
667
;    sub [Ycam],edx
668
 
669
;    sub [Xcam],esi
670
;    add [Zcam],edi
671
 
672
n_uk:
673
    cmp byte [keymap+80],0
674
    je  n_dk
675
    add [Xcam],eax
676
    add [Ycam],ebx
677
 
678
;    add [Zcam],ecx
679
;    add [Ycam],edx
680
 
681
;    add [Xcam],esi
682
;    sub [Zcam],edi
683
 
684
n_dk:
685
 
686
    xor ebp,ebp
687
move_test:
688
    cmp [Xcam],-SECTOR_SIZE/2
689
    jnl ok1
690
    add [Xcam],SECTOR_SIZE
691
    dec [Xmap]
692
    jmp move_test
693
ok1:
694
    cmp [Xcam],SECTOR_SIZE/2
695
    jng ok2
696
    sub [Xcam],SECTOR_SIZE
697
    inc [Xmap]
698
    jmp ok1
699
ok2:
700
    cmp [Ycam],-SECTOR_SIZE/2
701
    jnl ok3
702
    add [Ycam],SECTOR_SIZE
703
    dec [Ymap]
704
    jmp ok2
705
ok3:
706
    cmp [Ycam],SECTOR_SIZE/2
707
    jng ok4
708
    sub [Ycam],SECTOR_SIZE
709
    inc [Ymap]
710
    jmp ok3
711
ok4:
712
 
713
    and [Xangle],011111111b
714
    and [Yangle],011111111b
715
    and [Zangle],011111111b
716
 
717
    jmp still
718
 
719
  red:                          ; redraw
720
    call draw_window
721
    jmp  still
722
 
723
  key:                          ; key
724
    mov  eax,2                  ; just read it and ignore
485 heavyiron 725
    mcall
31 halyavin 726
 
727
    shr eax,8
728
    and eax,0xff
729
    mov ah,al
730
 
731
    mov ebx,0
732
    mov bl,ah
733
    cmp bl,224
734
    je  noisa  ; ignore Ext code
735
    cmp bl,170
736
    je  noisa  ; ignore Key Up code
737
    cmp bl,128
738
    ja  isa
739
    mov [keymap+ebx],byte 'X'  ; set press marker to key id
740
    jmp noisa
741
isa:
742
    sub bl,128
743
    mov [keymap+ebx],byte 0    ; reset key marker
744
noisa:
745
    jmp n_a
746
 
747
    jmp still ; cycle
748
 
749
  button:                       ; button
750
    mov  eax,17                 ; get id
485 heavyiron 751
    mcall
31 halyavin 752
    cmp ah,1
753
    jz exit
754
    jmp  cycle
755
 
756
exit:
485 heavyiron 757
    or eax,-1
758
    mcall
31 halyavin 759
 
760
;   *********************************************
761
;   *******  WINDOW DEFINITIONS AND DRAW ********
762
;   *********************************************
763
 
764
draw_window:
765
    mov  eax,12                    ; function 12:tell os about windowdraw
766
    mov  ebx,1                     ; 1, start of draw
485 heavyiron 767
    mcall
31 halyavin 768
                                   ; DRAW WINDOW
769
    mov  eax,0                     ; function 0 : define and draw window
770
    mov  ebx,0*65536+SCREEN_X-1         ; [x start] *65536 + [x size]
771
    mov  ecx,0*65536+SCREEN_Y-1         ; [y start] *65536 + [y size]
772
    mov  edx,0x03ffffff            ; color of work area RRGGBB,8->color gl
773
    mov  esi,0x005080d0            ; color of grab bar  RRGGBB,8->color gl
774
    mov  edi,0x005080d0            ; color of frames    RRGGBB
485 heavyiron 775
    mcall
31 halyavin 776
                                   ; WINDOW LABEL
777
    mov  eax,4                     ; function 4 : write text to window
778
    mov  ebx,8*65536+8             ; [x start] *65536 + [y start]
779
    mov  ecx,0x10ddeeff            ; font 1 & color ( 0xF0RRGGBB )
780
    mov  edx,labelt                ; pointer to text beginning
781
    mov  esi,labellen-labelt       ; text length
485 heavyiron 782
    mcall
31 halyavin 783
 
784
    mov eax,12
785
    mov ebx,2
485 heavyiron 786
    mcall
31 halyavin 787
    ret
788
 
789
dispimg:
790
    mov eax,7
791
    mov ebx,I_END ;zbuffer
792
    mov ecx,SCREEN_X*65536+SCREEN_Y
793
    xor edx,edx  ;0*65536+0
485 heavyiron 794
    mcall
31 halyavin 795
;    ret
796
 
797
    mov eax,8
798
    mov ebx,(SCREEN_X-30)*65536+20
799
    mov ecx,10*65536+20
800
    mov edx,1
801
    mov esi,0x0000aa00
485 heavyiron 802
    mcall
31 halyavin 803
    ret
804
 
805
clrscr:                         ; clear screen buffer
806
;    cld
807
;    mov edi,I_END
808
;    xor eax,eax
809
;    mov ecx,SCREEN_X*SCREEN_Y*3/4
810
;    rep stosd
811
;    ret
812
 
813
; clear screen buffer with MMX technology +1,5 fps
814
    mov edi,I_END
815
    mov ecx,SCREEN_X*SCREEN_Y*3/32
816
    xor eax,eax
817
    movd mm0,eax
818
    movd mm1,eax
819
    movd mm2,eax
820
    movd mm3,eax
821
csloo:
822
    movq qword [edi],mm0
823
    movq qword [edi+8],mm1
824
    movq qword [edi+16],mm2
825
    movq qword [edi+24],mm3
826
    add edi,32
827
    dec ecx
828
    jnz csloo
829
    ret
830
 
831
clrzbuf:                         ; clear zbuf
832
    cld
833
    mov edi,zbuffer
834
    mov eax,-1
835
    mov ecx,SCREEN_X*SCREEN_Y*3/4
836
    rep stosd
837
    ret
838
 
839
 
840
;    mov [@@atx1],dword 0xffffffff
841
;    mov [@@aty1],dword 0xffffffff
842
;    movq mm0,qword [@@atx1]
843
;    movq mm1,qword [@@atx1]
844
;    movq mm2,qword [@@atx1]
845
;    movq mm3,qword [@@atx1]
846
;czbloo:
847
;    movq qword [edi],mm0
848
;    movq qword [edi+8],mm1
849
;    movq qword [edi+16],mm2
850
;    movq qword [edi+24],mm3
851
;    add edi,32
852
;    dec ecx
853
;    jnz czbloo
854
    ret
855
 
856
@@atx1: dd 0
857
@@aty1: dd 0
858
 
859
;===========================================================================
860
;
861
;   3D-system example. Use the following formulas to rotate a point:
862
;
863
;        Rotate around x-axis
864
;        Y = Y * COS(xang) - Z * SIN(xang) / 256
865
;        Z = Y * SIN(xang) + Z * COS(xang) / 256
866
;
867
;        Rotate around y-axis
868
;        X = X * COS(yang) - Z * SIN(yang) / 256
869
;        Z = X * SIN(yang) + Z * COS(yang) / 256
870
;
871
;        Rotate around z-axis
872
;        X = X * COS(zang) - Y * SIN(zang) / 256
873
;        Y = X * SIN(zang) + Y * COS(zang) / 256
874
;
875
;   Divide by 256 coz we have multiplyd our sin values with 256 too.
876
;   This example isn't too fast right now but it'll work just fine.
877
;
878
;===========================================================================
879
 
880
;***************************************************************************
881
;                      \\\   MAIN 3D LOOP   ///
882
;                         ******************
883
render_scene:
884
 
885
;********************
886
; Turn matrix points
887
;********************
888
 
889
    cmp   [autorot],0
890
    je    no_autorot
891
    call  UpdateAngles        ; Calculate new angles
892
no_autorot:
893
    call  SetRotation         ; Find sine & cosine of those angles
894
 
895
    mov  edi,tpoints
896
    mov  esi,points
897
    mov [mapoff],-1      ;-1 at start
898
    mov ebp,[Ymap]
899
    imul ebp,MAP_XSIZE+1
900
    mov eax,[Xmap]
901
    add ebp,eax
902
 
903
    mov  ecx,(MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)
904
ShowLoop:
905
    push ecx
906
    push esi
907
    mov  eax,[esi]
908
    sub  eax,[Xcam]
909
    mov  [X],eax
910
    mov  eax,[esi+4]
911
    sub  eax,[Ycam]
912
    mov  [Y],eax
913
    mov  eax,[ebp+ground_level_map]    ;color
914
    and  eax,0x000000ff
915
    sub  eax,[Zcam]
916
    mov  [Z],eax
917
    push ebp
918
    push edi
919
    call TranslatePoint         ; Rotates the point using above formulas
920
    pop  edi
921
    mov  [edi],ebp    ;x
922
    mov  [edi+4],eax  ;y
923
    mov  eax,[Z]      ;z
924
    add  eax,[Zoff]
925
    mov  [edi+8],eax
926
    pop  ebp
927
    pop  esi
928
    pop  ecx
929
 
930
    add  esi,4*3 ;next in point
931
    add  edi,4*3 ;next out point
932
 
933
    inc [mapoff]
934
    cmp [mapoff],MATRIX_XSIZE+1
935
    jne no_shift_glm
936
    mov [mapoff],dword 0
937
    add ebp,(MAP_XSIZE-MATRIX_XSIZE)
938
no_shift_glm:
939
    add ebp,1
940
 
941
    dec  ecx
942
    jnz  ShowLoop
943
 
944
 
945
; Show, how many polygons on screen.
946
    outcount [massize],50,10,cl_White,8*65536
947
 
948
 
949
;*****************
950
;  out triangles
951
;*****************
952
 
953
    mov [mapoff],-1      ;-1 at start
954
    mov [massize],0      ;restet triangle massive counter
955
 
956
    mov ebp,[Ymap]
957
    imul ebp,MAP_XSIZE;64;3*64  ;MAP_XSIZE
958
    mov eax,[Xmap]
959
    add ebp,eax
960
 
961
    mov edi,tpoints
962
    mov ecx,MATRIX_YSIZE ;64
963
lootpy:
964
    push ecx
965
    mov ecx,MATRIX_XSIZE ;64
966
lootpx:
967
;draw four angle (two triangles)
968
 
969
Z_MAX = 10    ;maximal z range for triangles
970
 
971
; get texture offset at start
972
    inc [mapoff]
973
    cmp [mapoff],MATRIX_XSIZE
974
    jne no_shift
975
    mov [mapoff],dword 0
976
    add ebp,(MAP_XSIZE-MATRIX_XSIZE)
977
no_shift:
978
    xor eax,eax
979
    mov al,[ebp+img_area];+8]
980
    inc ebp
981
    imul eax,4095;32*32*3
982
    add eax,texture_img
983
    mov ebx,eax
984
 
985
;first triangle
986
    mov eax,[edi+8]          ;z1
987
    cmp eax,Z_MAX
988
    jl  no_add1
989
    mov [@@tz1],eax
990
    mov eax,[edi+8+12]   ;z2
991
    cmp eax,Z_MAX
992
    jl  no_add1
993
    mov [@@tz2],eax
994
    mov eax,[edi+8+(4*3*(MATRIX_XSIZE+2))]   ;z3
995
    cmp eax,Z_MAX
996
    jl  no_add1
997
    mov [@@tz3],eax
998
 
999
    cmp dword [edi],SCREEN_X
1000
    ja  p11
1001
    cmp dword [edi+4],SCREEN_Y
1002
    jna yes_add1
1003
p11:
1004
    cmp dword [edi+12],SCREEN_X
1005
    ja  p12
1006
    cmp dword [edi+4+12],SCREEN_Y
1007
    jna yes_add1
1008
p12:
1009
    cmp dword [edi+(4*3*(MATRIX_XSIZE+2))],SCREEN_X
1010
    ja  p13
1011
    cmp dword [edi+4+(4*3*(MATRIX_XSIZE+2))],SCREEN_Y
1012
    jna yes_add1
1013
p13:
1014
    jmp no_add1
1015
yes_add1:
1016
 
1017
    movq mm0,qword [edi]        ;x1
1018
    movq mm1,qword [edi+12]     ;x2
1019
    movq mm2,qword [edi+(4*3*(MATRIX_XSIZE+2))]     ;x3
1020
    movq qword [@@tx1],mm0
1021
    movq qword [@@tx2],mm1
1022
    movq qword [@@tx3],mm2
1023
 
1024
    mov eax,ebx;+1 shl 31;[ebp]
1025
    mov [@@tex_off],eax ;0x0000ff00
1026
    inc [massize]
1027
    pushad
1028
    mov [@@tex_x1],0
1029
    mov [@@tex_y1],0
1030
    mov [@@tex_x3],(32 shl 16) -1;128
1031
    mov [@@tex_y3],(32 shl 16) -1;128
1032
    mov [@@tex_x2],0
1033
    mov [@@tex_y2],(32 shl 16) -1;128
1034
    call textured_triangle
1035
    popad
1036
 
1037
no_add1:
1038
 
1039
 
1040
 
1041
;second triangle
1042
    mov eax,[edi+8]          ;z1
1043
    cmp eax,Z_MAX
1044
    jl  no_add2
1045
    mov [@@tz1],eax
1046
    mov eax,[edi+8+(4*3*(MATRIX_XSIZE+1))]   ;z2
1047
    cmp eax,Z_MAX
1048
    jl  no_add2
1049
    mov [@@tz2],eax
1050
    mov eax,[edi+8+(4*3*(MATRIX_XSIZE+2))]   ;z3
1051
    cmp eax,Z_MAX
1052
    jl  no_add2
1053
    mov [@@tz3],eax
1054
 
1055
    cmp dword [edi],SCREEN_X
1056
    ja  p21
1057
    cmp dword [edi+4],SCREEN_Y
1058
    jna yes_add2
1059
p21:
1060
    cmp dword [edi+(4*3*(MATRIX_XSIZE+1))],SCREEN_X
1061
    ja  p22
1062
    cmp dword [edi+4+(4*3*(MATRIX_XSIZE+1))],SCREEN_Y
1063
    jna yes_add2
1064
p22:
1065
    cmp dword [edi+(4*3*(MATRIX_XSIZE+2))],SCREEN_X
1066
    ja  p23
1067
    cmp dword [edi+4+(4*3*(MATRIX_XSIZE+2))],SCREEN_Y
1068
    jna yes_add2
1069
p23:
1070
    jmp no_add2
1071
yes_add2:
1072
 
1073
    movq mm0,qword [edi]            ;x1
1074
    movq mm1,qword [edi+(4*3*(MATRIX_XSIZE+1))]     ;x2
1075
    movq mm2,qword [edi+(4*3*(MATRIX_XSIZE+2))]     ;x3
1076
    movq qword [@@tx1],mm0
1077
    movq qword [@@tx2],mm1
1078
    movq qword [@@tx3],mm2
1079
 
1080
 
1081
    mov eax,ebx
1082
    mov [@@tex_off],eax ;0x0000ff00
1083
    inc [massize]
1084
;    add esi,4*10
1085
 
1086
    pushad
1087
    mov [@@tex_x1],0
1088
    mov [@@tex_y1],0
1089
    mov [@@tex_x3],(32 shl 16) -1;128
1090
    mov [@@tex_y3],(32 shl 16) -1;128
1091
    mov [@@tex_x2],(32 shl 16) -1
1092
    mov [@@tex_y2],0
1093
    call textured_triangle
1094
    popad
1095
 
1096
 
1097
no_add2:
1098
 
1099
    add edi,4*3     ;next triangle
1100
    dec ecx
1101
    jnz lootpx
1102
    add edi,4*3     ;next string
1103
    pop ecx
1104
    dec ecx
1105
    jnz lootpy
1106
 
1107
;**********************************
1108
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1109
;**********************************
1110
; For good models quality -5% speed
1111
;    call clrzbuf
1112
 
1113
    jmp skip_modmas
1114
mmcnt       dd 0 ;counter of model read number
1115
modeloff    dd 0 ;offset of model structure
1116
modelmoff   dd 0 ;offset in model mas
1117
modeltmpoff dd 0 ;tmpoints offset
1118
; massive of models
1119
; format: X,Y,Z coordoinats,offset to model structure
1120
 
1121
skip_modmas:
1122
 
1123
; Rendering models on map
1124
 
1125
    mov  eax,[model_mas]
1126
    mov  [mmcnt],eax
1127
 
1128
ModelRenderLoop:
1129
 
1130
    mov  ebx,[mmcnt]
1131
    dec  ebx
1132
    imul ebx,4*8
1133
    add  ebx,model_mas+4
1134
    mov  ebp,ebx   ;edi=model offset X,Y,Z,Xturn,Yturn,Zturn,zero,modeloff
1135
 
1136
    mov     ebx,[ebp+4*3];[Xangle]         ; Grab angle
1137
    call    GetSinCos           ; Get the sine&cosine
1138
    mov     [Xsin],eax           ; Save sin
1139
    mov     [Xcos],ebx           ; Save cos
1140
    mov     ebx,[ebp+4*4];[Yangle]
1141
    call    GetSinCos
1142
    mov     [Ysin],eax
1143
    mov     [Ycos],ebx
1144
    mov     ebx,[ebp+4*5];[Zangle]
1145
    call    GetSinCos
1146
    mov     [Zsin],eax
1147
    mov     [Zcos],ebx
1148
 
1149
    mov  ebx,[mmcnt]
1150
    imul ebx,4*8
1151
    add  ebx,model_mas+4-4
1152
    mov  eax,[ebx]
1153
 
1154
    mov  [modeloff],eax
1155
    sub  ebx,4*7;3
1156
    mov  [modelmoff],ebx
1157
 
1158
    mov edi,modelpoints
1159
    mov  esi,eax ;bunker+8
1160
    add  esi,8
1161
    mov  ecx,[eax] ;[bunker] ;MODEL_POINTS
1162
 
1163
TurnModelLoop:
1164
    push ecx
1165
    push esi
1166
    mov  eax,[esi]
1167
    mov  [X],eax
1168
    mov  eax,[esi+4]
1169
    mov  [Y],eax
1170
    mov  eax,[esi+8]
1171
    mov  [Z],eax
1172
    push ebp
1173
    push edi
1174
 
1175
;RotatePoint
1176
 
1177
    mov esi,[Y]
1178
    mov ebx,[Xcos]
1179
    mov edi,[Z]
1180
    mov ecx,[Xsin]
1181
    call math
1182
    mov [Y],esi
1183
    mov [Z],edi
1184
    mov esi,[X]
1185
    mov ebx,[Ycos]
1186
    mov ecx,[Ysin]
1187
    call math
1188
    mov [X],esi
1189
    mov [Z],edi
1190
    mov ebx,[Zcos]
1191
    mov edi,[Y]
1192
    mov ecx,[Zsin]
1193
    call math
1194
    mov [X],esi
1195
    mov [Y],edi
1196
 
1197
    pop  edi
1198
 
1199
    mov  eax,[X]
1200
    mov  [edi],eax
1201
    mov  eax,[Y]
1202
    mov  [edi+4],eax
1203
 
1204
    mov  eax,[Z]      ;z
1205
;    add  eax,[Zoff]
1206
    mov  [edi+8],eax
1207
    pop  ebp
1208
    pop  esi
1209
    pop  ecx
1210
 
1211
    add  esi,4*3 ;next in point
1212
    add  edi,4*3 ;next out point
1213
 
1214
    dec  ecx
1215
    jnz  TurnModelLoop
1216
 
1217
modxxx:
1218
 
1219
 
1220
;Turn model off map
1221
 
1222
    call SetRotation
1223
 
1224
    mov  ebx,[mmcnt]
1225
    imul ebx,4*8
1226
    add  ebx,model_mas+4-4
1227
    mov  eax,[ebx]
1228
 
1229
    mov  [modeloff],eax
1230
    sub  ebx,4*7;3
1231
    mov  [modelmoff],ebx
1232
 
1233
    mov edi,modelpoints
1234
    mov  ecx,[eax] ;[bunker] ;MODEL_POINTS
1235
 
1236
ShowModelLoop:
1237
    push ecx
1238
    mov  eax,[edi] ;esi]
1239
 
1240
    mov  ebx,[modelmoff]
1241
    sub  eax,[ebx] ;[Xmod]
1242
 
1243
    sub  eax,[Xcam]
1244
    mov  ebx,[Xmap]
1245
    imul ebx,SECTOR_SIZE
1246
    sub  eax,ebx
1247
    mov  [X],eax
1248
    mov  eax,[edi+4] ;esi+4]
1249
 
1250
    mov  ebx,[modelmoff]
1251
    sub  eax,[ebx+4] ;[Ymod]
1252
 
1253
    sub  eax,[Ycam]
1254
    mov  ebx,[Ymap]
1255
    imul ebx,SECTOR_SIZE
1256
    sub  eax,ebx
1257
    mov  [Y],eax
1258
    mov  eax,[edi+8];esi+8]
1259
 
1260
    mov  ebx,[modelmoff]
1261
    sub  eax,[ebx+8] ;[Zmod]
1262
 
1263
    sub  eax,[Zcam]
1264
    mov  [Z],eax
1265
    push ebp
1266
    push edi
1267
    call TranslatePoint         ; Rotates the point using above formulas
1268
    pop  edi
1269
    mov  [edi],ebp    ;x
1270
    mov  [edi+4],eax  ;y
1271
    mov  eax,[Z]      ;z
1272
    add  eax,[Zoff]
1273
    mov  [edi+8],eax
1274
    pop  ebp
1275
    pop  ecx
1276
 
1277
    add  edi,4*3 ;next out point
1278
 
1279
    dec  ecx
1280
    jnz  ShowModelLoop
1281
 
1282
 
1283
;    add [model_mas+8],dword 3
1284
 
1285
 
1286
 
1287
    mov esi,[massize]
1288
    imul esi,4*10
1289
 
1290
    mov eax,[modeloff]
1291
    mov ecx,[eax+4] ;MODEL_TRIANGELS
1292
 
1293
;calc tmpoints offset
1294
    mov edi,modelpoints
1295
    mov [modeltmpoff],edi
1296
 
1297
;calc postlink offset
1298
    mov edi,[eax]
1299
    imul edi,3*4;*2  ;X,Y,Z (3) points dd format (4) 2 masives (2)
1300
    add edi,eax
1301
    add edi,8       ;skip dd points, dd triangels
1302
msloo:
1303
 
1304
    mov ebx,[edi]
1305
    imul ebx,4*3
1306
    add ebx,[modeltmpoff] ;tmpoints
1307
    mov eax,[ebx]
1308
    mov [@@tx1],eax
1309
    mov eax,[ebx+4]
1310
    mov [@@ty1],eax
1311
    mov eax,[ebx+8]
1312
    mov [@@tz1],eax
1313
 
1314
    mov ebx,[edi+4]
1315
    imul ebx,4*3
1316
    add ebx,[modeltmpoff] ;tmpoints
1317
    mov eax,[ebx]
1318
    mov [@@tx2],eax
1319
    mov eax,[ebx+4]
1320
    mov [@@ty2],eax
1321
    mov eax,[ebx+8]
1322
    mov [@@tz2],eax
1323
 
1324
    mov ebx,[edi+8]
1325
    imul ebx,4*3
1326
    add ebx,[modeltmpoff] ;tmpoints
1327
    mov eax,[ebx]
1328
    mov [@@tx3],eax
1329
    mov eax,[ebx+4]
1330
    mov [@@ty3],eax
1331
    mov eax,[ebx+8]
1332
    mov [@@tz3],eax
1333
 
1334
 
1335
    cmp dword [@@tz1],Z_MAX
1336
    jl  no_add
1337
    cmp dword [@@tz2],Z_MAX
1338
    jl  no_add
1339
    cmp dword [@@tz3],Z_MAX
1340
    jl  no_add
1341
    cmp dword [@@tx1],SCREEN_X
1342
    ja  pm1
1343
    cmp dword [@@ty1],SCREEN_Y
1344
    jna yes_madd
1345
pm1:
1346
    cmp dword [@@tx2],SCREEN_X
1347
    ja  pm2
1348
    cmp dword [@@ty2],SCREEN_Y
1349
    jna yes_madd
1350
pm2:
1351
    cmp dword [@@tx3],SCREEN_X
1352
    ja  pm3
1353
    cmp dword [@@ty3],SCREEN_Y
1354
    jna yes_madd
1355
pm3:
1356
    jmp no_add
1357
yes_madd:
1358
 
1359
 
1360
 
1361
 
1362
    mov ebx,[edi+12]
1363
    dec ebx
1364
    js  ttex
1365
    mov eax,1 shl 31
1366
    jmp posit
1367
ttex:
1368
    add ebx,2
1369
    mov eax,0
1370
    neg ebx
1371
posit:
1372
    imul ebx,4095;32*32*3
1373
    add ebx,texture_img
1374
    mov [@@tex_off],ebx
1375
 
1376
    pushad
1377
    mov [@@tex_x1],0
1378
    mov [@@tex_y1],0
1379
    mov [@@tex_x3],(32 shl 16) -1;128
1380
    mov [@@tex_y3],(32 shl 16) -1;128
1381
    cmp eax,0
1382
    je  nez
1383
    mov [@@tex_x2],0
1384
    mov [@@tex_y2],(32 shl 16) -1
1385
    jmp isz
1386
nez:
1387
    mov [@@tex_x2],(32 shl 16) -1
1388
    mov [@@tex_y2],0
1389
isz:
1390
    call textured_triangle
1391
    popad
1392
 
1393
;    mov [esi+8+24+4],eax
1394
;    add esi,4*10
1395
    inc [massize]
1396
no_add:
1397
    add edi,4*4; *9
1398
    dec ecx
1399
    jnz msloo
1400
 
1401
    dec [mmcnt]
1402
    jnz ModelRenderLoop
1403
 
1404
 
1405
    jmp skip_mdata
1406
 
1407
bunker:
1408
dd 8      ;model points
1409
dd 10     ;model triagels
1410
;mpoints:
1411
dd -105,-105,0, -105,105,0, 105,105,0,  105,-105,0
1412
dd -70,-70,-50, -70,70,-50, 70,70,-50,  70,-70,-50
1413
 
1414
;  4-------7 Points structure
1415
;  |\0---3/|
1416
;  | |   | |
1417
;  | |   | |
1418
;  |/1---2\|
1419
;  5-------6
1420
 
1421
;pointslink:
1422
;dd   0,1,2, -3,  0,3,2, 3  ;far side
1423
dd   4,0,1, -5,  4,5,1, 5   ;left side
1424
dd   6,2,3, -5,  6,7,3, 5   ;right side
1425
dd   4,0,3, -5,  4,7,3, 5   ;up side
1426
dd   5,1,2, -5,  5,6,2, 5   ;down side
1427
dd   4,5,6, -6,  4,7,6, 6   ;far side
1428
 
1429
;model 2 outpost
1430
outpost:
1431
dd 8      ;model points
1432
dd 10     ;model triagels
1433
;mpoints:
1434
dd -45,-45,0,   -45,45,0,   45,45,0,   45,-45,0
1435
dd -30,-30,-20, -30,30,-20, 30,30,-20, 30,-30,-20
1436
;pointslink:
1437
;dd   0,1,2, -3,  0,3,2, 3  ;far side
1438
dd   4,0,1, -8,  4,5,1, 8   ;left  side
1439
dd   6,2,3, -8,  6,7,3, 8   ;right side
1440
dd   4,0,3, -8,  4,7,3, 8   ;up side
1441
dd   5,1,2, -8,  5,6,2, 8   ;down side
1442
dd   4,5,6, -7,  4,7,6, 7   ;near side
1443
 
1444
;model 3 cannon
1445
cannon:
1446
dd 12      ;model points
1447
dd 12     ;model triagels
1448
;mpoints:
1449
dd -10,-20,0,   -10,20,0,   10,20,0,   10,-20,0
1450
dd -10,-10,-15, -10,10,-15, 10,10,-15, 10,-10,-15
1451
dd -2,15,-8,    2,15,-8,    -2,45,-8,  2,45,-8
1452
;pointslink:
1453
;dd   0,1,2, -3,  0,3,2, 3  ;far side
1454
dd   4,0,1, -10,  4,5,1, 10   ;left  side
1455
dd   6,2,3, -10,  6,7,3, 10   ;right side
1456
dd   4,0,3, -10,  4,7,3, 10   ;up side
1457
dd   5,1,2, -10,  5,6,2, 10   ;down side
1458
dd   4,5,6, -11,  4,7,6, 11   ;near side
1459
dd   8,9,10,-10,  9,10,11,10  ;cannon 1
1460
 
1461
;model 4 red flag
1462
red_flag:
1463
dd 12      ;model points
1464
dd 6*2     ;model triagels
1465
;mpoints:
1466
dd -1,-1,0,   -1,1,0,    1,1,0,    1,-1,0
1467
dd -1,-1,-30, -1,1,-30,  1,1,-30,  1,-1,-30
1468
dd 1,1,-30,  10,1,-30,  10,1,-20, 1,1,-20
1469
;pointslink:
1470
dd   4,0,1, -10,  4,5,1, 15   ;left  side
1471
dd   6,2,3, -10,  6,7,3, 15   ;right side
1472
dd   4,0,3, -10,  4,7,3, 15   ;up side
1473
dd   5,1,2, -10,  5,6,2, 15   ;down side
1474
dd   4,5,6, -10,  4,7,6, 15   ;near side
1475
dd   8,11,10,-49, 8,9,10,49   ;flag
1476
 
1477
repear:
1478
dd 8      ;model points
1479
dd 10     ;model triagels
1480
;mpoints:
1481
dd -45,-45,0,   -45,45,0,   45,45,0,   45,-45,0
1482
dd -30,-30,-20, -30,30,-20, 30,30,-20, 30,-30,-20
1483
;pointslink:
1484
dd   4,0,1, -5,  4,5,1, 5   ;left side
1485
dd   6,2,3, -5,  6,7,3, 5   ;right side
1486
dd   4,0,3, -5,  4,7,3, 5   ;up side
1487
dd   5,1,2, -5,  5,6,2, 5   ;down side
1488
dd   4,5,6, -3,  4,7,6, 3   ;far side
1489
 
1490
;model 5 tree (elka)
1491
tree:
1492
dd 16      ;model points
1493
dd 8*2     ;model triagels
1494
;mpoints:
1495
dd -2,-2,0,   -2,2,0,    2,2,0,    2,-2,0
1496
dd -1,-1,-8, -1,1,-8,  1,1,-8,  1,-1,-8
1497
dd -10,-10,-8,  -10,10,-8,   10,10,-8,   10,-10,-8
1498
dd -1,-1,-40, -1,1,-40,  1,1,-40,  1,-1,-40
1499
;pointslink:
1500
dd   4,0,1, -16,  4,5,1, 16   ;left  side
1501
dd   6,2,3, -16,  6,7,3, 16   ;right side
1502
dd   4,0,3, -16,  4,7,3, 16   ;up side
1503
dd   5,1,2, -16,  5,6,2, 16   ;down side
1504
 
1505
dd   12,8,9, -14,  12,13,9, 14   ;left  side
1506
dd   14,10,11, -14,  14,15,11, 14   ;right side
1507
dd   12,8,11, -14,  12,15,11, 14   ;up side
1508
dd   13,9,10, -14,  13,14,10, 14   ;down side
1509
 
1510
;model tank
1511
tank:
1512
dd 20      ;model points
1513
dd 12+10     ;model triagels
1514
;mpoints:
1515
dd -10,-20,-10, -10,20,-10,   10,20,-10,  10,-20,-10
1516
dd -10,-10,-20, -10,10,-20,   10,10,-20,  10,-10,-20
1517
dd -2,15,-15,    2,15,-15,    -2,45,-15,   2,45,-15
1518
 
1519
dd -20,-20,0,   -20,20,0,   20,20,0,   20,-20,0
1520
dd -20,-30,-10, -20,30,-10, 20,30,-10, 20,-30,-10
1521
 
1522
;pointslink:
1523
;dd   0,1,2, -3,  0,3,2, 3  ;far side
1524
dd   4,0,1, -10,  4,5,1, 10   ;left  side
1525
dd   6,2,3, -10,  6,7,3, 10   ;right side
1526
dd   4,0,3, -10,  4,7,3, 10   ;up side
1527
dd   5,1,2, -10,  5,6,2, 10   ;down side
1528
dd   4,5,6, -11,  4,7,6, 11   ;near side
1529
dd   8,9,10,-10,  9,10,11,10  ;cannon 1
1530
 
1531
dd   16,12,13, -11,  16,17,13, 11   ;left  side
1532
dd   18,14,15, -11,  18,19,15, 11   ;right side
1533
dd   16,12,15, -11,  16,19,15, 11   ;up side
1534
dd   17,13,14, -11,  17,18,14, 11   ;down side
1535
dd   16,17,18, -11,  16,19,18, 11   ;near side
1536
 
1537
;Test model
1538
gqfa:  ;Good quality four angle
1539
dd 5     ;model points
1540
dd 4     ;model triagels
1541
;mpoints:
1542
;dd -45,-145,0,   -45,145,0,   45,45,0,   45,-45,0
1543
dd -0,-105,0,   -0,105,0,   45,45,0,   45,-45,0
1544
dd 30,0,0
1545
;pointslink:
1546
dd   1,4,0, 50  ;left side
1547
dd   1,4,2, 51 ;right side
1548
dd   3,4,2, -50 ;up side
1549
dd   3,4,0, -51  ;down side
1550
 
1551
skip_mdata:
1552
 
1553
;***************
1554
; Add new models
1555
;***************
1556
;    jmp no_addmodel
1557
 
1558
    random 20,eax
1559
    sub eax,10
1560
    imul eax,SECTOR_SIZE
1561
    add eax,SECTOR_SIZE/2
1562
    mov [temp1],eax
1563
    random 20,eax
1564
    sub eax,10
1565
    imul eax,SECTOR_SIZE
1566
    add eax,SECTOR_SIZE/2
1567
    mov [temp2],eax
1568
 
1569
    mov eax,dword [model_mas]
1570
    cmp eax,40;00
1571
    jae no_addmodel
1572
    imul eax,4*8;
1573
    add eax,4+model_mas
1574
    inc dword [model_mas]
1575
    mov ebx,[temp1]
1576
    mov [eax],ebx
1577
    mov ebx,[temp2]
1578
    mov [eax+4],ebx
1579
    mov [eax+8],dword -170
1580
    mov ebx,0
1581
    mov [eax+12],ebx
1582
    mov [eax+16],ebx
1583
    mov [eax+20],ebx
1584
    mov ebx,tree;red_flag
1585
    mov [eax+28],ebx
1586
    jmp skip_mdata     ;use for auto filling at start
1587
no_addmodel:
1588
 
1589
    ret
1590
 
1591
 
1592
UpdateAngles:
1593
; Calculates new x,y,z angles
1594
; to autorotate around
1595
 
1596
   mov     eax,[Xangle]         ; Load current angles
1597
   mov     ebx,[Yangle]
1598
   mov     ecx,[Zangle]
1599
 
1600
   add     eax,[DeltaX]         ; Add velocity
1601
   and     eax,011111111b        ; Range from 0..255
1602
   mov     [Xangle],eax         ; Update X
1603
   add     ebx,[DeltaY]         ; Add velocity
1604
   and     ebx,011111111b        ; Range from 0..255
1605
   mov     [Yangle],ebx         ; Update Y
1606
   add     ecx,[DeltaZ]         ; Add velocity
1607
   and     ecx,011111111b        ; Range from 0..255
1608
   mov     [Zangle],ecx         ; Update Z
1609
   ret
1610
 
1611
GetSinCos:
1612
; Needed : bx=angle (0..255)
1613
; Returns: ax=Sin   bx=Cos
1614
    push    ebx                  ; Save angle (use as pointer)
1615
    shl     ebx,2                ; Grab a word so bx=bx*2
1616
    mov     eax,[SinCos + ebx]    ; Get sine
1617
    pop     ebx                  ; Restore pointer into bx
1618
    push    eax                  ; Save sine on stack
1619
    add     ebx,64               ; Add 64 to get cosine
1620
    and     ebx,11111111b        ; Range from 0..255
1621
    shl     ebx,2                ; *2 coz it's a word
1622
    mov     eax,[SinCos + ebx]    ; Get cosine
1623
    mov     ebx,eax               ; Save it   bx=Cos
1624
    pop     eax                  ; Restore   ax=Sin
1625
    ret
1626
 
1627
; Get sin & cos of x,y,z angle
1628
SetRotation:
1629
    mov     ebx,[Xangle]         ; Grab angle
1630
    call    GetSinCos           ; Get the sine&cosine
1631
    mov     [Xsin],eax           ; Save sin
1632
    mov     [Xcos],ebx           ; Save cos
1633
 
1634
    mov     ebx,[Yangle]
1635
    call    GetSinCos
1636
    mov     [Ysin],eax
1637
    mov     [Ycos],ebx
1638
 
1639
    mov     ebx,[Zangle]
1640
    call    GetSinCos
1641
    mov     [Zsin],eax
1642
    mov     [Zcos],ebx
1643
; for camera
1644
    mov     ebx,[Xcamangle]
1645
    call    GetSinCos
1646
    mov     [Xcamsin],eax
1647
    mov     [Xcamcos],ebx
1648
 
1649
    mov     ebx,[Ycamangle]
1650
    call    GetSinCos
1651
    mov     [Ycamsin],eax
1652
    mov     [Ycamcos],ebx
1653
 
1654
    mov     ebx,[Zcamangle]
1655
    call    GetSinCos
1656
    mov     [Zcamsin],eax
1657
    mov     [Zcamcos],ebx
1658
 
1659
    ret
1660
 
1661
TranslatePoint:            ; Rotates the point around x,y,z
1662
; Gets original x,y,z values
1663
; This can be done elsewhere
1664
 
1665
    mov esi,[X]
1666
    mov edi,[Y]
1667
    mov ebx,[Zcamcos]
1668
    mov ecx,[Zcamsin]
1669
    call math
1670
    mov [X],esi
1671
    mov [Y],edi
1672
 
1673
    mov esi,[Y]
1674
    mov edi,[Z]
1675
    mov ebx,[Xcamcos]
1676
    mov ecx,[Xcamsin]
1677
    call math
1678
    mov [Y],esi
1679
    mov [Z],edi
1680
 
1681
    mov esi,[X]
1682
    mov edi,[Z]
1683
    mov ebx,[Ycamcos]
1684
    mov ecx,[Ycamsin]
1685
    call math
1686
    mov [X],esi
1687
    mov [Z],edi
1688
 
1689
    mov esi,[Y]
1690
    mov ebx,[Xcos]
1691
    mov edi,[Z]
1692
    mov ecx,[Xsin]
1693
    call math
1694
    mov [Y],esi
1695
    mov [Z],edi
1696
    mov esi,[X]
1697
    mov ebx,[Ycos]
1698
    mov ecx,[Ysin]
1699
    call math
1700
    mov [X],esi
1701
    mov [Z],edi
1702
    mov ebx,[Zcos]
1703
    mov edi,[Y]
1704
    mov ecx,[Zsin]
1705
    call math
1706
 
1707
;*************
1708
;  ShowPoint
1709
;*************
1710
 
1711
; Calculates screenposition and
1712
; plots the point on the screen
1713
    mov     eax,[Xoff]           ; Xoff*X / Z+Zoff = screen x
1714
    mov     ecx,esi
1715
    imul    ecx
1716
 
1717
    mov     ebx,[Z]
1718
    add     ebx,[Zoff]           ; Distance
1719
 
1720
    cmp ebx,0
1721
    je notout
1722
    idiv    ebx
1723
    add     eax,[Mx]             ; Center on screen
1724
    mov     ebp,eax              ;ebp =Xp
1725
 
1726
    mov     eax,[Yoff]           ; Yoff*Y / Z+Zoff = screen y
1727
    mov     ecx,edi
1728
    imul    ecx
1729
 
1730
    cmp ebx,0
1731
    je notout
1732
    idiv    ebx                  ;eax =Yp
1733
    add     eax,[My]             ; Center on screen
1734
 
1735
notout:
1736
    ret
1737
 
1738
math:
1739
    mov     eax,esi
1740
    imul    ebx               ; ax = X * Cos(zang)
1741
    mov     ebp,eax
1742
    mov     eax,edi
1743
    imul    ecx               ; ax = Y * Sin(zang)
1744
    sub     ebp,eax            ; bp = X * Cos(zang) - Y * Sin(zang)
1745
    sar     ebp,8             ; bp = X * Cos(zang) - Y * Sin(zang) / 256
1746
 
1747
    mov     eax,esi
1748
    mov     esi,ebp
1749
    imul    ecx               ; ax = X * Sin(zang)
1750
    mov     ebp,eax
1751
    mov     eax,edi
1752
    imul    ebx               ; ax = Y * Cos(zang)
1753
    add     ebp,eax            ; bp = X * SIN(zang) + Y * COS(zang)
1754
    sar     ebp,8             ; bp = X * SIN(zang) + Y * COS(zang) / 256
1755
    mov     edi,ebp
1756
    ret
1757
 
1758
SinCos:
1759
dd 0,6,13,19,25,31,38,44,50,56
1760
dd 62,68,74,80,86,92,98,104,109,115
1761
dd 121,126,132,137,142,147,152,157,162,167
1762
dd 172,177,181,185,190,194,198,202,206,209
1763
dd 213,216,220,223,226,229,231,234,237,239
1764
dd 241,243,245,247,248,250,251,252,253,254
1765
dd 255,255,256,256,256,256,256,255,255,254
1766
dd 253,252,251,250,248,247,245,243,241,239
1767
dd 237,234,231,229,226,223,220,216,213,209
1768
dd 206,202,198,194,190,185,181,177,172,167
1769
dd 162,157,152,147,142,137,132,126,121,115
1770
dd 109,104,98,92,86,80,74,68,62,56
1771
dd 50,44,38,31,25,19,13,6,0,-6
1772
dd -13,-19,-25,-31,-38,-44,-50,-56,-62,-68
1773
dd -74,-80,-86,-92,-98,-104,-109,-115,-121,-126
1774
dd -132,-137,-142,-147,-152,-157,-162,-167,-172,-177
1775
dd -181,-185,-190,-194,-198,-202,-206,-209,-213,-216
1776
dd -220,-223,-226,-229,-231,-234,-237,-239,-241,-243
1777
dd -245,-247,-248,-250,-251,-252,-253,-254,-255,-255
1778
dd -256,-256,-256,-256,-256,-255,-255,-254,-253,-252
1779
dd -251,-250,-248,-247,-245,-243,-241,-239,-237,-234
1780
dd -231,-229,-226,-223,-220,-216,-213,-209,-206,-202
1781
dd -198,-194,-190,-185,-181,-177,-172,-167,-162,-157
1782
dd -152,-147,-142,-137,-132,-126,-121,-115,-109,-104
1783
dd -98,-92,-86,-80,-74,-68,-62,-56,-50,-44
1784
dd -38,-31,-25,-19,-13,-6
1785
 
1786
mipzoom dd 0
1787
mipmapwork dd 0
1788
temp1 dd 0
1789
temp2 dd 0
1790
 
1791
;  4.24.2005 Textured triangle algorythm
1792
;  created by Pavlushin Evgeni waptap[at]mail.ru
1793
;  on base tex3 from Mikolaj Felix mfelix@polbox.com
1794
 
1795
align 512
1796
@@tx1 dd 0 ;equ [bp+4]
1797
@@ty1 dd 0 ;equ [bp+6]
1798
align 512
1799
@@tx2 dd 0 ;equ [bp+8]
1800
@@ty2 dd 0 ;equ [bp+10]
1801
align 512
1802
@@tx3 dd 0 ;equ [bp+12]
1803
@@ty3 dd 0 ;equ [bp+14]
1804
 
1805
@@tz1 dd 0
1806
@@tz2 dd 0
1807
@@tz3 dd 0
1808
 
1809
@@z_dy12 dd 0
1810
@@z_dy13 dd 0
1811
@@z_dy23 dd 0
1812
 
1813
@@tex_off dd 0 ;equ [bp+16]
1814
@@tex_x1 dd 0 ;equ [bp+18]
1815
@@tex_y1 dd 0 ;equ [bp+20]
1816
@@tex_x2 dd 0 ;equ [bp+22]
1817
@@tex_y2 dd 0 ;equ [bp+24]
1818
@@tex_x3 dd 0 ;equ [bp+26]
1819
@@tex_y3 dd 0 ;equ [bp+28]
1820
 
1821
@@dx12 dd 0 ;equ [bp-2]
1822
@@dx13 dd 0 ;equ [bp-4]
1823
@@dx23 dd 0 ;equ [bp-6]
1824
 
1825
@@tex_dx12 dd 0 ;equ [bp-8]
1826
@@tex_dy12 dd 0 ;equ [bp-10]
1827
@@tex_dx13 dd 0 ;equ [bp-12]
1828
@@tex_dy13 dd 0 ;equ [bp-14]
1829
@@tex_dx23 dd 0 ;equ [bp-16]
1830
@@tex_dy23 dd 0 ;equ [bp-18]
1831
 
1832
@@scan_x1 dd 0
1833
@@scan_y1 dd 0
1834
@@scan_x2 dd 0
1835
@@scan_y2 dd 0
1836
 
1837
@@scan_z1 dd 0
1838
@@scan_z2 dd 0
1839
 
1840
SHIFT=16
1841
 
1842
textured_triangle:
1843
 
1844
	mov eax,[@@ty1]
1845
	cmp eax,[@@ty3]
1846
	jle tt_check1
1847
 
1848
	xchg eax,[@@ty3]
1849
	mov [@@ty1],eax
1850
 
1851
	mov eax,[@@tx1]
1852
	xchg eax,[@@tx3]
1853
	mov [@@tx1],eax
1854
 
1855
	mov eax,[@@tz1]
1856
	xchg eax,[@@tz3]
1857
	mov [@@tz1],eax
1858
 
1859
	mov eax,[@@tex_y1]
1860
	xchg eax,[@@tex_y3]
1861
	mov [@@tex_y1],eax
1862
 
1863
	mov eax,[@@tex_x1]
1864
	xchg eax,[@@tex_x3]
1865
	mov [@@tex_x1],eax
1866
tt_check1:
1867
	mov eax,[@@ty2]
1868
	cmp eax,[@@ty3]
1869
	jle tt_check2
1870
 
1871
	xchg eax,[@@ty3]
1872
	mov [@@ty2],eax
1873
 
1874
	mov eax,[@@tx2]
1875
	xchg eax,[@@tx3]
1876
	mov [@@tx2],eax
1877
 
1878
	mov eax,[@@tz2]
1879
	xchg eax,[@@tz3]
1880
	mov [@@tz2],eax
1881
 
1882
	mov eax,[@@tex_y2]
1883
	xchg eax,[@@tex_y3]
1884
	mov [@@tex_y2],eax
1885
 
1886
	mov eax,[@@tex_x2]
1887
	xchg eax,[@@tex_x3]
1888
	mov [@@tex_x2],eax
1889
tt_check2:
1890
	mov eax,[@@ty1]
1891
	cmp eax,[@@ty2]
1892
	jle tt_check3
1893
 
1894
	xchg eax,[@@ty2]
1895
	mov [@@ty1],eax
1896
 
1897
	mov eax,[@@tx1]
1898
	xchg eax,[@@tx2]
1899
	mov [@@tx1],eax
1900
 
1901
	mov eax,[@@tz1]
1902
	xchg eax,[@@tz2]
1903
	mov [@@tz1],eax
1904
 
1905
	mov eax,[@@tex_y1]
1906
	xchg eax,[@@tex_y2]
1907
	mov [@@tex_y1],eax
1908
 
1909
	mov eax,[@@tex_x1]
1910
	xchg eax,[@@tex_x2]
1911
	mov [@@tex_x1],eax
1912
tt_check3:
1913
 
1914
	mov ebx,[@@ty2]
1915
	sub ebx,[@@ty1]
1916
	jnz tt_dx12_make
1917
 
1918
	mov [@@dx12],0
1919
	mov [@@tex_dx12],0
1920
	mov [@@tex_dy12],0
1921
	mov [@@z_dy12],0
1922
	jmp tt_dx12_done
1923
tt_dx12_make:
1924
	mov eax,[@@tx2]
1925
	sub eax,[@@tx1]
1926
	shl eax,SHIFT
1927
	cdq
1928
	idiv ebx
1929
	mov [@@dx12],eax			; dx12 = (x2-x1)/(y2-y1)
1930
 
1931
	mov eax,[@@tex_x2]
1932
	sub eax,[@@tex_x1]
1933
	cdq
1934
	idiv ebx
1935
	mov [@@tex_dx12],eax		; tex_dx12 = (tex_x2-tex_x1)/(y2-y1)
1936
 
1937
	mov eax,[@@tex_y2]
1938
	sub eax,[@@tex_y1]
1939
	cdq
1940
	idiv ebx
1941
	mov [@@tex_dy12],eax		; tex_dy12 = (tex_y2-tex_y1)/(y2-y1)
1942
 
1943
	mov eax,[@@tz2]
1944
	sub eax,[@@tz1]
1945
	shl eax,SHIFT
1946
	cdq
1947
	idiv ebx
1948
	mov [@@z_dy12],eax
1949
 
1950
tt_dx12_done:
1951
 
1952
	mov ebx,[@@ty3]
1953
	sub ebx,[@@ty1]
1954
	jnz tt_dx13_make
1955
 
1956
	mov [@@dx13],0
1957
	mov [@@tex_dx13],0
1958
	mov [@@tex_dy13],0
1959
 mov [@@z_dy13],0
1960
	jmp tt_dx13_done
1961
tt_dx13_make:
1962
	mov eax,[@@tx3]
1963
	sub eax,[@@tx1]
1964
	shl eax,SHIFT
1965
	cdq
1966
	idiv ebx
1967
	mov [@@dx13],eax			; dx13 = (x3-x1)/(y3-y1)
1968
 
1969
	mov eax,[@@tex_x3]
1970
	sub eax,[@@tex_x1]
1971
	cdq
1972
	idiv ebx
1973
	mov [@@tex_dx13],eax		; tex_dx13 = (tex_x3-tex_x1)/(y3-y1)
1974
 
1975
	mov eax,[@@tex_y3]
1976
	sub eax,[@@tex_y1]
1977
	cdq
1978
	idiv ebx
1979
	mov [@@tex_dy13],eax		; tex_dy13 = (tex_y3-tex_x1)/(y3-y1)
1980
 
1981
	mov eax,[@@tz3]
1982
	sub eax,[@@tz1]
1983
	shl eax,SHIFT
1984
	cdq
1985
	idiv ebx
1986
	mov [@@z_dy13],eax
1987
tt_dx13_done:
1988
 
1989
	mov ebx,[@@ty3]
1990
	sub ebx,[@@ty2]
1991
	jnz tt_dx23_make
1992
 
1993
	mov [@@dx23],0
1994
	mov [@@tex_dx23],0
1995
	mov [@@tex_dy23],0
1996
	mov [@@z_dy23],0
1997
	jmp tt_dx23_done
1998
tt_dx23_make:
1999
	mov eax,[@@tx3]
2000
	sub eax,[@@tx2]
2001
	shl eax,SHIFT
2002
	cdq
2003
	idiv ebx
2004
	mov [@@dx23],eax			; dx23 = (x3-x2)/(y3-y2)
2005
 
2006
	mov eax,[@@tex_x3]
2007
	sub eax,[@@tex_x2]
2008
	cdq
2009
	idiv ebx
2010
	mov [@@tex_dx23],eax		; tex_dx23 = (tex_x3-tex_x2)/(y3-y2)
2011
 
2012
	mov eax,[@@tex_y3]
2013
	sub eax,[@@tex_y2]
2014
	cdq
2015
	idiv ebx
2016
	mov [@@tex_dy23],eax		; tex_dy23 = (tex_y3-tex_y2)/(y3-y2)
2017
 
2018
	mov eax,[@@tz3]
2019
	sub eax,[@@tz2]
2020
	shl eax,SHIFT
2021
	cdq
2022
	idiv ebx
2023
	mov [@@z_dy23],eax
2024
tt_dx23_done:
2025
 
2026
 
2027
	mov eax,[@@tx1]
2028
	shl eax,SHIFT
2029
	mov ebx,eax
2030
	mov ecx,[@@ty1]
2031
 
2032
 mov edx,[@@tz1]
2033
 shl edx,SHIFT
2034
 mov [@@scan_z1],edx
2035
 mov [@@scan_z2],edx
2036
 
2037
	mov edx,[@@tex_x1]
2038
	mov [@@scan_x1],edx
2039
	mov [@@scan_x2],edx
2040
	mov edx,[@@tex_y1]
2041
	mov [@@scan_y1],edx
2042
	mov [@@scan_y2],edx
2043
 
2044
; ****************
2045
 mov edx,[@@ty1]   ;skip equals
2046
 cmp [@@ty2],edx
2047
 je tt_loop1_end
2048
 
2049
 mov ebp,[@@ty1]
2050
 cmp ebp,0
2051
 jg no_up_clip
2052
 neg ebp
2053
 mov edx,[@@ty2]
2054
 cmp edx,0
2055
 jg no_sbx
2056
 neg edx
2057
 sub ebp,edx
2058
no_sbx:
2059
 
2060
	mov edx,[@@tex_dx13]
2061
 imul edx,ebp
2062
	add [@@scan_x1],edx
2063
	mov edx,[@@tex_dx12]
2064
 imul edx,ebp
2065
	add [@@scan_x2],edx
2066
	mov edx,[@@tex_dy13]
2067
 imul edx,ebp
2068
	add [@@scan_y1],edx
2069
	mov edx,[@@tex_dy12]
2070
 imul edx,ebp
2071
	add [@@scan_y2],edx
2072
 
2073
	mov edx,[@@z_dy13]
2074
 imul edx,ebp
2075
	add [@@scan_z1],edx
2076
	mov edx,[@@z_dy12]
2077
 imul edx,ebp
2078
	add [@@scan_z2],edx
2079
 
2080
 mov edx,[@@dx13]
2081
 imul edx,ebp
2082
	add eax,edx
2083
 mov edx,[@@dx12]
2084
 imul edx,ebp
2085
	add ebx,edx
2086
	add ecx,ebp
2087
no_up_clip:
2088
 
2089
 cmp [@@ty2],0
2090
 jl  tt_loop1_end
2091
 
2092
tt_loop1:
2093
 cmp ecx,SCREEN_Y
2094
 jge tt_loop2_end
2095
 
2096
 pushad
2097
	mov edx,[@@scan_y2]
2098
	mov [@@tex_ly2],edx ;push dx
2099
	mov edx,[@@scan_x2]
2100
	mov [@@tex_lx2],edx ;push dx
2101
	mov edx,[@@scan_y1]
2102
	mov [@@tex_ly1],edx ;push dx
2103
	mov edx,[@@scan_x1]
2104
	mov [@@tex_lx1],edx ;push dx
2105
 
2106
 mov edx,[@@scan_z1]
2107
 mov [@@lz1],edx
2108
 mov edx,[@@scan_z2]
2109
 mov [@@lz2],edx
2110
 
2111
	mov [@@ly],ecx ;push cx
2112
	mov edx,ebx
2113
	sar edx,SHIFT
2114
	mov [@@lx2],edx ;push dx
2115
	mov edx,eax
2116
	sar edx,SHIFT
2117
	mov [@@lx1],edx ; push dx
2118
	call textured_horizontal_line
2119
 popad
2120
 
2121
	mov edx,[@@tex_dx13]
2122
	add [@@scan_x1],edx
2123
	mov edx,[@@tex_dx12]
2124
	add [@@scan_x2],edx
2125
	mov edx,[@@tex_dy13]
2126
	add [@@scan_y1],edx
2127
	mov edx,[@@tex_dy12]
2128
	add [@@scan_y2],edx
2129
 
2130
	mov edx,[@@z_dy13]
2131
	add [@@scan_z1],edx
2132
	mov edx,[@@z_dy12]
2133
	add [@@scan_z2],edx
2134
 
2135
	add eax,[@@dx13]
2136
	add ebx,[@@dx12]
2137
	inc ecx
2138
	cmp ecx,[@@ty2]
2139
	jl tt_loop1
2140
 
2141
tt_loop1_end:
2142
 
2143
	mov ebx,[@@tx2]
2144
	shl ebx,SHIFT
2145
	mov ecx,[@@ty2]
2146
 
2147
 mov edx,[@@tz2]
2148
 shl edx,SHIFT
2149
 mov [@@scan_z2],edx
2150
 
2151
	mov edx,[@@tex_x2]
2152
	mov [@@scan_x2],edx
2153
	mov edx,[@@tex_y2]
2154
	mov [@@scan_y2],edx
2155
 
2156
 mov ebp,[@@ty2]
2157
 cmp ebp,0
2158
 jg no_down_clip
2159
 neg ebp
2160
 dec ebp
2161
 
2162
	mov edx,[@@tex_dx13]
2163
 imul edx,ebp
2164
	add [@@scan_x1],edx
2165
	mov edx,[@@tex_dx23]
2166
 imul edx,ebp
2167
	add [@@scan_x2],edx
2168
	mov edx,[@@tex_dy13]
2169
 imul edx,ebp
2170
	add [@@scan_y1],edx
2171
	mov edx,[@@tex_dy23]
2172
 imul edx,ebp
2173
	add [@@scan_y2],edx
2174
 
2175
	mov edx,[@@z_dy13]
2176
 imul edx,ebp
2177
	add [@@scan_z1],edx
2178
	mov edx,[@@z_dy23]
2179
 imul edx,ebp
2180
	add [@@scan_z2],edx
2181
 
2182
 mov edx,[@@dx13]
2183
 imul edx,ebp
2184
	add eax,edx
2185
 mov edx,[@@dx23]
2186
 imul edx,ebp
2187
	add ebx,edx
2188
 add ecx,ebp
2189
no_down_clip:
2190
 
2191
tt_loop2:
2192
 cmp ecx,SCREEN_Y
2193
 jge tt_loop2_end
2194
 
2195
 pushad
2196
	mov edx,[@@scan_y2]
2197
	mov [@@tex_ly2],edx ;push dx
2198
	mov edx,[@@scan_x2]
2199
	mov [@@tex_lx2],edx ;push dx
2200
	mov edx,[@@scan_y1]
2201
	mov [@@tex_ly1],edx ;push dx
2202
	mov edx,[@@scan_x1]
2203
	mov [@@tex_lx1],edx ;push dx
2204
 
2205
 mov edx,[@@scan_z1]
2206
 mov [@@lz1],edx
2207
 mov edx,[@@scan_z2]
2208
 mov [@@lz2],edx
2209
 
2210
	mov [@@ly],ecx ;push cx
2211
	mov edx,ebx
2212
	sar edx,SHIFT
2213
	mov [@@lx2],edx ;push dx
2214
	mov edx,eax
2215
	sar edx,SHIFT
2216
	mov [@@lx1],edx ; push dx
2217
	call textured_horizontal_line
2218
 popad
2219
 
2220
	mov edx,[@@tex_dx13]
2221
	add [@@scan_x1],edx
2222
	mov edx,[@@tex_dx23]
2223
	add [@@scan_x2],edx
2224
	mov edx,[@@tex_dy13]
2225
	add [@@scan_y1],edx
2226
	mov edx,[@@tex_dy23]
2227
	add [@@scan_y2],edx
2228
 
2229
	mov edx,[@@z_dy13]
2230
	add [@@scan_z1],edx
2231
	mov edx,[@@z_dy23]
2232
	add [@@scan_z2],edx
2233
 
2234
	add eax,[@@dx13]
2235
	add ebx,[@@dx23]
2236
	inc ecx
2237
	cmp ecx,[@@ty3]
2238
	jl tt_loop2
2239
 
2240
tt_loop2_end:
2241
	ret
2242
 
2243
align 512
2244
@@lx1 dd 0
2245
align 512
2246
@@lx2 dd 0
2247
align 512
2248
@@ly dd  0
2249
 
2250
@@lz1 dd 0
2251
@@lz2 dd 0
2252
@@z_dx dd 0
2253
 
2254
align 512
2255
@@tex_loff dd 0 ;equ [bp+10]
2256
@@tex_lx1 dd 0 ;equ [bp+12]
2257
@@tex_ly1 dd 0 ;equ [bp+14]
2258
@@tex_lx2 dd 0 ;equ [bp+16]
2259
@@tex_ly2 dd 0 ;equ [bp+18]
2260
 
2261
align 512
2262
@@tex_ldx dd 0 ;equ [bp-2]
2263
@@tex_ldy dd 0 ;equ [bp-4]
2264
 
2265
align 1024
2266
textured_horizontal_line:
2267
 
2268
	mov eax,[@@lx1]
2269
	cmp eax,[@@lx2]
2270
	je thl_quit
2271
	jl thl_ok
2272
 
2273
	xchg eax,[@@lx2]
2274
	mov [@@lx1],eax
2275
 
2276
 mov eax,[@@lz1]
2277
	xchg eax,[@@lz2]
2278
	mov [@@lz1],eax
2279
 
2280
	mov eax,[@@tex_lx1]
2281
	xchg eax,[@@tex_lx2]
2282
	mov [@@tex_lx1],eax
2283
 
2284
	mov eax,[@@tex_ly1]
2285
	xchg eax,[@@tex_ly2]
2286
	mov [@@tex_ly1],eax
2287
 
2288
thl_ok:
2289
 
2290
 cmp [@@lx2],0
2291
 jle thl_quit
2292
 mov eax,SCREEN_X
2293
 cmp [@@lx1],eax
2294
 jge thl_quit
2295
 
2296
	mov ecx,[@@lx2]
2297
	sub ecx,[@@lx1]
2298
 
2299
 ; Uneversal method
2300
 mov edi,[@@ly]
2301
 mov eax,SCREEN_X   ;di = ly*320+lx1
2302
 imul edi
2303
 add eax,[@@lx1]
2304
 imul eax,3
2305
 mov edi,eax
2306
 add edi,I_END
2307
 
2308
 ;Right side clipping
2309
 mov eax,SCREEN_X
2310
 cmp [@@lx2],eax
2311
 jnge x1ok
2312
 mov edx,SCREEN_X
2313
 dec edx
2314
 sub edx,[@@lx1]
2315
 cmp edx,0
2316
 jle thl_quit
2317
 mov ecx,edx
2318
x1ok:
2319
 
2320
 ;Left side clipping
2321
 cmp [@@lx1],0
2322
 jg  x2ok
2323
 mov ecx,[@@lx2]     ;cmp lx2 screen x if above cut (for future)
2324
 mov edi,[@@ly]
2325
 mov eax,SCREEN_X
2326
 imul edi,eax
2327
 imul edi,3
2328
 add edi,I_END
2329
x2ok:
2330
 
2331
	mov ebx,[@@lx2]
2332
	sub ebx,[@@lx1]
2333
 
2334
	mov eax,[@@tex_lx2]
2335
	sub eax,[@@tex_lx1]
2336
	cdq
2337
	idiv ebx
2338
	mov [@@tex_ldx],eax			; tex_dx = (tex_x2-tex_x1)/(x2-x1)
2339
 
2340
	mov eax,[@@tex_ly2]
2341
	sub eax,[@@tex_ly1]
2342
	cdq
2343
	idiv ebx
2344
	mov [@@tex_ldy],eax			; tex_dy = (tex_y2-tex_y1)/(x2-x1)
2345
 
2346
	mov eax,[@@lz2]
2347
	sub eax,[@@lz1]
2348
	cdq
2349
	idiv ebx
2350
	mov [@@z_dx],eax			; tex_dx = (tex_x2-tex_x1)/(x2-x1)
2351
 
2352
 ; Left clipping post correction
2353
 cmp [@@lx1],0
2354
 jg  no_lcpc
2355
 mov eax,[@@lx1]
2356
 neg eax
2357
 mov ebp,[@@tex_ldx]
2358
 imul ebp,eax
2359
 add [@@tex_lx1],ebp
2360
 mov ebp,[@@tex_ldy]
2361
 imul ebp,eax
2362
 add [@@tex_ly1],ebp
2363
 mov ebp,[@@z_dx]
2364
 imul ebp,eax
2365
 add [@@lz1],ebp
2366
no_lcpc:
2367
 
2368
	inc ecx ;for equal correction
2369
	mov edx,[@@tex_lx1]
2370
	mov ebx,[@@tex_ly1]
2371
 mov esi,[@@lz1]
2372
 
2373
thl_loop:
2374
	mov ebp,esi
2375
 shr ebp,SHIFT
2376
 mov eax,dword [edi-I_END+zbuffer]
2377
 cmp ax,bp
2378
 jb  no_set
2379
 mov [edi-I_END+zbuffer],bp
2380
 
2381
 mov eax,edx
2382
; and eax,0x0fff0000
2383
 ror ebx,16
2384
 mov ax,bx
2385
 ror ebx,16
2386
 shl ax,11    ; 8 for 256*256, 9 for 128*128 ...
2387
 shr eax,11
2388
 lea eax,[eax*2+eax] ; equ imul eax,3
2389
	add eax,[@@tex_off]
2390
 mov ebp,eax
2391
 
2392
	mov ax,word [ebp]
2393
 mov [edi],ax
2394
	mov al,byte [ebp+2]
2395
 mov [edi+2],al
2396
 
2397
no_set:
2398
 add edi,3
2399
 
2400
 add esi,[@@z_dx]
2401
	add edx,[@@tex_ldx]
2402
	add ebx,[@@tex_ldy]
2403
	dec ecx
2404
	jnz thl_loop
2405
thl_quit:
2406
 ret
2407
 
2408
 
2409
@@rgb  dd 0
2410
@@rgbax  dw 0
2411
@@rgbbl  db 0
2412
 
2413
; === DATA ===
2414
 
2415
d_angle  dd 0.19634954 ;pi/16
2416
angle    dd 0.0
2417
mul_wave dd 1.5
2418
 
2419
sin_pos dw 0
2420
sinwave rw 256
2421
 
2422
Xmap   dd 0
2423
Ymap   dd 0
2424
mapoff dd 0
2425
 
2426
Xcam   dd 0
2427
Ycam   dd 0
2428
Zcam   dd -400
2429
 
2430
Xcamangle dd 0
2431
Ycamangle dd 0
2432
Zcamangle dd 0
2433
 
2434
Xcamsin   dd 0
2435
Xcamcos   dd 0
2436
Ycamsin   dd 0
2437
Ycamcos   dd 0
2438
Zcamsin   dd 0
2439
Zcamcos   dd 0
2440
 
2441
X      dd ?             ; X,Y,Z variable for formula
2442
Y      dd ?
2443
Z      dd ?
2444
 
2445
Xp dd ?
2446
Yp dd ?
2447
 
2448
Xangle dd 0             ; Angle to rotate around x
2449
Yangle dd 0
2450
Zangle dd 0
2451
 
2452
DeltaX dd 1             ; x,y,z rotation angle
2453
DeltaY dd 1
2454
DeltaZ dd 1
2455
 
2456
Xoff   dd 256           ; x-cord
2457
Yoff   dd 256           ; y-cord
2458
Zoff   dd 0;800         ; Distance from viewer
2459
 
2460
Xsin   dd ?             ; Sine and cosine of angle to rotate around
2461
Xcos   dd ?
2462
Ysin   dd ?
2463
Ycos   dd ?
2464
Zsin   dd ?
2465
Zcos   dd ?
2466
 
2467
Mx     dd SCREEN_X/2            ; Center  of the screen
2468
My     dd SCREEN_Y/2
2469
 
2470
autorot db 0                    ;Auto rotation flag
2471
massize dd 0                    ;Size of triangle massive
2472
id      dd 0
2473
temp    dd 0
2474
 
2475
; DATA AREA
2476
labelt:
2477
     db   '3D TEXTURED ENGINE'
2478
labellen:
2479
 
2480
 
2481
;Texture pusck 32*32 256
2482
texpack_gif:
5098 clevermous 2483
file 'texpack.gif'
31 halyavin 2484
rb 50
2485
 
2486
;Ground texture
2487
bmp_texmap:
5098 clevermous 2488
file 'texmap.bmp'
31 halyavin 2489
rb 50
2490
 
2491
 
2492
; Ground livel map
2493
gif_file_area5:
5098 clevermous 2494
file 'map.gif' ;level map
31 halyavin 2495
rb 50
2496
 
2497
rb 8
2498
texture_limg:
2499
rb 4095
2500
texture_img:
2501
rb 4095
2502
texture_img2:
2503
rb 4095
2504
 
2505
rb (4095)*16*16
2506
 
2507
img_area:
2508
rb 128*128*3+8
2509
 
2510
glm_img_area:
2511
rb (MAP_XSIZE+1)*(MAP_YSIZE+1)*3+8
2512
 
2513
rb 8
2514
 
2515
texpack_img:
2516
rb 512*512*3+8
2517
 
2518
keymap:
2519
rb 1000
2520
 
2521
model_mas:
2522
rb 4+8*100
2523
 
2524
; Hash area for decoding GIF
2525
gif_hash_area:
2526
rd 4096+1
2527
 
2528
MAX_MODEL_POINTS = 100
2529
modelpoints:
2530
rb MAX_MODEL_POINTS*3*4
2531
 
2532
; Matrix points massive
2533
points:
2534
; Massive of turn matrix points
2535
tpoints=points+((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)*3*4)
2536
; Ground level map massive
2537
ground_level_map=tpoints+((MATRIX_XSIZE+1)*(MATRIX_YSIZE+1)*3*4)
2538
; zbuffer
2539
zbuffer=ground_level_map+((MAP_XSIZE+1)*(MAP_YSIZE+1)*4)
2540
I_END=zbuffer+(SCREEN_X*SCREEN_Y)*3