Subversion Repositories Kolibri OS

Rev

Rev 109 | Go to most recent revision | 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: