Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1245 hidnplayr 1
CATMULL_SHIFT equ 16
2
 
3
 
4
flat_triangle_z:
5
;  procedure drawing triangle with Z cordinate interpolation ------
6
;  (Catmull  alghoritm)--------------------------------------------
7
;  ----------------in - eax - x1 shl 16 + y1 ----------------------
8
;  -------------------- ebx - x2 shl 16 + y2 ----------------------
9
;  -------------------- ecx - x3 shl 16 + y3 ----------------------
10
;  -------------------- edx - color 0x00RRGGBB --------------------
11
;  -------------------- esi - pointer to Z-buffer -----------------
12
;  -------------------- edi - pointer to screen buffer-------------
13
;  -------------------- stack : z coordinates
14
;  -------------------- Z-buffer : each z variable as dword
15
;  -------------------- (Z coor. as word) shl CATMULL_SHIFT
16
.z1	equ word[ebp+4]
17
.z2	equ word[ebp+6]    ; each z coordinate as word integer
18
.z3	equ word[ebp+8]
19
 
20
.col	equ dword[ebp-4]
21
.x1	equ word[ebp-6]
22
.y1	equ word[ebp-8]
23
.x2	equ word[ebp-10]
24
.y2	equ word[ebp-12]
25
.x3	equ word[ebp-14]
26
.y3	equ word[ebp-16]
27
 
28
.dx12	equ dword[ebp-20]
29
;.dz12   equ dword[ebp-24]
30
.dx13	equ dword[ebp-24]
31
.dz13	equ dword[ebp-28]
32
.dz12	equ dword[ebp-32]
33
;.dz13   equ dword[ebp-32]
34
.dx23	equ dword[ebp-36]
35
.dz13M	equ	 [ebp-40]
36
.dz23	equ dword[ebp-44]
37
.zz1	equ dword[ebp-48]
38
.zz2	equ dword[ebp-52]
39
.zz2M	equ qword[ebp-52]
40
.dz12M	equ qword[ebp-32]
41
.dz23M	equ qword[ebp-44]
42
;if Ext>=MMX
43
;        emms
44
;end if
45
	mov	ebp,esp
46
 
47
	push	edx	       ; store edx in variable .col
48
      .sort2:
49
	cmp	ax,bx
50
	jle	.sort1
51
	xchg	eax,ebx
52
	mov	dx,.z1
53
	xchg	dx,.z2
54
	mov	.z1,dx
55
      .sort1:
56
	cmp	bx,cx
57
	jle	.sort3
58
	xchg	ebx,ecx
59
	mov	dx,.z2
60
	xchg	dx,.z3
61
	mov	.z2,dx
62
	jmp	.sort2
63
      .sort3:
64
	push	eax	       ; store triangle coordinates in user friendly variables
65
	push	ebx
66
	push	ecx
67
	 mov	  edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
68
	 and	  edx,ebx	 ; if *all* of them are negative a sign flag is raised
69
	 and	  edx,ecx
70
	 and	  edx,eax
71
	 test	  edx,80008000h  ; Check both X&Y at once
72
	 jne	  .ft_loop2_end
73
       ;  cmp      ax,SIZE_Y
74
       ;  jle      @f
75
       ;  cmp      bx,SIZE_Y
76
       ;  jle      @f
77
       ;  cmp      cx,SIZE_Y
78
       ;  jge      @f
79
       ;  ror      eax,16
80
       ;  ror      ebx,16
81
       ;  ror      ecx,16
82
       ;  cmp      ax,SIZE_X
83
       ;  jle      @f
84
       ;  cmp      bx,SIZE_X
85
       ;  jle      @f
86
       ;  cmp      cx,SIZE_X
87
       ;  jle      @f
88
       ;  jmp      .ft_loop2_end
89
       ;@@:
90
	sub	esp,52-12
91
 
92
	mov	bx,.y2	     ; calc delta 12
93
	sub	bx,.y1
94
	jnz	.ft_dx12_make
95
	mov	.dx12,0
96
	mov	.dz12,0
97
	jmp	.ft_dx12_done
98
   .ft_dx12_make:
99
	mov	ax,.x2
100
	sub	ax,.x1
101
	cwde
102
	movsx	ebx,bx
103
	shl	eax,ROUND
104
	cdq
105
	idiv	ebx
106
	mov	.dx12,eax
107
 
108
	mov	ax,.z2
109
	sub	ax,.z1
110
	cwde
111
	shl	eax,CATMULL_SHIFT
112
	cdq
113
	idiv	ebx
114
	mov	.dz12,eax
115
  .ft_dx12_done:
116
	mov	bx,.y3	     ; calc delta 13
117
	sub	bx,.y1
118
	jnz	.ft_dx13_make
119
	mov	.dx13,0
120
	mov	.dz13,0
121
	mov	dword .dz13M,0
122
	jmp	.ft_dx13_done
123
   .ft_dx13_make:
124
	mov	ax,.x3
125
	sub	ax,.x1
126
	cwde
127
	movsx	ebx,bx
128
	shl	eax,ROUND
129
	cdq
130
	idiv	ebx
131
	mov	.dx13,eax
132
 
133
	mov	ax,.z3
134
	sub	ax,.z1
135
	cwde
136
	shl	eax,CATMULL_SHIFT
137
	cdq
138
	idiv	ebx
139
	mov	.dz13,eax
140
	mov	dword .dz13M,eax
141
    .ft_dx13_done:
142
	mov	bx,.y3	     ; calc delta 23
143
	sub	bx,.y2
144
	jnz	.gt_dx23_make
145
	mov	.dx23,0
146
	mov	.dz23,0
147
	jmp	.gt_dx23_done
148
   .gt_dx23_make:
149
	mov	ax,.x3
150
	sub	ax,.x2
151
	cwde
152
	movsx	ebx,bx
153
	shl	eax,ROUND
154
	cdq
155
	idiv	ebx
156
	mov	.dx23,eax
157
 
158
	mov	ax,.z3
159
	sub	ax,.z2
160
	cwde
161
	shl	eax,CATMULL_SHIFT
162
	cdq
163
	idiv	ebx
164
	mov	.dz23,eax
165
    .gt_dx23_done:
166
 
167
	movsx	edx,.z1
168
	shl	edx,CATMULL_SHIFT
169
	mov	.zz1,edx
170
	mov	.zz2,edx
171
	movsx	eax,.x1
172
	shl	eax,ROUND    ; eax - x1
173
	mov	ebx,eax      ; ebx - x2
174
;if Ext>=MMX
175
;        movq    mm0,.zz2M
176
;end if
177
	mov	cx,.y1
178
	cmp	cx,.y2
179
	jge	.ft_loop1_end
180
     .ft_loop1:
181
 
182
	pushad
183
 
184
	push	.col
185
	push	cx	    ; y
186
	sar	ebx,ROUND
187
	push	bx	    ; x2
188
	sar	eax,ROUND
189
	push	ax	    ; x1
190
;if Ext>=MMX
191
;        sub     esp,8
192
;        movq    [esp],mm0
193
;else
194
	push	.zz2	    ; z2 shl CATMULL_SHIFT
195
	push	.zz1	    ; z1 shl CATMULL_SHIFT
196
;end if
197
	call	flat_line_z
198
 
199
	popad
200
 
201
	add	eax,.dx13
202
	add	ebx,.dx12
203
;if  Ext>=MMX
204
;        paddd   mm0,.dz12M
205
;else
206
 
207
	mov	edx,.dz13
208
	add	.zz1,edx
209
	mov	edx,.dz12
210
	add	.zz2,edx
211
;end if
212
	inc	cx
213
	cmp	cx,.y2
214
	jl	.ft_loop1
215
    .ft_loop1_end:
216
 
217
	movsx	edx,.z2
218
	shl	edx,CATMULL_SHIFT
219
	mov	.zz2,edx
220
	movsx	ebx,.x2
221
	shl	ebx,ROUND
222
;if Ext>=MMX
223
;        movq    mm0,.zz2M
224
;;        push    .dz13    ; exchange
225
;;        pop     .dz12
226
;;        push    .dz23    ; exchange
227
;;        pop     .dz13
228
;end if
229
	mov	cx,.y2
230
	cmp	cx,.y3
231
	jge	.ft_loop2_end
232
     .ft_loop2:
233
	pushad
234
 
235
	push	.col
236
	push	cx
237
	sar	ebx,ROUND
238
	push	bx
239
	sar	eax,ROUND
240
	push	ax	    ; x1
241
;if Ext>=MMX
242
;        sub     esp,8
243
;        movq    [esp],mm0
244
;else
245
	push	.zz2	    ; z2 shl CATMULL_SHIFT
246
	push	.zz1	    ; z1 shl CATMULL_SHIFT
247
;end if
248
	call	flat_line_z
249
 
250
	popad
251
 
252
	add	eax,.dx13
253
	add	ebx,.dx23
254
;if  Ext>=MMX
255
;        paddd   mm0,.dz23M
256
;else
257
	mov	edx,.dz13
258
	add	.zz1,edx
259
	mov	edx,.dz23
260
	add	.zz2,edx
261
 
262
;        mov     edx,.dz13
263
;        add     .zz1,edx
264
;        mov     edx,.dz12
265
;        add     .zz2,edx
266
;end if
267
	inc	cx
268
	cmp	cx,.y3
269
	jl	.ft_loop2
270
     .ft_loop2_end:
271
 
272
	mov esp,ebp
273
ret 6
274
 
275
flat_line_z:
276
;----------------
277
;-------------in edi - pointer to screen buffer ----------------------------------
278
;--------------- esi - pointer to z-buffer (each Z varible dword)-----------------
279
;----------stack - (each z coordinate shifted shl CATMULL_SHIFT)------------------
280
.z1 equ dword [ebp+4]
281
.z2 equ dword [ebp+8]
282
.x1 equ word  [ebp+12]
283
.x2 equ word  [ebp+14]
284
.y  equ word  [ebp+16]
285
.col equ dword [ebp+18]
286
 
287
.dz equ dword [ebp-4]
288
 
289
     mov	ebp,esp
290
;;     sub        esp,4
291
     mov	ax,.y
292
     or 	ax,ax
293
     jl 	.fl_quit
6619 leency 294
     mov	bx,[size_y_var]
295
     dec	bx
296
     cmp	ax,bx ;[size_y_var]
297
  ;   cmp        ax,SIZE_Y-1
1245 hidnplayr 298
     jg 	.fl_quit
299
 
300
 ;    cmp        .x1,0
301
 ;    jge        .fl_ok1
302
 ;    cmp        .x2,0
303
 ;    jl         .fl_quit
304
 ;  .fl_ok1:
305
 ;    cmp        .x1,SIZE_X
306
 ;    jle        .fl_ok2
307
 ;    cmp        .x2,SIZE_X
308
 ;    jg         .fl_quit
309
 ;  .fl_ok2:
310
     mov	ax,.x1
311
     cmp	ax,.x2
312
     je 	.fl_quit
313
     jl 	.fl_ok
314
 
315
     xchg	ax,.x2
316
     mov	.x1,ax
317
     mov	edx,.z1
318
     xchg	edx,.z2
319
     mov	.z1,edx
320
   .fl_ok:
6619 leency 321
     mov	bx,[size_x_var]
322
     dec	bx
323
     cmp	.x1,bx ;SIZE_X-1
1245 hidnplayr 324
     jg 	.fl_quit
325
     cmp	.x2,0
326
     jle	.fl_quit
327
 
328
     mov	eax,.z2
329
     sub	eax,.z1
330
     cdq
331
     mov	bx,.x2
332
     sub	bx,.x1
333
     movsx	ebx,bx
334
     idiv	ebx
335
;;     mov        .dz,eax                ; calculated delta - shifted .dz
336
     push	eax
337
 
338
     cmp	.x1,0
339
     jge	@f
340
     movsx	ebx,.x1
341
     neg	ebx
342
     imul	ebx
343
     add	.z1,eax
344
     mov	.x1,0
345
    @@:
6619 leency 346
     movzx	edx,word[size_x_var]
347
     cmp	.x2,dx ;[size_x_var] ;SIZE_X
1245 hidnplayr 348
     jl 	@f
6619 leency 349
     mov	.x2,dx ;[size_x_var] ;SIZE_X
1245 hidnplayr 350
    @@:
6619 leency 351
 ;    movzx      edx,[size_x_var] ;SIZE_X
1245 hidnplayr 352
     movsx	eax,.y
353
     mul	edx		     ; edi = edi + (SIZE_X * y + x1)*3
354
     movsx	edx,.x1
355
     add	eax,edx
356
     push	eax
357
     lea	eax,[eax*3]
358
     add	edi,eax 	     ; esi = esi + (SIZE_X * y + x1)*4
359
     pop	eax
360
     shl	eax,2
361
     add	esi,eax
362
 
363
     mov	cx,.x2
364
     sub	cx,.x1
365
     movzx	ecx,cx
366
 
367
     mov	eax,.col
368
     mov	ebx,.z1  ; ebx : curr. z
369
     mov	edx,.dz
370
     dec	ecx
371
     jecxz	.draw_last
372
   .ddraw:
373
     cmp	ebx,dword[esi]
2881 leency 374
   ;  cmovl      [edi],eax
375
    ; cmovl      [esi],ebx
1245 hidnplayr 376
     jge	@f
377
     stosd
378
     dec	edi
379
     mov	dword[esi],ebx
380
     jmp	.no_skip
381
   @@:
382
     add	edi,3
383
   .no_skip:
384
     add	esi,4
385
     add	ebx,edx
386
     loop	.ddraw
387
 
388
   .draw_last:
389
     cmp	ebx,dword[esi]
390
     jge	.fl_quit
391
     stosw
392
     shr	eax,16
393
     stosb
394
     mov	dword[esi],ebx
395
 
396
   .fl_quit:
397
 
398
     mov   esp,ebp
399
ret 18