some fixes

git-svn-id: svn://kolibrios.org@5278 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2014-12-28 20:13:27 +00:00
parent 07b6e3f4f2
commit 470be179f7
3 changed files with 54 additions and 57 deletions

View File

@ -227,74 +227,66 @@ endp
; tmin,tmax -> &float ; tmin,tmax -> &float
align 4 align 4
proc ClipLine1 uses ebx, denom:dword,num:dword,tmin:dword,tmax:dword proc ClipLine1 uses ebx, denom:dword,num:dword,tmin:dword,tmax:dword
fldz fld dword[denom]
fcom dword[denom] ftst
fstsw ax fstsw ax
sahf sahf
je .u2 jbe .els_0 ;if (denom>0)
jmp @f
.u2:
fcom dword[num]
fstsw ax
sahf
jb .r0 ;if (denom==0 && num>0) return 0
jmp .r1
@@:
fcom dword[denom]
fstsw ax
sahf
ja .els_0 ;if (0<denom)
fld dword[num] fld dword[num]
fdiv dword[denom] fxch st1
fdivp ;t=num/denom
mov ebx,[tmax] mov ebx,[tmax]
fcom dword[ebx] fcom dword[ebx]
fstsw ax fstsw ax
sahf sahf
ja .r0_f2 ;if (t>*tmax) return 0 ja .r0_f1 ;if (t>*tmax) return 0
mov ebx,[tmin] mov ebx,[tmin]
fcom dword[ebx] fcom dword[ebx]
fstsw ax fstsw ax
sahf sahf
jbe .r1_f2 jbe .r1_f1 ;if (t>*tmin) *tmin=t
fstp dword[ebx] ;if (t>*tmin) *tmin=t fstp dword[ebx]
jmp .r1 jmp .r1
.els_0: ;else if (denom<0)
.els_0: ;else if (0>denom) jae .els_1
fld dword[num] fld dword[num]
fdiv dword[denom] fxch st1
fdivp ;t=num/denom
mov ebx,[tmin] mov ebx,[tmin]
fcom dword[ebx] fcom dword[ebx]
fstsw ax fstsw ax
sahf sahf
jb .r0_f2 ;if (t<*tmin) return 0 jb .r0_f1 ;if (t<*tmin) return 0
mov ebx,[tmax] mov ebx,[tmax]
fcom dword[ebx] fcom dword[ebx]
fstsw ax fstsw ax
sahf sahf
jae .r1_f2 jae .r1_f1
fstp dword[ebx] ;if (t<*tmin) *tmax=t fstp dword[ebx] ;if (t<*tmin) *tmax=t
jmp .r1 jmp .r1
.els_1: ;else if (num>0)
ffree st0 ;denom
fincstp
fld dword[num]
ftst
fstsw ax
sahf
ja .r0_f1 ;if (num>0) return 0
jmp .r1_f1
.r0_f2: ;return 0 & free st0,st1 .r0_f1: ;return 0 & free st0
ffree st0 ffree st0
fincstp fincstp
.r0: ;return 0 & free st0 .r0: ;return 0
xor eax,eax xor eax,eax
jmp .end_f jmp .end_f
.r1_f2: ;return 1 & free st0,st1 .r1_f1: ;return 1 & free st0
ffree st0 ffree st0
fincstp fincstp
.r1: ;return 1 & free st0 .r1: ;return 1
xor eax,eax xor eax,eax
inc eax inc eax
.end_f: .end_f:
ffree st0
fincstp
ret ret
endp endp

View File

@ -24,13 +24,13 @@ start:
mcall 40,0x27 mcall 40,0x27
stdcall [kosglMakeCurrent], 10,10,400,325,ctx1 stdcall [kosglMakeCurrent], 10,10,400,350,ctx1
stdcall [glEnable], GL_DEPTH_TEST stdcall [glEnable], GL_DEPTH_TEST
stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов
stdcall [gluNewQuadric] stdcall [gluNewQuadric]
mov [qObj],eax mov [qObj],eax
stdcall [glClearColor], 0.5,0.5,0.5,0.0 stdcall [glClearColor], 0.25,0.25,0.25,0.0
stdcall [glShadeModel], GL_SMOOTH stdcall [glShadeModel], GL_SMOOTH
call draw_3d call draw_3d
@ -56,7 +56,7 @@ draw_window:
mcall 12,1 mcall 12,1
mov edx,0x33ffffff ;0x73ffffff mov edx,0x33ffffff ;0x73ffffff
mcall 0,(50 shl 16)+430,(30 shl 16)+375,,,caption mcall 0,(50 shl 16)+430,(30 shl 16)+400,,,caption
stdcall [kosglSwapBuffers] stdcall [kosglSwapBuffers]
mcall 12,2 mcall 12,2
@ -141,14 +141,13 @@ align 4
draw_3d: draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
stdcall [glColor3f], 1.0, 1.0, 0.0
stdcall [glPushMatrix] stdcall [glPushMatrix]
call SetLight call SetLight
stdcall [glTranslatef], 0.0,0.0,0.5 stdcall [glTranslatef], 0.0,0.0,0.5
stdcall [glScalef], [scale], [scale], [scale] stdcall [glScalef], [scale], [scale], [scale]
stdcall [glColor3f], 1.0, 1.0, 0.0
stdcall [glRotatef], [angle_z],0.0,0.0,1.0 stdcall [glRotatef], [angle_z],0.0,0.0,1.0
stdcall [glRotatef], [angle_y],0.0,1.0,0.0 stdcall [glRotatef], [angle_y],0.0,1.0,0.0
stdcall [gluSphere], [qObj], 1.0, 32,32 stdcall [gluSphere], [qObj], 1.0, 32,32
@ -189,9 +188,10 @@ angle_z dd 0.0
angle_y dd 0.0 angle_y dd 0.0
delt_size dd 3.0 delt_size dd 3.0
light_position dd 0.0, 0.0, 2.0, 1000.0 ; Расположение источника [0][1][2], чем ближе [3] к 0, тем ярче свет light_position dd 3.0, 2.0, -10.0, 1.0 ; Расположение источника [0][1][2]
;[3] = (0.0 - бесконечно удаленный источник, 1.0 - источник света на определенном расстоянии)
light_dir dd 0.0,0.0,0.0 ;направление лампы light_dir dd 0.0,0.0,0.0 ;направление лампы
mat_specular dd 0.3, 0.3, 0.3, 1.0 ; Цвет блика mat_specular dd 0.1, 0.1, 0.1, 1.0 ; Цвет блика
mat_shininess dd 3.0 ; Размер блика (обратная пропорция) mat_shininess dd 3.0 ; Размер блика (обратная пропорция)
white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником
lmodel_ambient dd 0.2, 0.2, 0.2, 1.0 ; Параметры фонового освещения lmodel_ambient dd 0.2, 0.2, 0.2, 1.0 ; Параметры фонового освещения

View File

@ -203,7 +203,7 @@ pushad
fcom dword[an180f] ;if (a != 180) fcom dword[an180f] ;if (a != 180)
fstsw ax fstsw ax
sahf sahf
jne @f je @f
fldpi fldpi
fmulp fmulp
fdiv dword[an180f] fdiv dword[an180f]
@ -289,7 +289,7 @@ local .end_m
fcompp fcompp
fstsw ax fstsw ax
sahf sahf
jb .o_2 ja .o_2
mov eax,1.0 mov eax,1.0
jmp .end_m ;return 1.0 jmp .end_m ;return 1.0
.o_2: .o_2:
@ -355,19 +355,19 @@ fl_1e_3 dd 1.0e-3
if DEBUG if DEBUG
txt_mate db 'Material',0 txt_mate db 'Material',0
txt_colo db 'Color',0 txt_colo db 'Color',0
txt_rgba db 'R, G, B',0
end if end if
; non optimized lightening model ; non optimized lightening model
align 4 align 4
proc gl_shade_vertex, context:dword, v:dword proc gl_shade_vertex, context:dword, v:dword
locals locals
R dd ? ;float ebp-100 R dd ? ;float ebp-96
G dd ? ;float ebp-96 G dd ? ;float ebp-92
B dd ? ;float ebp-92 B dd ? ;float ebp-88
A dd ? ;float ebp-88 A dd ? ;float ebp-84
s V3 ;ebp-84 s V3 ;ebp-80
d V3 ;ebp-72 d V3 ;ebp-68
dist dd ? ;float ebp-60
tmp dd ? ;float ebp-56 tmp dd ? ;float ebp-56
att dd ? ;float ebp-52 att dd ? ;float ebp-52
dot_spot dd ? ;float ebp-48 dot_spot dd ? ;float ebp-48
@ -480,8 +480,7 @@ end if
fld dword[d+offs_Z] fld dword[d+offs_Z]
fmul st0,st0 fmul st0,st0
faddp faddp
fsqrt fsqrt ;dist=sqrt(d.X^2+d.Y^2+d.Z^2)
fst dword[dist] ;dist=sqrt(d.X^2+d.Y^2+d.Z^2)
fcom dword[fl_1e_3] fcom dword[fl_1e_3]
fstsw ax fstsw ax
sahf sahf
@ -557,7 +556,7 @@ end if
fcomp dword[an180f] ;if (l.spot_cutoff != 180) fcomp dword[an180f] ;if (l.spot_cutoff != 180)
fstsw ax fstsw ax
sahf sahf
jne .if1_end je .if1_end
fld dword[ebx+offs_ligh_norm_spot_direction] fld dword[ebx+offs_ligh_norm_spot_direction]
fmul dword[d] fmul dword[d]
fld dword[ebx+offs_ligh_norm_spot_direction+4] fld dword[ebx+offs_ligh_norm_spot_direction+4]
@ -675,7 +674,7 @@ end if
faddp faddp
fld dword[s+offs_Z] fld dword[s+offs_Z]
fmul st0,st0 fmul st0,st0
faddp faddp ;st0 = s.X^2 +s.Y^2 +s.Z^2
fsqrt fsqrt
fcom dword[fl_1e_3] fcom dword[fl_1e_3]
fstsw ax fstsw ax
@ -697,7 +696,7 @@ end if
fstsw ax fstsw ax
fild dword[idx] fild dword[idx]
sahf sahf
jae @f ;if(dot_spec < 1.0) jbe @f ;if(dot_spec < 1.0) st0=1 st1=dot_spec
fmul st0,st1 ;idx *= dot_spec fmul st0,st1 ;idx *= dot_spec
@@: @@:
fistp dword[idx] fistp dword[idx]
@ -711,16 +710,22 @@ end if
fmul dword[ecx+offs_mate_specular] fmul dword[ecx+offs_mate_specular]
fadd dword[lR] fadd dword[lR]
fstp dword[lR] ;lR+=dot_spec * l.specular.v[0] * m.specular.v[0] fstp dword[lR] ;lR+=dot_spec * l.specular.v[0] * m.specular.v[0]
;ffree st0
;fincstp
fld dword[ebx+offs_ligh_specular+4] fld dword[ebx+offs_ligh_specular+4]
fmul st0,st1 fmul st0,st1
fmul dword[ecx+offs_mate_specular+4] fmul dword[ecx+offs_mate_specular+4]
fadd dword[lG] fadd dword[lG]
fstp dword[lG] ;lG+=dot_spec * l.specular.v[1] * m.specular.v[1] fstp dword[lG] ;lG+=dot_spec * l.specular.v[1] * m.specular.v[1]
;ffree st0
;fincstp
fld dword[ebx+offs_ligh_specular+8] fld dword[ebx+offs_ligh_specular+8]
fmul st0,st1 fmul st0,st1
fmul dword[ecx+offs_mate_specular+8] fmul dword[ecx+offs_mate_specular+8]
fadd dword[lB] fadd dword[lB]
fstp dword[lB] ;lB+=dot_spec * l.specular.v[2] * m.specular.v[2] fstp dword[lB] ;lB+=dot_spec * l.specular.v[2] * m.specular.v[2]
;ffree st0
;fincstp
ffree st0 ;dot_spec ffree st0 ;dot_spec
fincstp fincstp
jmp .if2_end jmp .if2_end