Subversion Repositories Kolibri OS

Rev

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

Rev 6145 Rev 6172
Line 129... Line 129...
129
	ret
129
	ret
130
endp
130
endp
Line 131... Line 131...
131
 
131
 
Line 132... Line 132...
132
; line
132
; line
-
 
133
 
-
 
134
;input:
133
 
135
;q - регистр с адресом вершины для интерполяции
134
align 16
136
;p0 - регистр с адресом 1-й вершины
135
proc interpolate uses eax ebx ecx, q:dword,p0:dword,p1:dword,t:dword
137
;p1 - регистр с адресом 2-й вершины
136
	mov eax,[q]
138
;t - float
137
	mov ebx,[p0]
139
macro interpolate q, p0, p1, t
Line 138... Line 140...
138
	mov ecx,[p1]
140
{
139
	fld dword[t]
141
	fld dword[t]
140
 
142
 
141
	; интерполяция по координатам
143
	; интерполяция по координатам
142
	fld dword[ecx+offs_vert_pc]
144
	fld dword[p1+offs_vert_pc]
143
	fsub dword[ebx+offs_vert_pc]
145
	fsub dword[p0+offs_vert_pc]
Line 144... Line 146...
144
	fmul st0,st1
146
	fmul st0,st1
145
	fadd dword[ebx+offs_vert_pc]
147
	fadd dword[p0+offs_vert_pc]
146
	fstp dword[eax+offs_vert_pc] ;q.pc.X = p0.pc.X + (p1.pc.X - p0.pc.X) * t
148
	fstp dword[q+offs_vert_pc] ;q.pc.X = p0.pc.X + (p1.pc.X - p0.pc.X) * t
147
 
149
 
148
	fld dword[ecx+offs_vert_pc+offs_Y]
150
	fld dword[p1+offs_vert_pc+offs_Y]
Line 149... Line 151...
149
	fsub dword[ebx+offs_vert_pc+offs_Y]
151
	fsub dword[p0+offs_vert_pc+offs_Y]
150
	fmul st0,st1
152
	fmul st0,st1
151
	fadd dword[ebx+offs_vert_pc+offs_Y]
153
	fadd dword[p0+offs_vert_pc+offs_Y]
152
	fstp dword[eax+offs_vert_pc+offs_Y]
154
	fstp dword[q+offs_vert_pc+offs_Y]
153
 
155
 
Line 154... Line 156...
154
	fld dword[ecx+offs_vert_pc+offs_Z]
156
	fld dword[p1+offs_vert_pc+offs_Z]
155
	fsub dword[ebx+offs_vert_pc+offs_Z]
157
	fsub dword[p0+offs_vert_pc+offs_Z]
156
	fmul st0,st1
158
	fmul st0,st1
157
	fadd dword[ebx+offs_vert_pc+offs_Z]
159
	fadd dword[p0+offs_vert_pc+offs_Z]
158
	fstp dword[eax+offs_vert_pc+offs_Z]
160
	fstp dword[q+offs_vert_pc+offs_Z]
Line 159... Line 161...
159
 
161
 
160
	fld dword[ecx+offs_vert_pc+offs_W]
162
	fld dword[p1+offs_vert_pc+offs_W]
161
	fsub dword[ebx+offs_vert_pc+offs_W]
163
	fsub dword[p0+offs_vert_pc+offs_W]
162
	fmul st0,st1
164
	fmul st0,st1
163
	fadd dword[ebx+offs_vert_pc+offs_W]
165
	fadd dword[p0+offs_vert_pc+offs_W]
164
	fstp dword[eax+offs_vert_pc+offs_W]
166
	fstp dword[q+offs_vert_pc+offs_W]
Line 165... Line 167...
165
 
167
 
166
	; интерполяция по цвету
168
	; интерполяция по цвету
167
	fld dword[ecx+offs_vert_color]
169
	fld dword[p1+offs_vert_color]
168
	fsub dword[ebx+offs_vert_color]
170
	fsub dword[p0+offs_vert_color]
169
	fmul st0,st1
171
	fmul st0,st1
Line 170... Line 172...
170
	fadd dword[ebx+offs_vert_color]
172
	fadd dword[p0+offs_vert_color]
171
	fstp dword[eax+offs_vert_color]
173
	fstp dword[q+offs_vert_color]
172
 
174
 
173
	fld dword[ecx+offs_vert_color+4]
175
	fld dword[p1+offs_vert_color+4]
174
	fsub dword[ebx+offs_vert_color+4]
176
	fsub dword[p0+offs_vert_color+4]
175
	fmul st0,st1
177
	fmul st0,st1
176
	fadd dword[ebx+offs_vert_color+4]
-
 
Line 177... Line 178...
177
	fstp dword[eax+offs_vert_color+4]
178
	fadd dword[p0+offs_vert_color+4]
178
 
179
	fstp dword[q+offs_vert_color+4]
179
	fld dword[ecx+offs_vert_color+8]
180
 
Line 419... Line 420...
419
	bt eax,0
420
	bt eax,0
420
	jnc .end_f
421
	jnc .end_f
Line 421... Line 422...
421
 
422
 
422
	mov eax,ebp
423
	mov eax,ebp
423
	sub eax,8+2*sizeof.GLVertex ;eax = &q1
424
	sub eax,8+2*sizeof.GLVertex ;eax = &q1
424
	stdcall interpolate, eax,edi,esi,[tmin]
425
	interpolate eax,edi,esi,tmin
425
	stdcall gl_transform_to_viewport, edx,eax
426
	stdcall gl_transform_to_viewport, edx,eax
426
	add eax,sizeof.GLVertex ;eax = &q2
427
	add eax,sizeof.GLVertex ;eax = &q2
427
	stdcall interpolate, eax,edi,esi,[tmax]
428
	interpolate eax,edi,esi,tmax
Line 428... Line 429...
428
	stdcall gl_transform_to_viewport, edx,eax
429
	stdcall gl_transform_to_viewport, edx,eax
429
 
430
 
430
	sub eax,sizeof.GLVertex ;eax = &q1
431
	sub eax,sizeof.GLVertex ;eax = &q1
Line 584... Line 585...
584
endp
585
endp
Line 585... Line 586...
585
 
586
 
586
align 4
587
align 4
Line -... Line 588...
-
 
588
clip_proc dd clip_xmin,clip_xmax, clip_ymin,clip_ymax, clip_zmin,clip_zmax
-
 
589
 
587
clip_proc dd clip_xmin,clip_xmax, clip_ymin,clip_ymax, clip_zmin,clip_zmax
590
;input:
588
 
591
;edi - q
589
align 16
-
 
590
proc updateTmp uses eax ebx ecx edx, context:dword, q:dword, p0:dword, p1:dword, t:dword
592
align 16
591
	mov ebx,[q]
593
proc updateTmp uses eax ecx edx, context:dword, p0:dword, p1:dword, t:dword
592
	mov edx,[context]
594
	mov edx,[context]
593
	mov eax,[p0]
595
	mov eax,[p0]
594
	cmp dword[edx+offs_cont_current_shade_model],GL_SMOOTH ;if (context.current_shade_model == GL_SMOOTH)
596
	cmp dword[edx+offs_cont_current_shade_model],GL_SMOOTH ;if (context.current_shade_model == GL_SMOOTH)
595
	jne .els_0
597
	jne .els_0
596
		mov ecx,[p1]
598
		mov ecx,[p1]
597
		fld dword[ecx+offs_vert_color]
599
		fld dword[ecx+offs_vert_color]
598
		fsub dword[eax+offs_vert_color]
600
		fsub dword[eax+offs_vert_color]
599
		fmul dword[t]
601
		fmul dword[t]
600
		fadd dword[eax+offs_vert_color]
602
		fadd dword[eax+offs_vert_color]
601
		fstp dword[ebx+offs_vert_color] ;q.color.v[0]=p0.color.v[0] + (p1.color.v[0]-p0.color.v[0])*t
603
		fstp dword[edi+offs_vert_color] ;q.color.v[0]=p0.color.v[0] + (p1.color.v[0]-p0.color.v[0])*t
602
		fld dword[ecx+offs_vert_color+4]
604
		fld dword[ecx+offs_vert_color+4]
603
		fsub dword[eax+offs_vert_color+4]
605
		fsub dword[eax+offs_vert_color+4]
604
		fmul dword[t]
606
		fmul dword[t]
605
		fadd dword[eax+offs_vert_color+4]
607
		fadd dword[eax+offs_vert_color+4]
606
		fstp dword[ebx+offs_vert_color+4] ;q.color.v[1]=p0.color.v[1] + (p1.color.v[1]-p0.color.v[1])*t
608
		fstp dword[edi+offs_vert_color+4] ;q.color.v[1]=p0.color.v[1] + (p1.color.v[1]-p0.color.v[1])*t
607
		fld dword[ecx+offs_vert_color+8]
609
		fld dword[ecx+offs_vert_color+8]
608
		fsub dword[eax+offs_vert_color+8]
610
		fsub dword[eax+offs_vert_color+8]
609
		fmul dword[t]
611
		fmul dword[t]
610
		fadd dword[eax+offs_vert_color+8]
612
		fadd dword[eax+offs_vert_color+8]
611
		fstp dword[ebx+offs_vert_color+8] ;q.color.v[2]=p0.color.v[2] + (p1.color.v[2]-p0.color.v[2])*t
613
		fstp dword[edi+offs_vert_color+8] ;q.color.v[2]=p0.color.v[2] + (p1.color.v[2]-p0.color.v[2])*t
612
		jmp @f
614
		jmp @f
613
align 4
615
align 4
614
	.els_0:
616
	.els_0:
615
		mov ecx,[eax+offs_vert_color]
617
		mov ecx,[eax+offs_vert_color]
616
		mov [ebx+offs_vert_color],ecx ;q.color.v[0]=p0.color.v[0]
618
		mov [edi+offs_vert_color],ecx ;q.color.v[0]=p0.color.v[0]
617
		mov ecx,[eax+offs_vert_color+4]
619
		mov ecx,[eax+offs_vert_color+4]
618
		mov [ebx+offs_vert_color+4],ecx ;q.color.v[1]=p0.color.v[1]
620
		mov [edi+offs_vert_color+4],ecx ;q.color.v[1]=p0.color.v[1]
619
		mov ecx,[eax+offs_vert_color+8]
621
		mov ecx,[eax+offs_vert_color+8]
Line 620... Line 622...
620
		mov [ebx+offs_vert_color+8],ecx ;q.color.v[2]=p0.color.v[2]
622
		mov [edi+offs_vert_color+8],ecx ;q.color.v[2]=p0.color.v[2]
621
	@@:
623
	@@:
622
 
624
 
623
	cmp dword[edx+offs_cont_texture_2d_enabled],0 ;if (context.texture_2d_enabled)
625
	cmp dword[edx+offs_cont_texture_2d_enabled],0 ;if (context.texture_2d_enabled)
624
	je @f
626
	je @f
625
		mov ecx,[p1]
627
		mov ecx,[p1]
626
		fld dword[ecx+offs_vert_tex_coord+offs_X]
628
		fld dword[ecx+offs_vert_tex_coord+offs_X]
627
		fsub dword[eax+offs_vert_tex_coord+offs_X]
629
		fsub dword[eax+offs_vert_tex_coord+offs_X]
628
		fmul dword[t]
630
		fmul dword[t]
629
		fadd dword[eax+offs_vert_tex_coord+offs_X]
631
		fadd dword[eax+offs_vert_tex_coord+offs_X]
630
		fstp dword[ebx+offs_vert_tex_coord+offs_X] ;q.tex_coord.X=p0.tex_coord.X + (p1.tex_coord.X-p0.tex_coord.X)*t
632
		fstp dword[edi+offs_vert_tex_coord+offs_X] ;q.tex_coord.X=p0.tex_coord.X + (p1.tex_coord.X-p0.tex_coord.X)*t
631
		fld dword[ecx+offs_vert_tex_coord+offs_Y]
633
		fld dword[ecx+offs_vert_tex_coord+offs_Y]
632
		fsub dword[eax+offs_vert_tex_coord+offs_Y]
634
		fsub dword[eax+offs_vert_tex_coord+offs_Y]
633
		fmul dword[t]
635
		fmul dword[t]
Line 634... Line 636...
634
		fadd dword[eax+offs_vert_tex_coord+offs_Y]
636
		fadd dword[eax+offs_vert_tex_coord+offs_Y]
635
		fstp dword[ebx+offs_vert_tex_coord+offs_Y] ;q.tex_coord.Y=p0.tex_coord.Y + (p1.tex_coord.Y-p0.tex_coord.Y)*t
637
		fstp dword[edi+offs_vert_tex_coord+offs_Y] ;q.tex_coord.Y=p0.tex_coord.Y + (p1.tex_coord.Y-p0.tex_coord.Y)*t
636
	@@:
638
	@@:
637
 
639
 
638
	stdcall gl_clipcode, [ebx+offs_vert_pc+offs_X],[ebx+offs_vert_pc+offs_Y],\
640
	stdcall gl_clipcode, [edi+offs_vert_pc+offs_X],[edi+offs_vert_pc+offs_Y],\
639
		[ebx+offs_vert_pc+offs_Z],[ebx+offs_vert_pc+offs_W]
641
		[edi+offs_vert_pc+offs_Z],[edi+offs_vert_pc+offs_W]
640
	mov dword[ebx+offs_vert_clip_code],eax
642
	mov dword[edi+offs_vert_clip_code],eax
641
	or eax,eax ;if (q.clip_code==0)
643
	or eax,eax ;if (q.clip_code==0)
642
	jnz @f
644
	jnz @f
643
		stdcall gl_transform_to_viewport,[context],ebx
645
		stdcall gl_transform_to_viewport,[context],edi
644
		mov eax,ebx
646
		mov eax,edi
645
		add eax,offs_vert_zp+offs_zbup_b
647
		add eax,offs_vert_zp+offs_zbup_b
646
		push eax
648
		push eax
647
		add eax,offs_zbup_g-offs_zbup_b
649
		add eax,offs_zbup_g-offs_zbup_b
648
		push eax
650
		push eax
649
		add eax,offs_zbup_r-offs_zbup_g
651
		add eax,offs_zbup_r-offs_zbup_g
650
		push eax
652
		push eax
Line 651... Line 653...
651
		stdcall RGBFtoRGBI, dword[ebx+offs_vert_color],dword[ebx+offs_vert_color+4],dword[ebx+offs_vert_color+8]
653
		stdcall RGBFtoRGBI, dword[edi+offs_vert_color],dword[edi+offs_vert_color+4],dword[edi+offs_vert_color+8]
Line 883... Line 885...
883
		stdcall dword[eax],edi,ebx,ecx ;clip_proc[clip_bit](&tmp1.pc,&q[0].pc,&q[1].pc)
885
		stdcall dword[eax],edi,ebx,ecx ;clip_proc[clip_bit](&tmp1.pc,&q[0].pc,&q[1].pc)
884
		sub edi,offs_vert_pc
886
		sub edi,offs_vert_pc
Line 885... Line 887...
885
 
887
 
886
		sub ebx,offs_vert_pc
888
		sub ebx,offs_vert_pc
887
		sub ecx,offs_vert_pc
889
		sub ecx,offs_vert_pc
888
		stdcall updateTmp,[context],edi,ebx,ecx,eax ;updateTmp(c,&tmp1,q[0],q[1],tt)
890
		stdcall updateTmp,[context],ebx,ecx,eax ;(c,&tmp1,q[0],q[1],tt)
Line 889... Line 891...
889
		add ebx,offs_vert_pc
891
		add ebx,offs_vert_pc
890
 
892
 
891
		lea eax,[clip_proc]
893
		lea eax,[clip_proc]
Line 896... Line 898...
896
		sub edi,sizeof.GLVertex-offs_vert_pc
898
		sub edi,sizeof.GLVertex-offs_vert_pc
897
		stdcall dword[eax],edi,ebx,edx ;clip_proc[clip_bit](&tmp2.pc,&q[0].pc,&q[2].pc)
899
		stdcall dword[eax],edi,ebx,edx ;clip_proc[clip_bit](&tmp2.pc,&q[0].pc,&q[2].pc)
898
		sub edi,offs_vert_pc
900
		sub edi,offs_vert_pc
899
		sub ebx,offs_vert_pc
901
		sub ebx,offs_vert_pc
900
		sub edx,offs_vert_pc
902
		sub edx,offs_vert_pc
901
		stdcall updateTmp,[context],edi,ebx,edx,eax ;updateTmp(c,&tmp2,q[0],q[2],tt)
903
		stdcall updateTmp,[context],ebx,edx,eax ;(c,&tmp2,q[0],q[2],tt)
Line 902... Line 904...
902
 
904
 
903
		mov eax,[ebx+offs_vert_edge_flag]
905
		mov eax,[ebx+offs_vert_edge_flag]
904
		mov [tmp1.edge_flag],eax ;q[0].edge_flag
906
		mov [tmp1.edge_flag],eax ;q[0].edge_flag
905
		mov eax,[edx+offs_vert_edge_flag]
907
		mov eax,[edx+offs_vert_edge_flag]
Line 965... Line 967...
965
		add eax,edi
967
		add eax,edi
966
		mov edi,ebp
968
		mov edi,ebp
967
		sub edi,(2*sizeof.GLVertex)-offs_vert_pc
969
		sub edi,(2*sizeof.GLVertex)-offs_vert_pc
968
		stdcall dword[eax],edi,ebx,ecx ;clip_proc[clip_bit](&tmp1.pc,&q[0].pc,&q[1].pc)
970
		stdcall dword[eax],edi,ebx,ecx ;clip_proc[clip_bit](&tmp1.pc,&q[0].pc,&q[1].pc)
969
		sub edi,offs_vert_pc
971
		sub edi,offs_vert_pc
970
		stdcall updateTmp,[context],edi,[q],[q+4],eax
972
		stdcall updateTmp,[context],[q],[q+4],eax
Line 971... Line 973...
971
 
973
 
972
		lea eax,[clip_proc]
974
		lea eax,[clip_proc]
973
		mov edi,[clip_bit]
975
		mov edi,[clip_bit]
974
		shl edi,2
976
		shl edi,2
975
		add eax,edi
977
		add eax,edi
976
		mov edi,ebp
978
		mov edi,ebp
977
		sub edi,sizeof.GLVertex-offs_vert_pc
979
		sub edi,sizeof.GLVertex-offs_vert_pc
978
		stdcall dword[eax],edi,ebx,edx ;clip_proc[clip_bit](&tmp2.pc,&q[0].pc,&q[2].pc)
980
		stdcall dword[eax],edi,ebx,edx ;clip_proc[clip_bit](&tmp2.pc,&q[0].pc,&q[2].pc)
979
		sub edi,offs_vert_pc
981
		sub edi,offs_vert_pc
Line 980... Line 982...
980
		stdcall updateTmp,[context],edi,[q],[q+8],eax
982
		stdcall updateTmp,[context],[q],[q+8],eax
981
 
983
 
982
		mov dword[tmp1.edge_flag],1
984
		mov dword[tmp1.edge_flag],1
983
		mov eax,[edx+offs_vert_edge_flag-offs_vert_pc]
985
		mov eax,[edx+offs_vert_edge_flag-offs_vert_pc]