Subversion Repositories Kolibri OS

Rev

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