Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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