Subversion Repositories Kolibri OS

Rev

Rev 485 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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