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] |