Subversion Repositories Kolibri OS

Rev

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