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