Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 5921 → Rev 5922

/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc
1,6 → 1,25
;
; We draw a triangle with various interpolations
;
; Порядок преобразований цветов вершин:
; ZBufferPoint.r -> r1 (+drdl_min or +drdl_max) -> or1 (+drdx) -> [pixel buffer]
; ZBufferPoint.g -> g1 (+dgdl_min or +dgdl_max) -> og1 (+dgdx) -> [pixel buffer]
; ZBufferPoint.b -> b1 (+dbdl_min or +dbdl_max) -> ob1 (+dbdx) -> [pixel buffer]
;
; В некоторых случаях значения цвета (во 2-м байте переменных: or1,og1,ob1)
; может становиться < 0 или > 255, тогда появляються пиксели не правильного
; цвета. Скорее всего это связано с ошибками округления дробных чисел,
; при вычислении коэфициентов для плавного перехода цвета.
;
; Для лечения этой проблемы в версии на C++ специально ограничиваються
; минимальные и максимальные значения цвета точек (например от 3 до 252).
; Потому цвета граней могут немного отличаться от указанных в программе.
;
; В даной версии алгоритм немного другой. В наиболее вероятных местах появления
; пикселей не правильного цвета (обычно начало и конец линии) иправляеться
; цвет испорченных пикселей. Цвет получаеться наиболее близким к указанному
; пользователем.
 
t dd ? ;ZBufferPoint*
pr1 dd ? ;ZBufferPoint*
pr2 dd ? ;ZBufferPoint*
699,10 → 718,34
end if
if INTERP_RGB eq 1
mov eax,[r1]
bt eax,31 ; коректирование испорченных пикселей (в начале линии)
jnc @f
xor eax,eax
@@:
bt eax,16
jnc @f
mov eax,0xff00
@@:
mov [or1],eax
mov eax,[g1]
bt eax,31
jnc @f
xor eax,eax
@@:
bt eax,16
jnc @f
mov eax,0xff00
@@:
mov [og1],eax
mov eax,[b1]
bt eax,31
jnc @f
xor eax,eax
@@:
bt eax,16
jnc @f
mov eax,0xff00
@@:
mov [ob1],eax
end if
if INTERP_ST eq 1
720,8 → 763,13
 
align 4
.cycle_1: ;while (n>=3)
if INTERP_RGB eq 1
cmp dword[n],5
jl .cycle_2
else
cmp dword[n],3
jl .cycle_2
end if
PUT_PIXEL 0
PUT_PIXEL 1
PUT_PIXEL 2
733,6 → 781,36
sub dword[n],4
jmp .cycle_1
.cycle_2: ;while (n>=0)
if INTERP_RGB eq 1
; коректирование испорченных пикселей (в конце линии)
bt dword[or1],31
jnc @f
mov dword[or1],0
jmp .end_r
@@:
bt dword[or1],16
jnc .end_r
mov dword[or1],0xff00
.end_r:
bt dword[og1],31
jnc @f
mov dword[og1],0
jmp .end_g
@@:
bt dword[og1],16
jnc .end_g
mov dword[og1],0xff00
.end_g:
bt dword[ob1],31
jnc @f
mov dword[ob1],0
jmp .end_b
@@:
bt dword[ob1],16
jnc .end_b
mov dword[ob1],0xff00
.end_b:
end if
cmp dword[n],0
jl .cycle_2_end
PUT_PIXEL 0