Rev 6134 | Rev 6243 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6134 | Rev 6141 | ||
---|---|---|---|
Line -... | Line 1... | ||
- | 1 | ; |
|
- | 2 | ; Опции для функций: |
|
- | 3 | ; |
|
- | 4 | ;INTERP_Z - использование Z буфера (всегда включено) |
|
- | 5 | ;INTERP_RGB - сглажевание цветов |
|
- | 6 | ;INTERP_ST - наложение текстуры в ортогональной проэкции |
|
- | 7 | ;INTERP_STZ - наложение текстуры в перспективной проэкции |
|
- | 8 | ; |
|
- | 9 | ; Функции рисования треугольников: |
|
- | 10 | ; |
|
- | 11 | ;ZB_fillTriangleFlat - треугольник одного цвета |
|
- | 12 | ;ZB_fillTriangleSmooth - треугольник с разными цветами вершин |
|
- | 13 | ;ZB_fillTriangleMapping - треугольник с текстурой в ортогональной проэкции |
|
- | 14 | ;ZB_fillTriangleMappingPerspective - треугольник с текстурой в перспективной проэкции |
|
- | 15 | ; |
|
- | 16 | ||
- | 17 | macro calc_d1d2 f, r1, r2 |
|
- | 18 | { |
|
- | 19 | fld dword[fdy2] |
|
- | 20 | fmul st0,st2 |
|
- | 21 | fld dword[fdy1] |
|
- | 22 | fmul st0,st2 |
|
- | 23 | fsubp |
|
- | 24 | f#stp dword[r1] ;r1 = (fdy2*d1 - fdy1*d2) |
|
- | 25 | fld dword[fdx1] |
|
- | 26 | fmulp |
|
- | 27 | fld dword[fdx2] |
|
- | 28 | fmul st0,st2 |
|
- | 29 | fsubp |
|
- | 30 | f#stp dword[r2] ;r2 = (fdx1*d2 - fdx2*d1) |
|
- | 31 | ffree st0 ;d1 |
|
- | 32 | fincstp |
|
- | 33 | } |
|
Line 1... | Line 34... | ||
1 | INTERP_Z equ 1 |
34 | |
Line 2... | Line 35... | ||
2 | 35 | INTERP_Z equ 1 |
|
3 | macro DRAW_INIT |
36 | |
Line 118... | Line 151... | ||
118 | 151 | } |
|
Line 119... | Line 152... | ||
119 | macro PUT_PIXEL _a |
152 | |
120 | { |
153 | macro PUT_PIXEL _a |
121 | local .end_0 |
154 | { |
122 | local .in_mem |
- | |
123 | mov eax,[z] |
155 | local .end_0 |
124 | shr eax,ZB_POINT_Z_FRAC_BITS |
156 | mov eax,[z] |
125 | cmp ax,word[esi+2*_a] ;if (zz >= pz[_a]) |
157 | shr eax,ZB_POINT_Z_FRAC_BITS |
126 | jl .end_0 |
158 | cmp ax,word[esi+2*_a] ;if (zz >= pz[_a]) |
127 | ;edi = pp |
159 | jl .end_0 |
128 | mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение |
160 | ;edi = pp |
129 | if TGL_FEATURE_RENDER_BITS eq 24 |
161 | mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение |
130 | mov ebx,[t] |
162 | if TGL_FEATURE_RENDER_BITS eq 24 |
131 | and ebx,0x3fc00000 |
163 | mov ebx,[t] |
132 | or ebx,[s] |
164 | and ebx,0x3fc00000 |
- | 165 | mov eax,[s] |
|
- | 166 | and eax,0x003fc000 |
|
133 | shr ebx,14 |
167 | or ebx,eax |
134 | cmp ebx,256*256-1 ;проверка на выход за пределы текстуры |
- | |
135 | jl .in_mem ;координата 1.0,1.0 может выползать |
- | |
136 | mov ebx,256*256-1 ;переход на последний пиксель текстуры |
- | |
137 | .in_mem: |
- | |
138 | imul ebx,3 |
168 | shr ebx,14 |
139 | add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3 |
169 | imul ebx,3 |
140 | mov ax,word[ebx] |
170 | add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3 |
141 | mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1] |
171 | mov ax,word[ebx] |
142 | mov al,byte[ebx+2] |
172 | mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1] |
Line 191... | Line 221... | ||
191 | 221 | } |
|
Line 192... | Line 222... | ||
192 | macro PUT_PIXEL _a |
222 | |
193 | { |
223 | macro PUT_PIXEL _a |
194 | local .end_0 |
224 | { |
195 | local .in_mem |
- | |
196 | mov eax,[z] |
225 | local .end_0 |
197 | shr eax,ZB_POINT_Z_FRAC_BITS |
226 | mov eax,[z] |
198 | cmp ax,word[esi+2*_a] ;if (zz >= pz[_a]) |
227 | shr eax,ZB_POINT_Z_FRAC_BITS |
199 | jl .end_0 |
228 | cmp ax,word[esi+2*_a] ;if (zz >= pz[_a]) |
200 | ;edi = pp |
229 | jl .end_0 |
Line 205... | Line 234... | ||
205 | mov eax,[s] |
234 | and ebx,0x3fc00000 |
206 | and eax,0x003fc000 |
235 | mov eax,[s] |
207 | or ebx,eax |
236 | and eax,0x003fc000 |
208 | shr ebx,14 |
237 | or ebx,eax |
209 | if 1 |
238 | shr ebx,14 |
210 | ; не знаю нужна ли сдесь эта проверка |
- | |
211 | ; функция ZB_fillTriangleMapping без нее не работает |
- | |
212 | ; на всякий случай делаю и тут такое же |
- | |
213 | cmp ebx,256*256-1 ;проверка на выход за пределы текстуры |
- | |
214 | jl .in_mem ;координата 1.0,1.0 может выползать |
- | |
215 | mov ebx,256*256-1 ;переход на последний пиксель текстуры |
- | |
216 | .in_mem: |
- | |
217 | end if |
- | |
218 | imul ebx,3 |
- | |
219 | add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3 |
239 | imul ebx,3 |
220 | mov ax,word[ebx] |
240 | add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3 |
221 | mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1] |
241 | mov ax,word[ebx] |
222 | mov al,byte[ebx+2] |
242 | mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1] |
223 | mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2] |
243 | mov al,byte[ebx+2] |