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: |
;--------------------------------------------------------------------- |