Rev 109 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 109 | Rev 485 | ||
---|---|---|---|
1 | ; |
1 | ; |
2 | ; 9 Ver Screen saver |
2 | ; 9 Ver Screen saver |
3 | ; 5 Ver 24 bit texture. |
3 | ; 5 Ver 24 bit texture. |
4 | ; 23/8/2004 |
4 | ; 23/8/2004 |
5 | ; Pavlushin Evgeni 3d cube screen saver |
5 | ; Pavlushin Evgeni 3d cube screen saver |
6 | ; mail: waptap@mail.ru site: www.deck4.narod.ru |
6 | ; mail: waptap@mail.ru site: www.deck4.narod.ru |
7 | ; |
7 | ; |
8 | ; This programm develop on sample text3d to Mikolaj Felix 25/5/2001 |
8 | ; This programm develop on sample text3d to Mikolaj Felix 25/5/2001 |
9 | ; mfelix@polbox.com |
9 | ; mfelix@polbox.com |
10 | ; |
10 | ; |
11 | 11 | ||
12 | use32 |
12 | use32 |
13 | org 0x0 |
13 | org 0x0 |
14 | db 'MENUET01' ; 8 byte id |
14 | db 'MENUET01' ; 8 byte id |
15 | dd 0x01 ; header version |
15 | dd 0x01 ; header version |
16 | dd START ; start of code |
16 | dd START ; start of code |
17 | dd I_END ; size of image |
17 | dd I_END ; size of image |
18 | dd 0x200000 ; memory for app |
18 | dd 0x200000 ; memory for app |
19 | dd 0x200000 ; esp |
19 | dd 0x200000 ; esp |
20 | dd 0x0 , 0x0 ; I_Param , I_Icon |
20 | dd 0x0 , 0x0 ; I_Param , I_Icon |
21 | 21 | ||
22 | include 'lang.inc' |
22 | include 'lang.inc' |
- | 23 | include '..\..\..\macros.inc' |
|
23 | MAX_DEGS equ 512 ;quantity of angels 2^n.Minimize for speedup |
24 | MAX_DEGS equ 512 ;quantity of angels 2^n.Minimize for speedup |
24 | MAX_POINTS equ 8 ;quantity of points |
25 | MAX_POINTS equ 8 ;quantity of points |
25 | MAX_FACES equ 6 ;quantity of points |
26 | MAX_FACES equ 6 ;quantity of points |
26 | 27 | ||
27 | START: |
28 | START: |
28 | finit |
29 | finit |
29 | call draw_window |
30 | call draw_window |
30 | call clear_screen |
31 | call clear_screen |
31 | call init_sincos |
32 | call init_sincos |
32 | 33 | ||
33 | still: |
34 | still: |
34 | mov eax,23 ; wait for system event with 2 ms timeout |
35 | mov eax,23 ; wait for system event with 2 ms timeout |
35 | mov ebx,2 ; wait 2 ms, then continue |
36 | mov ebx,2 ; wait 2 ms, then continue |
36 | int 0x40 |
37 | mcall |
37 | 38 | ||
38 | ; mov eax,11 ;If you want maximum speed! :) |
39 | ; mov eax,11 ;If you want maximum speed! :) |
39 | ; int 0x40 |
40 | ; mcall |
40 | 41 | ||
41 | dec eax ; window redraw request ? |
42 | dec eax ; window redraw request ? |
42 | je red |
43 | je red |
43 | dec eax ; key in buffer ? |
44 | dec eax ; key in buffer ? |
44 | je key |
45 | je key |
45 | dec eax ; button in buffer ? |
46 | dec eax ; button in buffer ? |
46 | je button |
47 | je button |
47 | 48 | ||
48 | main_loop: |
49 | main_loop: |
49 | call fade_texture |
50 | call fade_texture |
50 | 51 | ||
51 | mov esi,cube |
52 | mov esi,cube |
52 | mov edi,cube_rotated |
53 | mov edi,cube_rotated |
53 | mov ecx,MAX_POINTS*3 |
54 | mov ecx,MAX_POINTS*3 |
54 | copy_object: |
55 | copy_object: |
55 | fild word [esi] |
56 | fild word [esi] |
56 | fstp dword [edi] |
57 | fstp dword [edi] |
57 | add esi,2 |
58 | add esi,2 |
58 | add edi,4 |
59 | add edi,4 |
59 | dec ecx |
60 | dec ecx |
60 | jnz copy_object |
61 | jnz copy_object |
61 | 62 | ||
62 | mov esi,angle_x |
63 | mov esi,angle_x |
63 | mov edi,cube_rotated |
64 | mov edi,cube_rotated |
64 | mov ecx,MAX_POINTS |
65 | mov ecx,MAX_POINTS |
65 | call rotate_points |
66 | call rotate_points |
66 | 67 | ||
67 | mov esi,cube_rotated |
68 | mov esi,cube_rotated |
68 | mov edi,coord2d |
69 | mov edi,coord2d |
69 | mov ecx,MAX_POINTS |
70 | mov ecx,MAX_POINTS |
70 | call translate_points |
71 | call translate_points |
71 | 72 | ||
72 | call draw_textured_faces |
73 | call draw_textured_faces |
73 | call clear_screen_buffer |
74 | call clear_screen_buffer |
74 | 75 | ||
75 | add [angle_x],1 |
76 | add [angle_x],1 |
76 | add [angle_y],3 |
77 | add [angle_y],3 |
77 | add [angle_z],1 |
78 | add [angle_z],1 |
78 | 79 | ||
79 | jmp still |
80 | jmp still |
80 | 81 | ||
81 | red: |
82 | red: |
82 | call draw_window |
83 | call draw_window |
83 | jmp still |
84 | jmp still |
84 | key: |
85 | key: |
85 | mov eax,2 |
86 | mov eax,2 |
86 | jmp exit |
87 | jmp exit |
87 | button: |
88 | button: |
88 | mov eax,17 |
89 | mov eax,17 |
89 | int 0x40 |
90 | mcall |
90 | cmp ah,1 |
91 | cmp ah,1 |
91 | jne still |
92 | jne still |
92 | exit: |
93 | exit: |
93 | mov eax,-1 |
94 | mov eax,-1 |
94 | int 0x40 |
95 | mcall |
95 | 96 | ||
96 | ;Draw window |
97 | ;Draw window |
97 | draw_window: |
98 | draw_window: |
98 | mov eax,12 ;Start |
99 | mov eax,12 ;Start |
99 | mov ebx,1 |
100 | mov ebx,1 |
100 | int 0x40 |
101 | mcall |
101 | 102 | ||
102 | mov eax,0 ;Draw window |
103 | mov eax,0 ;Draw window |
103 | mov ebx,0*65536+(799) ;x start*65536+x size |
104 | mov ebx,0*65536+(799) ;x start*65536+x size |
104 | mov ecx,0*65536+(599) ;y start*65536+y size |
105 | mov ecx,0*65536+(599) ;y start*65536+y size |
105 | mov edx,0x00000000 ;0x03 use skinned window |
106 | mov edx,0x00000000 ;0x03 use skinned window |
106 | int 0x40 |
107 | mcall |
107 | 108 | ||
108 | call clear_screen |
109 | call clear_screen |
109 | 110 | ||
110 | mov eax,12 ;End |
111 | mov eax,12 ;End |
111 | mov ebx,2 |
112 | mov ebx,2 |
112 | int 0x40 |
113 | mcall |
113 | ret |
114 | ret |
114 | 115 | ||
115 | head_label: db "3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR MENUETOS. USE " |
116 | head_label: db "3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR MENUETOS. USE " |
116 | db "800x600 SCREEN MODE FROM VIEW. PRESS ANY KEY FOR EXIT" |
117 | db "800x600 SCREEN MODE FROM VIEW. PRESS ANY KEY FOR EXIT" |
117 | hl_end: |
118 | hl_end: |
118 | 119 | ||
119 | ;FADE IN FADE OUT TEXTURE |
120 | ;FADE IN FADE OUT TEXTURE |
120 | 121 | ||
121 | x_step db 0 |
122 | x_step db 0 |
122 | x_num db 1 |
123 | x_num db 1 |
123 | 124 | ||
124 | fade_texture: |
125 | fade_texture: |
125 | mov ecx,0 |
126 | mov ecx,0 |
126 | loox: |
127 | loox: |
127 | mov al,[file_texture+ecx] |
128 | mov al,[file_texture+ecx] |
128 | mov [texture+ecx],al |
129 | mov [texture+ecx],al |
129 | inc ecx |
130 | inc ecx |
130 | cmp ecx,128*128*3 |
131 | cmp ecx,128*128*3 |
131 | jnae loox |
132 | jnae loox |
132 | 133 | ||
133 | mov ecx,0 |
134 | mov ecx,0 |
134 | loox2: |
135 | loox2: |
135 | mov al,[file_texture+ecx] |
136 | mov al,[file_texture+ecx] |
136 | cmp [x_step],al |
137 | cmp [x_step],al |
137 | jae xxx |
138 | jae xxx |
138 | sub al,[x_step] |
139 | sub al,[x_step] |
139 | jmp nnn |
140 | jmp nnn |
140 | xxx: |
141 | xxx: |
141 | mov al,0 |
142 | mov al,0 |
142 | nnn: |
143 | nnn: |
143 | mov [texture+ecx],al |
144 | mov [texture+ecx],al |
144 | inc ecx |
145 | inc ecx |
145 | cmp ecx,128*128*3 |
146 | cmp ecx,128*128*3 |
146 | jnae loox2 |
147 | jnae loox2 |
147 | 148 | ||
148 | cmp [x_step],255 |
149 | cmp [x_step],255 |
149 | jne no_max |
150 | jne no_max |
150 | mov [x_num],-1 |
151 | mov [x_num],-1 |
151 | no_max: |
152 | no_max: |
152 | cmp [x_step],0 |
153 | cmp [x_step],0 |
153 | jne no_min |
154 | jne no_min |
154 | mov [x_num],1 |
155 | mov [x_num],1 |
155 | no_min: |
156 | no_min: |
156 | mov al,[x_num] |
157 | mov al,[x_num] |
157 | add [x_step],al |
158 | add [x_step],al |
158 | ret |
159 | ret |
159 | 160 | ||
160 | ; Clear Screen |
161 | ; Clear Screen |
161 | clear_screen: |
162 | clear_screen: |
162 | mov eax,13 |
163 | mov eax,13 |
163 | mov ebx,0*65536+800 |
164 | mov ebx,0*65536+800 |
164 | mov ecx,0*65536+600 |
165 | mov ecx,0*65536+600 |
165 | mov edx,0 |
166 | mov edx,0 |
166 | int 40h |
167 | mcall |
167 | 168 | ||
168 | mov eax,4 ;Out Text |
169 | mov eax,4 ;Out Text |
169 | mov ebx,8*65536+8 ;x start*65536+y start |
170 | mov ebx,8*65536+8 ;x start*65536+y start |
170 | mov ecx,0x00ffffff ;color White |
171 | mov ecx,0x00ffffff ;color White |
171 | mov edx,head_label |
172 | mov edx,head_label |
172 | mov esi,hl_end-head_label |
173 | mov esi,hl_end-head_label |
173 | int 0x40 |
174 | mcall |
174 | ret |
175 | ret |
175 | 176 | ||
176 | clear_screen_buffer: |
177 | clear_screen_buffer: |
177 | mov ebx,scrbuf |
178 | mov ebx,scrbuf |
178 | mov ecx,800*65536+(600-40) ;sub 40 for antiflickering title |
179 | mov ecx,800*65536+(600-40) ;sub 40 for antiflickering title |
179 | mov edx,0*65536+40 |
180 | mov edx,0*65536+40 |
180 | mov eax,7 |
181 | mov eax,7 |
181 | int 0x40 |
182 | mcall |
182 | 183 | ||
183 | mov eax,4 ;Out Text |
184 | mov eax,4 ;Out Text |
184 | mov ebx,8*65536+580 ;x start*65536+y start |
185 | mov ebx,8*65536+580 ;x start*65536+y start |
185 | mov ebp,[n_step] |
186 | mov ebp,[n_step] |
186 | shl ebp,16 |
187 | shl ebp,16 |
187 | sub ebx,ebp |
188 | sub ebx,ebp |
188 | mov ecx,0x0000ff00 ;color White |
189 | mov ecx,0x0000ff00 ;color White |
189 | mov edx,move_text |
190 | mov edx,move_text |
190 | add edx,[step] |
191 | add edx,[step] |
191 | mov esi,130 ;mt_end-move_text |
192 | mov esi,130 ;mt_end-move_text |
192 | int 0x40 |
193 | mcall |
193 | 194 | ||
194 | inc [n_step] |
195 | inc [n_step] |
195 | cmp [n_step],6 |
196 | cmp [n_step],6 |
196 | jna t_ok |
197 | jna t_ok |
197 | mov [n_step],0 |
198 | mov [n_step],0 |
198 | inc [step] |
199 | inc [step] |
199 | cmp [step],mt_end-move_text-130 |
200 | cmp [step],mt_end-move_text-130 |
200 | jng t_ok |
201 | jng t_ok |
201 | mov [step],0 |
202 | mov [step],0 |
202 | t_ok: |
203 | t_ok: |
203 | 204 | ||
204 | mov edi,scrbuf |
205 | mov edi,scrbuf |
205 | mov eax,0 ;black background |
206 | mov eax,0 ;black background |
206 | mov ecx,800*600*3/4 ; 16000 |
207 | mov ecx,800*600*3/4 ; 16000 |
207 | cld |
208 | cld |
208 | rep stosd |
209 | rep stosd |
209 | ret |
210 | ret |
210 | 211 | ||
211 | n_step dd 0 |
212 | n_step dd 0 |
212 | step dd 0 |
213 | step dd 0 |
213 | 214 | ||
214 | move_text: db " " |
215 | move_text: db " " |
215 | db " " |
216 | db " " |
216 | db " " |
217 | db " " |
217 | db "***** 3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR " |
218 | db "***** 3D TEXTURED CUBE THE LITTLE SCREEN SAVER FOR " |
218 | db "MENUET OS. SET 800x600 SCREEN MODE FROM VIEW THIS SCREEN " |
219 | db "MENUET OS. SET 800x600 SCREEN MODE FROM VIEW THIS SCREEN " |
219 | db "SAVER ***** " |
220 | db "SAVER ***** " |
220 | db "SITE OF THE RUSSIAN DEVELOPERS TO MENUETOS: " |
221 | db "SITE OF THE RUSSIAN DEVELOPERS TO MENUETOS: " |
221 | db "www.menuet.narod.ru " |
222 | db "www.menuet.narod.ru " |
222 | db "RUSSIAN MENUET APLICATION ARCHIVE PAGE ON: " |
223 | db "RUSSIAN MENUET APLICATION ARCHIVE PAGE ON: " |
223 | db "www.meosfiles.narod.ru " |
224 | db "www.meosfiles.narod.ru " |
224 | db "AUTOR OF THIS SCREEN SAVER Pavlushin Evgeni " |
225 | db "AUTOR OF THIS SCREEN SAVER Pavlushin Evgeni " |
225 | db "MY SITE: www.deck4.narod.ru (Slow update) " |
226 | db "MY SITE: www.deck4.narod.ru (Slow update) " |
226 | db "AND MAIL BOX: waptap@mail.ru " |
227 | db "AND MAIL BOX: waptap@mail.ru " |
227 | db "THANK YOU FOR USE! " |
228 | db "THANK YOU FOR USE! " |
228 | db " " |
229 | db " " |
229 | db " " |
230 | db " " |
230 | db " " |
231 | db " " |
231 | mt_end: |
232 | mt_end: |
232 | 233 | ||
233 | 234 | ||
234 | ;include graphlib.asm Mikolaj Felix 9/12/2000 mfelix@polbox.com |
235 | ;include graphlib.asm Mikolaj Felix 9/12/2000 mfelix@polbox.com |
235 | ;Draw textured faces proc |
236 | ;Draw textured faces proc |
236 | 237 | ||
237 | @@rx1 dw 0 ;equ [bp-2] |
238 | @@rx1 dw 0 ;equ [bp-2] |
238 | @@ry1 dw 0 ;equ [bp-4] |
239 | @@ry1 dw 0 ;equ [bp-4] |
239 | @@rx2 dw 0 ;equ [bp-6] |
240 | @@rx2 dw 0 ;equ [bp-6] |
240 | @@ry2 dw 0 ;equ [bp-8] |
241 | @@ry2 dw 0 ;equ [bp-8] |
241 | @@rx3 dw 0 ;equ [bp-10] |
242 | @@rx3 dw 0 ;equ [bp-10] |
242 | @@ry3 dw 0 ;equ [bp-12] |
243 | @@ry3 dw 0 ;equ [bp-12] |
243 | @@rx4 dw 0 ;equ [bp-14] |
244 | @@rx4 dw 0 ;equ [bp-14] |
244 | @@ry4 dw 0 ;equ [bp-16] |
245 | @@ry4 dw 0 ;equ [bp-16] |
245 | 246 | ||
246 | draw_textured_faces: |
247 | draw_textured_faces: |
247 | 248 | ||
248 | mov esi,link |
249 | mov esi,link |
249 | mov ecx,MAX_FACES |
250 | mov ecx,MAX_FACES |
250 | dtf_loop: |
251 | dtf_loop: |
251 | push ecx |
252 | push ecx |
252 | 253 | ||
253 | xor ebx,ebx |
254 | xor ebx,ebx |
254 | mov bl,byte [esi] ; point 1 |
255 | mov bl,byte [esi] ; point 1 |
255 | shl bx,2 |
256 | shl bx,2 |
256 | mov eax,dword [coord2d+bx] ;COPY 1 FOURANGLE POINT |
257 | mov eax,dword [coord2d+bx] ;COPY 1 FOURANGLE POINT |
257 | mov dword [@@rx1],eax |
258 | mov dword [@@rx1],eax |
258 | 259 | ||
259 | xor ebx,ebx |
260 | xor ebx,ebx |
260 | mov bl,byte [esi+1] ; point 2 |
261 | mov bl,byte [esi+1] ; point 2 |
261 | shl bx,2 |
262 | shl bx,2 |
262 | mov eax,dword [coord2d+bx] ;COPY 2 FOURANGLE POINT |
263 | mov eax,dword [coord2d+bx] ;COPY 2 FOURANGLE POINT |
263 | mov dword [@@rx2],eax |
264 | mov dword [@@rx2],eax |
264 | 265 | ||
265 | xor ebx,ebx |
266 | xor ebx,ebx |
266 | mov bl,byte [esi+2] ; point 3 |
267 | mov bl,byte [esi+2] ; point 3 |
267 | shl bx,2 |
268 | shl bx,2 |
268 | mov eax,dword [coord2d+bx] ;COPY 3 FOURANGLE POINT |
269 | mov eax,dword [coord2d+bx] ;COPY 3 FOURANGLE POINT |
269 | mov dword [@@rx3],eax |
270 | mov dword [@@rx3],eax |
270 | 271 | ||
271 | xor bh,bh ; point 4 |
272 | xor bh,bh ; point 4 |
272 | mov bl,byte [esi+3] |
273 | mov bl,byte [esi+3] |
273 | shl bx,2 |
274 | shl bx,2 |
274 | mov eax,dword [coord2d+bx] ;COPY 4 FOURANGLE POINT |
275 | mov eax,dword [coord2d+bx] ;COPY 4 FOURANGLE POINT |
275 | mov dword [@@rx4],eax |
276 | mov dword [@@rx4],eax |
276 | 277 | ||
277 | mov ax,[@@ry1] |
278 | mov ax,[@@ry1] |
278 | sub ax,[@@ry3] |
279 | sub ax,[@@ry3] |
279 | mov bx,[@@rx2] |
280 | mov bx,[@@rx2] |
280 | sub bx,[@@rx1] |
281 | sub bx,[@@rx1] |
281 | imul bx |
282 | imul bx |
282 | shl edx,16 |
283 | shl edx,16 |
283 | mov dx,ax |
284 | mov dx,ax |
284 | push edx |
285 | push edx |
285 | mov ax,[@@rx1] |
286 | mov ax,[@@rx1] |
286 | sub ax,[@@rx3] |
287 | sub ax,[@@rx3] |
287 | mov bx,[@@ry2] |
288 | mov bx,[@@ry2] |
288 | sub bx,[@@ry1] |
289 | sub bx,[@@ry1] |
289 | imul bx |
290 | imul bx |
290 | shl edx,16 |
291 | shl edx,16 |
291 | mov dx,ax |
292 | mov dx,ax |
292 | pop ebx |
293 | pop ebx |
293 | sub ebx,edx ; normal_z = (y1-y3)*(x2-x1)-(x1-x3)*(y2-y1) |
294 | sub ebx,edx ; normal_z = (y1-y3)*(x2-x1)-(x1-x3)*(y2-y1) |
294 | or ebx,ebx |
295 | or ebx,ebx |
295 | jl dtf_next_face ; normal_z < 0 |
296 | jl dtf_next_face ; normal_z < 0 |
296 | 297 | ||
297 | ; FIRST PICE OF FOUR ANGLE |
298 | ; FIRST PICE OF FOUR ANGLE |
298 | 299 | ||
299 | ; Set 3 triangel puts for texture ycoord*65536+xcoord |
300 | ; Set 3 triangel puts for texture ycoord*65536+xcoord |
300 | mov dword [@@tex_x3],127*65536+127 ;3 point |
301 | mov dword [@@tex_x3],127*65536+127 ;3 point |
301 | mov dword [@@tex_x2],0*65536+127 ;2 point |
302 | mov dword [@@tex_x2],0*65536+127 ;2 point |
302 | mov dword [@@tex_x1],0*65536+0 ;1 point |
303 | mov dword [@@tex_x1],0*65536+0 ;1 point |
303 | ; Set texture bitmap offset |
304 | ; Set texture bitmap offset |
304 | mov [@@tex_off],texture |
305 | mov [@@tex_off],texture |
305 | ; Set 3 triangel puts coordinates |
306 | ; Set 3 triangel puts coordinates |
306 | mov eax,dword [@@rx3] |
307 | mov eax,dword [@@rx3] |
307 | mov dword [@@x3],eax |
308 | mov dword [@@x3],eax |
308 | mov eax,dword [@@rx2] |
309 | mov eax,dword [@@rx2] |
309 | mov dword [@@x2],eax |
310 | mov dword [@@x2],eax |
310 | mov eax,dword [@@rx1] |
311 | mov eax,dword [@@rx1] |
311 | mov dword [@@x1],eax |
312 | mov dword [@@x1],eax |
312 | call textured_triangle |
313 | call textured_triangle |
313 | 314 | ||
314 | ; SECOND PICE OF FOUR ANGLE |
315 | ; SECOND PICE OF FOUR ANGLE |
315 | 316 | ||
316 | ; Set 3 triangel puts for texture ycoord*65536+xcoord |
317 | ; Set 3 triangel puts for texture ycoord*65536+xcoord |
317 | mov dword [@@tex_x3],127*65536+0 ;3 point |
318 | mov dword [@@tex_x3],127*65536+0 ;3 point |
318 | mov dword [@@tex_x2],127*65536+127 ;2 point |
319 | mov dword [@@tex_x2],127*65536+127 ;2 point |
319 | mov dword [@@tex_x1],0*65536+0 ;1 point |
320 | mov dword [@@tex_x1],0*65536+0 ;1 point |
320 | ; Set texture bitmap offset |
321 | ; Set texture bitmap offset |
321 | mov [@@tex_off],texture |
322 | mov [@@tex_off],texture |
322 | ; Set 3 triangel puts coordinates |
323 | ; Set 3 triangel puts coordinates |
323 | mov eax,dword [@@rx4] |
324 | mov eax,dword [@@rx4] |
324 | mov dword [@@x3],eax |
325 | mov dword [@@x3],eax |
325 | mov eax,dword [@@rx3] |
326 | mov eax,dword [@@rx3] |
326 | mov dword [@@x2],eax |
327 | mov dword [@@x2],eax |
327 | mov eax,dword [@@rx1] |
328 | mov eax,dword [@@rx1] |
328 | mov dword [@@x1],eax |
329 | mov dword [@@x1],eax |
329 | call textured_triangle |
330 | call textured_triangle |
330 | 331 | ||
331 | dtf_next_face: |
332 | dtf_next_face: |
332 | add esi,4 |
333 | add esi,4 |
333 | pop ecx |
334 | pop ecx |
334 | dec ecx |
335 | dec ecx |
335 | jnz dtf_loop |
336 | jnz dtf_loop |
336 | ret |
337 | ret |
337 | 338 | ||
338 | ;include tex3.asm Mikolaj Felix 15/5/2001 mfelix@polbox.com |
339 | ;include tex3.asm Mikolaj Felix 15/5/2001 mfelix@polbox.com |
339 | 340 | ||
340 | @@x1 dw 0 ;equ [bp+4] |
341 | @@x1 dw 0 ;equ [bp+4] |
341 | @@y1 dw 0 ;equ [bp+6] |
342 | @@y1 dw 0 ;equ [bp+6] |
342 | @@x2 dw 0 ;equ [bp+8] |
343 | @@x2 dw 0 ;equ [bp+8] |
343 | @@y2 dw 0 ;equ [bp+10] |
344 | @@y2 dw 0 ;equ [bp+10] |
344 | @@x3 dw 0 ;equ [bp+12] |
345 | @@x3 dw 0 ;equ [bp+12] |
345 | @@y3 dw 0 ;equ [bp+14] |
346 | @@y3 dw 0 ;equ [bp+14] |
346 | 347 | ||
347 | @@tex_off dd 0 ;equ [bp+16] |
348 | @@tex_off dd 0 ;equ [bp+16] |
348 | @@tex_x1 dw 0 ;equ [bp+18] |
349 | @@tex_x1 dw 0 ;equ [bp+18] |
349 | @@tex_y1 dw 0 ;equ [bp+20] |
350 | @@tex_y1 dw 0 ;equ [bp+20] |
350 | @@tex_x2 dw 0 ;equ [bp+22] |
351 | @@tex_x2 dw 0 ;equ [bp+22] |
351 | @@tex_y2 dw 0 ;equ [bp+24] |
352 | @@tex_y2 dw 0 ;equ [bp+24] |
352 | @@tex_x3 dw 0 ;equ [bp+26] |
353 | @@tex_x3 dw 0 ;equ [bp+26] |
353 | @@tex_y3 dw 0 ;equ [bp+28] |
354 | @@tex_y3 dw 0 ;equ [bp+28] |
354 | 355 | ||
355 | @@dx12 dw 0 ;equ [bp-2] |
356 | @@dx12 dw 0 ;equ [bp-2] |
356 | @@dx13 dw 0 ;equ [bp-4] |
357 | @@dx13 dw 0 ;equ [bp-4] |
357 | @@dx23 dw 0 ;equ [bp-6] |
358 | @@dx23 dw 0 ;equ [bp-6] |
358 | 359 | ||
359 | @@tex_dx12 dw 0 ;equ [bp-8] |
360 | @@tex_dx12 dw 0 ;equ [bp-8] |
360 | @@tex_dy12 dw 0 ;equ [bp-10] |
361 | @@tex_dy12 dw 0 ;equ [bp-10] |
361 | @@tex_dx13 dw 0 ;equ [bp-12] |
362 | @@tex_dx13 dw 0 ;equ [bp-12] |
362 | @@tex_dy13 dw 0 ;equ [bp-14] |
363 | @@tex_dy13 dw 0 ;equ [bp-14] |
363 | @@tex_dx23 dw 0 ;equ [bp-16] |
364 | @@tex_dx23 dw 0 ;equ [bp-16] |
364 | @@tex_dy23 dw 0 ;equ [bp-18] |
365 | @@tex_dy23 dw 0 ;equ [bp-18] |
365 | 366 | ||
366 | @@scan_x1 dw 0 ;equ [bp-20] |
367 | @@scan_x1 dw 0 ;equ [bp-20] |
367 | @@scan_y1 dw 0 ;equ [bp-22] |
368 | @@scan_y1 dw 0 ;equ [bp-22] |
368 | @@scan_x2 dw 0 ;equ [bp-24] |
369 | @@scan_x2 dw 0 ;equ [bp-24] |
369 | @@scan_y2 dw 0 ;equ [bp-26] |
370 | @@scan_y2 dw 0 ;equ [bp-26] |
370 | 371 | ||
371 | 372 | ||
372 | textured_triangle: |
373 | textured_triangle: |
373 | 374 | ||
374 | mov ax,[@@y1] |
375 | mov ax,[@@y1] |
375 | cmp ax,[@@y3] |
376 | cmp ax,[@@y3] |
376 | jb tt_check1 |
377 | jb tt_check1 |
377 | 378 | ||
378 | xchg ax,[@@y3] |
379 | xchg ax,[@@y3] |
379 | mov [@@y1],ax |
380 | mov [@@y1],ax |
380 | 381 | ||
381 | mov ax,[@@x1] |
382 | mov ax,[@@x1] |
382 | xchg ax,[@@x3] |
383 | xchg ax,[@@x3] |
383 | mov [@@x1],ax |
384 | mov [@@x1],ax |
384 | 385 | ||
385 | mov ax,[@@tex_y1] |
386 | mov ax,[@@tex_y1] |
386 | xchg ax,[@@tex_y3] |
387 | xchg ax,[@@tex_y3] |
387 | mov [@@tex_y1],ax |
388 | mov [@@tex_y1],ax |
388 | 389 | ||
389 | mov ax,[@@tex_x1] |
390 | mov ax,[@@tex_x1] |
390 | xchg ax,[@@tex_x3] |
391 | xchg ax,[@@tex_x3] |
391 | mov [@@tex_x1],ax |
392 | mov [@@tex_x1],ax |
392 | tt_check1: |
393 | tt_check1: |
393 | mov ax,[@@y2] |
394 | mov ax,[@@y2] |
394 | cmp ax,[@@y3] |
395 | cmp ax,[@@y3] |
395 | jb tt_check2 |
396 | jb tt_check2 |
396 | 397 | ||
397 | xchg ax,[@@y3] |
398 | xchg ax,[@@y3] |
398 | mov [@@y2],ax |
399 | mov [@@y2],ax |
399 | 400 | ||
400 | mov ax,[@@x2] |
401 | mov ax,[@@x2] |
401 | xchg ax,[@@x3] |
402 | xchg ax,[@@x3] |
402 | mov [@@x2],ax |
403 | mov [@@x2],ax |
403 | 404 | ||
404 | mov ax,[@@tex_y2] |
405 | mov ax,[@@tex_y2] |
405 | xchg ax,[@@tex_y3] |
406 | xchg ax,[@@tex_y3] |
406 | mov [@@tex_y2],ax |
407 | mov [@@tex_y2],ax |
407 | 408 | ||
408 | mov ax,[@@tex_x2] |
409 | mov ax,[@@tex_x2] |
409 | xchg ax,[@@tex_x3] |
410 | xchg ax,[@@tex_x3] |
410 | mov [@@tex_x2],ax |
411 | mov [@@tex_x2],ax |
411 | tt_check2: |
412 | tt_check2: |
412 | mov ax,[@@y1] |
413 | mov ax,[@@y1] |
413 | cmp ax,[@@y2] |
414 | cmp ax,[@@y2] |
414 | jb tt_check3 |
415 | jb tt_check3 |
415 | 416 | ||
416 | xchg ax,[@@y2] |
417 | xchg ax,[@@y2] |
417 | mov [@@y1],ax |
418 | mov [@@y1],ax |
418 | 419 | ||
419 | mov ax,[@@x1] |
420 | mov ax,[@@x1] |
420 | xchg ax,[@@x2] |
421 | xchg ax,[@@x2] |
421 | mov [@@x1],ax |
422 | mov [@@x1],ax |
422 | 423 | ||
423 | mov ax,[@@tex_y1] |
424 | mov ax,[@@tex_y1] |
424 | xchg ax,[@@tex_y2] |
425 | xchg ax,[@@tex_y2] |
425 | mov [@@tex_y1],ax |
426 | mov [@@tex_y1],ax |
426 | 427 | ||
427 | mov ax,[@@tex_x1] |
428 | mov ax,[@@tex_x1] |
428 | xchg ax,[@@tex_x2] |
429 | xchg ax,[@@tex_x2] |
429 | mov [@@tex_x1],ax |
430 | mov [@@tex_x1],ax |
430 | tt_check3: |
431 | tt_check3: |
431 | 432 | ||
432 | mov bx,[@@y2] |
433 | mov bx,[@@y2] |
433 | sub bx,[@@y1] |
434 | sub bx,[@@y1] |
434 | jnz tt_dx12_make |
435 | jnz tt_dx12_make |
435 | 436 | ||
436 | mov word [@@dx12],0 |
437 | mov word [@@dx12],0 |
437 | mov word [@@tex_dx12],0 |
438 | mov word [@@tex_dx12],0 |
438 | mov word [@@tex_dy12],0 |
439 | mov word [@@tex_dy12],0 |
439 | jmp tt_dx12_done |
440 | jmp tt_dx12_done |
440 | tt_dx12_make: |
441 | tt_dx12_make: |
441 | mov ax,[@@x2] |
442 | mov ax,[@@x2] |
442 | sub ax,[@@x1] |
443 | sub ax,[@@x1] |
443 | shl ax,7 |
444 | shl ax,7 |
444 | cwd |
445 | cwd |
445 | idiv bx |
446 | idiv bx |
446 | mov [@@dx12],ax ; dx12 = (x2-x1)/(y2-y1) |
447 | mov [@@dx12],ax ; dx12 = (x2-x1)/(y2-y1) |
447 | 448 | ||
448 | mov ax,[@@tex_x2] |
449 | mov ax,[@@tex_x2] |
449 | sub ax,[@@tex_x1] |
450 | sub ax,[@@tex_x1] |
450 | shl ax,7 |
451 | shl ax,7 |
451 | cwd |
452 | cwd |
452 | idiv bx |
453 | idiv bx |
453 | mov [@@tex_dx12],ax ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1) |
454 | mov [@@tex_dx12],ax ; tex_dx12 = (tex_x2-tex_x1)/(y2-y1) |
454 | 455 | ||
455 | mov ax,[@@tex_y2] |
456 | mov ax,[@@tex_y2] |
456 | sub ax,[@@tex_y1] |
457 | sub ax,[@@tex_y1] |
457 | shl ax,7 |
458 | shl ax,7 |
458 | cwd |
459 | cwd |
459 | idiv bx |
460 | idiv bx |
460 | mov [@@tex_dy12],ax ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1) |
461 | mov [@@tex_dy12],ax ; tex_dy12 = (tex_y2-tex_y1)/(y2-y1) |
461 | tt_dx12_done: |
462 | tt_dx12_done: |
462 | 463 | ||
463 | mov bx,[@@y3] |
464 | mov bx,[@@y3] |
464 | sub bx,[@@y1] |
465 | sub bx,[@@y1] |
465 | jnz tt_dx13_make |
466 | jnz tt_dx13_make |
466 | 467 | ||
467 | mov word [@@dx13],0 |
468 | mov word [@@dx13],0 |
468 | mov word [@@tex_dx13],0 |
469 | mov word [@@tex_dx13],0 |
469 | mov word [@@tex_dy13],0 |
470 | mov word [@@tex_dy13],0 |
470 | jmp tt_dx13_done |
471 | jmp tt_dx13_done |
471 | tt_dx13_make: |
472 | tt_dx13_make: |
472 | mov ax,[@@x3] |
473 | mov ax,[@@x3] |
473 | sub ax,[@@x1] |
474 | sub ax,[@@x1] |
474 | shl ax,7 |
475 | shl ax,7 |
475 | cwd |
476 | cwd |
476 | idiv bx |
477 | idiv bx |
477 | mov [@@dx13],ax ; dx13 = (x3-x1)/(y3-y1) |
478 | mov [@@dx13],ax ; dx13 = (x3-x1)/(y3-y1) |
478 | 479 | ||
479 | mov ax,[@@tex_x3] |
480 | mov ax,[@@tex_x3] |
480 | sub ax,[@@tex_x1] |
481 | sub ax,[@@tex_x1] |
481 | shl ax,7 |
482 | shl ax,7 |
482 | cwd |
483 | cwd |
483 | idiv bx |
484 | idiv bx |
484 | mov [@@tex_dx13],ax ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1) |
485 | mov [@@tex_dx13],ax ; tex_dx13 = (tex_x3-tex_x1)/(y3-y1) |
485 | 486 | ||
486 | mov ax,[@@tex_y3] |
487 | mov ax,[@@tex_y3] |
487 | sub ax,[@@tex_y1] |
488 | sub ax,[@@tex_y1] |
488 | shl ax,7 |
489 | shl ax,7 |
489 | cwd |
490 | cwd |
490 | idiv bx |
491 | idiv bx |
491 | mov [@@tex_dy13],ax ; tex_dy13 = (tex_y3-tex_x1)/(y3-y1) |
492 | mov [@@tex_dy13],ax ; tex_dy13 = (tex_y3-tex_x1)/(y3-y1) |
492 | tt_dx13_done: |
493 | tt_dx13_done: |
493 | 494 | ||
494 | mov bx,[@@y3] |
495 | mov bx,[@@y3] |
495 | sub bx,[@@y2] |
496 | sub bx,[@@y2] |
496 | jnz tt_dx23_make |
497 | jnz tt_dx23_make |
497 | 498 | ||
498 | mov word [@@dx23],0 |
499 | mov word [@@dx23],0 |
499 | mov word [@@tex_dx23],0 |
500 | mov word [@@tex_dx23],0 |
500 | mov word [@@tex_dy23],0 |
501 | mov word [@@tex_dy23],0 |
501 | jmp tt_dx23_done |
502 | jmp tt_dx23_done |
502 | tt_dx23_make: |
503 | tt_dx23_make: |
503 | mov ax,[@@x3] |
504 | mov ax,[@@x3] |
504 | sub ax,[@@x2] |
505 | sub ax,[@@x2] |
505 | shl ax,7 |
506 | shl ax,7 |
506 | cwd |
507 | cwd |
507 | idiv bx |
508 | idiv bx |
508 | mov [@@dx23],ax ; dx23 = (x3-x2)/(y3-y2) |
509 | mov [@@dx23],ax ; dx23 = (x3-x2)/(y3-y2) |
509 | 510 | ||
510 | mov ax,[@@tex_x3] |
511 | mov ax,[@@tex_x3] |
511 | sub ax,[@@tex_x2] |
512 | sub ax,[@@tex_x2] |
512 | shl ax,7 |
513 | shl ax,7 |
513 | cwd |
514 | cwd |
514 | idiv bx |
515 | idiv bx |
515 | mov [@@tex_dx23],ax ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2) |
516 | mov [@@tex_dx23],ax ; tex_dx23 = (tex_x3-tex_x2)/(y3-y2) |
516 | 517 | ||
517 | mov ax,[@@tex_y3] |
518 | mov ax,[@@tex_y3] |
518 | sub ax,[@@tex_y2] |
519 | sub ax,[@@tex_y2] |
519 | shl ax,7 |
520 | shl ax,7 |
520 | cwd |
521 | cwd |
521 | idiv bx |
522 | idiv bx |
522 | mov [@@tex_dy23],ax ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2) |
523 | mov [@@tex_dy23],ax ; tex_dy23 = (tex_y3-tex_y2)/(y3-y2) |
523 | tt_dx23_done: |
524 | tt_dx23_done: |
524 | 525 | ||
525 | 526 | ||
526 | mov ax,[@@x1] |
527 | mov ax,[@@x1] |
527 | shl ax,7 |
528 | shl ax,7 |
528 | mov bx,ax |
529 | mov bx,ax |
529 | mov cx,[@@y1] |
530 | mov cx,[@@y1] |
530 | 531 | ||
531 | mov dx,[@@tex_x1] |
532 | mov dx,[@@tex_x1] |
532 | shl dx,7 |
533 | shl dx,7 |
533 | mov [@@scan_x1],dx |
534 | mov [@@scan_x1],dx |
534 | mov [@@scan_x2],dx |
535 | mov [@@scan_x2],dx |
535 | mov dx,[@@tex_y1] |
536 | mov dx,[@@tex_y1] |
536 | shl dx,7 |
537 | shl dx,7 |
537 | mov [@@scan_y1],dx |
538 | mov [@@scan_y1],dx |
538 | mov [@@scan_y2],dx |
539 | mov [@@scan_y2],dx |
539 | tt_loop1: |
540 | tt_loop1: |
540 | pushad |
541 | pushad |
541 | ; push ax |
542 | ; push ax |
542 | ; push bx |
543 | ; push bx |
543 | ; push cx |
544 | ; push cx |
544 | 545 | ||
545 | mov dx,[@@scan_y2] |
546 | mov dx,[@@scan_y2] |
546 | shr dx,7 |
547 | shr dx,7 |
547 | mov [@@tex_ly2],dx ;push dx |
548 | mov [@@tex_ly2],dx ;push dx |
548 | mov dx,[@@scan_x2] |
549 | mov dx,[@@scan_x2] |
549 | shr dx,7 |
550 | shr dx,7 |
550 | mov [@@tex_lx2],dx ;push dx |
551 | mov [@@tex_lx2],dx ;push dx |
551 | mov dx,[@@scan_y1] |
552 | mov dx,[@@scan_y1] |
552 | shr dx,7 |
553 | shr dx,7 |
553 | mov [@@tex_ly1],dx ;push dx |
554 | mov [@@tex_ly1],dx ;push dx |
554 | mov dx,[@@scan_x1] |
555 | mov dx,[@@scan_x1] |
555 | shr dx,7 |
556 | shr dx,7 |
556 | mov [@@tex_lx1],dx ;push dx |
557 | mov [@@tex_lx1],dx ;push dx |
557 | mov ebp,dword [@@tex_off] ;push word ptr @@tex_off |
558 | mov ebp,dword [@@tex_off] ;push word ptr @@tex_off |
558 | mov [@@tex_loff],ebp |
559 | mov [@@tex_loff],ebp |
559 | 560 | ||
560 | mov [@@ly],cx ;push cx |
561 | mov [@@ly],cx ;push cx |
561 | mov dx,bx |
562 | mov dx,bx |
562 | shr dx,7 |
563 | shr dx,7 |
563 | mov [@@lx2],dx ;push dx |
564 | mov [@@lx2],dx ;push dx |
564 | mov dx,ax |
565 | mov dx,ax |
565 | shr dx,7 |
566 | shr dx,7 |
566 | mov [@@lx1],dx ; push dx |
567 | mov [@@lx1],dx ; push dx |
567 | call textured_horizontal_line |
568 | call textured_horizontal_line |
568 | 569 | ||
569 | ; pop cx |
570 | ; pop cx |
570 | ; pop bx |
571 | ; pop bx |
571 | ; pop ax |
572 | ; pop ax |
572 | popad |
573 | popad |
573 | 574 | ||
574 | mov dx,[@@tex_dx13] |
575 | mov dx,[@@tex_dx13] |
575 | add [@@scan_x1],dx |
576 | add [@@scan_x1],dx |
576 | mov dx,[@@tex_dx12] |
577 | mov dx,[@@tex_dx12] |
577 | add [@@scan_x2],dx |
578 | add [@@scan_x2],dx |
578 | mov dx,[@@tex_dy13] |
579 | mov dx,[@@tex_dy13] |
579 | add [@@scan_y1],dx |
580 | add [@@scan_y1],dx |
580 | mov dx,[@@tex_dy12] |
581 | mov dx,[@@tex_dy12] |
581 | add [@@scan_y2],dx |
582 | add [@@scan_y2],dx |
582 | 583 | ||
583 | add ax,[@@dx13] |
584 | add ax,[@@dx13] |
584 | add bx,[@@dx12] |
585 | add bx,[@@dx12] |
585 | inc cx |
586 | inc cx |
586 | cmp cx,[@@y2] |
587 | cmp cx,[@@y2] |
587 | jb tt_loop1 |
588 | jb tt_loop1 |
588 | 589 | ||
589 | mov bx,[@@x2] |
590 | mov bx,[@@x2] |
590 | shl bx,7 |
591 | shl bx,7 |
591 | mov cx,[@@y2] |
592 | mov cx,[@@y2] |
592 | 593 | ||
593 | mov dx,[@@tex_x2] |
594 | mov dx,[@@tex_x2] |
594 | shl dx,7 |
595 | shl dx,7 |
595 | mov [@@scan_x2],dx |
596 | mov [@@scan_x2],dx |
596 | mov dx,[@@tex_y2] |
597 | mov dx,[@@tex_y2] |
597 | shl dx,7 |
598 | shl dx,7 |
598 | mov [@@scan_y2],dx |
599 | mov [@@scan_y2],dx |
599 | tt_loop2: |
600 | tt_loop2: |
600 | 601 | ||
601 | pushad |
602 | pushad |
602 | ; push ax |
603 | ; push ax |
603 | ; push bx |
604 | ; push bx |
604 | ; push cx |
605 | ; push cx |
605 | 606 | ||
606 | mov dx,[@@scan_y2] |
607 | mov dx,[@@scan_y2] |
607 | shr dx,7 |
608 | shr dx,7 |
608 | mov [@@tex_ly2],dx ;push dx |
609 | mov [@@tex_ly2],dx ;push dx |
609 | mov dx,[@@scan_x2] |
610 | mov dx,[@@scan_x2] |
610 | shr dx,7 |
611 | shr dx,7 |
611 | mov [@@tex_lx2],dx ;push dx |
612 | mov [@@tex_lx2],dx ;push dx |
612 | mov dx,[@@scan_y1] |
613 | mov dx,[@@scan_y1] |
613 | shr dx,7 |
614 | shr dx,7 |
614 | mov [@@tex_ly1],dx ;push dx |
615 | mov [@@tex_ly1],dx ;push dx |
615 | mov dx,[@@scan_x1] |
616 | mov dx,[@@scan_x1] |
616 | shr dx,7 |
617 | shr dx,7 |
617 | mov [@@tex_lx1],dx ;push dx |
618 | mov [@@tex_lx1],dx ;push dx |
618 | mov ebp,dword [@@tex_off] ;push word ptr @@tex_off |
619 | mov ebp,dword [@@tex_off] ;push word ptr @@tex_off |
619 | mov [@@tex_loff],ebp |
620 | mov [@@tex_loff],ebp |
620 | 621 | ||
621 | mov [@@ly],cx ;push cx |
622 | mov [@@ly],cx ;push cx |
622 | mov dx,bx |
623 | mov dx,bx |
623 | shr dx,7 |
624 | shr dx,7 |
624 | mov [@@lx2],dx ;push dx |
625 | mov [@@lx2],dx ;push dx |
625 | mov dx,ax |
626 | mov dx,ax |
626 | shr dx,7 |
627 | shr dx,7 |
627 | mov [@@lx1],dx ; push dx |
628 | mov [@@lx1],dx ; push dx |
628 | call textured_horizontal_line |
629 | call textured_horizontal_line |
629 | 630 | ||
630 | ; pop cx |
631 | ; pop cx |
631 | ; pop bx |
632 | ; pop bx |
632 | ; pop ax |
633 | ; pop ax |
633 | popad |
634 | popad |
634 | 635 | ||
635 | mov dx,[@@tex_dx13] |
636 | mov dx,[@@tex_dx13] |
636 | add [@@scan_x1],dx |
637 | add [@@scan_x1],dx |
637 | mov dx,[@@tex_dx23] |
638 | mov dx,[@@tex_dx23] |
638 | add [@@scan_x2],dx |
639 | add [@@scan_x2],dx |
639 | mov dx,[@@tex_dy13] |
640 | mov dx,[@@tex_dy13] |
640 | add [@@scan_y1],dx |
641 | add [@@scan_y1],dx |
641 | mov dx,[@@tex_dy23] |
642 | mov dx,[@@tex_dy23] |
642 | add [@@scan_y2],dx |
643 | add [@@scan_y2],dx |
643 | 644 | ||
644 | add ax,[@@dx13] |
645 | add ax,[@@dx13] |
645 | add bx,[@@dx23] |
646 | add bx,[@@dx23] |
646 | inc cx |
647 | inc cx |
647 | cmp cx,[@@y3] |
648 | cmp cx,[@@y3] |
648 | jb tt_loop2 |
649 | jb tt_loop2 |
649 | ret |
650 | ret |
650 | 651 | ||
651 | @@lx1 dw 0 ;equ [bp+4] |
652 | @@lx1 dw 0 ;equ [bp+4] |
652 | @@lx2 dw 0 ;equ [bp+6] |
653 | @@lx2 dw 0 ;equ [bp+6] |
653 | @@ly dw 0 ;equ [bp+8] |
654 | @@ly dw 0 ;equ [bp+8] |
654 | 655 | ||
655 | @@tex_loff dd 0 ;equ [bp+10] |
656 | @@tex_loff dd 0 ;equ [bp+10] |
656 | @@tex_lx1 dw 0 ;equ [bp+12] |
657 | @@tex_lx1 dw 0 ;equ [bp+12] |
657 | @@tex_ly1 dw 0 ;equ [bp+14] |
658 | @@tex_ly1 dw 0 ;equ [bp+14] |
658 | @@tex_lx2 dw 0 ;equ [bp+16] |
659 | @@tex_lx2 dw 0 ;equ [bp+16] |
659 | @@tex_ly2 dw 0 ;equ [bp+18] |
660 | @@tex_ly2 dw 0 ;equ [bp+18] |
660 | 661 | ||
661 | @@tex_ldx dw 0 ;equ [bp-2] |
662 | @@tex_ldx dw 0 ;equ [bp-2] |
662 | @@tex_ldy dw 0 ;equ [bp-4] |
663 | @@tex_ldy dw 0 ;equ [bp-4] |
663 | 664 | ||
664 | textured_horizontal_line: |
665 | textured_horizontal_line: |
665 | 666 | ||
666 | mov ax,[@@lx1] |
667 | mov ax,[@@lx1] |
667 | cmp ax,[@@lx2] |
668 | cmp ax,[@@lx2] |
668 | je thl_quit |
669 | je thl_quit |
669 | jb thl_ok |
670 | jb thl_ok |
670 | 671 | ||
671 | xchg ax,[@@lx2] |
672 | xchg ax,[@@lx2] |
672 | mov [@@lx1],ax |
673 | mov [@@lx1],ax |
673 | 674 | ||
674 | mov ax,[@@tex_lx1] |
675 | mov ax,[@@tex_lx1] |
675 | xchg ax,[@@tex_lx2] |
676 | xchg ax,[@@tex_lx2] |
676 | mov [@@tex_lx1],ax |
677 | mov [@@tex_lx1],ax |
677 | 678 | ||
678 | mov ax,[@@tex_ly1] |
679 | mov ax,[@@tex_ly1] |
679 | xchg ax,[@@tex_ly2] |
680 | xchg ax,[@@tex_ly2] |
680 | mov [@@tex_ly1],ax |
681 | mov [@@tex_ly1],ax |
681 | thl_ok: |
682 | thl_ok: |
682 | 683 | ||
683 | ; Fast method |
684 | ; Fast method |
684 | ; mov edi,0 |
685 | ; mov edi,0 |
685 | ; mov di,[@@ly] ;edi = calculating start of line |
686 | ; mov di,[@@ly] ;edi = calculating start of line |
686 | ; mov ax,di |
687 | ; mov ax,di |
687 | ; shl di,6 ;ly*64 |
688 | ; shl di,6 ;ly*64 |
688 | ; shl ax,8 ;ly*256 |
689 | ; shl ax,8 ;ly*256 |
689 | ; add di,ax ;di = (ly*64)+(ly*256) |
690 | ; add di,ax ;di = (ly*64)+(ly*256) |
690 | ; add di,[@@lx1] ;di = ly*320+lx1 |
691 | ; add di,[@@lx1] ;di = ly*320+lx1 |
691 | ; mov eax,edi |
692 | ; mov eax,edi |
692 | ; shl eax,1 |
693 | ; shl eax,1 |
693 | ; add edi,eax |
694 | ; add edi,eax |
694 | ; add edi,scrbuf |
695 | ; add edi,scrbuf |
695 | 696 | ||
696 | ; Uneversal method |
697 | ; Uneversal method |
697 | movsx edi,[@@ly] |
698 | movsx edi,[@@ly] |
698 | mov eax,800 ;di = ly*320+lx1 |
699 | mov eax,800 ;di = ly*320+lx1 |
699 | mul edi |
700 | mul edi |
700 | movsx ebx,[@@lx1] |
701 | movsx ebx,[@@lx1] |
701 | add eax,ebx ;[@@lx1] |
702 | add eax,ebx ;[@@lx1] |
702 | mov edi,3 |
703 | mov edi,3 |
703 | mul edi |
704 | mul edi |
704 | mov edi,eax |
705 | mov edi,eax |
705 | add edi,scrbuf |
706 | add edi,scrbuf |
706 | 707 | ||
707 | mov cx,[@@lx2] |
708 | mov cx,[@@lx2] |
708 | sub cx,[@@lx1] |
709 | sub cx,[@@lx1] |
709 | 710 | ||
710 | mov ax,[@@tex_lx2] |
711 | mov ax,[@@tex_lx2] |
711 | sub ax,[@@tex_lx1] |
712 | sub ax,[@@tex_lx1] |
712 | shl ax,7 |
713 | shl ax,7 |
713 | cwd |
714 | cwd |
714 | idiv cx |
715 | idiv cx |
715 | mov [@@tex_ldx],ax ; tex_dx = (tex_x2-tex_x1)/(x2-x1) |
716 | mov [@@tex_ldx],ax ; tex_dx = (tex_x2-tex_x1)/(x2-x1) |
716 | 717 | ||
717 | mov ax,[@@tex_ly2] |
718 | mov ax,[@@tex_ly2] |
718 | sub ax,[@@tex_ly1] |
719 | sub ax,[@@tex_ly1] |
719 | shl ax,7 |
720 | shl ax,7 |
720 | cwd |
721 | cwd |
721 | idiv cx |
722 | idiv cx |
722 | mov [@@tex_ldy],ax ; tex_dy = (tex_y2-tex_y1)/(x2-x1) |
723 | mov [@@tex_ldy],ax ; tex_dy = (tex_y2-tex_y1)/(x2-x1) |
723 | 724 | ||
724 | cld |
725 | cld |
725 | inc cx |
726 | inc cx |
726 | mov ax,[@@tex_lx1] |
727 | mov ax,[@@tex_lx1] |
727 | shl ax,7 |
728 | shl ax,7 |
728 | mov bx,[@@tex_ly1] |
729 | mov bx,[@@tex_ly1] |
729 | shl bx,7 |
730 | shl bx,7 |
730 | 731 | ||
731 | thl_loop: |
732 | thl_loop: |
732 | mov dx,ax |
733 | mov dx,ax |
733 | push bx |
734 | push bx |
734 | 735 | ||
735 | and bx,0ff80h |
736 | and bx,0ff80h |
736 | shr ax,7 |
737 | shr ax,7 |
737 | add bx,ax |
738 | add bx,ax |
738 | mov ebp,0 |
739 | mov ebp,0 |
739 | mov bp,bx |
740 | mov bp,bx |
740 | mov eax,ebp |
741 | mov eax,ebp |
741 | shl eax,1 |
742 | shl eax,1 |
742 | add ebp,eax |
743 | add ebp,eax |
743 | add ebp,[@@tex_loff] |
744 | add ebp,[@@tex_loff] |
744 | 745 | ||
745 | mov al,byte [ebp+2] |
746 | mov al,byte [ebp+2] |
746 | stosb |
747 | stosb |
747 | mov al,byte [ebp+1] |
748 | mov al,byte [ebp+1] |
748 | stosb |
749 | stosb |
749 | mov al,byte [ebp] |
750 | mov al,byte [ebp] |
750 | stosb |
751 | stosb |
751 | 752 | ||
752 | pop bx |
753 | pop bx |
753 | mov ax,dx |
754 | mov ax,dx |
754 | 755 | ||
755 | add ax,[@@tex_ldx] |
756 | add ax,[@@tex_ldx] |
756 | add bx,[@@tex_ldy] |
757 | add bx,[@@tex_ldy] |
757 | dec cx |
758 | dec cx |
758 | jnz thl_loop |
759 | jnz thl_loop |
759 | thl_quit: |
760 | thl_quit: |
760 | ret |
761 | ret |
761 | 762 | ||
762 | ;include math3d_2.asm |
763 | ;include math3d_2.asm |
763 | ; Mikolaj Felix 20/06/2001 |
764 | ; Mikolaj Felix 20/06/2001 |
764 | ; mfelix@polbox.com |
765 | ; mfelix@polbox.com |
765 | 766 | ||
766 | ;------------------------------------------------------------ |
767 | ;------------------------------------------------------------ |
767 | ; ds:si - offset to angles (int) |
768 | ; ds:si - offset to angles (int) |
768 | ; ds:di - offset to array of 3d points |
769 | ; ds:di - offset to array of 3d points |
769 | ; cx - number of points |
770 | ; cx - number of points |
770 | ;------------------------------------------------------------ |
771 | ;------------------------------------------------------------ |
771 | 772 | ||
772 | @@sin_x dd 0 ;equ dword ptr [bp-4] |
773 | @@sin_x dd 0 ;equ dword ptr [bp-4] |
773 | @@cos_x dd 0 ;equ dword ptr [bp-8] |
774 | @@cos_x dd 0 ;equ dword ptr [bp-8] |
774 | @@sin_y dd 0 ;equ dword ptr [bp-12] |
775 | @@sin_y dd 0 ;equ dword ptr [bp-12] |
775 | @@cos_y dd 0 ;equ dword ptr [bp-16] |
776 | @@cos_y dd 0 ;equ dword ptr [bp-16] |
776 | @@sin_z dd 0 ;equ dword ptr [bp-20] |
777 | @@sin_z dd 0 ;equ dword ptr [bp-20] |
777 | @@cos_z dd 0 ;equ dword ptr [bp-24] |
778 | @@cos_z dd 0 ;equ dword ptr [bp-24] |
778 | 779 | ||
779 | @@x equ dword [edi] |
780 | @@x equ dword [edi] |
780 | @@y equ dword [edi+4] |
781 | @@y equ dword [edi+4] |
781 | @@z equ dword [edi+8] |
782 | @@z equ dword [edi+8] |
782 | 783 | ||
783 | rotate_points: |
784 | rotate_points: |
784 | 785 | ||
785 | push edi |
786 | push edi |
786 | mov edi,@@sin_x |
787 | mov edi,@@sin_x |
787 | mov edx,3 |
788 | mov edx,3 |
788 | rp_sin_cos: |
789 | rp_sin_cos: |
789 | mov bx,word [esi] |
790 | mov bx,word [esi] |
790 | and bx,MAX_DEGS-1 |
791 | and bx,MAX_DEGS-1 |
791 | shl bx,2 |
792 | shl bx,2 |
792 | mov eax,dword [sintab+bx] |
793 | mov eax,dword [sintab+bx] |
793 | mov dword [edi],eax |
794 | mov dword [edi],eax |
794 | mov eax,dword [costab+bx] |
795 | mov eax,dword [costab+bx] |
795 | mov dword [edi+4],eax |
796 | mov dword [edi+4],eax |
796 | add edi,8 |
797 | add edi,8 |
797 | add esi,2 |
798 | add esi,2 |
798 | dec edx |
799 | dec edx |
799 | jnz rp_sin_cos |
800 | jnz rp_sin_cos |
800 | pop edi |
801 | pop edi |
801 | 802 | ||
802 | rp_rotate: |
803 | rp_rotate: |
803 | fld @@y |
804 | fld @@y |
804 | fmul [@@cos_x] |
805 | fmul [@@cos_x] |
805 | fld @@z |
806 | fld @@z |
806 | fmul [@@sin_x] |
807 | fmul [@@sin_x] |
807 | fsubp st1,st |
808 | fsubp st1,st |
808 | fld @@y |
809 | fld @@y |
809 | fxch st1 |
810 | fxch st1 |
810 | fstp @@y ; Yrotated = Cos (A)*Y - Sin (A)*Z |
811 | fstp @@y ; Yrotated = Cos (A)*Y - Sin (A)*Z |
811 | fmul [@@sin_x] |
812 | fmul [@@sin_x] |
812 | fld @@z |
813 | fld @@z |
813 | fmul [@@cos_x] |
814 | fmul [@@cos_x] |
814 | faddp st1,st |
815 | faddp st1,st |
815 | fstp @@z ; Zrotated = Sin (A)*Y + Cos (A)*Z |
816 | fstp @@z ; Zrotated = Sin (A)*Y + Cos (A)*Z |
816 | 817 | ||
817 | fld @@x |
818 | fld @@x |
818 | fmul [@@cos_y] |
819 | fmul [@@cos_y] |
819 | fld @@z |
820 | fld @@z |
820 | fmul [@@sin_y] |
821 | fmul [@@sin_y] |
821 | fsubp st1,st |
822 | fsubp st1,st |
822 | fld @@x |
823 | fld @@x |
823 | fxch st1 |
824 | fxch st1 |
824 | fstp @@x ; Xrotated = Cos (A)*X - Sin (A)*Z |
825 | fstp @@x ; Xrotated = Cos (A)*X - Sin (A)*Z |
825 | fmul [@@sin_y] |
826 | fmul [@@sin_y] |
826 | fld @@z |
827 | fld @@z |
827 | fmul [@@cos_y] |
828 | fmul [@@cos_y] |
828 | faddp st1,st |
829 | faddp st1,st |
829 | fstp @@z ; Zrotated = Sin (A)*X + Cos (A)*Z |
830 | fstp @@z ; Zrotated = Sin (A)*X + Cos (A)*Z |
830 | 831 | ||
831 | fld @@x |
832 | fld @@x |
832 | fmul [@@cos_z] |
833 | fmul [@@cos_z] |
833 | fld @@y |
834 | fld @@y |
834 | fmul [@@sin_z] |
835 | fmul [@@sin_z] |
835 | fsubp st1,st |
836 | fsubp st1,st |
836 | fld @@x |
837 | fld @@x |
837 | fxch st1 |
838 | fxch st1 |
838 | fstp @@x ; Xrotated = Cos (A)*X - Sin (A)*Y |
839 | fstp @@x ; Xrotated = Cos (A)*X - Sin (A)*Y |
839 | fmul [@@sin_z] |
840 | fmul [@@sin_z] |
840 | fld @@y |
841 | fld @@y |
841 | fmul [@@cos_z] |
842 | fmul [@@cos_z] |
842 | faddp st1,st |
843 | faddp st1,st |
843 | fstp @@y ; Yrotated = Sin (A)*X + Cos (A)*Y |
844 | fstp @@y ; Yrotated = Sin (A)*X + Cos (A)*Y |
844 | 845 | ||
845 | add edi,12 |
846 | add edi,12 |
846 | dec ecx |
847 | dec ecx |
847 | jnz rp_rotate |
848 | jnz rp_rotate |
848 | ret |
849 | ret |
849 | 850 | ||
850 | ;------------------------------------------------------------ |
851 | ;------------------------------------------------------------ |
851 | ; ds:si - offset to array of 3d points |
852 | ; ds:si - offset to array of 3d points |
852 | ; ds:di - offset to 2d points |
853 | ; ds:di - offset to 2d points |
853 | ; cx - number of points |
854 | ; cx - number of points |
854 | ;------------------------------------------------------------ |
855 | ;------------------------------------------------------------ |
855 | 856 | ||
856 | translate_points: |
857 | translate_points: |
857 | 858 | ||
858 | fld dword [esi+8] |
859 | fld dword [esi+8] |
859 | fadd [perspective] |
860 | fadd [perspective] |
860 | 861 | ||
861 | fld dword [esi] |
862 | fld dword [esi] |
862 | fmul [perspective] |
863 | fmul [perspective] |
863 | fdiv st,st1 |
864 | fdiv st,st1 |
864 | fadd [correct_x] |
865 | fadd [correct_x] |
865 | fistp word [edi] ; x2d = (x*persp)/(z+persp)+correct_x |
866 | fistp word [edi] ; x2d = (x*persp)/(z+persp)+correct_x |
866 | 867 | ||
867 | fld dword [esi+4] |
868 | fld dword [esi+4] |
868 | fmul [perspective] |
869 | fmul [perspective] |
869 | fdivrp st1,st |
870 | fdivrp st1,st |
870 | fadd [correct_y] |
871 | fadd [correct_y] |
871 | fistp word [edi+2] ; y2d = (y*persp)/(z+persp)+correct_y |
872 | fistp word [edi+2] ; y2d = (y*persp)/(z+persp)+correct_y |
872 | 873 | ||
873 | add esi,12 |
874 | add esi,12 |
874 | add edi,4 |
875 | add edi,4 |
875 | dec ecx |
876 | dec ecx |
876 | jnz translate_points |
877 | jnz translate_points |
877 | ret |
878 | ret |
878 | 879 | ||
879 | ; initalize SIN&COS table |
880 | ; initalize SIN&COS table |
880 | 881 | ||
881 | @@temp1 dd 0 ;dword ptr [bp-4] |
882 | @@temp1 dd 0 ;dword ptr [bp-4] |
882 | @@temp2 dd 0 ;dword ptr [bp-8] |
883 | @@temp2 dd 0 ;dword ptr [bp-8] |
883 | 884 | ||
884 | init_sincos: |
885 | init_sincos: |
885 | mov [@@temp1],0 |
886 | mov [@@temp1],0 |
886 | fldpi |
887 | fldpi |
887 | mov [@@temp2],MAX_DEGS/2 |
888 | mov [@@temp2],MAX_DEGS/2 |
888 | fidiv [@@temp2] |
889 | fidiv [@@temp2] |
889 | fstp [@@temp2] |
890 | fstp [@@temp2] |
890 | 891 | ||
891 | xor edi,edi |
892 | xor edi,edi |
892 | mov ecx,MAX_DEGS |
893 | mov ecx,MAX_DEGS |
893 | isc_loop: |
894 | isc_loop: |
894 | fld [@@temp1] |
895 | fld [@@temp1] |
895 | fld st0 |
896 | fld st0 |
896 | fld st0 |
897 | fld st0 |
897 | fsin |
898 | fsin |
898 | fstp dword [sintab+edi] |
899 | fstp dword [sintab+edi] |
899 | fcos |
900 | fcos |
900 | fstp dword [costab+edi] |
901 | fstp dword [costab+edi] |
901 | fadd [@@temp2] |
902 | fadd [@@temp2] |
902 | fstp [@@temp1] |
903 | fstp [@@temp1] |
903 | 904 | ||
904 | add edi,4 |
905 | add edi,4 |
905 | dec ecx |
906 | dec ecx |
906 | jnz isc_loop |
907 | jnz isc_loop |
907 | ret |
908 | ret |
908 | 909 | ||
909 | perspective dd 256.0 |
910 | perspective dd 256.0 |
910 | correct_x dd 400.0 |
911 | correct_x dd 400.0 |
911 | correct_y dd 300.0 |
912 | correct_y dd 300.0 |
912 | 913 | ||
913 | angle_x dw 0 |
914 | angle_x dw 0 |
914 | angle_y dw 0 |
915 | angle_y dw 0 |
915 | angle_z dw 0 |
916 | angle_z dw 0 |
916 | 917 | ||
917 | file_texture: |
918 | file_texture: |
918 | file 'texture.raw' |
919 | file 'texture.raw' |
919 | 920 | ||
920 | cube dw -50,-50,50, 50,-50,50, 50,50,50, -50,50,50 |
921 | cube dw -50,-50,50, 50,-50,50, 50,50,50, -50,50,50 |
921 | dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50 |
922 | dw -50,-50,-50, 50,-50,-50, 50,50,-50, -50,50,-50 |
922 | 923 | ||
923 | link db 0,1,2,3, 5,4,7,6, 1,5,6,2, 4,0,3,7, 4,5,1,0, 3,2,6,7 |
924 | link db 0,1,2,3, 5,4,7,6, 1,5,6,2, 4,0,3,7, 4,5,1,0, 3,2,6,7 |
924 | 925 | ||
925 | sintab: |
926 | sintab: |
926 | rd MAX_DEGS |
927 | rd MAX_DEGS |
927 | costab: |
928 | costab: |
928 | rd MAX_DEGS |
929 | rd MAX_DEGS |
929 | 930 | ||
930 | cube_rotated: |
931 | cube_rotated: |
931 | rd MAX_POINTS*3 |
932 | rd MAX_POINTS*3 |
932 | coord2d: |
933 | coord2d: |
933 | rw MAX_POINTS*2 |
934 | rw MAX_POINTS*2 |
934 | texture: |
935 | texture: |
935 | rb 128*128*3 |
936 | rb 128*128*3 |
936 | scrbuf: |
937 | scrbuf: |
937 | 938 | ||
938 | I_END:> |
939 | I_END:> |