Subversion Repositories Kolibri OS

Rev

Rev 109 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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