Subversion Repositories Kolibri OS

Rev

Rev 6126 | Rev 6141 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5153 IgorA 1
 
2
3
 
4
{
5
if TGL_FEATURE_RENDER_BITS eq 24
6
	mov ecx,[p2]
7
	mov eax,[ecx+offs_zbup_r]
8
	mov [colorR],ah ;colorR=p2.r>>8
5208 IgorA 9
	mov eax,[ecx+offs_zbup_g]
5153 IgorA 10
	mov [colorG],ah ;colorG=p2.g>>8
5208 IgorA 11
	mov eax,[ecx+offs_zbup_b]
5153 IgorA 12
	mov [colorB],ah ;colorB=p2.b>>8
5208 IgorA 13
;else
5187 IgorA 14
;color=RGB_TO_PIXEL(p2.r,p2.g,p2.b)
6126 IgorA 15
end if
5153 IgorA 16
}
17
18
 
19
{
20
local .end_0
5175 IgorA 21
	mov eax,[z]
22
	shr eax,ZB_POINT_Z_FRAC_BITS
6126 IgorA 23
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
24
	jl .end_0
5175 IgorA 25
		;edi = pp
26
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
6126 IgorA 27
if TGL_FEATURE_RENDER_BITS eq 24
5153 IgorA 28
		mov al,[colorR]
6111 IgorA 29
		mov ah,[colorG]
30
		mov word[edi+3*_a],ax
31
		mov al,[colorB]
32
		mov byte[edi+3*_a +2],al
33
;else
5187 IgorA 34
;pp[_a]=color
6126 IgorA 35
end if
5153 IgorA 36
	.end_0:
5175 IgorA 37
	mov eax,[dzdx]
38
	add [z],eax
39
}
5153 IgorA 40
41
 
6134 IgorA 42
proc ZB_fillTriangleFlat, zb:dword, p0:dword, p1:dword, p2:dword
5153 IgorA 43
locals
44
if TGL_FEATURE_RENDER_BITS eq 24
45
	colorR db ?
46
	colorG db ?
47
	colorB db ? ;unsigned char
48
else
49
	color dd ? ;int
50
end if
51
include 'ztriangle.inc'
52
53
 
54
; Smooth filled triangle.
55
; The code below is very tricky :)
56
;
57
58
 
59
INTERP_RGB equ 1
60
61
 
62
{
63
}
64
65
 
66
{
67
local .end_0
5187 IgorA 68
	mov eax,[z]
5175 IgorA 69
	shr eax,ZB_POINT_Z_FRAC_BITS
70
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
6126 IgorA 71
	jl .end_0
5187 IgorA 72
		;edi = pp
73
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
6126 IgorA 74
if TGL_FEATURE_RENDER_BITS eq 24
5153 IgorA 75
		mov ebx,[or1]
6111 IgorA 76
		mov eax,[og1]
77
		mov al,bh
78
		mov word[edi+3*_a],ax
79
		mov eax,[ob1]
5187 IgorA 80
		mov byte[edi+3*_a +2],ah
81
end if
82
;if TGL_FEATURE_RENDER_BITS eq 32
6111 IgorA 83
;pp[_a] = RGB_TO_PIXEL(or1, og1, ob1)
6126 IgorA 84
;end if
6111 IgorA 85
	.end_0:
5187 IgorA 86
	mov eax,[dzdx]
5175 IgorA 87
	add [z],eax
88
	mov eax,[dgdx]
5187 IgorA 89
	add [og1],eax
90
	mov eax,[drdx]
91
	add [or1],eax
92
	mov eax,[dbdx]
93
	add [ob1],eax
94
}
5153 IgorA 95
96
 
6134 IgorA 97
proc ZB_fillTriangleSmooth, zb:dword, p0:dword, p1:dword, p2:dword
5153 IgorA 98
locals
99
include 'ztriangle.inc'
100
101
 
6134 IgorA 102
proc ZB_setTexture uses eax ebx, zb:dword, texture:dword
5153 IgorA 103
	mov eax,[zb]
104
	mov ebx,[texture]
105
	mov dword[eax+offs_zbuf_current_texture],ebx
106
	ret
107
endp
108
109
 
110
INTERP_ST equ 1
111
112
 
113
{
114
	mov eax,[zb]
5187 IgorA 115
	mov eax,[eax+offs_zbuf_current_texture]
116
	mov [texture],eax
117
}
5153 IgorA 118
119
 
120
{
121
local .end_0
5187 IgorA 122
local .in_mem
6134 IgorA 123
	mov eax,[z]
5187 IgorA 124
	shr eax,ZB_POINT_Z_FRAC_BITS
125
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
6126 IgorA 126
	jl .end_0
5187 IgorA 127
		;edi = pp
5922 IgorA 128
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
6126 IgorA 129
if TGL_FEATURE_RENDER_BITS eq 24
5153 IgorA 130
		mov ebx,[t]
6108 IgorA 131
		and ebx,0x3fc00000
132
		or ebx,[s]
133
		shr ebx,14
134
		cmp ebx,256*256-1 ;проверка на выход за пределы текстуры
6134 IgorA 135
		jl .in_mem ;координата 1.0,1.0 может выползать
136
			mov ebx,256*256-1 ;переход на последний пиксель текстуры
137
		.in_mem:
138
		imul ebx,3
6108 IgorA 139
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
140
		mov ax,word[ebx]
141
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
142
		mov al,byte[ebx+2]
143
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
144
else
5153 IgorA 145
;pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]
6126 IgorA 146
end if
5153 IgorA 147
	.end_0:
5187 IgorA 148
	mov eax,[dzdx]
5175 IgorA 149
	add [z],eax
150
	mov eax,[dsdx]
151
	add [s],eax
152
	mov eax,[dtdx]
153
	add [t],eax
154
}
5153 IgorA 155
156
 
6134 IgorA 157
proc ZB_fillTriangleMapping, zb:dword, p0:dword, p1:dword, p2:dword
5153 IgorA 158
locals
159
	texture dd ? ;PIXEL*
160
include 'ztriangle.inc'
161
162
 
163
; Texture mapping with perspective correction.
164
; We use the gradient method to make less divisions.
165
; TODO: pipeline the division
166
;
167
if 1
168
169
 
170
INTERP_STZ equ 1
171
172
 
173
174
 
175
{
176
	mov eax,[zb]
5187 IgorA 177
	mov eax,[eax+offs_zbuf_current_texture]
178
	mov [texture],eax
179
	mov dword[esp-4],NB_INTERP
6108 IgorA 180
	fild dword[esp-4]
181
	fild dword[dzdx]
5187 IgorA 182
	fst dword[fdzdx] ;fdzdx = (float)dzdx
6108 IgorA 183
	fmul st0,st1
184
	fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
185
	fld dword[fdzdx]
186
	fmul st0,st1
187
	fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
188
	fmul dword[dtzdx]
189
	fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
190
}
5153 IgorA 191
192
 
193
{
194
local .end_0
5187 IgorA 195
local .in_mem
6134 IgorA 196
	mov eax,[z]
5187 IgorA 197
	shr eax,ZB_POINT_Z_FRAC_BITS
198
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
6126 IgorA 199
	jl .end_0
5187 IgorA 200
		;edi = pp
5922 IgorA 201
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
6126 IgorA 202
if TGL_FEATURE_RENDER_BITS eq 24
5153 IgorA 203
		mov ebx,[t]
6108 IgorA 204
		and ebx,0x3fc00000
205
		mov eax,[s]
206
		and eax,0x003fc000
207
		or ebx,eax
208
		shr ebx,14
209
if 1
6134 IgorA 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
6108 IgorA 219
		add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
220
		mov ax,word[ebx]
221
		mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
222
		mov al,byte[ebx+2]
223
		mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
224
else
5153 IgorA 225
;       pp[_a]=*(PIXEL *)((char *)texture+
226
;           (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
5187 IgorA 227
end if
5153 IgorA 228
	.end_0:
5187 IgorA 229
	mov eax,[dzdx]
5175 IgorA 230
	add [z],eax
231
	mov eax,[dsdx]
232
	add [s],eax
233
	mov eax,[dtdx]
234
	add [t],eax
235
}
5153 IgorA 236
237
 
5175 IgorA 238
239
 
6113 IgorA 240
{
5175 IgorA 241
if TGL_FEATURE_RENDER_BITS eq 24
242
	mov eax,[x2]
6108 IgorA 243
	sar eax,16
244
	mov edi,[x1]
6113 IgorA 245
	sub eax,edi
246
	mov [n],eax ;n = (x2 >> 16) - x1
6111 IgorA 247
	fld1
6134 IgorA 248
	fild dword[z1]
6108 IgorA 249
	fst dword[f_z] ;fz = (float)z1
6113 IgorA 250
	fdivp
6108 IgorA 251
	fstp dword[zinv] ;zinv = 1.0 / fz
252
	imul edi,PSZB
253
	add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
254
	mov esi,[x1]
6126 IgorA 255
	shl esi,1
256
	add esi,[pz1] ;pz = pz1 + x1
257
	mov eax,[z1]
6108 IgorA 258
	mov [z],eax ;z = z1
259
	mov eax,[sz1]
260
	mov [s_z],eax ;sz = sz1
261
	mov eax,[tz1]
262
	mov [t_z],eax ;tz = tz1
263
align 4
264
	.cycle_2: ;while (n>=(NB_INTERP-1))
6111 IgorA 265
	cmp dword[n],NB_INTERP-1
266
	jl .cycle_2_end
6108 IgorA 267
		fld dword[zinv]
268
		fld st0
269
		fmul dword[s_z] ;ss = (sz * zinv)
270
		fist dword[s] ;s = (int) ss
271
		fmul dword[fdzdx]
272
		fchs
273
		fadd dword[dszdx]
274
		fmul dword[zinv]
275
		fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
276
		fmul dword[t_z] ;tt = (tz * zinv)
277
		fist dword[t] ;t = (int) tt
278
		fmul dword[fdzdx]
279
		fchs
280
		fadd dword[dtzdx]
281
		fmul dword[zinv]
282
		fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
283
		fld1
6134 IgorA 284
		fld dword[f_z]
6113 IgorA 285
		fadd dword[fndzdx]
6108 IgorA 286
		fst dword[f_z] ;fz += fndzdx
6113 IgorA 287
		fdivp
6108 IgorA 288
		fstp dword[zinv] ;zinv = 1.0 / fz
289
		PUT_PIXEL 0
290
		PUT_PIXEL 1
291
		PUT_PIXEL 2
292
		PUT_PIXEL 3
293
		PUT_PIXEL 4
294
		PUT_PIXEL 5
295
		PUT_PIXEL 6
296
		PUT_PIXEL 7
297
		add esi,2*NB_INTERP ;pz += NB_INTERP
6126 IgorA 298
		add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
6108 IgorA 299
		sub dword[n],NB_INTERP ;n -= NB_INTERP
6111 IgorA 300
		fld dword[ndszdx]
6108 IgorA 301
		fadd dword[s_z]
302
		fstp dword[s_z] ;sz += ndszdx
6111 IgorA 303
		fld dword[ndtzdx]
6108 IgorA 304
		fadd dword[t_z]
305
		fstp dword[t_z] ;tz += ndtzdx
306
		jmp .cycle_2
307
align 4
6134 IgorA 308
	.cycle_2_end:
6108 IgorA 309
	fld dword[zinv]
310
	fld st0
311
	fmul dword[s_z] ;ss = (sz * zinv)
312
	fist dword[s] ;s = (int) ss
313
	fmul dword[fdzdx]
314
	fchs
315
	fadd dword[dszdx]
316
	fmul dword[zinv]
317
	fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
318
	fmul dword[t_z] ;tt = (tz * zinv)
319
	fist dword[t] ;t = (int) tt
320
	fmul dword[fdzdx]
321
	fchs
322
	fadd dword[dtzdx]
323
	fmul dword[zinv]
324
	fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
325
align 4
326
	.cycle_3: ;while (n>=0)
6111 IgorA 327
	cmp dword[n],0
328
	jl .cycle_3_end
6108 IgorA 329
		PUT_PIXEL 0
330
		add esi,2 ;pz += 1
6126 IgorA 331
		add edi,PSZB ;pp += PSZB
6108 IgorA 332
		dec dword[n]
6111 IgorA 333
		jmp .cycle_3
6108 IgorA 334
align 4
6134 IgorA 335
	.cycle_3_end:
6108 IgorA 336
end if
5175 IgorA 337
}
338
339
 
6134 IgorA 340
proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
5153 IgorA 341
locals
342
	texture dd ? ;PIXEL *
5175 IgorA 343
	fdzdx dd ? ;float
344
	fndzdx dd ? ;float
5187 IgorA 345
	ndszdx dd ? ;float
346
	ndtzdx dd ? ;float
347
	zinv dd ? ;float
6113 IgorA 348
	f_z dd ? ;float - переменная отвечающая за геометрию текстуры
349
include 'ztriangle.inc'
5153 IgorA 350
351
 
352
353
 
354
355
 
356
; bits)
357
358
 
359
INTERP_STZ equ 1
360
361
 
362
{
363
	mov eax,[zb]
5187 IgorA 364
	mov eax,[eax+offs_zbuf_current_texture]
365
	mov [texture],eax
366
}
5153 IgorA 367
368
 
369
{
370
local .end_0
5187 IgorA 371
	mov eax,[z]
372
	shr eax,ZB_POINT_Z_FRAC_BITS
373
	cmp ax,word[esi+2*_a] ;if (zz >= pz[_a])
6126 IgorA 374
	jl .end_0
5187 IgorA 375
		;edi = pp
5922 IgorA 376
		mov word[esi+2*_a],ax ;пишем в буфер глубины новое значение
6126 IgorA 377
		fild dword[z]
5187 IgorA 378
		fld dword[s_z]
379
		fdiv st0,st1
380
		fistp dword[esp-4] ;s = (int) (s_z / (float) z)
6111 IgorA 381
		fld dword[t_z]
382
		fdiv st0,st1
383
		fistp dword[esp-8] ;t = (int) (t_z / (float) z)
384
		mov eax,dword[esp-8]
385
		and eax,0x3FC00000
386
		or eax,dword[esp-4]
387
		shr eax,12 ;14
388
		add eax,[texture]
389
		mov eax,[eax]
390
		stosd ;pp[_a] = texture[((t & 0x3FC00000) | s) >> 14]
391
		sub edi,4
392
	.end_0:
5187 IgorA 393
	mov eax,[dzdx]
5175 IgorA 394
	add [z],eax
395
	fld dword[dszdx]
5187 IgorA 396
	fadd dword[s_z]
397
	fstp dword[s_z]
398
	fld dword,[dtzdx]
399
	fadd dword[t_z]
400
	fstp dword[t_z]
401
}
5153 IgorA 402
403
 
6134 IgorA 404
proc ZB_fillTriangleMappingPerspective, zb:dword, p0:dword, p1:dword, p2:dword
5153 IgorA 405
locals
406
	texture dd ? ;PIXEL*
407
include 'ztriangle.inc'
408
409
 
410