Subversion Repositories Kolibri OS

Rev

Rev 5208 | Rev 5939 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5208 Rev 5922
Line 1... Line 1...
1
;
1
;
2
; We draw a triangle with various interpolations
2
; We draw a triangle with various interpolations
3
;
3
;
-
 
4
; Порядок преобразований цветов вершин:
-
 
5
; ZBufferPoint.r -> r1 (+drdl_min or +drdl_max) -> or1 (+drdx) -> [pixel buffer]
-
 
6
; ZBufferPoint.g -> g1 (+dgdl_min or +dgdl_max) -> og1 (+dgdx) -> [pixel buffer]
-
 
7
; ZBufferPoint.b -> b1 (+dbdl_min or +dbdl_max) -> ob1 (+dbdx) -> [pixel buffer]
-
 
8
;
-
 
9
; В некоторых случаях значения цвета (во 2-м байте переменных: or1,og1,ob1)
-
 
10
; может становиться < 0 или > 255, тогда появляються пиксели не правильного
-
 
11
; цвета. Скорее всего это связано с ошибками округления дробных чисел,
-
 
12
; при вычислении коэфициентов для плавного перехода цвета.
-
 
13
;
-
 
14
; Для лечения этой проблемы в версии на C++ специально ограничиваються
-
 
15
; минимальные и максимальные значения цвета точек (например от 3 до 252).
-
 
16
; Потому цвета граней могут немного отличаться от указанных в программе.
-
 
17
;
-
 
18
; В даной версии алгоритм немного другой. В наиболее вероятных местах появления
-
 
19
; пикселей не правильного цвета (обычно начало и конец линии) иправляеться
-
 
20
; цвет испорченных пикселей. Цвет получаеться наиболее близким к указанному
-
 
21
; пользователем.
-
 
22
 
4
	t dd ? ;ZBufferPoint*
23
	t dd ? ;ZBufferPoint*
5
	pr1 dd ? ;ZBufferPoint*
24
	pr1 dd ? ;ZBufferPoint*
6
	pr2 dd ? ;ZBufferPoint*
25
	pr2 dd ? ;ZBufferPoint*
7
	l1 dd ? ;ZBufferPoint*
26
	l1 dd ? ;ZBufferPoint*
8
	l2 dd ? ;ZBufferPoint*
27
	l2 dd ? ;ZBufferPoint*
Line 697... Line 716...
697
		mov eax,[z1]
716
		mov eax,[z1]
698
		mov [z],eax
717
		mov [z],eax
699
end if
718
end if
700
if INTERP_RGB eq 1
719
if INTERP_RGB eq 1
701
		mov eax,[r1]
720
		mov eax,[r1]
-
 
721
		bt eax,31 ; коректирование испорченных пикселей (в начале линии)
-
 
722
		jnc @f
-
 
723
			xor eax,eax
-
 
724
		@@:
-
 
725
		bt eax,16
-
 
726
		jnc @f
-
 
727
			mov eax,0xff00
-
 
728
		@@:
702
		mov [or1],eax
729
		mov [or1],eax
703
		mov eax,[g1]
730
		mov eax,[g1]
-
 
731
		bt eax,31
-
 
732
		jnc @f
-
 
733
			xor eax,eax
-
 
734
		@@:
-
 
735
		bt eax,16
-
 
736
		jnc @f
-
 
737
			mov eax,0xff00
-
 
738
		@@:
704
		mov [og1],eax
739
		mov [og1],eax
705
		mov eax,[b1]
740
		mov eax,[b1]
-
 
741
		bt eax,31
-
 
742
		jnc @f
-
 
743
			xor eax,eax
-
 
744
		@@:
-
 
745
		bt eax,16
-
 
746
		jnc @f
-
 
747
			mov eax,0xff00
-
 
748
		@@:
706
		mov [ob1],eax
749
		mov [ob1],eax
707
end if
750
end if
708
if INTERP_ST eq 1
751
if INTERP_ST eq 1
709
		mov eax,[s1]
752
		mov eax,[s1]
710
		mov [s],eax
753
		mov [s],eax
Line 718... Line 761...
718
		mov [t_z],eax
761
		mov [t_z],eax
719
end if
762
end if
Line 720... Line 763...
720
 
763
 
721
align 4
764
align 4
-
 
765
		.cycle_1: ;while (n>=3)
-
 
766
if INTERP_RGB eq 1
-
 
767
		cmp dword[n],5
-
 
768
		jl .cycle_2
722
		.cycle_1: ;while (n>=3)
769
else
723
		cmp dword[n],3
770
		cmp dword[n],3
-
 
771
		jl .cycle_2
724
		jl .cycle_2
772
end if
725
			PUT_PIXEL 0
773
			PUT_PIXEL 0
726
			PUT_PIXEL 1
774
			PUT_PIXEL 1
727
			PUT_PIXEL 2
775
			PUT_PIXEL 2
728
			PUT_PIXEL 3
776
			PUT_PIXEL 3
Line 731... Line 779...
731
end if
779
end if
732
			add edi,4*PSZB
780
			add edi,4*PSZB
733
			sub dword[n],4
781
			sub dword[n],4
734
		jmp .cycle_1
782
		jmp .cycle_1
735
		.cycle_2: ;while (n>=0)
783
		.cycle_2: ;while (n>=0)
-
 
784
if INTERP_RGB eq 1
-
 
785
		; коректирование испорченных пикселей (в конце линии)
-
 
786
		bt dword[or1],31
-
 
787
		jnc @f
-
 
788
			mov dword[or1],0
-
 
789
			jmp .end_r
-
 
790
		@@:
-
 
791
		bt dword[or1],16
-
 
792
		jnc .end_r
-
 
793
			mov dword[or1],0xff00
-
 
794
		.end_r:
-
 
795
		bt dword[og1],31
-
 
796
		jnc @f
-
 
797
			mov dword[og1],0
-
 
798
			jmp .end_g
-
 
799
		@@:
-
 
800
		bt dword[og1],16
-
 
801
		jnc .end_g
-
 
802
			mov dword[og1],0xff00
-
 
803
		.end_g:
-
 
804
		bt dword[ob1],31
-
 
805
		jnc @f
-
 
806
			mov dword[ob1],0
-
 
807
			jmp .end_b
-
 
808
		@@:
-
 
809
		bt dword[ob1],16
-
 
810
		jnc .end_b
-
 
811
			mov dword[ob1],0xff00
-
 
812
		.end_b:
-
 
813
end if
736
		cmp dword[n],0
814
		cmp dword[n],0
737
		jl .cycle_2_end
815
		jl .cycle_2_end
738
			PUT_PIXEL 0
816
			PUT_PIXEL 0
739
if INTERP_Z eq 1
817
if INTERP_Z eq 1
740
			add dword[pz],2 ;=sizeof(uint)
818
			add dword[pz],2 ;=sizeof(uint)