Rev 37 | Rev 272 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ; |
2 | ; Fisheye Raycasting Engine Etc. FREE3D for MENUETOS by Dieter Marfurt |
||
3 | ; Version 0.4 (requires some texture-files to compile (see Data Section)) |
||
4 | ; dietermarfurt@angelfire.com - www.melog.ch/mos_pub/ |
||
5 | ; Don't hit me - I'm an ASM-Newbie... since years :) |
||
6 | ; |
||
7 | ; Compile with FASM for Menuet (requires .INC files - see DATA Section) |
||
8 | ; |
||
37 | halyavin | 9 | ; Willow - greatly srinked code size by using GIF texture and FPU to calculate sine table |
10 | ; |
||
11 | ; !!!! Don't use GIF.INC in your apps - it's modified for FREE3D !!!! |
||
31 | halyavin | 12 | |
37 | halyavin | 13 | TEX_SIZE equ 64*64*4 |
14 | ceil = sinus+16*1024 |
||
15 | wall = ceil+TEX_SIZE*1 |
||
16 | wall2 = ceil+TEX_SIZE*2 |
||
17 | wall3 = ceil+TEX_SIZE*3 |
||
18 | wall4 = ceil+TEX_SIZE*4 |
||
19 | wall5 = ceil+TEX_SIZE*5 |
||
20 | wall6 = ceil+TEX_SIZE*6 |
||
21 | wall7 = ceil+TEX_SIZE*7 |
||
22 | APP_MEM equ 0x200000 |
||
23 | |||
31 | halyavin | 24 | use32 |
25 | |||
26 | org 0x0 |
||
27 | |||
28 | db 'MENUET01' ; 8 byte id |
||
29 | dd 0x01 ; header version |
||
30 | dd START ; start of code |
||
31 | dd I_END ; size of image |
||
37 | halyavin | 32 | dd APP_MEM;0x300000 ; memory for app |
33 | dd APP_MEM;0x300000 ; esp |
||
31 | halyavin | 34 | dd 0x0 , 0x0 ; I_Param , I_Icon |
37 | halyavin | 35 | include 'lang.inc' |
36 | include 'macros.inc' |
||
37 | COLOR_ORDER equ OTHER |
||
38 | include 'gif.inc' |
||
31 | halyavin | 39 | |
40 | START: ; start of execution |
||
37 | halyavin | 41 | mov esi,textures |
42 | mov edi,ceil |
||
43 | mov eax,sinus |
||
44 | call ReadGIF |
||
45 | mov esi,sinus |
||
46 | mov ecx,360*10 |
||
47 | fninit |
||
48 | fld [sindegree] |
||
49 | .sinlp: |
||
50 | fst st1 |
||
51 | fsin |
||
52 | fmul [sindiv] |
||
53 | fistp dword[esi] |
||
54 | add esi,4 |
||
55 | fadd [sininc] |
||
56 | loop .sinlp |
||
31 | halyavin | 57 | call draw_window ; at first, draw the window |
58 | call draw_stuff |
||
59 | |||
60 | gamestart: |
||
61 | ; ******* MOUSE CHECK ******* |
||
62 | ; mov eax,37 ; check mouse (use mouse over window to navigate) |
||
63 | ; mov ebx,2 ; check mousebuttons |
||
64 | ; int 0x40 |
||
65 | ; cmp eax,0 ; only use mouse when button down |
||
66 | ; je noneed ; deactivated cause of disappear-bug etc. |
||
67 | mov eax,37 |
||
68 | mov ebx,1 ; check mouseposition |
||
69 | int 0x40 |
||
70 | |||
71 | mov ebx,eax |
||
72 | shr eax,16 |
||
73 | and eax,0x0000FFFF ; mousex |
||
74 | and ebx,0x0000FFFF ; mousey |
||
75 | |||
76 | cmp eax,5 ; mouse out of window ? |
||
77 | jb check_refresh ; it will prevent an app-crash |
||
78 | cmp ebx,22 |
||
79 | jb check_refresh |
||
80 | cmp eax, 640 |
||
81 | jg check_refresh |
||
82 | cmp ebx,501 |
||
83 | jg check_refresh |
||
84 | |||
85 | cmp eax,315 ; navigating? |
||
86 | jb m_left |
||
87 | cmp eax,325 ; |
||
88 | jg m_right |
||
89 | continue: |
||
90 | cmp ebx,220 ; |
||
91 | jb s_up |
||
92 | cmp ebx,260 ; |
||
93 | jg s_down |
||
94 | ; ******* END OF MOUSE CHECK ******* |
||
95 | check_refresh: |
||
96 | |||
97 | ; mov eax,23 ; wait for system event with 10 ms timeout |
||
98 | ; mov ebx,1 ; thats max 100 FPS |
||
99 | mov eax,11 ; ask no wait for full speed |
||
100 | int 0x40 |
||
101 | |||
102 | cmp eax,1 ; window redraw request ? |
||
103 | je red2 |
||
104 | cmp eax,2 ; key in buffer ? |
||
105 | je key2 |
||
106 | cmp eax,3 ; button in buffer ? |
||
107 | je button2 |
||
108 | |||
109 | mov edi,[mouseya] ; check flag if a refresh has to be done |
||
110 | cmp edi,1 |
||
111 | jne gamestart |
||
112 | mov [mouseya],dword 0 |
||
113 | call draw_stuff |
||
114 | |||
115 | |||
116 | jmp gamestart |
||
117 | |||
118 | ; END OF MAINLOOP |
||
119 | |||
120 | red2: ; redraw |
||
121 | call draw_window |
||
122 | call draw_stuff |
||
123 | jmp gamestart |
||
124 | |||
125 | key2: ; key |
||
126 | mov eax,2 |
||
127 | int 0x40 |
||
128 | cmp al,1 |
||
129 | je gamestart ; keybuffer empty |
||
130 | |||
131 | cmp ah,27 ; esc=End App |
||
132 | je finish |
||
133 | |||
134 | cmp ah,178 ; up |
||
135 | je s_up |
||
136 | cmp ah,177 ; down |
||
137 | je s_down |
||
138 | cmp ah,176 ; left |
||
139 | je s_left |
||
140 | cmp ah,179 ; right |
||
141 | je s_right |
||
142 | |||
143 | jmp gamestart ; was any other key |
||
144 | |||
145 | |||
146 | s_up: ; walk forward (key or mouse) |
||
147 | mov eax,[vpx] |
||
148 | mov ebx,[vpy] |
||
149 | |||
150 | |||
151 | mov ecx,[vheading] |
||
152 | imul ecx,4 |
||
153 | add ecx,sinus |
||
154 | mov edi,[ecx] |
||
155 | |||
156 | mov edx,[vheading] |
||
157 | imul edx,4 |
||
158 | add edx,sinus |
||
159 | add edx,3600 |
||
160 | cmp edx,eosinus ;cosinus taken from (sinus plus 900) mod 3600 |
||
161 | jb ok200 |
||
162 | sub edx,14400 |
||
163 | ok200: |
||
164 | mov esi,[edx] |
||
165 | ; sal esi,1 ; edit walking speed here |
||
166 | ; sal edi,1 |
||
167 | |||
168 | add eax,edi ; newPx |
||
169 | add ebx,esi ; newPy |
||
170 | mov edi,eax ; newPx / ffff |
||
171 | mov esi,ebx ; newPy / ffff |
||
172 | sar edi,16 |
||
173 | sar esi,16 |
||
174 | mov ecx,esi |
||
175 | sal ecx,5 ; equal *32 |
||
176 | add ecx,edi |
||
177 | add ecx,grid |
||
178 | cmp [ecx],byte 0 ; collision check |
||
179 | jne cannotwalk0 |
||
180 | mov [vpx],eax |
||
181 | mov [vpy],ebx |
||
182 | mov [mouseya],dword 1 ; set refresh flag |
||
183 | cannotwalk0: |
||
184 | jmp check_refresh |
||
185 | |||
186 | s_down: ; walk backward |
||
187 | mov eax,[vpx] |
||
188 | mov ebx,[vpy] |
||
189 | |||
190 | mov ecx,[vheading] |
||
191 | imul ecx,4 |
||
192 | add ecx,sinus |
||
193 | mov edi,[ecx] |
||
194 | |||
195 | mov edx,[vheading] |
||
196 | imul edx,4 |
||
197 | add edx,sinus |
||
198 | add edx,3600 |
||
199 | cmp edx,eosinus ;cosinus taken from (sinus plus 900) mod 3600 |
||
200 | jb ok201 |
||
201 | sub edx,14400 |
||
202 | ok201: |
||
203 | |||
204 | mov esi,[edx] |
||
205 | ; sal esi,1 ; edit walking speed here |
||
206 | ; sal edi,1 |
||
207 | |||
208 | sub eax,edi ; newPx |
||
209 | sub ebx,esi ; newPy |
||
210 | mov edi,eax ; newPx / ffff |
||
211 | mov esi,ebx ; newPy / ffff |
||
212 | sar edi,16 |
||
213 | sar esi,16 |
||
214 | mov ecx,esi |
||
215 | sal ecx,5 |
||
216 | add ecx,edi |
||
217 | add ecx,grid |
||
218 | cmp [ecx],byte 0 |
||
219 | jne cannotwalk1 |
||
220 | mov [vpx],eax |
||
221 | mov [vpy],ebx |
||
222 | mov [mouseya],dword 1 |
||
223 | cannotwalk1: |
||
224 | jmp check_refresh |
||
225 | |||
226 | s_left: ; turn left (key) |
||
227 | mov edi,[vheading] ; heading |
||
228 | add edi,50 |
||
229 | cmp edi,3600 |
||
230 | jb ok_heading0 |
||
231 | sub edi,3600 |
||
232 | ok_heading0: |
||
233 | mov [vheading],edi |
||
234 | mov [mouseya],dword 1 |
||
235 | jmp check_refresh |
||
236 | |||
237 | s_right: ; turn right |
||
238 | mov edi,[vheading] |
||
239 | sub edi,50 |
||
240 | cmp edi,-1 |
||
241 | jg ok_heading1 |
||
242 | add edi,3600 |
||
243 | ok_heading1: |
||
244 | mov [vheading],edi |
||
245 | mov [mouseya],dword 1 |
||
246 | jmp check_refresh |
||
247 | |||
248 | m_left: ; turn left (mouse) |
||
249 | mov edi,[vheading] ; heading |
||
250 | mov ecx,315 |
||
251 | sub ecx,eax |
||
252 | sar ecx,2 |
||
253 | add edi,ecx |
||
254 | cmp edi,3600 |
||
255 | jb ok_heading2 |
||
256 | sub edi,3600 |
||
257 | ok_heading2: |
||
258 | mov [vheading],edi |
||
259 | mov [mouseya],dword 1 |
||
260 | jmp continue ; allow both: walk and rotate |
||
261 | |||
262 | m_right: ; turn right |
||
263 | mov edi,[vheading] |
||
264 | sub eax,325 |
||
265 | sar eax,2 |
||
266 | sub edi,eax |
||
267 | cmp edi,-1 |
||
268 | jg ok_heading3 |
||
269 | add edi,3600 |
||
270 | ok_heading3: |
||
271 | mov [vheading],edi |
||
272 | mov [mouseya],dword 1 |
||
273 | jmp continue |
||
274 | |||
275 | |||
276 | |||
277 | button2: ; button |
||
278 | mov eax,17 ; get id |
||
279 | int 0x40 |
||
280 | cmp ah,1 ; button id=1 ? |
||
281 | jne gamestart |
||
282 | |||
283 | ; eo GAME mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm |
||
284 | finish: |
||
285 | mov eax,-1 ; close this program |
||
286 | int 0x40 |
||
287 | |||
288 | |||
289 | ; ********************************************* |
||
290 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
||
291 | ; ********************************************* |
||
292 | |||
293 | |||
294 | draw_window: |
||
295 | |||
296 | mov eax,12 ; function 12:tell os about windowdraw |
||
297 | mov ebx,1 ; 1, start of draw |
||
298 | int 0x40 |
||
299 | |||
300 | ; DRAW WINDOW |
||
301 | mov eax,0 ; function 0 : define and draw window |
||
302 | mov ebx,50*65536+649 ; [x start] *65536 + [x size] |
||
303 | mov ecx,50*65536+504 ; [y start] *65536 + [y size] |
||
304 | mov edx,0x02ffffff ; color of work area RRGGBB,8->color gl |
||
305 | mov esi,0x80777777 ; color of grab bar RRGGBB,8->color gl |
||
306 | mov edi,0x00777777 ; color of frames RRGGBB |
||
307 | int 0x40 |
||
308 | |||
309 | ; WINDOW LABEL |
||
310 | mov eax,4 ; function 4 : write text to window |
||
311 | mov ebx,8*65536+8 ; [x start] *65536 + [y start] |
||
312 | mov ecx,0x00ddeeff ; color of text RRGGBB |
||
313 | mov edx,labelt ; pointer to text beginning |
||
314 | mov esi,labellen-labelt ; text length |
||
315 | int 0x40 |
||
316 | |||
317 | ; CLOSE BUTTON |
||
318 | mov eax,8 ; function 8 : define and draw button |
||
319 | mov ebx,(649-19)*65536+12 ; [x start] *65536 + [x size] |
||
320 | mov ecx,5*65536+12 ; [y start] *65536 + [y size] |
||
321 | mov edx,1 ; button id |
||
322 | mov esi,0x777777 ; button color RRGGBB |
||
323 | int 0x40 |
||
324 | |||
325 | |||
326 | mov eax,12 ; function 12:tell os about windowdraw |
||
327 | mov ebx,2 ; 2, end of draw |
||
328 | int 0x40 |
||
329 | |||
330 | ret |
||
331 | |||
332 | ; ********************************************* |
||
333 | ; ******* COMPUTE 3D-VIEW ******** |
||
334 | ; ********************************************* |
||
335 | draw_stuff: |
||
336 | |||
337 | |||
338 | mov [step1],dword 1 |
||
339 | ;mov [step64],dword 64 |
||
340 | mov esi,[vheading] |
||
341 | add esi,320 |
||
342 | mov [va],esi |
||
343 | mov eax,[vheading] |
||
344 | sub eax,320 |
||
345 | mov [vacompare],eax |
||
346 | ;------------------------------------ CAST 640 PIXEL COLUMNS --------------- |
||
347 | ; FOR A=320+heading to -319+heading step -1 (a is stored in [va]) |
||
348 | ;--------------------------------------------------------------------------- |
||
349 | ; mov edx,5 |
||
350 | mov [vx1],dword 0 ;5 ;edx ; init x1 ... pixelcolumn |
||
351 | for_a: |
||
352 | mov edx,[vx1] |
||
353 | mov [vx1b],edx |
||
354 | sub [vx1b],dword 320 |
||
355 | mov edx,[va] ; a2 |
||
356 | cmp edx,-1 ; a2 is a mod 3600 |
||
357 | jg ok1 |
||
358 | add edx,3600 |
||
359 | ok1: |
||
360 | cmp edx,3600 |
||
361 | jb ok2 |
||
362 | sub edx,3600 |
||
363 | ok2: |
||
364 | |||
365 | ; get stepx and stepy |
||
366 | mov ecx,edx |
||
367 | imul ecx,4 |
||
368 | add ecx,sinus ; pointer to stepx |
||
369 | mov esi,[ecx] |
||
370 | sar esi,4 ; accuracy |
||
371 | mov [vstepx],esi ; store stepx |
||
372 | |||
373 | mov esi,edx |
||
374 | imul esi,4 |
||
375 | add esi,sinus ; pointer to stepy |
||
376 | add esi,3600 |
||
377 | cmp esi,eosinus ;cosinus taken from ((sinus plus 900) mod 3600) |
||
378 | jb ok202 |
||
379 | sub esi,14400 |
||
380 | ok202: |
||
381 | |||
382 | mov ecx,[esi] |
||
383 | sar ecx,4 |
||
384 | mov [vstepy],ecx ; store stepy |
||
385 | |||
386 | |||
387 | mov eax,[vpx] ; get Camera Position |
||
388 | mov ebx,[vpy] |
||
389 | mov [vxx],eax ; init caster position |
||
390 | mov [vyy],ebx |
||
391 | |||
392 | mov edi,0 ; init L (number of raycsting-steps) |
||
393 | mov [step1],dword 1 ; init Caster stepwidth for L |
||
394 | |||
395 | ; raycast a pixel column................................. |
||
396 | raycast: |
||
397 | add edi,[step1] ; count caster steps |
||
398 | ;jmp nodouble ; use this to prevent blinking/wobbling textures: much slower! |
||
399 | |||
400 | cmp edi,32 |
||
401 | je double |
||
402 | cmp edi,512 |
||
403 | je double |
||
404 | cmp edi,1024 |
||
405 | je double |
||
406 | jmp nodouble |
||
407 | |||
408 | double: |
||
409 | mov edx,[step1] |
||
410 | sal edx,1 |
||
411 | mov [step1],edx |
||
412 | |||
413 | mov edx,[vstepx] |
||
414 | sal edx,1 |
||
415 | mov [vstepx],edx |
||
416 | |||
417 | mov edx,[vstepy] |
||
418 | sal edx,1 |
||
419 | mov [vstepy],edx |
||
420 | |||
421 | nodouble: |
||
422 | |||
423 | mov eax,32000 ; 3600 ; determine Floors Height based on distance |
||
424 | mov edx,0 |
||
425 | mov ebx,edi |
||
426 | |||
427 | div ebx |
||
428 | mov esi,eax |
||
429 | mov [vdd],esi |
||
430 | mov edx,260 |
||
431 | sub edx,esi |
||
432 | mov [vh],edx |
||
433 | |||
434 | cmp edx,22 |
||
435 | jb no_nu_pixel |
||
436 | cmp edx,259 |
||
437 | jg no_nu_pixel ; draw only new pixels |
||
438 | cmp edx,[h_old] |
||
439 | je no_nu_pixel |
||
440 | |||
441 | mov eax,[vxx] ; calc floor pixel |
||
442 | mov ebx,[vyy] |
||
443 | |||
444 | and eax,0x0000FFFF |
||
445 | and ebx,0x0000FFFF |
||
446 | |||
447 | shr eax,10 |
||
448 | shr ebx,10 ; pixel coords inside Texture x,y 64*64 |
||
449 | mov [xfrac],eax |
||
450 | mov [yfrac],ebx |
||
451 | |||
452 | |||
453 | |||
454 | ; plot floor pixel !!!! |
||
455 | mov [vl],edi ; save L |
||
456 | mov [ytemp],esi ; remember L bzw. H |
||
457 | |||
458 | mov edi,[yfrac] ; get pixel color of this floor pixel |
||
459 | sal edi,8 |
||
460 | mov esi,[xfrac] |
||
461 | sal esi,2 |
||
462 | add edi,esi |
||
463 | add edi,wall ; in fact its floor, just using the wall texture :) |
||
464 | mov edx,[edi] |
||
465 | mov [remesi],esi |
||
466 | |||
467 | ;**** calculate pixel adress:**** |
||
468 | mov esi,[ytemp] |
||
469 | add esi,240 |
||
470 | imul esi,1920 |
||
471 | add esi,[vx1] |
||
472 | add esi,[vx1] |
||
473 | add esi,[vx1] |
||
474 | add esi,0x80000 |
||
475 | |||
476 | cmp esi,0x80000+1920*480 |
||
477 | jg foff0 |
||
478 | cmp esi,0x80000 |
||
479 | jb foff0 |
||
480 | ; now we have the adress of the floor-pixel color in edi |
||
481 | ; and the adress of the pixel in the image in esi |
||
482 | |||
483 | mov edx,[edi] |
||
484 | ;******************** custom distance DARKEN Floor |
||
485 | |||
486 | mov eax,[vdd] |
||
487 | |||
488 | ; jmp nodark0 ; use this to deactivate darkening floor (a bit faster) |
||
489 | |||
490 | cmp eax,80 |
||
491 | jg nodark0 |
||
492 | ; split rgb |
||
493 | |||
494 | mov [blue],edx |
||
495 | and [blue],dword 255 |
||
496 | |||
497 | shr edx,8 |
||
498 | mov [green],edx |
||
499 | and [green],dword 255 |
||
500 | |||
501 | shr edx,8 |
||
502 | mov [red],edx |
||
503 | and [red],dword 255 |
||
504 | |||
505 | mov eax,81 ; darkness parameter |
||
506 | sub eax,[vdd] |
||
507 | sal eax,1 |
||
508 | |||
509 | ; reduce rgb |
||
510 | sub [red],eax |
||
511 | cmp [red], dword 0 |
||
512 | jg notblack10 |
||
513 | mov [red],dword 0 |
||
514 | notblack10: |
||
515 | |||
516 | sub [green],eax |
||
517 | cmp [green],dword 0 |
||
518 | jg notblack20 |
||
519 | mov [green],dword 0 |
||
520 | notblack20: |
||
521 | |||
522 | mov edx,[blue] |
||
523 | sub [blue],eax |
||
524 | cmp [blue],dword 0 |
||
525 | jg notblack30 |
||
526 | mov [blue],dword 0 |
||
527 | notblack30: |
||
528 | |||
529 | shl dword [red],16 ; reassemble rgb |
||
530 | shl dword [green],8 |
||
531 | mov edx,[red] |
||
532 | or edx,[green] |
||
533 | or edx,[blue] |
||
534 | |||
535 | nodark0: |
||
536 | ; eo custom darken floor |
||
537 | |||
538 | |||
539 | mov eax,edx |
||
540 | mov [esi],eax ; actually draw the floor pixel |
||
541 | |||
542 | ; paint "forgotten" pixels |
||
543 | |||
544 | mov edx,[lasty] |
||
545 | sub edx,1920 |
||
546 | cmp esi,edx |
||
547 | je foff0 |
||
548 | mov [esi+1920],eax |
||
549 | |||
550 | sub edx,1920 |
||
551 | cmp esi,edx |
||
552 | je foff0 |
||
553 | mov [edx+1920],eax |
||
554 | |||
555 | sub edx,1920 |
||
556 | cmp esi,edx |
||
557 | je foff0 |
||
558 | mov [edx+1920],eax |
||
559 | |||
560 | foff0: |
||
561 | mov [lasty],esi |
||
562 | ;**** end of draw floor pixel **** |
||
563 | |||
564 | mov esi,[remesi] |
||
565 | mov edi,[vl] ; restore L |
||
566 | |||
567 | no_nu_pixel: |
||
568 | |||
569 | |||
570 | mov esi,[vh] |
||
571 | mov [h_old],esi |
||
572 | |||
573 | mov eax,[vxx] |
||
574 | mov ebx,[vyy] |
||
575 | |||
576 | add eax,[vstepx] ; casting... |
||
577 | add ebx,[vstepy] |
||
578 | |||
579 | mov [vxx],eax |
||
580 | mov [vyy],ebx |
||
581 | |||
582 | sar eax,16 |
||
583 | sar ebx,16 |
||
584 | |||
585 | mov [vpxi],eax ; casters position in Map Grid |
||
586 | mov [vpyi],ebx |
||
587 | |||
588 | mov edx,ebx |
||
589 | ; imul edx,32 |
||
590 | shl edx,5 |
||
591 | add edx,grid |
||
592 | add edx,eax |
||
593 | cmp [edx],byte 0 ; raycaster reached a wall? (0=no) |
||
594 | jne getout |
||
595 | cmp edi,10000 ; limit view range |
||
596 | jb raycast |
||
597 | ;................................................ |
||
598 | getout: |
||
599 | mov eax,[edx] ; store Grid Wall Value for Texture Selection |
||
600 | mov [vk],eax |
||
601 | |||
602 | call blur ; deactivate this (blurs the near floor) : a bit faster |
||
603 | |||
604 | ; simply copy floor to ceil pixel column here |
||
605 | ;jmp nocopy ; use this for test purposes |
||
606 | |||
607 | pusha |
||
608 | mov eax,0x80000+1920*240 |
||
609 | mov ebx,0x80000+1920*240 |
||
610 | |||
611 | copyfloor: |
||
612 | sub eax,1920 |
||
613 | add ebx,1920 |
||
614 | |||
615 | mov ecx,0 |
||
616 | add ecx,[vx1] |
||
617 | add ecx,[vx1] |
||
618 | add ecx,[vx1] |
||
619 | |||
620 | mov edx,ecx |
||
621 | add ecx,eax |
||
622 | add edx,ebx |
||
623 | |||
624 | mov esi,[edx] |
||
625 | mov [ecx],esi |
||
626 | |||
627 | cmp eax,0x80000 |
||
628 | jg copyfloor |
||
629 | |||
630 | popa |
||
631 | ; *** end of copy floor to ceil |
||
632 | ;nocopy: |
||
633 | ;__________________________________________________________________________ |
||
634 | |||
635 | |||
636 | ; draw this pixelrows wall |
||
637 | mov [vl],edi |
||
638 | |||
639 | mov edi,260 |
||
640 | sub edi,[vdd] |
||
641 | cmp edi,0 |
||
642 | jg ok3 |
||
643 | xor edi,edi |
||
644 | ok3: |
||
645 | mov [vbottom],edi ; end wall ceil (or window top) |
||
646 | |||
647 | mov esi,262 |
||
648 | add esi,[vdd] ; start wall floor |
||
649 | |||
650 | xor edi,edi |
||
651 | |||
652 | ; somethin is wrong with xfrac,so recalc... |
||
653 | |||
654 | mov eax,[vxx] |
||
655 | and eax,0x0000FFFF |
||
656 | shr eax,10 |
||
657 | mov [xfrac],eax |
||
658 | |||
659 | mov eax,[vyy] |
||
660 | and eax,0x0000FFFF |
||
661 | shr eax,10 |
||
662 | mov [yfrac],eax |
||
663 | |||
664 | pixelrow: |
||
665 | |||
666 | ; find each pixels color: |
||
667 | |||
668 | add edi,64 |
||
669 | sub esi,1 |
||
670 | cmp esi, 502 ; dont calc offscreen-pixels |
||
671 | jg speedup |
||
672 | |||
673 | xor edx,edx |
||
674 | mov eax, edi |
||
675 | mov ebx,[vdd] |
||
676 | add ebx,[vdd] |
||
677 | div ebx |
||
678 | and eax,63 |
||
679 | mov [ytemp],eax ; get y of texture for wall |
||
680 | |||
681 | mov eax,[xfrac] |
||
682 | add eax,[yfrac] |
||
683 | |||
684 | and eax,63 |
||
685 | mov [xtemp],eax ; get x of texture for wall |
||
686 | |||
687 | ; now prepare to plot that wall-pixel... |
||
688 | mov [remedi],edi |
||
689 | |||
690 | mov edi,[ytemp] |
||
691 | sal edi,8 |
||
692 | mov edx,[xtemp] |
||
693 | sal edx,2 |
||
694 | add edi,edx |
||
695 | |||
696 | mov eax,[vk] ; determine which texture should be used |
||
697 | and eax,255 |
||
698 | |||
699 | cmp eax,1 |
||
700 | jne checkmore1 |
||
701 | add edi,ceil |
||
702 | jmp foundtex |
||
703 | checkmore1: |
||
704 | |||
705 | cmp eax,2 |
||
706 | jne checkmore2 |
||
707 | add edi,wall |
||
708 | jmp foundtex |
||
709 | checkmore2: |
||
710 | |||
711 | cmp eax,3 |
||
712 | jne checkmore3 |
||
713 | add edi,wall2 |
||
714 | jmp foundtex |
||
715 | checkmore3: |
||
716 | |||
717 | cmp eax,4 |
||
718 | jne checkmore4 |
||
719 | add edi,wall3 |
||
720 | jmp foundtex |
||
721 | checkmore4: |
||
722 | |||
723 | cmp eax,5 |
||
724 | jne checkmore5 |
||
725 | add edi,wall4 |
||
726 | jmp foundtex |
||
727 | checkmore5: |
||
728 | |||
729 | cmp eax,6 |
||
730 | jne checkmore6 |
||
731 | add edi,wall5 |
||
732 | jmp foundtex |
||
733 | checkmore6: |
||
734 | |||
735 | cmp eax,7 |
||
736 | jne checkmore7 |
||
737 | add edi,wall6 |
||
738 | jmp foundtex |
||
739 | checkmore7: |
||
740 | |||
741 | cmp eax,8 |
||
742 | jne checkmore8 |
||
743 | add edi,wall7 |
||
744 | jmp foundtex |
||
745 | checkmore8: |
||
746 | |||
747 | foundtex: |
||
748 | |||
749 | mov edx,[edi] ; get pixel color inside texture |
||
750 | |||
751 | ; ***pseudoshade south-west |
||
752 | jmp east ; activate this for southwest pseudoshade : a bit slower + blink-bug |
||
753 | mov edi,[yfrac] |
||
754 | mov [pseudo],dword 0 ; store flag for custom distance darkening |
||
755 | cmp edi,[xfrac] |
||
756 | jge east |
||
757 | and edx,0x00FEFEFE |
||
758 | shr edx,1 |
||
759 | mov [pseudo],dword 1 |
||
760 | east: |
||
761 | |||
762 | call dark_distance ; deactivate wall distance darkening: a bit faster |
||
763 | |||
764 | ; ******* DRAW WALL PIXEL ******* |
||
765 | mov eax,esi |
||
766 | sub eax,22 |
||
767 | imul eax,1920 |
||
768 | add eax,[vx1] |
||
769 | add eax,[vx1] |
||
770 | add eax,[vx1] |
||
771 | add eax,0x80000 |
||
772 | |||
773 | cmp eax,0x80000+1920*480 |
||
774 | jg dont_draw |
||
775 | cmp eax,0x80000 |
||
776 | jb dont_draw |
||
777 | mov [eax],edx ; actually set the pixel in the image |
||
778 | ; *** eo draw wall pixel |
||
779 | dont_draw: |
||
780 | mov edi,[remedi] |
||
781 | speedup: |
||
782 | cmp esi,[vbottom] ; end of this column? |
||
783 | jg pixelrow |
||
784 | |||
785 | mov edi,[vl] ; restoring |
||
786 | mov eax,[vx1] ; inc X1 |
||
787 | add eax,1 |
||
788 | mov [vx1],eax |
||
789 | |||
790 | ;*** NEXT A *** |
||
791 | mov esi,[va] |
||
792 | sub esi,1 |
||
793 | mov [va],esi |
||
794 | cmp esi,[vacompare] |
||
795 | jg for_a |
||
796 | ;*** EO NEXT A *** |
||
797 | ;--------------------------------------------------------------------------- |
||
798 | |||
799 | |||
800 | ; **** put image !!!!!**** |
||
801 | ; *********************** |
||
802 | mov eax,7 |
||
803 | mov ebx,0x80000 |
||
804 | mov ecx,640*65536+480 |
||
805 | mov edx,5*65536+20 |
||
806 | int 0x40 |
||
807 | |||
808 | ret |
||
809 | |||
810 | blur: |
||
811 | |||
812 | pusha |
||
813 | mov eax,0x080000+360*1920 |
||
814 | |||
815 | copyfloor2: |
||
816 | add eax,1920 |
||
817 | mov ebx,eax |
||
818 | add ebx,[vx1] |
||
819 | add ebx,[vx1] |
||
820 | add ebx,[vx1] |
||
821 | |||
822 | mov ecx,[ebx-15] |
||
823 | and ecx,0x00FEFEFE |
||
824 | shr ecx,1 |
||
825 | mov edx,[ebx-12] |
||
826 | and edx,0x00FEFEFE |
||
827 | shr edx,1 |
||
828 | add edx,ecx |
||
829 | and edx,0x00FEFEFE |
||
830 | shr edx,1 |
||
831 | |||
832 | mov ecx,[ebx-9] |
||
833 | and ecx,0x00FEFEFE |
||
834 | shr ecx,1 |
||
835 | add edx,ecx |
||
836 | |||
837 | and edx,0x00FEFEFE |
||
838 | shr edx,1 |
||
839 | |||
840 | mov ecx,[ebx-6] |
||
841 | and ecx,0x00FEFEFE |
||
842 | shr ecx,1 |
||
843 | add edx,ecx |
||
844 | |||
845 | and edx,0x00FEFEFE |
||
846 | shr edx,1 |
||
847 | |||
848 | mov ecx,[ebx-3] |
||
849 | and ecx,0x00FEFEFE |
||
850 | shr ecx,1 |
||
851 | add edx,ecx |
||
852 | |||
853 | and edx,0x00FEFEFE |
||
854 | shr edx,1 |
||
855 | |||
856 | mov ecx,[ebx] |
||
857 | and ecx,0x00FEFEFE |
||
858 | shr ecx,1 |
||
859 | add edx,ecx |
||
860 | |||
861 | mov [ebx],edx |
||
862 | |||
863 | cmp eax,0x80000+478*1920 |
||
864 | jb copyfloor2 |
||
865 | |||
866 | popa |
||
867 | |||
868 | ret |
||
869 | |||
870 | |||
871 | |||
872 | ; ******* Darken by Distance ******* |
||
873 | dark_distance: |
||
874 | |||
875 | ; color must be in edx, wall height in [vdd] |
||
876 | |||
877 | mov eax,[vdd] |
||
878 | cmp eax,50 |
||
879 | jg nodark |
||
880 | ; split rgb |
||
881 | |||
882 | mov [blue],edx |
||
883 | and [blue],dword 255 |
||
884 | |||
885 | shr edx,8 |
||
886 | mov [green],edx |
||
887 | and [green],dword 255 |
||
888 | |||
889 | shr edx,8 |
||
890 | mov [red],edx |
||
891 | and [red],dword 255 |
||
892 | |||
893 | mov eax,51 ; darkness parameter |
||
894 | sub eax,[vdd] |
||
895 | cmp [pseudo],dword 1 |
||
896 | je isdarkside |
||
897 | sal eax,2 |
||
898 | isdarkside: |
||
899 | |||
900 | ; reduce rgb |
||
901 | sub [red],eax |
||
902 | cmp [red], dword 0 |
||
903 | jg notblack10b |
||
904 | mov [red],dword 0 |
||
905 | notblack10b: |
||
906 | |||
907 | sub [green],eax |
||
908 | cmp [green],dword 0 |
||
909 | jg notblack20b |
||
910 | mov [green],dword 0 |
||
911 | notblack20b: |
||
912 | |||
913 | mov edx,[blue] |
||
914 | sub [blue],eax |
||
915 | cmp [blue],dword 0 |
||
916 | jg notblack30b |
||
917 | mov [blue],dword 0 |
||
918 | notblack30b: |
||
919 | |||
920 | shl dword [red],16 ; reassemble rgb |
||
921 | shl dword [green],8 |
||
922 | mov edx,[red] |
||
923 | or edx,[green] |
||
924 | or edx,[blue] |
||
925 | mov eax,edx |
||
926 | |||
927 | nodark: |
||
928 | |||
929 | ret |
||
930 | |||
931 | |||
932 | ; DATA AREA |
||
933 | |||
934 | ;ceil=ceil |
||
935 | ;wall=wall floor |
||
936 | ;2 corner stone |
||
937 | ;3 leaf mosaic |
||
938 | ;4 closed window |
||
939 | ;5 greek mosaic |
||
940 | ;6 old street stones |
||
941 | ;7 maya wall |
||
942 | |||
943 | grid: ; 32*32 Blocks, Map: 0 = Air, 1 to 8 = Wall |
||
944 | db 2,1,2,1,2,1,2,1,2,1,2,1,1,1,1,1,1,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 |
||
945 | db 1,0,0,0,1,0,0,0,0,0,0,3,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8 |
||
946 | db 5,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8 |
||
947 | db 1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,3,3,3,3,0,0,0,0,0,0,8 |
||
948 | db 5,0,1,2,3,4,5,6,7,8,2,1,3,3,3,0,5,0,2,1,2,3,0,0,0,0,0,0,0,0,0,8 |
||
949 | db 1,0,0,0,0,0,0,0,0,0,2,3,0,0,0,0,5,0,0,0,0,3,0,0,0,0,0,0,0,0,0,8 |
||
950 | db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,5,0,0,0,0,3,3,0,3,3,0,0,0,0,0,8 |
||
951 | db 1,1,0,1,1,1,1,4,1,0,1,3,0,0,0,0,5,2,1,2,0,3,0,0,0,3,0,0,0,0,0,8 |
||
952 | db 5,0,0,0,1,0,0,0,0,0,0,1,0,3,3,3,5,0,0,0,0,3,0,0,0,3,0,0,0,0,0,8 |
||
953 | db 1,0,0,0,1,0,0,5,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,3,0,0,0,0,0,8 |
||
954 | db 5,0,0,0,0,0,0,5,0,0,0,1,0,0,0,0,5,0,0,0,0,3,0,0,0,0,0,0,0,0,0,8 |
||
955 | db 1,4,4,4,4,4,4,4,4,4,4,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,8,8 |
||
956 | db 2,2,2,2,2,2,8,8,8,8,8,8,8,8,8,0,0,0,6,6,0,7,7,7,7,7,7,7,7,7,8,8 |
||
957 | db 1,0,0,0,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1 |
||
958 | db 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,2,2,2,2,0,0,0,0,3,3,3,3,3,1 |
||
959 | db 1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,6,0,0,0,0,2,0,0,0,0,3,0,0,0,0,1 |
||
960 | db 5,0,2,3,2,3,2,3,2,3,2,1,0,0,0,0,6,0,2,2,0,2,0,0,0,0,3,0,5,5,0,1 |
||
961 | db 1,0,0,0,0,0,0,4,0,0,0,3,0,0,0,0,6,0,0,2,0,2,0,2,0,0,3,0,0,0,0,1 |
||
962 | db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,6,0,0,2,2,2,0,2,0,0,3,3,3,3,0,1 |
||
963 | db 1,1,0,1,1,1,1,4,1,0,1,3,7,7,7,0,6,0,0,0,0,0,0,2,0,0,0,0,0,3,0,1 |
||
964 | db 5,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,6,0,0,0,0,2,2,2,0,0,0,0,0,3,0,1 |
||
965 | db 1,0,0,0,1,0,0,5,0,0,0,3,0,0,0,0,6,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1 |
||
966 | db 5,0,0,0,0,0,0,5,0,0,0,1,0,0,0,0,6,0,5,1,0,2,0,0,4,4,0,4,4,0,0,1 |
||
967 | db 1,4,1,4,1,4,1,4,1,4,1,3,0,0,0,0,6,0,0,5,0,2,0,0,0,4,0,4,0,0,0,1 |
||
968 | db 1,0,0,0,0,0,0,4,0,0,0,3,0,3,3,3,6,0,0,1,0,1,0,0,4,4,0,4,4,0,0,1 |
||
969 | db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,6,0,0,5,0,1,0,4,4,0,0,0,4,4,0,1 |
||
970 | db 1,1,0,1,1,1,1,4,1,0,1,3,0,0,0,0,6,0,0,1,0,1,0,4,0,0,0,0,0,4,0,1 |
||
971 | db 5,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,6,0,0,5,0,1,0,4,0,0,0,0,0,4,0,1 |
||
972 | db 1,0,0,0,1,0,0,5,0,0,0,3,0,0,0,0,6,1,5,1,0,1,0,4,4,0,0,0,4,4,0,1 |
||
973 | db 5,0,0,0,0,0,0,5,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,4,4,4,4,4,0,0,1 |
||
974 | db 1,4,1,4,1,4,1,4,1,4,1,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1 |
||
975 | db 2,1,2,1,2,1,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 |
||
976 | |||
37 | halyavin | 977 | vpx: |
978 | dd 0x0001FFFF ; initial player position * 0xFFFF |
||
979 | vpy: |
||
980 | dd 0x0001FFFF |
||
31 | halyavin | 981 | |
37 | halyavin | 982 | labelt: |
983 | db 'FISHEYE RAYCASTING ENGINE ETC. FREE3D' |
||
31 | halyavin | 984 | |
37 | halyavin | 985 | labellen: |
986 | sindegree dd 0.0 |
||
987 | sininc dd 0.0017453292519943295769236907684886 |
||
988 | sindiv dd 6553.5 |
||
989 | textures: |
||
990 | file 'texture.gif' |
||
991 | I_END: |
||
31 | halyavin | 992 | |
993 | col1: |
||
37 | halyavin | 994 | dd ?;- |
31 | halyavin | 995 | ; misc raycaster vars: |
996 | vxx: |
||
37 | halyavin | 997 | dd ?;- |
31 | halyavin | 998 | vyy: |
37 | halyavin | 999 | dd ?;- |
31 | halyavin | 1000 | vl: |
37 | halyavin | 1001 | dd ?;- |
31 | halyavin | 1002 | vstepx: |
37 | halyavin | 1003 | dd ?;- |
31 | halyavin | 1004 | vstepy: |
37 | halyavin | 1005 | dd ?;- |
31 | halyavin | 1006 | vxxint: |
37 | halyavin | 1007 | dd ?;- |
31 | halyavin | 1008 | vyyint: |
37 | halyavin | 1009 | dd ?;- |
31 | halyavin | 1010 | vk: |
37 | halyavin | 1011 | dd ?;- |
31 | halyavin | 1012 | va: |
37 | halyavin | 1013 | dd ?;- |
31 | halyavin | 1014 | va2: |
37 | halyavin | 1015 | dd ?;- |
31 | halyavin | 1016 | vdd: |
37 | halyavin | 1017 | dd ?;- |
31 | halyavin | 1018 | vx1: |
37 | halyavin | 1019 | dd ?;- |
31 | halyavin | 1020 | vx1b: |
37 | halyavin | 1021 | dd ?;- |
31 | halyavin | 1022 | vh: |
37 | halyavin | 1023 | dd ?;- |
31 | halyavin | 1024 | vdt: |
37 | halyavin | 1025 | dd ?;- |
31 | halyavin | 1026 | vheading: ; initial heading: 0 to 3599 |
37 | halyavin | 1027 | dd ?;- |
31 | halyavin | 1028 | vacompare: |
37 | halyavin | 1029 | dd ?;- |
31 | halyavin | 1030 | vpxi: |
37 | halyavin | 1031 | dd ?;- |
31 | halyavin | 1032 | vpyi: |
37 | halyavin | 1033 | dd ?;- |
31 | halyavin | 1034 | wtolong: |
37 | halyavin | 1035 | dw ?,?;-,?;- |
31 | halyavin | 1036 | |
1037 | xtemp: |
||
37 | halyavin | 1038 | dd ?;- |
31 | halyavin | 1039 | ytemp: |
37 | halyavin | 1040 | dd ?;- |
31 | halyavin | 1041 | xfrac: |
37 | halyavin | 1042 | dd ?;- |
31 | halyavin | 1043 | yfrac: |
37 | halyavin | 1044 | dd ?;- |
31 | halyavin | 1045 | h_old: |
37 | halyavin | 1046 | dd ?;- |
31 | halyavin | 1047 | vbottom: |
37 | halyavin | 1048 | dd ?;- |
31 | halyavin | 1049 | mouseya: |
37 | halyavin | 1050 | dd ?;- |
31 | halyavin | 1051 | remeax: |
37 | halyavin | 1052 | dd ?;- |
31 | halyavin | 1053 | remebx: |
37 | halyavin | 1054 | dd ?;- |
31 | halyavin | 1055 | remecx: |
37 | halyavin | 1056 | dd ?;- |
31 | halyavin | 1057 | remedx: |
37 | halyavin | 1058 | dd ?;- |
31 | halyavin | 1059 | remedi: |
37 | halyavin | 1060 | dd ?;- |
31 | halyavin | 1061 | remesi: |
37 | halyavin | 1062 | dd ?;- |
31 | halyavin | 1063 | red: |
37 | halyavin | 1064 | dd ?;- |
31 | halyavin | 1065 | green: |
37 | halyavin | 1066 | dd ?;- |
31 | halyavin | 1067 | blue: |
37 | halyavin | 1068 | dd ?;- |
31 | halyavin | 1069 | pseudo: |
37 | halyavin | 1070 | dd ?;- |
31 | halyavin | 1071 | step1: |
37 | halyavin | 1072 | dd ?;- |
31 | halyavin | 1073 | step64: |
37 | halyavin | 1074 | dd ?;- |
31 | halyavin | 1075 | lasty: |
37 | halyavin | 1076 | dd ?;- |
31 | halyavin | 1077 | |
37 | halyavin | 1078 | sinus rd 360*10 |
1079 | eosinus: |