diff --git a/programs/demos/free3d/trunk/build.bat b/programs/demos/free3d/trunk/build.bat new file mode 100644 index 0000000000..75a675a30a --- /dev/null +++ b/programs/demos/free3d/trunk/build.bat @@ -0,0 +1,3 @@ +@fasm free3d.asm free3d +@kpack free3d +@pause \ No newline at end of file diff --git a/programs/demos/free3d/trunk/build.sh b/programs/demos/free3d/trunk/build.sh new file mode 100755 index 0000000000..6329867225 --- /dev/null +++ b/programs/demos/free3d/trunk/build.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# This script does for linux the same as build.bat for DOS, +# it compiles the KoOS kernel, hopefully ;-) + + fasm -m 16384 free3d.asm free3d + kpack free3d + exit 0 + + + + diff --git a/programs/demos/free3d/trunk/free3d.asm b/programs/demos/free3d/trunk/free3d.asm new file mode 100644 index 0000000000..85c98315b4 --- /dev/null +++ b/programs/demos/free3d/trunk/free3d.asm @@ -0,0 +1,1356 @@ +;--------------------------------------------------------------------- +; Free3D version 0.5 +; +; last update: 20/02/2011 +; written by: Marat Zakiyanov aka Mario79, aka Mario +; changes: PNG textures 128x128 +; using libraries cnv_png.obj and archiver.obj +; using dinamically allocation of memory +; +;--------------------------------------------------------------------- +; +; Fisheye Raycasting Engine Etc. FREE3D for MENUETOS by Dieter Marfurt +; Version 0.4 (requires some texture-files to compile (see Data Section)) +; dietermarfurt@angelfire.com - www.melog.ch/mos_pub/ +; Don't hit me - I'm an ASM-Newbie... since years :) +; +; Compile with FASM for Menuet (requires .INC files - see DATA Section) +; +; Willow - greatly srinked code size by using GIF texture and FPU to calculate sine table +; +; !!!! Don't use GIF_LITE.INC in your apps - it's modified for FREE3D !!!! +; +; Heavyiron - new 0-function of drawing window from kolibri (do not work correctly with menuet) + +TEX_SIZE equ 128*128*4 ;64*64*4 ; + +ICON_SIZE_X equ 128 ;64 +ICON_SIZE_Y equ 128 ;64 + +Floors_Height equ 32000 +;ceil = sinus+TEX_SIZE ;16*1024 +;wall = ceil+TEX_SIZE*1 +;wall2 = ceil+TEX_SIZE*2 +;wall3 = ceil+TEX_SIZE*3 +;wall4 = ceil+TEX_SIZE*4 +;wall5 = ceil+TEX_SIZE*5 +;wall6 = ceil+TEX_SIZE*6 +;wall7 = ceil+TEX_SIZE*7 +;APP_MEM equ 0x400000 +;--------------------------------------------------------------------- +use32 +org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd IM_END ; size of image + dd I_END ; 0x100000 ; memory for app + dd stacktop ; 0x100000 ; esp + dd 0x0 + dd path +;--------------------------------------------------------------------- +include '..\..\..\macros.inc' +;include 'macros.inc' +include '../../../develop/libraries/box_lib/load_lib.mac' +;include 'load_lib.mac' +@use_library +;COLOR_ORDER equ OTHER +;include 'gif_lite.inc' +;--------------------------------------------------------------------- +START: ; start of execution + mcall 68,11 + +load_libraries l_libs_start,end_l_libs + test eax,eax + jnz finish + +; unpack deflate + mov eax,[unpack_DeflateUnpack2] + mov [deflate_unpack],eax + + call load_icons + call convert_icons + + mov esi,sinus + mov ecx,360*10 + fninit + fld [sindegree] +;-------------------------------------- +.sinlp: + fst st1 + fsin + fmul [sindiv] + fistp dword[esi] + add esi,4 + fadd [sininc] + loop .sinlp + call draw_window ; at first, draw the window + call draw_stuff +;-------------------------------------- +align 4 +gamestart: +; ******* MOUSE CHECK ******* +; mov eax,37 ; check mouse (use mouse over window to navigate) +; mov ebx,2 ; check mousebuttons +; mcall +; cmp eax,0 ; only use mouse when button down +; je noneed ; deactivated cause of disappear-bug etc. + + mcall 37,1 ; check mouseposition + mov ebx,eax + shr eax,16 + and eax,0x0000FFFF ; mousex + and ebx,0x0000FFFF ; mousey + + cmp eax,5 ; mouse out of window ? + jb check_refresh ; it will prevent an app-crash + + cmp ebx,22 + jb check_refresh + + cmp eax,640 + jg check_refresh + + cmp ebx,501 + jg check_refresh + + cmp eax,315 ; navigating? + jb m_left + + cmp eax,325 ; + jg m_right +;-------------------------------------- +continue: + cmp ebx,220 ; + jb s_up + + cmp ebx,260 ; + jg s_down +;-------------------------------------- +; ******* END OF MOUSE CHECK ******* +align 4 +check_refresh: + +; mov eax,23 ; wait for system event with 10 ms timeout +; mov ebx,1 ; thats max 100 FPS + mcall 11 ; ask no wait for full speed + + cmp eax,1 ; window redraw request ? + je red2 + + cmp eax,2 ; key in buffer ? + je key2 + + cmp eax,3 ; button in buffer ? + je button2 + + mov edi,[mouseya] ; check flag if a refresh has to be done + cmp edi,1 + jne gamestart + + mov [mouseya],dword 0 + call draw_stuff + jmp gamestart +;--------------------------------------------------------------------- +align 4 +red2: ; redraw + call draw_window + call draw_stuff + jmp gamestart +;--------------------------------------------------------------------- +align 4 +key2: ; key + mcall 2 + cmp al,1 + je gamestart ; keybuffer empty + + cmp ah,27 ; esc=End App + je finish + + cmp ah,178 ; up + je s_up + + cmp ah,177 ; down + je s_down + + cmp ah,176 ; left + je s_left + + cmp ah,179 ; right + je s_right + + jmp gamestart ; was any other key +;--------------------------------------------------------------------- +align 4 +s_up: ; walk forward (key or mouse) + mov eax,[vpx] + mov ebx,[vpy] + + mov ecx,[vheading] + mov edi,[sinus+ecx*4] + + mov edx,[vheading] + lea edx,[sinus+3600+edx*4] + cmp edx,eosinus ;cosinus taken from (sinus plus 900) mod 3600 + jb ok200 + + sub edx,14400 +;-------------------------------------- +ok200: + mov esi,[edx] +; sal esi,1 ; edit walking speed here +; sal edi,1 + add eax,edi ; newPx + add ebx,esi ; newPy + mov edi,eax ; newPx / ffff + mov esi,ebx ; newPy / ffff + sar edi,16 + sar esi,16 + mov ecx,esi + sal ecx,5 ; equal *32 + lea ecx,[grid+ecx+edi] + cmp [ecx],byte 0 ; collision check + jne cannotwalk0 + mov [vpx],eax + mov [vpy],ebx + mov [mouseya],dword 1 ; set refresh flag +;-------------------------------------- +cannotwalk0: + jmp check_refresh +;--------------------------------------------------------------------- +align 4 +s_down: ; walk backward + mov eax,[vpx] + mov ebx,[vpy] + mov ecx,[vheading] + mov edi,[sinus+ecx*4] + mov edx,[vheading] + lea edx,[sinus+3600+edx*4] + cmp edx,eosinus ; cosinus taken from (sinus plus 900) mod 3600 + jb ok201 + sub edx,14400 +;-------------------------------------- +ok201: + mov esi,[edx] +; sal esi,1 ; edit walking speed here +; sal edi,1 + sub eax,edi ; newPx + sub ebx,esi ; newPy + mov edi,eax ; newPx / ffff + mov esi,ebx ; newPy / ffff + sar edi,16 + sar esi,16 + mov ecx,esi + sal ecx,5 + lea ecx,[grid+ecx+edi] + cmp [ecx],byte 0 + jne cannotwalk1 + mov [vpx],eax + mov [vpy],ebx + mov [mouseya],dword 1 +;-------------------------------------- +cannotwalk1: + jmp check_refresh +;--------------------------------------------------------------------- +align 4 +s_left: ; turn left (key) + mov edi,[vheading] ; heading + add edi,50 + cmp edi,3600 + jb ok_heading0 + + sub edi,3600 +;-------------------------------------- +ok_heading0: + mov [vheading],edi + mov [mouseya],dword 1 + jmp check_refresh +;--------------------------------------------------------------------- +align 4 +s_right: ; turn right + mov edi,[vheading] + sub edi,50 + cmp edi,-1 + jg ok_heading1 + + add edi,3600 +;-------------------------------------- +ok_heading1: + mov [vheading],edi + mov [mouseya],dword 1 + jmp check_refresh +;--------------------------------------------------------------------- +align 4 +m_left: ; turn left (mouse) + mov edi,[vheading] ; heading + mov ecx,315 + sub ecx,eax + sar ecx,2 + add edi,ecx + cmp edi,3600 + jb ok_heading2 + + sub edi,3600 +;-------------------------------------- +ok_heading2: + mov [vheading],edi + mov [mouseya],dword 1 + jmp continue ; allow both: walk and rotate +;--------------------------------------------------------------------- +align 4 +m_right: ; turn right + mov edi,[vheading] + sub eax,325 + sar eax,2 + sub edi,eax + cmp edi,-1 + jg ok_heading3 + + add edi,3600 +;-------------------------------------- +ok_heading3: + mov [vheading],edi + mov [mouseya],dword 1 + jmp continue +;--------------------------------------------------------------------- +align 4 +button2: ; button + mcall 17 + cmp ah,1 ; button id=1 ? + jne gamestart +;-------------------------------------- +finish: + mcall -1 ; close this program +;--------------------------------------------------------------------- +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* +align 4 +draw_window: + mcall 12,1 + xor eax,eax + xor esi,esi + mcall ,<50,649>,<50,506>,0x74ffffff,,title + mcall 12,2 + ret +;--------------------------------------------------------------------- +; ********************************************* +; ******* COMPUTE 3D-VIEW ******** +; ********************************************* +align 4 +draw_stuff: + mov [step1],dword 1 +; mov [step64],dword 64 + mov esi,[vheading] + add esi,320 + mov [va],esi + mov eax,[vheading] + sub eax,320 + mov [vacompare],eax +;------------------------------------ CAST 640 PIXEL COLUMNS --------------- +; FOR A=320+heading to -319+heading step -1 (a is stored in [va]) +;--------------------------------------------------------------------------- +; mov edx,5 + mov [vx1],dword 0 ;5 ;edx ; init x1 ... pixelcolumn +;-------------------------------------- +align 4 +for_a: + mov edx,[vx1] + mov [vx1b],edx + sub [vx1b],dword 320 + mov edx,[va] ; a2 + cmp edx,-1 ; a2 is a mod 3600 + jg ok1 + + add edx,3600 +;-------------------------------------- +ok1: + cmp edx,3600 + jb ok2 + + sub edx,3600 +;-------------------------------------- +ok2: +; get stepx and stepy + ; pointer to stepx + lea ecx,[sinus+edx*4] + mov esi,[ecx] + sar esi,4 ; accuracy + mov [vstepx],esi ; store stepx + lea esi,[sinus+3600+edx*4] + cmp esi,eosinus ;cosinus taken from ((sinus plus 900) mod 3600) + jb ok202 + + sub esi,14400 +;-------------------------------------- +ok202: + mov ecx,[esi] + sar ecx,4 + mov [vstepy],ecx ; store stepy + + mov eax,[vpx] ; get Camera Position + mov ebx,[vpy] + mov [vxx],eax ; init caster position + mov [vyy],ebx + + mov edi,0 ; init L (number of raycsting-steps) + mov [step1],dword 1 ; init Caster stepwidth for L. +;-------------------------------------- +; raycast a pixel column +align 4 +raycast: + add edi,[step1] ; count caster steps + jmp nodouble ; use this to prevent blinking/wobbling textures: much slower! + +; cmp edi,32 +; je double + +; cmp edi,512 +; je double + +; cmp edi,1024 +; je double + +; jmp nodouble +;--------------------------------------------------------------------- +;double: +; mov edx,[step1] +; sal edx,1 +; mov [step1],edx + +; mov edx,[vstepx] +; sal edx,1 +; mov [vstepx],edx + +; mov edx,[vstepy] +; sal edx,1 +; mov [vstepy],edx +;-------------------------------------- +nodouble: + mov eax,Floors_Height ;32000 ; 3600 ; determine Floors Height based on distance + xor edx,edx + mov ebx,edi + + div ebx + + shl edx,1 + cmp ebx,edx + jae @f + inc eax +@@: + + mov esi,eax + mov [vdd],esi + mov edx,260 + sub edx,esi + mov [vh],edx + + cmp edx,22 + jb no_nu_pixel + + cmp edx,259 + jg no_nu_pixel ; draw only new pixels + + cmp edx,[h_old] + je no_nu_pixel + + mov eax,[vxx] ; calc floor pixel + mov ebx,[vyy] + + and eax,0x0000FFFF + and ebx,0x0000FFFF + + shr eax,10 + shr ebx,10 ; pixel coords inside Texture x,y 64*64 + mov [xfrac],eax + mov [yfrac],ebx +; plot floor pixel !!!! + mov [vl],edi ; save L + mov [ytemp],esi ; remember L bzw. H + + mov edi,[yfrac] ; get pixel color of this floor pixel + sal edi,9 ;8 - for 64x64 + mov esi,[xfrac] + sal esi,3 ;2 - for 64x64 +; in fact its floor, just using the wall texture :) +; lea edi,[wall+edi+esi] + add edi,[wall1] + add edi,esi + mov edx,[edi] + mov [remesi],esi +;**** calculate pixel adress:**** + mov esi,[ytemp] + add esi,240 + imul esi,1920 + mov eax,[vx1] + lea eax,[eax+eax*2] + lea esi,[screen_buffer+eax+esi] + + cmp esi,screen_buffer+1920*480 + jg foff0 + + cmp esi,screen_buffer + jb foff0 +; now we have the adress of the floor-pixel color in edi +; and the adress of the pixel in the image in esi + mov edx,[edi] +;******************** custom distance DARKEN Floor + mov eax,[vdd] +; jmp nodark0 ; use this to deactivate darkening floor (a bit faster) + + cmp eax,80 + jg nodark0 +; split rgb + mov [blue],edx + and [blue],dword 255 + + shr edx,8 + mov [green],edx + and [green],dword 255 + + shr edx,8 + mov [red],edx + and [red],dword 255 + + mov eax,81 ; darkness parameter + sub eax,[vdd] + sal eax,1 +; reduce rgb + sub [red],eax + cmp [red],dword 0 + jg notblack10 + + mov [red],dword 0 +;-------------------------------------- +notblack10: + sub [green],eax + cmp [green],dword 0 + jg notblack20 + + mov [green],dword 0 +;-------------------------------------- +notblack20: + mov edx,[blue] + sub [blue],eax + cmp [blue],dword 0 + jg notblack30 + + mov [blue],dword 0 +;-------------------------------------- +notblack30: + shl dword [red],16 ; reassemble rgb + shl dword [green],8 + mov edx,[red] + or edx,[green] + or edx,[blue] +;-------------------------------------- +nodark0: +; eo custom darken floor + mov eax,edx + +; cmp esi,screen_buffer+1920*480 +; ja foff0 + +; cmp esi,screen_buffer +; jb foff0 + + mov [esi],eax ; actually draw the floor pixel +; paint "forgotten" pixels + mov edx,[lasty] + sub edx,1920 + cmp esi,edx + je foff0 + + mov [esi+1920],eax + sub edx,1920 + cmp esi,edx + je foff0 + + mov [edx+1920],eax + sub edx,1920 + cmp esi,edx + je foff0 + + mov [edx+1920],eax +;-------------------------------------- +align 4 +foff0: + mov [lasty],esi +;**** end of draw floor pixel **** + mov esi,[remesi] + mov edi,[vl] ; restore L +;-------------------------------------- +no_nu_pixel: + mov esi,[vh] + mov [h_old],esi + + mov eax,[vxx] + mov ebx,[vyy] + + add eax,[vstepx] ; casting... + add ebx,[vstepy] + + mov [vxx],eax + mov [vyy],ebx + + sar eax,16 + sar ebx,16 + + mov [vpxi],eax ; casters position in Map Grid + mov [vpyi],ebx + + mov edx,ebx + shl edx,5 + lea edx,[grid+edx+eax] + + cmp [edx],byte 0 ; raycaster reached a wall? (0=no) + jne getout + + cmp edi,10000 ; limit view range + jb raycast +;-------------------------------------- +getout: + mov eax,[edx] ; store Grid Wall Value for Texture Selection + mov [vk],eax + call blur ; deactivate this (blurs the near floor) : a bit faster + +; simply copy floor to ceil pixel column here +; jmp nocopy ; use this for test purposes + pusha + mov eax,screen_buffer+1920*240 + mov ebx,eax ;screen_buffer+1920*240 +;-------------------------------------- +align 4 +copyfloor: + sub eax,1920 + add ebx,1920 + mov ecx,[vx1] + lea ecx,[ecx+ecx*2] + lea edx,[ecx+ebx] + add ecx,eax + mov esi,[edx] + mov [ecx],esi + cmp eax,screen_buffer + jg copyfloor +;@@: + popa +; *** end of copy floor to ceil +;nocopy: +;-------------------------------------- +; draw this pixelrows wall + mov [vl],edi + mov edi,260 + sub edi,[vdd] + cmp edi,0 + jg ok3 + + xor edi,edi +;-------------------------------------- +ok3: + mov [vbottom],edi ; end wall ceil (or window top) + mov esi,262 + add esi,[vdd] ; start wall floor + xor edi,edi +; somethin is wrong with xfrac,so recalc... + mov eax,[vxx] + and eax,0x0000FFFF + shr eax,10 + mov [xfrac],eax + + mov eax,[vyy] + and eax,0x0000FFFF + shr eax,10 + mov [yfrac],eax +;-------------------------------------- +pixelrow: +; find each pixels color: + add edi,ICON_SIZE_Y + sub esi,1 + cmp esi,502 ; dont calc offscreen-pixels + jg speedup + + xor edx,edx + mov eax,edi + mov ebx,[vdd] +; add ebx,ebx + shl ebx,1 + div ebx + + shl edx,1 + cmp ebx,edx + jae @f + inc eax +@@: + and eax,ICON_SIZE_Y-1 + mov [ytemp],eax ; get y of texture for wall + + mov eax,[xfrac] + add eax,[yfrac] + and eax,ICON_SIZE_X-1 + mov [xtemp],eax ; get x of texture for wall +; now prepare to plot that wall-pixel... + mov [remedi],edi + mov edi,[ytemp] + sal edi,9 ;8 - for 64x64 + mov edx,[xtemp] + sal edx,3 ;2 - for 64x64 + add edi,edx + mov eax,[vk] ; determine which texture should be used + and eax,255 + + cmp eax,1 + jne checkmore1 + + add edi,[wall0] ;ceil + jmp foundtex +;--------------------------------------------------------------------- +align 4 +checkmore1: + cmp eax,2 + jne checkmore2 + + add edi,[wall1] + jmp foundtex +;--------------------------------------------------------------------- +align 4 +checkmore2: + cmp eax,3 + jne checkmore3 + + add edi,[wall2] + jmp foundtex +;--------------------------------------------------------------------- +align 4 +checkmore3: + cmp eax,4 + jne checkmore4 + + add edi,[wall3] + jmp foundtex +;--------------------------------------------------------------------- +align 4 +checkmore4: + cmp eax,5 + jne checkmore5 + + add edi,[wall4] + jmp foundtex +;--------------------------------------------------------------------- +align 4 +checkmore5: + cmp eax,6 + jne checkmore6 + + add edi,[wall5] + jmp foundtex +;--------------------------------------------------------------------- +align 4 +checkmore6: + cmp eax,7 + jne checkmore7 + + add edi,[wall6] + jmp foundtex +;--------------------------------------------------------------------- +align 4 +checkmore7: + cmp eax,8 + jne checkmore8 + + add edi,[wall7] + jmp foundtex +;--------------------------------------------------------------------- +align 4 +checkmore8: +foundtex: + mov edx,[edi] ; get pixel color inside texture +; ***pseudoshade south-west +; jmp east ; activate this for southwest pseudoshade : a bit slower + blink-bug +;--------------------------------------------------------------------- +; mov edi,[yfrac] +; mov [pseudo],dword 0 ; store flag for custom distance darkening +; cmp edi,[xfrac] +; jge east + +; and edx,0x00FEFEFE +; shr edx,1 +; mov [pseudo],dword 1 +;-------------------------------------- +east: + call dark_distance ; deactivate wall distance darkening: a bit faster +; ******* DRAW WALL PIXEL ******* + mov eax,esi + lea eax,[esi-22] + imul eax,1920 + mov ebx,[vx1] + lea ebx,[ebx+ebx*2] + lea eax,[eax+screen_buffer+ebx] + + cmp eax,screen_buffer+1920*480 + ja dont_draw + + cmp eax,screen_buffer + jb dont_draw + + mov [eax],edx ; actually set the pixel in the image +;-------------------------------------- +; *** eo draw wall pixel +dont_draw: + mov edi,[remedi] +;-------------------------------------- +speedup: + cmp esi,[vbottom] ; end of this column? + jg pixelrow + + mov edi,[vl] ; restoring + mov eax,[vx1] ; inc X1 + add eax,1 + mov [vx1],eax +;*** NEXT A *** + mov esi,[va] + sub esi,1 + mov [va],esi + cmp esi,[vacompare] + jg for_a +;*** EO NEXT A *** +;-------------------------------------- +; **** put image !!!!!**** + xor edx,edx + mcall 7,screen_buffer,<640,480> + ret +;--------------------------------------------------------------------- +align 4 +blur: + pusha + mov eax,screen_buffer+360*1920 +;-------------------------------------- +align 4 +copyfloor2: + add eax,1920 + mov ebx,[vx1] + lea ebx,[ebx+ebx*2] + add ebx,eax + + mov ecx,[ebx-15] + and ecx,0x00FEFEFE + shr ecx,1 + + mov edx,[ebx-12] + and edx,0x00FEFEFE + shr edx,1 + add edx,ecx + and edx,0x00FEFEFE + shr edx,1 + + mov ecx,[ebx-9] + and ecx,0x00FEFEFE + shr ecx,1 + add edx,ecx + + and edx,0x00FEFEFE + shr edx,1 + + mov ecx,[ebx-6] + and ecx,0x00FEFEFE + shr ecx,1 + add edx,ecx + + and edx,0x00FEFEFE + shr edx,1 + + mov ecx,[ebx-3] + and ecx,0x00FEFEFE + shr ecx,1 + add edx,ecx + + and edx,0x00FEFEFE + shr edx,1 + + mov ecx,[ebx] + and ecx,0x00FEFEFE + shr ecx,1 + add edx,ecx + + mov [ebx],edx + + cmp eax,screen_buffer+478*1920 + jb copyfloor2 + + popa + ret +;--------------------------------------------------------------------- +; ******* Darken by Distance ******* +align 4 +dark_distance: +; color must be in edx, wall height in [vdd] + mov eax,[vdd] + cmp eax,50 + jg nodark +; split rgb + mov [blue],edx + and [blue],dword 255 + + shr edx,8 + mov [green],edx + and [green],dword 255 + + shr edx,8 + mov [red],edx + and [red],dword 255 + + mov eax,51 ; darkness parameter + sub eax,[vdd] + cmp [pseudo],dword 1 + je isdarkside + + sal eax,2 +;-------------------------------------- +align 4 +isdarkside: +; reduce rgb + sub [red],eax + cmp [red], dword 0 + jg notblack10b + + mov [red],dword 0 +;-------------------------------------- +align 4 +notblack10b: + sub [green],eax + cmp [green],dword 0 + jg notblack20b + + mov [green],dword 0 +;-------------------------------------- +align 4 +notblack20b: + mov edx,[blue] + sub [blue],eax + cmp [blue],dword 0 + jg notblack30b + + mov [blue],dword 0 +;-------------------------------------- +align 4 +notblack30b: + shl dword [red],16 ; reassemble rgb + shl dword [green],8 + mov edx,[red] + or edx,[green] + or edx,[blue] + mov eax,edx +;-------------------------------------- +align 4 +nodark: + ret +;--------------------------------------------------------------------- +load_icons: + mov ebx,icons_file_name + mov esi,path + mov edi,file_name + call copy_file_path + + mov [fileinfo.subfunction],dword 5 + mov [fileinfo.size],dword 0 + mov [fileinfo.return],dword file_info + mcall 70,fileinfo + test eax,eax + jnz .error + + mov [fileinfo.subfunction],dword 0 + + mov ecx,[file_info+32] + mov [fileinfo.size],ecx + mov [img_size],ecx + + mcall 68,12 + test eax,eax + jz finish ;memory_get_error + + mov [fileinfo.return],eax + mov [image_file],eax + + mcall 70,fileinfo + test eax,eax + jnz .error + ret +.error: +; mov [N_error],2 +; mov [error_type],eax + jmp finish +;--------------------------------------------------------------------- +copy_file_path: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @b + mov esi,edi + dec esi + std +@@: + lodsb + cmp al,'/' + jnz @b + mov edi,esi + add edi,2 + mov esi,ebx + cld +@@: + lodsb + stosb + test eax,eax + jnz @b + ret +;--------------------------------------------------------------------- +convert_icons: + xor eax,eax + mov [return_code],eax + mov eax,image_file + call [cnv_png_import.Start] + + mov ecx,[image_file] + mcall 68,13, + test eax,eax + jz finish ;memory_free_error + + cmp [return_code],dword 0 +; je @f +; mov [N_error],6 +; jmp button.exit +;@@: + jne finish + + mcall 68,20,ICON_SIZE_X*ICON_SIZE_Y*4*8+44,[raw_pointer] + mov [raw_pointer],eax + + mov ebx,[raw_pointer] +; set RAW area for icon + mov eax,[ebx+28] + add eax,ebx + mov edi,eax + mov esi,eax + add esi,ICON_SIZE_X*ICON_SIZE_Y*8*3-1 + add edi,ICON_SIZE_X*ICON_SIZE_Y*8*4-4 + +; add eax,TEX_SIZE + mov [wall0],eax + add eax,TEX_SIZE + mov [wall1],eax + add eax,TEX_SIZE + mov [wall2],eax + add eax,TEX_SIZE + mov [wall3],eax + add eax,TEX_SIZE + mov [wall4],eax + add eax,TEX_SIZE + mov [wall5],eax + add eax,TEX_SIZE + mov [wall6],eax + add eax,TEX_SIZE + mov [wall7],eax + add eax,TEX_SIZE +; conversion 24b to 32 b + mov ecx,ICON_SIZE_X*ICON_SIZE_Y*8 + std +@@: + xor eax,eax + lodsb + rol eax,8 + lodsb + rol eax,8 + lodsb +; ror eax,16 + stosd + dec ecx + jnz @b + cld + ret +;--------------------------------------------------------------------- +; DATA AREA +;ceil=ceil +;wall=wall floor +;2 corner stone +;3 leaf mosaic +;4 closed window +;5 greek mosaic +;6 old street stones +;7 maya wall +;--------------------------------------------------------------------- +align 4 +grid: ; 32*32 Blocks, Map: 0 = Air, 1 to 8 = Wall +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +;--------------------------------------------------------------------- +vpx: + dd 0x0001FFFF ; initial player position * 0xFFFF +vpy: + dd 0x0001FFFF + +title db 'Free3D v0.5 - fisheye raycasting engine etc.',0 + +sindegree dd 0.0 +sininc dd 0.0017453292519943295769236907684886 +sindiv dd 6553.5 +;textures: +;file 'texture.gif' +;--------------------------------------------------------------------- +align 4 +fileinfo: +.subfunction dd 5 +.Offset dd 0 +.Offset_1 dd 0 +.size dd 0 +.return dd file_info + db 0 +.name: dd file_name +;--------------------------------------------------------------------- +icons_file_name db 'texture_24b.png',0 +;--------------------------------------------------------------------- +plugins_directory db 0 + +system_dir_Boxlib db '/sys/lib/box_lib.obj',0 +system_dir_CnvPNG db '/sys/lib/cnv_png.obj',0 +system_dir_Sort db '/sys/lib/sort.obj',0 +system_dir_UNPACK db '/sys/lib/archiver.obj',0 + +ihead_f_i: +ihead_f_l db 'System error',0 + +er_message_found_lib1 db 'cnv_png.obj - Not found!',0 +er_message_import1 db 'cnv_png.obj - Wrong import!',0 + +err_message_found_lib2 db 'archiver.obj - Not found!',0 +err_message_import2 db 'archiver.obj - Wrong import!',0 + + +align 4 +l_libs_start: +library01 l_libs system_dir_CnvPNG+9,path,file_name,system_dir_CnvPNG,\ +er_message_found_lib1,ihead_f_l,cnv_png_import,er_message_import1,ihead_f_i,plugins_directory + +library02 l_libs system_dir_UNPACK+9,path,file_name,system_dir_UNPACK,\ +err_message_found_lib2,ihead_f_l,UNPACK_import,err_message_import2,ihead_f_i,plugins_directory + +end_l_libs: +;--------------------------------------------------------------------- +align 4 +cnv_png_import: +.Start dd aCP_Start +.Version dd aCP_Version +.Check dd aCP_Check +.Assoc dd aCP_Assoc + dd 0 + dd 0 +aCP_Start db 'START',0 +aCP_Version db 'version',0 +aCP_Check db 'Check_Header',0 +aCP_Assoc db 'Associations',0 +;--------------------------------------------------------------------- +align 4 +UNPACK_import: +;unpack_Version dd aUnpack_Version +;unpack_PluginLoad dd aUnpack_PluginLoad +;unpack_OpenFilePlugin dd aUnpack_OpenFilePlugin +;unpack_ClosePlugin dd aUnpack_ClosePlugin +;unpack_ReadFolder dd aUnpack_ReadFolder +;unpack_SetFolder dd aUnpack_SetFolder +;unpack_GetFiles dd aUnpack_GetFiles +;unpack_GetOpenPluginInfo dd aUnpack_GetOpenPluginInfo +;unpack_Getattr dd aUnpack_Getattr +;unpack_Open dd aUnpack_Open +;unpack_Read dd aUnpack_Read +;unpack_Setpos dd aUnpack_Setpos +;unpack_Close dd aUnpack_Close +;unpack_DeflateUnpack dd aUnpack_DeflateUnpack +unpack_DeflateUnpack2 dd aUnpack_DeflateUnpack2 + dd 0 + dd 0 + +;aUnpack_Version db 'version',0 +;aUnpack_PluginLoad db 'plugin_load',0 +;aUnpack_OpenFilePlugin db 'OpenFilePlugin',0 +;aUnpack_ClosePlugin db 'ClosePlugin',0 +;aUnpack_ReadFolder db 'ReadFolder',0 +;aUnpack_SetFolder db 'SetFolder',0 +;aUnpack_GetFiles db 'GetFiles',0 +;aUnpack_GetOpenPluginInfo db 'GetOpenPluginInfo',0 +;aUnpack_Getattr db 'getattr',0 +;aUnpack_Open db 'open',0 +;aUnpack_Read db 'read',0 +;aUnpack_Setpos db 'setpos',0 +;aUnpack_Close db 'close',0 +;aUnpack_DeflateUnpack db 'deflate_unpack',0 +aUnpack_DeflateUnpack2 db 'deflate_unpack2',0 + +;--------------------------------------------------------------------- +IM_END: +;--------------------------------------------------------------------- +; not change this section!!! +; start section +;--------------------------------------------------------------------- +align 4 +image_file rd 1 +raw_pointer rd 1 +return_code rd 1 +img_size rd 1 +deflate_unpack rd 1 +raw_pointer_2 rd 1 ;+20 +;--------------------------------------------------------------------- +; end section +;--------------------------------------------------------------------- +align 4 +;--------------------------------------------------------------------- +wall0 rd 1 +wall1 rd 1 +wall2 rd 1 +wall3 rd 1 +wall4 rd 1 +wall5 rd 1 +wall6 rd 1 +wall7 rd 1 +;screen_buffer rd 1 +;--------------------------------------------------------------------- +align 4 +col1: + dd ? ;- +; misc raycaster vars: +vxx: + dd ? ;- +vyy: + dd ? ;- +vl: + dd ? ;- +vstepx: + dd ? ;- +vstepy: + dd ? ;- +vxxint: + dd ? ;- +vyyint: + dd ? ;- +vk: + dd ? ;- +va: + dd ? ;- +va2: + dd ? ;- +vdd: + dd ? ;- +vx1: + dd ? ;- +vx1b: + dd ? ;- +vh: + dd ? ;- +vdt: + dd ? ;- +vheading: ; initial heading: 0 to 3599 + dd ? ;- +vacompare: + dd ? ;- +vpxi: + dd ? ;- +vpyi: + dd ? ;- +wtolong: + dw ?,? ;-,?;- + +xtemp: + dd ? ;- +ytemp: + dd ? ;- +xfrac: + dd ? ;- +yfrac: + dd ? ;- +h_old: + dd ? ;- +vbottom: + dd ? ;- +mouseya: + dd ? ;- +remeax: + dd ? ;- +remebx: + dd ? ;- +remecx: + dd ? ;- +remedx: + dd ? ;- +remedi: + dd ? ;- +remesi: + dd ? ;- +red: + dd ? ;- +green: + dd ? ;- +blue: + dd ? ;- +pseudo: + dd ? ;- +step1: + dd ? ;- +;step64: +; dd ? ;- +lasty: + dd ? ;- +;--------------------------------------------------------------------- +;I_END: +IncludeUGlobals +align 4 +sinus rd 360*10 +eosinus: +; rd 16*1024*4 +;--------------------------------------------------------------------- +align 4 + rb 1024 +stacktop: +;--------------------------------------------------------------------- +path: + rb 4096 +;--------------------------------------------------------------------- +file_name: + rb 4096 +;--------------------------------------------------------------------- +file_info: + rb 40 +;--------------------------------------------------------------------- +screen_buffer: + rb 640*480*3 *3/2 +;--------------------------------------------------------------------- +I_END: +;--------------------------------------------------------------------- \ No newline at end of file diff --git a/programs/demos/free3d/trunk/texture_24b.png b/programs/demos/free3d/trunk/texture_24b.png new file mode 100644 index 0000000000..182cad84cc Binary files /dev/null and b/programs/demos/free3d/trunk/texture_24b.png differ