Rev 5922 | Rev 6111 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6108 | IgorA | 1 | ; |
2 | ; Макрос DRAW_LINE имеет параметр code, от которого зависит |
||
3 | ; будет ли включен код или объявлены переменные. |
||
4 | ; В версии на C++ параметра code нет, потому что там переменные |
||
5 | ; можно ставить в любом месте функции, в asm версии такое не проходит. |
||
6 | ; |
||
5153 | IgorA | 7 | |
8 | INTERP_Z equ 1 |
||
9 | |||
10 | macro DRAW_INIT |
||
11 | { |
||
12 | if TGL_FEATURE_RENDER_BITS eq 24 |
||
13 | mov ecx,[p2] |
||
14 | mov eax,[ecx+offs_zbup_r] |
||
5208 | IgorA | 15 | mov [colorR],ah ;colorR=p2.r>>8 |
5153 | IgorA | 16 | mov eax,[ecx+offs_zbup_g] |
5208 | IgorA | 17 | mov [colorG],ah ;colorG=p2.g>>8 |
5153 | IgorA | 18 | mov eax,[ecx+offs_zbup_b] |
5208 | IgorA | 19 | mov [colorB],ah ;colorB=p2.b>>8 |
5187 | IgorA | 20 | ;else |
5153 | IgorA | 21 | ; color=RGB_TO_PIXEL(p2->r,p2->g,p2->b); |
22 | end if |
||
23 | } |
||
24 | |||
25 | macro PUT_PIXEL _a |
||
26 | { |
||
5175 | IgorA | 27 | local .end_0 |
28 | mov eax,[z] |
||
29 | shr eax, ZB_POINT_Z_FRAC_BITS |
||
30 | mov [zz],eax |
||
31 | mov ebx,[pz] |
||
32 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
||
33 | jl .end_0 |
||
34 | ;edi = pp |
||
5187 | IgorA | 35 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
5153 | IgorA | 36 | if TGL_FEATURE_RENDER_BITS eq 24 |
5175 | IgorA | 37 | mov cl,[colorR] |
38 | mov ch,[colorG] |
||
39 | mov word[edi+3*_a],cx |
||
40 | mov cl,[colorB] |
||
41 | mov byte[edi+3*_a +2],cl |
||
5187 | IgorA | 42 | ;else |
5153 | IgorA | 43 | ; pp[_a]=color; |
44 | end if |
||
5175 | IgorA | 45 | .end_0: |
46 | mov eax,[dzdx] |
||
47 | add [z],eax |
||
5153 | IgorA | 48 | } |
49 | |||
50 | align 4 |
||
51 | proc ZB_fillTriangleFlat, zb:dword, p0:dword, p1:dword, p2:dword |
||
52 | locals |
||
53 | if TGL_FEATURE_RENDER_BITS eq 24 |
||
54 | colorR db ? |
||
55 | colorG db ? |
||
56 | colorB db ? ;unsigned char |
||
57 | else |
||
58 | color dd ? ;int |
||
59 | end if |
||
60 | include 'ztriangle.inc' |
||
61 | |||
62 | ; |
||
63 | ; Smooth filled triangle. |
||
64 | ; The code below is very tricky :) |
||
65 | ; |
||
66 | |||
67 | INTERP_Z equ 1 |
||
68 | INTERP_RGB equ 1 |
||
69 | |||
70 | macro DRAW_INIT |
||
71 | { |
||
72 | if TGL_FEATURE_RENDER_BITS eq 16 |
||
73 | ; _drgbdx=((drdx / (1<<6)) << 22) & 0xFFC00000; |
||
74 | ; _drgbdx|=(dgdx / (1<<5)) & 0x000007FF; |
||
75 | ; _drgbdx|=((dbdx / (1<<7)) << 12) & 0x001FF000; |
||
76 | end if |
||
77 | } |
||
78 | |||
79 | macro PUT_PIXEL _a |
||
80 | { |
||
5187 | IgorA | 81 | local .end_0 |
5175 | IgorA | 82 | mov eax,[z] |
83 | shr eax,ZB_POINT_Z_FRAC_BITS |
||
84 | mov [zz],eax |
||
5187 | IgorA | 85 | mov ebx,[pz] |
86 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
||
87 | jl .end_0 |
||
88 | ;edi = pp |
||
89 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
||
5153 | IgorA | 90 | if TGL_FEATURE_RENDER_BITS eq 24 |
5922 | IgorA | 91 | mov ecx,[og1] |
5187 | IgorA | 92 | mov eax,[or1] |
93 | mov cl,ah |
||
94 | mov word[edi+3*_a],cx |
||
95 | mov eax,[ob1] |
||
96 | mov byte[edi+3*_a +2],ah |
||
97 | end if |
||
98 | if TGL_FEATURE_RENDER_BITS eq 16 |
||
5153 | IgorA | 99 | ; tmp=rgb & 0xF81F07E0; |
100 | ; pp[_a]=tmp | (tmp >> 16); |
||
5187 | IgorA | 101 | ;else |
5153 | IgorA | 102 | ; pp[_a] = RGB_TO_PIXEL(or1, og1, ob1); |
5187 | IgorA | 103 | end if |
104 | .end_0: |
||
5175 | IgorA | 105 | mov eax,[dzdx] |
106 | add [z],eax |
||
5187 | IgorA | 107 | if TGL_FEATURE_RENDER_BITS eq 16 |
108 | ; rgb=(rgb+drgbdx) & ( ~ 0x00200800); |
||
5153 | IgorA | 109 | end if |
5187 | IgorA | 110 | if TGL_FEATURE_RENDER_BITS <> 16 |
111 | mov eax,[dgdx] |
||
112 | add [og1],eax |
||
113 | mov eax,[drdx] |
||
114 | add [or1],eax |
||
115 | mov eax,[dbdx] |
||
116 | add [ob1],eax |
||
117 | end if |
||
5153 | IgorA | 118 | } |
119 | |||
5175 | IgorA | 120 | macro DRAW_LINE code |
5153 | IgorA | 121 | { |
5187 | IgorA | 122 | local .cycle_0 |
123 | local .cycle_1 |
||
5153 | IgorA | 124 | if TGL_FEATURE_RENDER_BITS eq 16 |
5175 | IgorA | 125 | if code eq 0 |
5187 | IgorA | 126 | tmp dd ? ;uint |
127 | rgb dd ? ;uint |
||
128 | drgbdx dd ? ;uint |
||
5175 | IgorA | 129 | end if |
130 | if code eq 1 |
||
5187 | IgorA | 131 | mov eax,[x2] |
5208 | IgorA | 132 | sar eax,16 |
5187 | IgorA | 133 | sub eax,[x1] |
134 | mov [n],eax ;n = (x2 >> 16) - x1 |
||
6108 | IgorA | 135 | mov edi,[pp1] |
136 | add edi,[x1] ;pp = pp1 + x1 |
||
137 | mov eax,[pz1] |
||
138 | add eax,[x1] |
||
139 | mov [pz],eax ;pz = pz1 + x1 |
||
140 | mov eax,[z1] |
||
141 | mov [z],eax ;z = z1 |
||
142 | mov eax,[r1] |
||
143 | shl eax,16 |
||
144 | and eax,0xFFC00000 |
||
145 | mov [rgb],eax ;rgb = (r1 << 16) & 0xFFC00000 |
||
146 | mov eax,[g1] |
||
147 | shr eax,5 |
||
148 | and eax,0x000007FF |
||
149 | or [rgb],eax ;rgb |= (g1 >> 5) & 0x000007FF |
||
150 | mov eax,[b1] |
||
151 | shl eax,5 |
||
152 | and eax,0x001FF000 |
||
153 | or [rgb],eax ;rgb |= (b1 << 5) & 0x001FF000 |
||
154 | mov eax,[_drgbdx] |
||
155 | mov [drgbdx],eax ;drgbdx = _drgbdx |
||
5187 | IgorA | 156 | align 4 |
157 | .cycle_0: ;while (n>=3) |
||
158 | cmp dword[n],3 |
||
159 | jl .cycle_1 |
||
160 | PUT_PIXEL 0 |
||
161 | PUT_PIXEL 1 |
||
162 | PUT_PIXEL 2 |
||
163 | PUT_PIXEL 3 |
||
164 | add dword[pz],8 |
||
6108 | IgorA | 165 | add edi,4*3 |
5187 | IgorA | 166 | sub [n],4 |
167 | jmp .cycle_0 |
||
168 | .cycle_1: ;while (n>=0) |
||
169 | cmp dword[n],0 |
||
170 | jl .cycle_1_end |
||
171 | PUT_PIXEL 0 |
||
172 | add dword[pz],2 |
||
6108 | IgorA | 173 | add edi,3 |
5187 | IgorA | 174 | dec dword[n] |
175 | jmp .cycle_1 |
||
176 | .cycle_1_end: |
||
5153 | IgorA | 177 | end if |
178 | end if |
||
179 | } |
||
180 | |||
181 | align 4 |
||
182 | proc ZB_fillTriangleSmooth, zb:dword, p0:dword, p1:dword, p2:dword |
||
183 | locals |
||
184 | if TGL_FEATURE_RENDER_BITS eq 16 |
||
185 | _drgbdx dd ? ;int |
||
186 | end if |
||
187 | include 'ztriangle.inc' |
||
188 | |||
189 | align 4 |
||
190 | proc ZB_setTexture uses eax ebx, zb:dword, texture:dword |
||
191 | mov eax,[zb] |
||
192 | mov ebx,[texture] |
||
193 | mov dword[eax+offs_zbuf_current_texture],ebx |
||
194 | ret |
||
195 | endp |
||
196 | |||
197 | INTERP_Z equ 1 |
||
198 | INTERP_ST equ 1 |
||
199 | |||
200 | macro DRAW_INIT |
||
201 | { |
||
5187 | IgorA | 202 | mov eax,[zb] |
203 | mov eax,[eax+offs_zbuf_current_texture] |
||
204 | mov [texture],eax |
||
5153 | IgorA | 205 | } |
206 | |||
207 | macro PUT_PIXEL _a |
||
208 | { |
||
5187 | IgorA | 209 | local .end_0 |
210 | mov eax,[z] |
||
211 | shr eax,ZB_POINT_Z_FRAC_BITS |
||
212 | mov [zz],eax |
||
213 | mov ebx,[pz] |
||
214 | cmp ax,word[ebx+2*_a] ;if (zz >= pz[_a]) |
||
215 | jl .end_0 |
||
5922 | IgorA | 216 | ;edi = pp |
217 | mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
||
5153 | IgorA | 218 | if TGL_FEATURE_RENDER_BITS eq 24 |
6108 | IgorA | 219 | mov ebx,[t] |
220 | and ebx,0x3fc00000 |
||
221 | or ebx,[s] |
||
222 | shr ebx,14 |
||
< |