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